@productbrain/cli 0.1.0-beta.85 → 0.1.0-beta.88

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 (67) hide show
  1. package/dist/__tests__/hook-intents.test.d.ts +2 -0
  2. package/dist/__tests__/hook-intents.test.d.ts.map +1 -0
  3. package/dist/__tests__/hook-intents.test.js +184 -0
  4. package/dist/__tests__/hook-intents.test.js.map +1 -0
  5. package/dist/__tests__/manifest.test.d.ts +6 -0
  6. package/dist/__tests__/manifest.test.d.ts.map +1 -0
  7. package/dist/__tests__/manifest.test.js +138 -0
  8. package/dist/__tests__/manifest.test.js.map +1 -0
  9. package/dist/__tests__/method-registry.integration.test.d.ts +6 -0
  10. package/dist/__tests__/method-registry.integration.test.d.ts.map +1 -0
  11. package/dist/__tests__/method-registry.integration.test.js +18 -0
  12. package/dist/__tests__/method-registry.integration.test.js.map +1 -0
  13. package/dist/__tests__/method-registry.test.d.ts +14 -0
  14. package/dist/__tests__/method-registry.test.d.ts.map +1 -0
  15. package/dist/__tests__/method-registry.test.js +134 -0
  16. package/dist/__tests__/method-registry.test.js.map +1 -0
  17. package/dist/__tests__/personal-layer.test.d.ts +12 -0
  18. package/dist/__tests__/personal-layer.test.d.ts.map +1 -0
  19. package/dist/__tests__/personal-layer.test.js +304 -0
  20. package/dist/__tests__/personal-layer.test.js.map +1 -0
  21. package/dist/__tests__/surfaces.test.d.ts +2 -0
  22. package/dist/__tests__/surfaces.test.d.ts.map +1 -0
  23. package/dist/__tests__/surfaces.test.js +46 -0
  24. package/dist/__tests__/surfaces.test.js.map +1 -0
  25. package/dist/commands/admin/seed.d.ts.map +1 -1
  26. package/dist/commands/admin/seed.js +6 -0
  27. package/dist/commands/admin/seed.js.map +1 -1
  28. package/dist/commands/connect-screens.js +1 -1
  29. package/dist/commands/connect-screens.js.map +1 -1
  30. package/dist/commands/handshake.d.ts +2 -0
  31. package/dist/commands/handshake.d.ts.map +1 -1
  32. package/dist/commands/handshake.js +117 -32
  33. package/dist/commands/handshake.js.map +1 -1
  34. package/dist/commands/method.d.ts +99 -0
  35. package/dist/commands/method.d.ts.map +1 -0
  36. package/dist/commands/method.js +781 -0
  37. package/dist/commands/method.js.map +1 -0
  38. package/dist/commands/session.js +5 -5
  39. package/dist/commands/session.js.map +1 -1
  40. package/dist/formatters/handshake.d.ts +20 -0
  41. package/dist/formatters/handshake.d.ts.map +1 -1
  42. package/dist/formatters/handshake.js +86 -2
  43. package/dist/formatters/handshake.js.map +1 -1
  44. package/dist/generators/manifest.d.ts +37 -0
  45. package/dist/generators/manifest.d.ts.map +1 -0
  46. package/dist/generators/manifest.js +166 -0
  47. package/dist/generators/manifest.js.map +1 -0
  48. package/dist/generators/portable-knowledge.d.ts +22 -0
  49. package/dist/generators/portable-knowledge.d.ts.map +1 -1
  50. package/dist/generators/portable-knowledge.js +109 -0
  51. package/dist/generators/portable-knowledge.js.map +1 -1
  52. package/dist/index.js +45 -2
  53. package/dist/index.js.map +1 -1
  54. package/dist/lib/hook-intents.d.ts +51 -0
  55. package/dist/lib/hook-intents.d.ts.map +1 -0
  56. package/dist/lib/hook-intents.js +85 -0
  57. package/dist/lib/hook-intents.js.map +1 -0
  58. package/dist/lib/method-registry.d.ts +32 -0
  59. package/dist/lib/method-registry.d.ts.map +1 -0
  60. package/dist/lib/method-registry.js +53 -0
  61. package/dist/lib/method-registry.js.map +1 -0
  62. package/dist/surfaces/registry.d.ts +20 -0
  63. package/dist/surfaces/registry.d.ts.map +1 -0
  64. package/dist/surfaces/registry.js +42 -0
  65. package/dist/surfaces/registry.js.map +1 -0
  66. package/package.json +1 -1
  67. package/templates/method-registry.json +16 -0
@@ -0,0 +1,53 @@
1
+ /**
2
+ * method-registry.ts — load pb method registry (WP-310 E4).
3
+ * Chain-first with bundled fallback. Used during handshake when manifest is present.
4
+ */
5
+ import { readFileSync } from 'fs';
6
+ import { join } from 'path';
7
+ import { fileURLToPath } from 'url';
8
+ // From dist/lib/method-registry.js → ../../templates/ (two levels up: lib → dist → package root)
9
+ // The templates/ directory lives at the package root alongside dist/, not inside dist/.
10
+ // This mirrors the pattern in commands/handshake.ts which also uses __dirname, '..', '..', 'templates'.
11
+ const __dirname = fileURLToPath(new URL('.', import.meta.url));
12
+ const BUNDLED_REGISTRY_PATH = join(__dirname, '..', '..', 'templates', 'method-registry.json');
13
+ const FRESHNESS_DAYS = 7;
14
+ function loadBundled() {
15
+ const raw = readFileSync(BUNDLED_REGISTRY_PATH, 'utf8');
16
+ return JSON.parse(raw);
17
+ }
18
+ function isStaleFn(generatedAt) {
19
+ const generated = new Date(generatedAt).getTime();
20
+ const now = Date.now();
21
+ return now - generated > FRESHNESS_DAYS * 24 * 60 * 60 * 1000;
22
+ }
23
+ /**
24
+ * Load the pb method registry.
25
+ *
26
+ * @param methodSource - from manifest.method_source: 'chain' | 'bundled' | undefined
27
+ * @param chainFetch - function that calls a Chain API endpoint (kernelCall signature)
28
+ *
29
+ * Resolution order:
30
+ * - 'bundled' → skip Chain, load bundled JSON
31
+ * - 'chain' or undefined → try Chain first; on error fall through to bundled
32
+ */
33
+ export async function loadMethodRegistry(methodSource, chainFetch) {
34
+ // Explicitly bundled — skip Chain attempt
35
+ if (methodSource === 'bundled') {
36
+ const registry = loadBundled();
37
+ return { registry, source: 'bundled', stale: isStaleFn(registry.generatedAt) };
38
+ }
39
+ // method_source: 'chain' or undefined — try Chain first
40
+ try {
41
+ const data = await chainFetch('chain.getMethodRegistry', {});
42
+ if (data && typeof data === 'object' && 'methods' in data) {
43
+ return { registry: data, source: 'chain', stale: false };
44
+ }
45
+ }
46
+ catch {
47
+ // Chain unreachable or returned unexpected shape — fall through to bundled
48
+ }
49
+ // Bundled fallback
50
+ const registry = loadBundled();
51
+ return { registry, source: 'bundled', stale: isStaleFn(registry.generatedAt) };
52
+ }
53
+ //# sourceMappingURL=method-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"method-registry.js","sourceRoot":"","sources":["../../src/lib/method-registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAqBpC,iGAAiG;AACjG,wFAAwF;AACxF,wGAAwG;AACxG,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,qBAAqB,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,sBAAsB,CAAC,CAAC;AAC/F,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB,SAAS,WAAW;IAClB,MAAM,GAAG,GAAG,YAAY,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;AAC3C,CAAC;AAED,SAAS,SAAS,CAAC,WAAmB;IACpC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,OAAO,GAAG,GAAG,SAAS,GAAG,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAChE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,YAA6C,EAC7C,UAA2E;IAE3E,0CAA0C;IAC1C,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;IACjF,CAAC;IAED,wDAAwD;IACxD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;QAC7D,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YAC1D,OAAO,EAAE,QAAQ,EAAE,IAAsB,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC7E,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,2EAA2E;IAC7E,CAAC;IAED,mBAAmB;IACnB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;AACjF,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Surface Capability Registry — WP-310 S0 (FEAT-959)
3
+ *
4
+ * Static typed record of per-surface capabilities consumed by E1–E4.
5
+ * INS-740: Cursor and Copilot had confirmed double-fire risk with Claude Code hooks.
6
+ * Their hookEvents arrays MUST be empty in v1. Only 'claude' gets hook events by default.
7
+ */
8
+ export type SurfaceName = 'claude' | 'cursor' | 'copilot' | 'codex';
9
+ export interface SurfaceCapability {
10
+ rulesFormat: 'markdown' | 'mdc';
11
+ skillsFormat: 'markdown' | 'none';
12
+ /** Hook events to project. Empty array = no default hook writes (INS-740 double-fire risk). */
13
+ hookEvents: string[];
14
+ /** Path to the surface's personal config file. */
15
+ hookFilePath: string;
16
+ personalConfigMechanism: 'settings_json' | 'none';
17
+ supportsAgentsMd: boolean;
18
+ }
19
+ export declare const SURFACE_REGISTRY: Record<SurfaceName, SurfaceCapability>;
20
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/surfaces/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpE,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,UAAU,GAAG,KAAK,CAAC;IAChC,YAAY,EAAE,UAAU,GAAG,MAAM,CAAC;IAClC,+FAA+F;IAC/F,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB,EAAE,eAAe,GAAG,MAAM,CAAC;IAClD,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,WAAW,EAAE,iBAAiB,CAiCnE,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Surface Capability Registry — WP-310 S0 (FEAT-959)
3
+ *
4
+ * Static typed record of per-surface capabilities consumed by E1–E4.
5
+ * INS-740: Cursor and Copilot had confirmed double-fire risk with Claude Code hooks.
6
+ * Their hookEvents arrays MUST be empty in v1. Only 'claude' gets hook events by default.
7
+ */
8
+ export const SURFACE_REGISTRY = {
9
+ claude: {
10
+ rulesFormat: 'markdown',
11
+ skillsFormat: 'markdown',
12
+ hookEvents: ['SessionStart', 'Stop', 'PreCompact'],
13
+ hookFilePath: '.claude/settings.json',
14
+ personalConfigMechanism: 'settings_json',
15
+ supportsAgentsMd: false,
16
+ },
17
+ cursor: {
18
+ rulesFormat: 'mdc',
19
+ skillsFormat: 'markdown',
20
+ hookEvents: [], // empty per INS-740 — no default Cursor hook writes
21
+ hookFilePath: '.cursor/settings.json',
22
+ personalConfigMechanism: 'none',
23
+ supportsAgentsMd: false,
24
+ },
25
+ copilot: {
26
+ rulesFormat: 'markdown',
27
+ skillsFormat: 'none',
28
+ hookEvents: [], // empty per INS-740
29
+ hookFilePath: '.github/copilot-instructions.md',
30
+ personalConfigMechanism: 'none',
31
+ supportsAgentsMd: false,
32
+ },
33
+ codex: {
34
+ rulesFormat: 'markdown',
35
+ skillsFormat: 'markdown',
36
+ hookEvents: [],
37
+ hookFilePath: 'AGENTS.md',
38
+ personalConfigMechanism: 'none',
39
+ supportsAgentsMd: true,
40
+ },
41
+ };
42
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/surfaces/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAeH,MAAM,CAAC,MAAM,gBAAgB,GAA2C;IACtE,MAAM,EAAE;QACN,WAAW,EAAE,UAAU;QACvB,YAAY,EAAE,UAAU;QACxB,UAAU,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,CAAC;QAClD,YAAY,EAAE,uBAAuB;QACrC,uBAAuB,EAAE,eAAe;QACxC,gBAAgB,EAAE,KAAK;KACxB;IACD,MAAM,EAAE;QACN,WAAW,EAAE,KAAK;QAClB,YAAY,EAAE,UAAU;QACxB,UAAU,EAAE,EAAE,EAAE,oDAAoD;QACpE,YAAY,EAAE,uBAAuB;QACrC,uBAAuB,EAAE,MAAM;QAC/B,gBAAgB,EAAE,KAAK;KACxB;IACD,OAAO,EAAE;QACP,WAAW,EAAE,UAAU;QACvB,YAAY,EAAE,MAAM;QACpB,UAAU,EAAE,EAAE,EAAE,oBAAoB;QACpC,YAAY,EAAE,iCAAiC;QAC/C,uBAAuB,EAAE,MAAM;QAC/B,gBAAgB,EAAE,KAAK;KACxB;IACD,KAAK,EAAE;QACL,WAAW,EAAE,UAAU;QACvB,YAAY,EAAE,UAAU;QACxB,UAAU,EAAE,EAAE;QACd,YAAY,EAAE,WAAW;QACzB,uBAAuB,EAAE,MAAM;QAC/B,gBAAgB,EAAE,IAAI;KACvB;CACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@productbrain/cli",
3
- "version": "0.1.0-beta.85",
3
+ "version": "0.1.0-beta.88",
4
4
  "description": "Product Brain — Chain knowledge and write-back CLI",
5
5
  "type": "module",
6
6
  "bin": {
@@ -0,0 +1,16 @@
1
+ {
2
+ "version": "1.0",
3
+ "generatedAt": "2026-04-18T00:00:00.000Z",
4
+ "methods": [
5
+ { "name": "session start", "usage": "pb session start", "description": "Open a tracked write session before making changes to the Chain." },
6
+ { "name": "session close", "usage": "pb session close", "description": "Close the current session and prompt for captures." },
7
+ { "name": "capture", "usage": "pb capture \"TYPE: text\"", "description": "Capture a decision (DEC), tension (TEN), insight (INS), or experiment (EXP) as a draft entry." },
8
+ { "name": "orient", "usage": "pb orient --task \"<task>\"", "description": "Get task-relevant governance and context before implementation." },
9
+ { "name": "get", "usage": "pb get <ID>", "description": "Get a full Chain entry by ID (BET, DEC, STD, BR, TEN, etc.)." },
10
+ { "name": "search", "usage": "pb search <query>", "description": "Search entries across the Chain." },
11
+ { "name": "handshake", "usage": "pb handshake", "description": "Refresh generated context files from Chain governance." },
12
+ { "name": "handshake --init", "usage": "pb handshake --init", "description": "Set up Claude Code integration (hooks, permissions, trust level)." },
13
+ { "name": "update", "usage": "pb update <ID> -f \"field=value\"", "description": "Update a Chain entry field." },
14
+ { "name": "context", "usage": "pb context <ID>", "description": "Get constellation context for a Chain entry." }
15
+ ]
16
+ }