@productbrain/cli 0.1.0-beta.7273 → 0.1.0-beta.7286

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.
Files changed (101) hide show
  1. package/dist/__tests__/onboarding.test.js +4 -1
  2. package/dist/__tests__/onboarding.test.js.map +1 -1
  3. package/dist/__tests__/session-close-loop.test.js +0 -2
  4. package/dist/__tests__/session-close-loop.test.js.map +1 -1
  5. package/dist/commands/handshake.js +2 -2
  6. package/dist/commands/handshake.js.map +1 -1
  7. package/dist/commands/init.d.ts.map +1 -1
  8. package/dist/commands/init.js +2 -4
  9. package/dist/commands/init.js.map +1 -1
  10. package/dist/commands/session.d.ts.map +1 -1
  11. package/dist/commands/session.js +0 -18
  12. package/dist/commands/session.js.map +1 -1
  13. package/dist/formatters/digest.d.ts.map +1 -1
  14. package/dist/formatters/digest.js +9 -5
  15. package/dist/formatters/digest.js.map +1 -1
  16. package/dist/index.js +1 -62
  17. package/dist/index.js.map +1 -1
  18. package/dist/lib/onboarding-shared.d.ts.map +1 -1
  19. package/dist/lib/onboarding-shared.js +8 -9
  20. package/dist/lib/onboarding-shared.js.map +1 -1
  21. package/dist/lib/onboarding-topics.js +1 -1
  22. package/dist/lib/onboarding.d.ts.map +1 -1
  23. package/dist/lib/onboarding.js +7 -13
  24. package/dist/lib/onboarding.js.map +1 -1
  25. package/package.json +1 -1
  26. package/dist/__tests__/migrate-setup-session-refusal.test.d.ts +0 -2
  27. package/dist/__tests__/migrate-setup-session-refusal.test.d.ts.map +0 -1
  28. package/dist/__tests__/migrate-setup-session-refusal.test.js +0 -65
  29. package/dist/__tests__/migrate-setup-session-refusal.test.js.map +0 -1
  30. package/dist/__tests__/setup-ingest.test.d.ts +0 -2
  31. package/dist/__tests__/setup-ingest.test.d.ts.map +0 -1
  32. package/dist/__tests__/setup-ingest.test.js +0 -71
  33. package/dist/__tests__/setup-ingest.test.js.map +0 -1
  34. package/dist/__tests__/setup-resolver.test.d.ts +0 -14
  35. package/dist/__tests__/setup-resolver.test.d.ts.map +0 -1
  36. package/dist/__tests__/setup-resolver.test.js +0 -228
  37. package/dist/__tests__/setup-resolver.test.js.map +0 -1
  38. package/dist/__tests__/setupShFallbackWarning.test.d.ts +0 -2
  39. package/dist/__tests__/setupShFallbackWarning.test.d.ts.map +0 -1
  40. package/dist/__tests__/setupShFallbackWarning.test.js +0 -15
  41. package/dist/__tests__/setupShFallbackWarning.test.js.map +0 -1
  42. package/dist/commands/__tests__/setup-detect-surfaces.test.d.ts +0 -15
  43. package/dist/commands/__tests__/setup-detect-surfaces.test.d.ts.map +0 -1
  44. package/dist/commands/__tests__/setup-detect-surfaces.test.js +0 -149
  45. package/dist/commands/__tests__/setup-detect-surfaces.test.js.map +0 -1
  46. package/dist/commands/__tests__/setup-state.test.d.ts +0 -2
  47. package/dist/commands/__tests__/setup-state.test.d.ts.map +0 -1
  48. package/dist/commands/__tests__/setup-state.test.js +0 -194
  49. package/dist/commands/__tests__/setup-state.test.js.map +0 -1
  50. package/dist/commands/migrate-setup.d.ts +0 -18
  51. package/dist/commands/migrate-setup.d.ts.map +0 -1
  52. package/dist/commands/migrate-setup.js +0 -162
  53. package/dist/commands/migrate-setup.js.map +0 -1
  54. package/dist/commands/setup-audit.d.ts +0 -59
  55. package/dist/commands/setup-audit.d.ts.map +0 -1
  56. package/dist/commands/setup-audit.js +0 -250
  57. package/dist/commands/setup-audit.js.map +0 -1
  58. package/dist/commands/setup-detect-surfaces.d.ts +0 -38
  59. package/dist/commands/setup-detect-surfaces.d.ts.map +0 -1
  60. package/dist/commands/setup-detect-surfaces.js +0 -76
  61. package/dist/commands/setup-detect-surfaces.js.map +0 -1
  62. package/dist/commands/setup-ingest.d.ts +0 -17
  63. package/dist/commands/setup-ingest.d.ts.map +0 -1
  64. package/dist/commands/setup-ingest.js +0 -179
  65. package/dist/commands/setup-ingest.js.map +0 -1
  66. package/dist/commands/setup-resolver.d.ts +0 -58
  67. package/dist/commands/setup-resolver.d.ts.map +0 -1
  68. package/dist/commands/setup-resolver.js +0 -150
  69. package/dist/commands/setup-resolver.js.map +0 -1
  70. package/dist/commands/setup-state.d.ts +0 -42
  71. package/dist/commands/setup-state.d.ts.map +0 -1
  72. package/dist/commands/setup-state.js +0 -93
  73. package/dist/commands/setup-state.js.map +0 -1
  74. package/dist/commands/setup.d.ts +0 -23
  75. package/dist/commands/setup.d.ts.map +0 -1
  76. package/dist/commands/setup.js +0 -69
  77. package/dist/commands/setup.js.map +0 -1
  78. package/dist/setup/__tests__/coach-traces.test.d.ts +0 -2
  79. package/dist/setup/__tests__/coach-traces.test.d.ts.map +0 -1
  80. package/dist/setup/__tests__/coach-traces.test.js +0 -189
  81. package/dist/setup/__tests__/coach-traces.test.js.map +0 -1
  82. package/dist/setup/__tests__/setup-commands.test.d.ts +0 -2
  83. package/dist/setup/__tests__/setup-commands.test.d.ts.map +0 -1
  84. package/dist/setup/__tests__/setup-commands.test.js +0 -177
  85. package/dist/setup/__tests__/setup-commands.test.js.map +0 -1
  86. package/dist/setup/__tests__/state-machine.test.d.ts +0 -2
  87. package/dist/setup/__tests__/state-machine.test.d.ts.map +0 -1
  88. package/dist/setup/__tests__/state-machine.test.js +0 -341
  89. package/dist/setup/__tests__/state-machine.test.js.map +0 -1
  90. package/dist/setup/detect-surfaces.d.ts +0 -21
  91. package/dist/setup/detect-surfaces.d.ts.map +0 -1
  92. package/dist/setup/detect-surfaces.js +0 -39
  93. package/dist/setup/detect-surfaces.js.map +0 -1
  94. package/dist/setup/manifest-writer.d.ts +0 -17
  95. package/dist/setup/manifest-writer.d.ts.map +0 -1
  96. package/dist/setup/manifest-writer.js +0 -153
  97. package/dist/setup/manifest-writer.js.map +0 -1
  98. package/dist/setup/state-machine.d.ts +0 -67
  99. package/dist/setup/state-machine.d.ts.map +0 -1
  100. package/dist/setup/state-machine.js +0 -124
  101. package/dist/setup/state-machine.js.map +0 -1
@@ -1,39 +0,0 @@
1
- /**
2
- * WP-431 S3 — pure surface detection driven by the SURFACE_ADAPTERS registry.
3
- *
4
- * Each registered adapter exposes a `detect(repoRoot)` predicate (e.g. existence
5
- * of `.claude/`, `.cursor/`, `.github/copilot-instructions.md`, `.codex/` or
6
- * `AGENTS.md`). This module wraps that registry so callers stay in one place
7
- * if the adapter set grows.
8
- */
9
- import { SURFACE_ADAPTERS } from '../surfaces/registry.js';
10
- /**
11
- * Run every adapter's `detect` against `repoRoot` and return the names of
12
- * surfaces that resolved truthy, in registry order.
13
- */
14
- export async function detectSurfaces(repoRoot) {
15
- const detected = [];
16
- for (const name of Object.keys(SURFACE_ADAPTERS)) {
17
- const adapter = SURFACE_ADAPTERS[name];
18
- const result = await Promise.resolve(adapter.detect(repoRoot));
19
- if (result)
20
- detected.push(name);
21
- }
22
- return detected;
23
- }
24
- /**
25
- * Forward-only union (STD-235) — the merge never removes a surface that is
26
- * already declared in the manifest. Returns a sorted, de-duplicated list so
27
- * the writer is order-stable.
28
- */
29
- export function unionSurfaces(existing, detected) {
30
- const set = new Set();
31
- for (const s of existing)
32
- if (typeof s === 'string' && s.length > 0)
33
- set.add(s);
34
- for (const s of detected)
35
- if (typeof s === 'string' && s.length > 0)
36
- set.add(s);
37
- return [...set].sort();
38
- }
39
- //# sourceMappingURL=detect-surfaces.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"detect-surfaces.js","sourceRoot":"","sources":["../../src/setup/detect-surfaces.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAoB,MAAM,yBAAyB,CAAC;AAE7E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAkB,EAAE,CAAC;QAClE,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/D,IAAI,MAAM;YAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,QAAkB,EAAE,QAAkB;IAClE,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,QAAQ;QAAE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChF,KAAK,MAAM,CAAC,IAAI,QAAQ;QAAE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC"}
@@ -1,17 +0,0 @@
1
- /**
2
- * WP-431 S3 — atomic surfaces writer for `.productbrain/manifest.yaml`.
3
- *
4
- * Reads the existing manifest, replaces / inserts the `surfaces:` block, and
5
- * writes back via tmp + rename. Calls `assertSetupWritePath` (STD-234) before
6
- * touching disk so a path argument outside `.productbrain/` is refused.
7
- *
8
- * Forward-only (STD-235) is the caller's responsibility — this helper writes
9
- * exactly what it is given. `setup-detect-surfaces` is the union-merge author.
10
- */
11
- export interface WriteManifestSurfacesResult {
12
- written: boolean;
13
- path: string;
14
- }
15
- export declare function writeManifestSurfaces(repoRoot: string, surfaces: string[]): Promise<WriteManifestSurfacesResult>;
16
- export declare function readManifestSurfaces(repoRoot: string): string[];
17
- //# sourceMappingURL=manifest-writer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manifest-writer.d.ts","sourceRoot":"","sources":["../../src/setup/manifest-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAcH,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAqFD,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,2BAA2B,CAAC,CAqCtC;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAG/D"}
@@ -1,153 +0,0 @@
1
- /**
2
- * WP-431 S3 — atomic surfaces writer for `.productbrain/manifest.yaml`.
3
- *
4
- * Reads the existing manifest, replaces / inserts the `surfaces:` block, and
5
- * writes back via tmp + rename. Calls `assertSetupWritePath` (STD-234) before
6
- * touching disk so a path argument outside `.productbrain/` is refused.
7
- *
8
- * Forward-only (STD-235) is the caller's responsibility — this helper writes
9
- * exactly what it is given. `setup-detect-surfaces` is the union-merge author.
10
- */
11
- import { existsSync, mkdirSync, readFileSync, realpathSync, renameSync, writeFileSync, unlinkSync } from 'fs';
12
- import { dirname, join, resolve } from 'path';
13
- import { assertSetupWritePath } from './perimeter.js';
14
- function canonicalRoot(repoRoot) {
15
- try {
16
- return realpathSync(repoRoot);
17
- }
18
- catch {
19
- return resolve(repoRoot);
20
- }
21
- }
22
- const MANIFEST_RELATIVE = '.productbrain/manifest.yaml';
23
- /**
24
- * Strip a `surfaces: …` block (with optional list items) from the manifest body,
25
- * preserving every other line verbatim. Stops on the next top-level key or EOF.
26
- *
27
- * Ad-hoc YAML parser (single-key replace only): js-yaml is not a dep of this
28
- * package, and round-tripping a full manifest through a YAML library would
29
- * lose comment-preserving fidelity anyway. This helper deliberately handles
30
- * exactly one shape — the top-level `surfaces:` block — and nothing else.
31
- */
32
- function stripSurfacesBlock(raw) {
33
- const lines = raw.split('\n');
34
- const out = [];
35
- let inSurfaces = false;
36
- for (const line of lines) {
37
- if (inSurfaces) {
38
- const isListItem = /^\s+-\s/.test(line);
39
- const isBlank = line.trim() === '';
40
- const isComment = line.trim().startsWith('#');
41
- if (isListItem || isBlank || isComment) {
42
- continue;
43
- }
44
- inSurfaces = false;
45
- }
46
- if (/^surfaces:\s*$/.test(line) || /^surfaces:\s*\[\]\s*$/.test(line)) {
47
- inSurfaces = true;
48
- continue;
49
- }
50
- if (/^surfaces:\s*\[.*\]\s*$/.test(line)) {
51
- continue;
52
- }
53
- out.push(line);
54
- }
55
- let result = out.join('\n');
56
- result = result.replace(/\n{3,}/g, '\n\n');
57
- return result;
58
- }
59
- function serializeSurfacesBlock(surfaces) {
60
- if (surfaces.length === 0)
61
- return 'surfaces: []\n';
62
- const sorted = [...surfaces].sort();
63
- return ['surfaces:', ...sorted.map((s) => ` - ${s}`)].join('\n') + '\n';
64
- }
65
- function buildNewManifest(existing, surfaces) {
66
- const stripped = stripSurfacesBlock(existing).trimEnd();
67
- const block = serializeSurfacesBlock(surfaces);
68
- if (stripped.length === 0) {
69
- return block;
70
- }
71
- return `${stripped}\n${block}`;
72
- }
73
- function readSurfacesFromManifest(raw) {
74
- const lines = raw.split('\n');
75
- for (let i = 0; i < lines.length; i++) {
76
- const line = lines[i];
77
- const inline = line.match(/^surfaces:\s*\[(.*)\]\s*$/);
78
- if (inline) {
79
- return inline[1]
80
- .split(',')
81
- .map((s) => s.trim().replace(/^['"]|['"]$/g, ''))
82
- .filter((s) => s.length > 0);
83
- }
84
- if (/^surfaces:\s*$/.test(line)) {
85
- const items = [];
86
- for (let j = i + 1; j < lines.length; j++) {
87
- const next = lines[j];
88
- const m = next.match(/^\s+-\s+(.+?)\s*$/);
89
- if (m) {
90
- items.push(m[1].replace(/^['"]|['"]$/g, ''));
91
- continue;
92
- }
93
- if (next.trim() === '' || next.trim().startsWith('#'))
94
- continue;
95
- break;
96
- }
97
- return items;
98
- }
99
- }
100
- return [];
101
- }
102
- export async function writeManifestSurfaces(repoRoot, surfaces) {
103
- const canonicalRepo = canonicalRoot(repoRoot);
104
- const absPath = resolve(canonicalRepo, MANIFEST_RELATIVE);
105
- const existingSurfaces = surfacesFromDisk(absPath);
106
- const existing = existsSync(absPath) ? readFileSync(absPath, 'utf8') : '';
107
- const sortedDesired = [...surfaces].sort();
108
- const sortedExisting = [...existingSurfaces].sort();
109
- if (existsSync(absPath) &&
110
- sortedDesired.length === sortedExisting.length &&
111
- sortedDesired.every((s, i) => s === sortedExisting[i])) {
112
- return { written: false, path: absPath };
113
- }
114
- // WP-431 S3 review fix #5: pass the canonical repo root explicitly. The
115
- // perimeter helper now accepts a cwd override (no more process.chdir
116
- // mutation around the call — concurrency-safe).
117
- assertSetupWritePath(absPath, { surfaces }, { cwd: canonicalRepo });
118
- const dir = dirname(absPath);
119
- if (!existsSync(dir))
120
- mkdirSync(dir, { recursive: true });
121
- const next = buildNewManifest(existing.length === 0 ? 'version: "0.1"\n' : existing, sortedDesired);
122
- const tmp = `${absPath}.tmp`;
123
- writeFileSync(tmp, next);
124
- try {
125
- renameSync(tmp, absPath);
126
- }
127
- catch (err) {
128
- try {
129
- unlinkSync(tmp);
130
- }
131
- catch {
132
- // best-effort cleanup
133
- }
134
- throw err;
135
- }
136
- return { written: true, path: absPath };
137
- }
138
- export function readManifestSurfaces(repoRoot) {
139
- const absPath = join(repoRoot, MANIFEST_RELATIVE);
140
- return surfacesFromDisk(absPath);
141
- }
142
- function surfacesFromDisk(absPath) {
143
- if (!existsSync(absPath))
144
- return [];
145
- try {
146
- const raw = readFileSync(absPath, 'utf8');
147
- return readSurfacesFromManifest(raw);
148
- }
149
- catch {
150
- return [];
151
- }
152
- }
153
- //# sourceMappingURL=manifest-writer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manifest-writer.js","sourceRoot":"","sources":["../../src/setup/manifest-writer.ts"],"names":[],"mappings":"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"}
@@ -1,67 +0,0 @@
1
- /**
2
- * WP-431 S2 — pb-setup state machine (DEC-988, DEC-993, DEC-994).
3
- *
4
- * Pure resolver: given a snapshot of the workspace + per-user activation inputs,
5
- * returns the (phase, role, expectedAction) tuple the pb-setup skill consumes
6
- * to drive its install-to-activation flow. No I/O, no Convex imports — testable
7
- * in isolation.
8
- *
9
- * Phase grammar (DEC-988):
10
- * 1. Surface declaration — manifest.surfaces empty → exit when >=1 surface.
11
- * 2. Local sync — CLI surfaces only; exit when 0 unimported assets.
12
- * 3. Catalog adoption — exit when >=1 catalog adoption (or skip).
13
- * 4. Capture loop — exit when >=10 confirmed entries AND >=2 distinct
14
- * collections AND retrieval-demo confirmed (BR-141).
15
- * 5. Activation — final receipt write; exit on userActivated=true.
16
- * settings — post-activation re-run sub-state.
17
- *
18
- * Role detection (DEC-988):
19
- * - joiner: workspaceMaterialized=true AND userActivated=false
20
- * - creator: otherwise
21
- *
22
- * Surface capability (DEC-993):
23
- * - chat-only surfaces (Cursor Desktop / Claude Desktop) skip Phases 1+2;
24
- * manifest.surfaces is upstream-stamped with ['mcp-only'] so Phase 3 entry
25
- * condition (P2 done OR surface-skipped) is satisfied either way.
26
- *
27
- * Soft-gate (DEC-994):
28
- * - confirmedEntryCount >= 10 but entriesAcrossCollections < 2 → stay in P4
29
- * and emit the diversity-nudge expectedAction.
30
- */
31
- export type SetupPhase = 1 | 2 | 3 | 4 | 5;
32
- export type SetupRole = 'creator' | 'joiner';
33
- export type SurfaceCapability = 'cli' | 'chat-only';
34
- export interface SetupStateInput {
35
- manifest: {
36
- surfaces: string[];
37
- };
38
- assetCounts: {
39
- totalAssets: number;
40
- totalUnimported: number;
41
- hasMore: boolean;
42
- };
43
- catalogAdoptionCount: number;
44
- confirmedEntryCount: number;
45
- entriesAcrossCollections: number;
46
- retrievalDemoConfirmed: boolean;
47
- workspaceMaterialized: boolean;
48
- userActivated: boolean;
49
- surfaceCapability: SurfaceCapability;
50
- }
51
- export interface SetupStateOutput {
52
- phase: SetupPhase | 'settings';
53
- role: SetupRole;
54
- expectedAction: string;
55
- reasonForPhase: string;
56
- isComplete: boolean;
57
- /**
58
- * WP-431 S3 review fix #1: surfaceCapability is surfaced as a structural
59
- * field on the resolver output (was previously a string-grep on
60
- * `reasonForPhase` strings the producer never emits — broken silently).
61
- * The resolver passes the input value straight through; consumers
62
- * (e.g. CLI `recordSetupInvocation`) read this directly.
63
- */
64
- surfaceCapability: SurfaceCapability;
65
- }
66
- export declare function resolveSetupState(input: SetupStateInput): SetupStateOutput;
67
- //# sourceMappingURL=state-machine.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"state-machine.d.ts","sourceRoot":"","sources":["../../src/setup/state-machine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC3C,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAC7C,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,WAAW,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACjC,WAAW,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAChF,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,wBAAwB,EAAE,MAAM,CAAC;IACjC,sBAAsB,EAAE,OAAO,CAAC;IAChC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,EAAE,iBAAiB,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,UAAU,GAAG,UAAU,CAAC;IAC/B,IAAI,EAAE,SAAS,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB;;;;;;OAMG;IACH,iBAAiB,EAAE,iBAAiB,CAAC;CACtC;AAqBD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAoF1E"}
@@ -1,124 +0,0 @@
1
- /**
2
- * WP-431 S2 — pb-setup state machine (DEC-988, DEC-993, DEC-994).
3
- *
4
- * Pure resolver: given a snapshot of the workspace + per-user activation inputs,
5
- * returns the (phase, role, expectedAction) tuple the pb-setup skill consumes
6
- * to drive its install-to-activation flow. No I/O, no Convex imports — testable
7
- * in isolation.
8
- *
9
- * Phase grammar (DEC-988):
10
- * 1. Surface declaration — manifest.surfaces empty → exit when >=1 surface.
11
- * 2. Local sync — CLI surfaces only; exit when 0 unimported assets.
12
- * 3. Catalog adoption — exit when >=1 catalog adoption (or skip).
13
- * 4. Capture loop — exit when >=10 confirmed entries AND >=2 distinct
14
- * collections AND retrieval-demo confirmed (BR-141).
15
- * 5. Activation — final receipt write; exit on userActivated=true.
16
- * settings — post-activation re-run sub-state.
17
- *
18
- * Role detection (DEC-988):
19
- * - joiner: workspaceMaterialized=true AND userActivated=false
20
- * - creator: otherwise
21
- *
22
- * Surface capability (DEC-993):
23
- * - chat-only surfaces (Cursor Desktop / Claude Desktop) skip Phases 1+2;
24
- * manifest.surfaces is upstream-stamped with ['mcp-only'] so Phase 3 entry
25
- * condition (P2 done OR surface-skipped) is satisfied either way.
26
- *
27
- * Soft-gate (DEC-994):
28
- * - confirmedEntryCount >= 10 but entriesAcrossCollections < 2 → stay in P4
29
- * and emit the diversity-nudge expectedAction.
30
- */
31
- const ACTIONS = {
32
- settings: 'User has activated. Settings menu: (1) add/remove surface, (2) re-import drift, (3) browse catalog updates.',
33
- phase1: 'Run pb connect to declare a surface (claude, cursor, codex, copilot, mcp-only). The state machine advances when manifest.surfaces[] is non-empty.',
34
- phase2: 'Run pb setup ingest (or pb setup migrate) to import the local .productbrain/ assets that have not yet been mirrored into Convex. Phase exits at totalUnimported=0.',
35
- phase3: 'Browse the catalog and adopt at least one platform-seeded asset (skill / rule / hook), or skip explicitly. Phase exits at catalogAdoptionCount>=1 or on skip.',
36
- phase4: 'Capture entries with pb capture and commit them. Demonstrate retrieval with pb get / pb orient on your own entry. Phase exits at confirmedEntryCount>=10 AND entriesAcrossCollections>=2 AND retrievalDemoConfirmed=true.',
37
- phase4Diversity: "You have 10 entries but they're all in one collection. Try one entry in a different collection (decision/tension/insight/etc.) before activation.",
38
- phase4Retrieval: 'You have 10+ entries across 2+ collections. Run pb get <ID> or pb orient on one of your own entries to confirm retrieval, then activate.',
39
- phase5: 'Activate your workspace by calling setup.recordActivationReceipt. The receipt closes the install-to-activation flow.',
40
- };
41
- export function resolveSetupState(input) {
42
- const role = computeRole(input);
43
- if (input.userActivated) {
44
- return {
45
- phase: 'settings',
46
- role,
47
- expectedAction: ACTIONS.settings,
48
- reasonForPhase: 'userActivated=true → settings sub-state (post-activation re-run).',
49
- isComplete: true,
50
- surfaceCapability: input.surfaceCapability,
51
- };
52
- }
53
- const surfaceSkipsP1P2 = input.surfaceCapability === 'chat-only';
54
- const isJoiner = role === 'joiner';
55
- const p1Done = input.manifest.surfaces.length >= 1 || surfaceSkipsP1P2;
56
- if (!p1Done && !isJoiner) {
57
- return {
58
- phase: 1,
59
- role,
60
- expectedAction: ACTIONS.phase1,
61
- reasonForPhase: 'manifest.surfaces empty AND surfaceCapability=cli → Phase 1.',
62
- isComplete: false,
63
- surfaceCapability: input.surfaceCapability,
64
- };
65
- }
66
- const p2Skipped = surfaceSkipsP1P2;
67
- const p2Done = p2Skipped || input.assetCounts.totalUnimported === 0;
68
- if (!p2Done) {
69
- return {
70
- phase: 2,
71
- role,
72
- expectedAction: ACTIONS.phase2,
73
- reasonForPhase: `Phase 1 done; assetCounts.totalUnimported=${input.assetCounts.totalUnimported} > 0 → Phase 2.`,
74
- isComplete: false,
75
- surfaceCapability: input.surfaceCapability,
76
- };
77
- }
78
- const p3Skipped = isJoiner;
79
- const p3Done = p3Skipped || input.catalogAdoptionCount >= 1;
80
- if (!p3Done) {
81
- return {
82
- phase: 3,
83
- role,
84
- expectedAction: ACTIONS.phase3,
85
- reasonForPhase: `Phase 2 done${surfaceSkipsP1P2 ? ' (surface-skipped per DEC-993)' : ''}; catalogAdoptionCount=0 → Phase 3.`,
86
- isComplete: false,
87
- surfaceCapability: input.surfaceCapability,
88
- };
89
- }
90
- const enoughEntries = input.confirmedEntryCount >= 10;
91
- const enoughDiversity = input.entriesAcrossCollections >= 2;
92
- const p4Done = enoughEntries && enoughDiversity && input.retrievalDemoConfirmed;
93
- if (!p4Done) {
94
- let action = ACTIONS.phase4;
95
- if (enoughEntries && !enoughDiversity) {
96
- action = ACTIONS.phase4Diversity;
97
- }
98
- else if (enoughEntries && enoughDiversity && !input.retrievalDemoConfirmed) {
99
- action = ACTIONS.phase4Retrieval;
100
- }
101
- return {
102
- phase: 4,
103
- role,
104
- expectedAction: action,
105
- reasonForPhase: `Phase 3 done${p3Skipped ? ' (joiner skip)' : ''}; confirmedEntryCount=${input.confirmedEntryCount} (>=10? ${enoughEntries}), entriesAcrossCollections=${input.entriesAcrossCollections} (>=2? ${enoughDiversity}), retrievalDemoConfirmed=${input.retrievalDemoConfirmed} → Phase 4.`,
106
- isComplete: false,
107
- surfaceCapability: input.surfaceCapability,
108
- };
109
- }
110
- return {
111
- phase: 5,
112
- role,
113
- expectedAction: ACTIONS.phase5,
114
- reasonForPhase: 'Phase 4 exit conditions met (>=10 entries, >=2 collections, retrieval demo confirmed); userActivated=false → Phase 5.',
115
- isComplete: false,
116
- surfaceCapability: input.surfaceCapability,
117
- };
118
- }
119
- function computeRole(input) {
120
- if (input.workspaceMaterialized && !input.userActivated)
121
- return 'joiner';
122
- return 'creator';
123
- }
124
- //# sourceMappingURL=state-machine.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"state-machine.js","sourceRoot":"","sources":["../../src/setup/state-machine.ts"],"names":[],"mappings":"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"}