@productbrain/cli 0.1.0-beta.2323 → 0.1.0-beta.2331
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generators/boundary-manifest.real-file.test.d.ts +2 -0
- package/dist/generators/boundary-manifest.real-file.test.d.ts.map +1 -0
- package/dist/generators/boundary-manifest.real-file.test.js +70 -0
- package/dist/generators/boundary-manifest.real-file.test.js.map +1 -0
- package/dist/lib/onboarding-shared.d.ts +4 -3
- package/dist/lib/onboarding-shared.d.ts.map +1 -1
- package/dist/lib/onboarding-shared.js +4 -3
- package/dist/lib/onboarding-shared.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boundary-manifest.real-file.test.d.ts","sourceRoot":"","sources":["../../src/generators/boundary-manifest.real-file.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guard against the #366 session-start regression (PR #380 hotfix): PR #366's rewrite of
|
|
3
|
+
* `.productbrain/rules/architecture-boundaries.md` shipped `eval-isolation-no-production-import`
|
|
4
|
+
* (a `kind: policyBoundary, status: active` entry) with `chainRefs: []`. `pb session start` runs
|
|
5
|
+
* `runHandshake(...)`, which (whenever `boundary_enforcement_mode !== 'advisory'`) calls
|
|
6
|
+
* `generateBoundaryManifest` on this exact file — its `validateBoundaryRules` throws on any
|
|
7
|
+
* active policyBoundary with an empty `chainRefs`, so `session start` exited 1 and never
|
|
8
|
+
* persisted the session marker, taking every downstream `pb` write command down with it
|
|
9
|
+
* (SESSION_REQUIRED). `boundary-manifest.test.ts` (sibling file) only exercises the parser
|
|
10
|
+
* against synthetic in-memory fixtures via a mocked `fs` — nothing asserted that the REAL,
|
|
11
|
+
* COMMITTED file actually validates, which is exactly how #366 shipped a file that broke this
|
|
12
|
+
* path through CI unnoticed.
|
|
13
|
+
*
|
|
14
|
+
* This file does NOT mock `fs` — it reads the real repo-root
|
|
15
|
+
* `.productbrain/rules/architecture-boundaries.md` and runs it through the exact functions
|
|
16
|
+
* `pb session start` -> `runHandshake` -> `generateBoundaryManifest` calls, so a future rewrite
|
|
17
|
+
* that reintroduces an empty-chainRefs active policyBoundary (or any other validation failure)
|
|
18
|
+
* fails THIS test instead of shipping silently.
|
|
19
|
+
*/
|
|
20
|
+
import { describe, expect, it } from 'vitest';
|
|
21
|
+
import { readFileSync } from 'fs';
|
|
22
|
+
import { fileURLToPath } from 'url';
|
|
23
|
+
import { dirname, join } from 'path';
|
|
24
|
+
import { generateBoundaryManifest, parseBoundaryRules } from './boundary-manifest.js';
|
|
25
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
26
|
+
// repo root: packages/cli/src/generators -> ../../../..
|
|
27
|
+
const REPO_ROOT = join(__dirname, '..', '..', '..', '..');
|
|
28
|
+
const PB_DIR = join(REPO_ROOT, '.productbrain');
|
|
29
|
+
const SOURCE_PATH = join(PB_DIR, 'rules', 'architecture-boundaries.md');
|
|
30
|
+
describe('boundary manifest generator — real committed file (session-start regression guard)', () => {
|
|
31
|
+
it('the committed architecture-boundaries.md is non-empty and has the expected frontmatter shape', () => {
|
|
32
|
+
// Sanity floor before the real assertion below — if this fails, REPO_ROOT resolution
|
|
33
|
+
// itself has drifted (e.g. the test moved), not the boundary data.
|
|
34
|
+
const raw = readFileSync(SOURCE_PATH, 'utf8');
|
|
35
|
+
expect(raw.length).toBeGreaterThan(0);
|
|
36
|
+
expect(raw.startsWith('---\n')).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
it('every active policyBoundary in the committed file has a non-empty chainRefs (the exact #366 regression)', () => {
|
|
39
|
+
const raw = readFileSync(SOURCE_PATH, 'utf8');
|
|
40
|
+
const rules = parseBoundaryRules(raw);
|
|
41
|
+
expect(rules.length).toBeGreaterThan(0);
|
|
42
|
+
// Copilot review (PR #381): `rule.chainRefs` comes from hand-authored markdown parsed by
|
|
43
|
+
// parseBoundaryRules — a rule entry that omits the `chainRefs:` key entirely never gets
|
|
44
|
+
// the property set, so `rule.chainRefs` can be `undefined` (not just `[]`) at runtime,
|
|
45
|
+
// even though BoundaryRule's TS type claims `chainRefs: string[]` unconditionally. A bare
|
|
46
|
+
// `rule.chainRefs.length === 0` would throw a TypeError on that undefined case instead of
|
|
47
|
+
// failing with the clear assertion message below — treat "missing or not a non-empty
|
|
48
|
+
// array" as the SAME violation (this is exactly the #366 regression shape: an active
|
|
49
|
+
// policyBoundary with no usable chainRefs, however that absence is spelled).
|
|
50
|
+
const violations = rules.filter((rule) => rule.kind === 'policyBoundary' && rule.status === 'active' && !(Array.isArray(rule.chainRefs) && rule.chainRefs.length > 0));
|
|
51
|
+
expect(violations.map((rule) => rule.id), 'Every active policyBoundary needs at least one chainRef — an empty chainRefs here is ' +
|
|
52
|
+
'exactly the #366 regression that made pb session start exit 1 (runHandshake -> ' +
|
|
53
|
+
'generateBoundaryManifest -> validateBoundaryRules throws), which took every ' +
|
|
54
|
+
'downstream pb write command down with it (SESSION_REQUIRED, deployed path).').toEqual([]);
|
|
55
|
+
});
|
|
56
|
+
it('generateBoundaryManifest does not throw against the real committed file — the exact pb session start -> runHandshake call path', () => {
|
|
57
|
+
// Calls the SAME function runHandshake calls (packages/cli/src/commands/handshake.ts,
|
|
58
|
+
// `boundaryManifestContent = ... : generateBoundaryManifest(pbDir)`), against the SAME
|
|
59
|
+
// real file on disk `pb session start` reads — no mock, no synthetic fixture.
|
|
60
|
+
expect(() => generateBoundaryManifest(PB_DIR)).not.toThrow();
|
|
61
|
+
const manifest = generateBoundaryManifest(PB_DIR);
|
|
62
|
+
expect(manifest).not.toBeNull();
|
|
63
|
+
// Parses back cleanly as the JSON shape generateBoundaryManifest documents.
|
|
64
|
+
const parsed = JSON.parse(manifest);
|
|
65
|
+
expect(parsed.schemaVersion).toBe(1);
|
|
66
|
+
expect(Array.isArray(parsed.rules)).toBe(true);
|
|
67
|
+
expect(parsed.rules.length).toBe(parseBoundaryRules(readFileSync(SOURCE_PATH, 'utf8')).length);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=boundary-manifest.real-file.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boundary-manifest.real-file.test.js","sourceRoot":"","sources":["../../src/generators/boundary-manifest.real-file.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
* Shared onboarding utilities — types, extraction mapping, batch capture, retrieval proof.
|
|
3
3
|
* WP-304: Extracted from onboarding.ts to support both Path A and future Path B.
|
|
4
4
|
*
|
|
5
|
-
* DIVERGED from
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* DIVERGED from the MCP server's former extractionToBatchEntries per DEC-522 (that module,
|
|
6
|
+
* start-interview.ts, was deleted as dead code — see git history / TEN-2754's PR for the
|
|
7
|
+
* removal). Copy-and-own: CLI uses 120-char truncate limits (vs MCP's former 80). Shared
|
|
8
|
+
* package deferred. Duplicated due to monorepo import boundary (BR-108).
|
|
8
9
|
*/
|
|
9
10
|
/** @deprecated Use CaptureEntry[] directly — LLM now outputs entry-shaped data. */
|
|
10
11
|
export interface OnboardingExtraction {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding-shared.d.ts","sourceRoot":"","sources":["../../src/lib/onboarding-shared.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"onboarding-shared.d.ts","sourceRoot":"","sources":["../../src/lib/onboarding-shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,mFAAmF;AACnF,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC5B;AAED,qCAAqC;AACrC,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,iCAAiC;AACjC,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,0DAA0D;AAC1D,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,0FAA0F;IAC1F,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE;QACR,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC9B,GAAG,IAAI,CAAC;CACV;AAED,6DAA6D;AAC7D,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,wFAAwF;IACxF,UAAU,CAAC,EAAE,oBAAoB,CAAC;CACnC;AAID,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAK5D;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAMD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,YAAY,EAAE,CAmC3E;AAED,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,oBAAoB,GAAG,YAAY,EAAE,CA4DnF;AAID;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAO7D;AAID;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,YAAY,EAAE,GACtB,OAAO,CAAC;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAoBtD;AAID;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAWxF"}
|
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
* Shared onboarding utilities — types, extraction mapping, batch capture, retrieval proof.
|
|
3
3
|
* WP-304: Extracted from onboarding.ts to support both Path A and future Path B.
|
|
4
4
|
*
|
|
5
|
-
* DIVERGED from
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* DIVERGED from the MCP server's former extractionToBatchEntries per DEC-522 (that module,
|
|
6
|
+
* start-interview.ts, was deleted as dead code — see git history / TEN-2754's PR for the
|
|
7
|
+
* removal). Copy-and-own: CLI uses 120-char truncate limits (vs MCP's former 80). Shared
|
|
8
|
+
* package deferred. Duplicated due to monorepo import boundary (BR-108).
|
|
8
9
|
*/
|
|
9
10
|
import { kernelCallWithSession } from './client.js';
|
|
10
11
|
import { bold, cyan, dim, icons } from './style.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding-shared.js","sourceRoot":"","sources":["../../src/lib/onboarding-shared.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"onboarding-shared.js","sourceRoot":"","sources":["../../src/lib/onboarding-shared.ts"],"names":[],"mappings":"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"}
|