Skip to content

Commit 185d187

Browse files
committed
fix(agent-plugin): repair release CI
1 parent d6c88a0 commit 185d187

12 files changed

Lines changed: 612 additions & 506 deletions

File tree

docs/rxjs-next/PROJECT_PLAN.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,3 +421,21 @@ ordinary agent tools.
421421
- No model, paid-token, authenticated, or credit-consuming evaluation ran.
422422
- Marked P7.11 complete and advanced four-package beta.1 publication and the
423423
RxJS 7 documentation backport as the sole `NEXT` item.
424+
425+
### 2026-08-17 — P7.12 pull-request CI repair
426+
427+
- Replaced the migration MCP path validator's lint-rejected control-character
428+
regular expression with equivalent character-code validation and expanded
429+
deterministic refusal coverage to all 33 ASCII control characters.
430+
- Restored pnpm 10 override enforcement by moving the policy to
431+
`pnpm-workspace.yaml`; updated the release-tooling paths to fixed `js-yaml`
432+
and `nanoid` versions and a Less version that no longer carries the
433+
vulnerable `image-size` dependency.
434+
- Re-ran the pinned OSV 2.3.8 scan and path-aware npm audit. All 264 remaining
435+
findings are isolated to the excluded legacy documentation workspace; the
436+
generated 185-ID exception baseline is owned, tracked, and expires within 90
437+
days.
438+
- Deterministic evidence: all four package lint, build, test, type, import, and
439+
packed-artifact gates passed; the plugin passed 146 tests and its 124-file
440+
packed MCP gate; the runtime contract, workflow formatting, and all 40
441+
release checks passed. P7.12 remains the sole `NEXT` item.

docs/security/LEGACY_DOCS_VULNERABILITIES.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# Legacy documentation dependency vulnerability backlog
22

3-
Last reviewed: 2026-08-02. Owner: Ben Lesh (`benlesh`). Next mandatory review: 2026-10-31.
3+
Last reviewed: 2026-08-17. Owner: Ben Lesh (`benlesh`). Next mandatory review: 2026-11-15.
44

5-
The inherited `apps/rxjs.dev` Angular 13 toolchain is outside the RxJS 9 package, test, qualification, and publication paths. It is intentionally not changed by the RxJS Next project. A path-aware npm audit on 2026-08-02 classified 253 remaining advisory paths as reachable only from that workspace after all release-reachable findings were removed.
5+
The inherited `apps/rxjs.dev` Angular 13 toolchain is outside the RxJS 9 package, test, qualification, and publication paths. It is intentionally not changed by the RxJS Next project. A path-aware npm audit on 2026-08-17 classified 264 remaining advisory paths as reachable only from that workspace after all release-reachable findings were removed. Fixable root-tooling findings were removed by restoring pnpm 10 override enforcement and updating `js-yaml`, `nanoid`, and Less; the remaining findings are isolated to legacy documentation tooling.
66

77
The matching OSV IDs are temporarily recorded in the root `osv-scanner.toml`. Each exception expires within 90 days. The isolated release-train scan never loads these exceptions. A new or changed advisory path that reaches the repository root or a release package fails CI.
88

osv-scanner.toml

Lines changed: 398 additions & 358 deletions
Large diffs are not rendered by default.

package.json

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -61,39 +61,6 @@
6161
"path": "cz-conventional-changelog"
6262
}
6363
},
64-
"pnpm": {
65-
"overrides": {
66-
"@babel/core": "7.29.7",
67-
"@babel/helpers": "7.29.7",
68-
"@babel/plugin-transform-modules-systemjs": "7.29.8",
69-
"@babel/runtime": "7.29.7",
70-
"ajv@6": "6.14.0",
71-
"ajv@8": "8.18.0",
72-
"axios": "1.18.0",
73-
"brace-expansion@1": "1.1.18",
74-
"brace-expansion@2": "2.1.4",
75-
"brace-expansion@5": "5.0.9",
76-
"braces": "3.0.3",
77-
"cross-spawn": "7.0.6",
78-
"diff@4": "4.0.4",
79-
"ejs": "3.1.10",
80-
"flatted": "3.4.2",
81-
"follow-redirects": "1.16.0",
82-
"form-data": "4.0.6",
83-
"glob@10": "10.5.0",
84-
"immutable@4": "4.3.9",
85-
"js-yaml@3": "3.15.0",
86-
"js-yaml@4": "4.3.0",
87-
"micromatch": "4.0.8",
88-
"minimatch@3": "3.1.4",
89-
"minimatch@5": "5.1.8",
90-
"minimatch@9": "9.0.7",
91-
"picomatch@2": "2.3.2",
92-
"rollup": "4.59.0",
93-
"tmp": "0.2.7",
94-
"yaml@1": "1.10.3"
95-
}
96-
},
9764
"lint-staged": {
9865
"*.js": "eslint --cache --fix",
9966
"(src|spec)/**/*.ts": [

packages/agent-plugin/claude-adapter/artifact-digests.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
"bytes": 2838
1010
},
1111
"dist/mcp-server.cjs": {
12-
"sha256": "c7c666f7bdb11a9df3c2ce8547644827a23ff748de59647f3b45110dc5dcfb68",
13-
"bytes": 11012820
12+
"sha256": "dd0b977ef49d5d1cb71cd348e8a2880f73cf591db041902002dd21d85504b84f",
13+
"bytes": 11013015
1414
},
1515
"skills/analyze-rxjs-performance/SKILL.md": {
1616
"sha256": "0128a2879643131cecfdfb920d8c0af4d7f1975b4e49788af2b7c9c94a4924ee",

packages/agent-plugin/claude-adapter/dist/mcp-server.cjs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240608,10 +240608,17 @@ function migrationOptions(batch, path) {
240608240608
};
240609240609
}
240610240610
function isRepositoryRelativePath(value) {
240611-
if (value.startsWith("/") || /^[A-Za-z]:[\\/]/.test(value) || /[\0-\x1f\x7f]/.test(value)) return false;
240611+
if (value.startsWith("/") || /^[A-Za-z]:[\\/]/.test(value) || hasAsciiControlCharacter(value)) return false;
240612240612
const segments = value.split(/[\\/]/);
240613240613
return segments.every((segment) => segment.length > 0 && segment !== "." && segment !== "..");
240614240614
}
240615+
function hasAsciiControlCharacter(value) {
240616+
for (const character of value) {
240617+
const code = character.charCodeAt(0);
240618+
if (code <= 31 || code === 127) return true;
240619+
}
240620+
return false;
240621+
}
240615240622
function limits() {
240616240623
return { maxFiles: MAX_FILES, maxFileBytes: MAX_FILE_BYTES, maxTotalBytes: MAX_TOTAL_BYTES };
240617240624
}

packages/agent-plugin/dist/mcp-server.cjs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240608,10 +240608,17 @@ function migrationOptions(batch, path) {
240608240608
};
240609240609
}
240610240610
function isRepositoryRelativePath(value) {
240611-
if (value.startsWith("/") || /^[A-Za-z]:[\\/]/.test(value) || /[\0-\x1f\x7f]/.test(value)) return false;
240611+
if (value.startsWith("/") || /^[A-Za-z]:[\\/]/.test(value) || hasAsciiControlCharacter(value)) return false;
240612240612
const segments = value.split(/[\\/]/);
240613240613
return segments.every((segment) => segment.length > 0 && segment !== "." && segment !== "..");
240614240614
}
240615+
function hasAsciiControlCharacter(value) {
240616+
for (const character of value) {
240617+
const code = character.charCodeAt(0);
240618+
if (code <= 31 || code === 127) return true;
240619+
}
240620+
return false;
240621+
}
240615240622
function limits() {
240616240623
return { maxFiles: MAX_FILES, maxFileBytes: MAX_FILE_BYTES, maxTotalBytes: MAX_TOTAL_BYTES };
240617240624
}

packages/agent-plugin/src/mcp/service.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,11 +192,19 @@ function migrationOptions(batch: z.output<typeof batchSchema>, path: string) {
192192
}
193193

194194
function isRepositoryRelativePath(value: string): boolean {
195-
if (value.startsWith('/') || /^[A-Za-z]:[\\/]/.test(value) || /[\0-\x1f\x7f]/.test(value)) return false;
195+
if (value.startsWith('/') || /^[A-Za-z]:[\\/]/.test(value) || hasAsciiControlCharacter(value)) return false;
196196
const segments = value.split(/[\\/]/);
197197
return segments.every((segment) => segment.length > 0 && segment !== '.' && segment !== '..');
198198
}
199199

200+
function hasAsciiControlCharacter(value: string): boolean {
201+
for (const character of value) {
202+
const code = character.charCodeAt(0);
203+
if (code <= 0x1f || code === 0x7f) return true;
204+
}
205+
return false;
206+
}
207+
200208
function limits() {
201209
return { maxFiles: MAX_FILES, maxFileBytes: MAX_FILE_BYTES, maxTotalBytes: MAX_TOTAL_BYTES };
202210
}

packages/agent-plugin/test/mcp.spec.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -130,11 +130,7 @@ void operate;
130130
expect(result.files[0]?.reviewFlags).toEqual(
131131
expect.arrayContaining(['default-import', 'unknown-public-surface', 'namespace-import', 'deep-import'])
132132
);
133-
expect(result.files[0]?.unsupportedConstructs).toEqual([
134-
'rxjs:default',
135-
'rxjs:notInRxjs782',
136-
'rxjs/internal/util/lift:*',
137-
]);
133+
expect(result.files[0]?.unsupportedConstructs).toEqual(['rxjs:default', 'rxjs:notInRxjs782', 'rxjs/internal/util/lift:*']);
138134
});
139135

140136
it('validates schema separately from readiness', () => {
@@ -212,7 +208,6 @@ void operate;
212208
['dot segment', { files: [{ path: './file.ts', source: '' }] }, 'invalid-path'],
213209
['empty segment', { files: [{ path: 'src//file.ts', source: '' }] }, 'invalid-path'],
214210
['Windows absolute path', { files: [{ path: 'C:\\src\\file.ts', source: '' }] }, 'invalid-path'],
215-
['control character', { files: [{ path: 'src/file\0.ts', source: '' }] }, 'invalid-path'],
216211
[
217212
'duplicate path',
218213
{
@@ -249,6 +244,10 @@ void operate;
249244
])('refuses %s before producing partial output', (_name, input, code) => {
250245
expectRefusal(() => previewMigration(input), code as InputRefusal['refusal']['code']);
251246
});
247+
248+
it.each([...Array.from({ length: 0x20 }, (_, code) => code), 0x7f])('refuses ASCII control character U+%s in a path', (code) => {
249+
expectRefusal(() => previewMigration({ files: [{ path: `src/file${String.fromCharCode(code)}.ts`, source: '' }] }), 'invalid-path');
250+
});
252251
});
253252

254253
function expectRefusal(operation: () => unknown, code: InputRefusal['refusal']['code']): void {

0 commit comments

Comments
 (0)