@magic-spells/constellation 0.1.1 → 0.2.1

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 (110) hide show
  1. package/README.md +35 -3
  2. package/dist/cli/index.js +75 -7
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/{mcp → core}/git.d.ts +19 -0
  5. package/dist/{mcp → core}/git.js +59 -2
  6. package/dist/core/git.js.map +1 -0
  7. package/dist/core/index.d.ts +1 -0
  8. package/dist/core/index.js +1 -0
  9. package/dist/core/index.js.map +1 -1
  10. package/dist/core/repos.d.ts +40 -0
  11. package/dist/core/repos.js +93 -0
  12. package/dist/core/repos.js.map +1 -0
  13. package/dist/core/sync.d.ts +28 -0
  14. package/dist/core/sync.js +85 -0
  15. package/dist/core/sync.js.map +1 -0
  16. package/dist/core/types.d.ts +12 -0
  17. package/dist/mcp/server.js +313 -28
  18. package/dist/mcp/server.js.map +1 -1
  19. package/dist/serve/server.js +28 -4
  20. package/dist/serve/server.js.map +1 -1
  21. package/docs/001-file-format.md +25 -0
  22. package/docs/002-mcp.md +30 -0
  23. package/package.json +1 -1
  24. package/schemas/plan.json +27 -0
  25. package/skill/SKILL.md +65 -0
  26. package/skill/methodology.md +17 -0
  27. package/skill/types/plan.md +19 -0
  28. package/viewer/dist/assets/{arc-z-d28NWT.js → arc-CMMRgIq9.js} +1 -1
  29. package/viewer/dist/assets/architecture-7EHR7CIX-Cbb-syEI.js +1 -0
  30. package/viewer/dist/assets/{architectureDiagram-3BPJPVTR-CjoeulX0.js → architectureDiagram-3BPJPVTR-CB5p_qlN.js} +1 -1
  31. package/viewer/dist/assets/{blockDiagram-GPEHLZMM-BGlWRy-x.js → blockDiagram-GPEHLZMM-DpnMj_e6.js} +1 -1
  32. package/viewer/dist/assets/{c4Diagram-AAUBKEIU-B09gKF2I.js → c4Diagram-AAUBKEIU-f91ngVN8.js} +1 -1
  33. package/viewer/dist/assets/channel-C2bkEQHQ.js +1 -0
  34. package/viewer/dist/assets/{chunk-2J33WTMH-Cfc4xM5m.js → chunk-2J33WTMH-y7Pz5tMO.js} +1 -1
  35. package/viewer/dist/assets/{chunk-3OPIFGDE-CfJIsbrs.js → chunk-3OPIFGDE-Ir_ghIUQ.js} +1 -1
  36. package/viewer/dist/assets/{chunk-4BX2VUAB-B1J5W5bz.js → chunk-4BX2VUAB-BTPyM1ux.js} +1 -1
  37. package/viewer/dist/assets/{chunk-55IACEB6-Bjg14U7h.js → chunk-55IACEB6-CtNd8e4Y.js} +1 -1
  38. package/viewer/dist/assets/{chunk-5ZQYHXKU-BCvNFwZ5.js → chunk-5ZQYHXKU-Dd3yz721.js} +1 -1
  39. package/viewer/dist/assets/{chunk-727SXJPM-XfiLvG1c.js → chunk-727SXJPM-CAM8mGbv.js} +1 -1
  40. package/viewer/dist/assets/{chunk-AQP2D5EJ-BS-Yzcyy.js → chunk-AQP2D5EJ-C3nW9Uve.js} +1 -1
  41. package/viewer/dist/assets/{chunk-BSJP7CBP-DdbVG_ma.js → chunk-BSJP7CBP-r6MRPvAH.js} +1 -1
  42. package/viewer/dist/assets/{chunk-CSCIHK7Q-C_v3KOxf.js → chunk-CSCIHK7Q-Cn-ZTxsS.js} +1 -1
  43. package/viewer/dist/assets/{chunk-FMBD7UC4-Djdrd8lQ.js → chunk-FMBD7UC4-5axXeZJa.js} +1 -1
  44. package/viewer/dist/assets/{chunk-KSCS5N6A-CLg-rwxg.js → chunk-KSCS5N6A-BwmNx0l0.js} +1 -1
  45. package/viewer/dist/assets/{chunk-L5ZTLDWV-DCOC9Gbq.js → chunk-L5ZTLDWV-C2YNkUjB.js} +1 -1
  46. package/viewer/dist/assets/{chunk-LZXEDZCA-D_cw-C3l.js → chunk-LZXEDZCA-CznuDgQD.js} +2 -2
  47. package/viewer/dist/assets/{chunk-ND2GUHAM-7krqLOpO.js → chunk-ND2GUHAM-CokDnghi.js} +1 -1
  48. package/viewer/dist/assets/{chunk-NZK2D7GU-BHqkidnq.js → chunk-NZK2D7GU-aaU0v4QE.js} +1 -1
  49. package/viewer/dist/assets/{chunk-O5CBEL6O-D953Jfjo.js → chunk-O5CBEL6O-ByfKhkZf.js} +1 -1
  50. package/viewer/dist/assets/chunk-QZHKN3VN-DJRjGeIo.js +1 -0
  51. package/viewer/dist/assets/chunk-WU5MYG2G-C63BVvr_.js +1 -0
  52. package/viewer/dist/assets/{chunk-XPW4576I-tr-y3uUk.js → chunk-XPW4576I-Amo3awtq.js} +1 -1
  53. package/viewer/dist/assets/classDiagram-4FO5ZUOK-z_bO1V-j.js +1 -0
  54. package/viewer/dist/assets/classDiagram-v2-Q7XG4LA2-z_bO1V-j.js +1 -0
  55. package/viewer/dist/assets/{cose-bilkent-S5V4N54A-RHqSF1Fo.js → cose-bilkent-S5V4N54A-CO8yESCW.js} +1 -1
  56. package/viewer/dist/assets/{dagre-BM42HDAG-CaRlC_3n.js → dagre-BM42HDAG-BnmNVNI2.js} +1 -1
  57. package/viewer/dist/assets/{diagram-2AECGRRQ-zBc7NQxu.js → diagram-2AECGRRQ-lcGXcbei.js} +1 -1
  58. package/viewer/dist/assets/{diagram-5GNKFQAL-CdFUltct.js → diagram-5GNKFQAL-Cj3-lPUt.js} +1 -1
  59. package/viewer/dist/assets/{diagram-KO2AKTUF-DKBMUmIp.js → diagram-KO2AKTUF-CtXdRI4M.js} +1 -1
  60. package/viewer/dist/assets/{diagram-LMA3HP47-aj0REjiQ.js → diagram-LMA3HP47-CIyLAzX7.js} +1 -1
  61. package/viewer/dist/assets/{diagram-OG6HWLK6-Bqtmu-Nc.js → diagram-OG6HWLK6-BwF4bQCv.js} +1 -1
  62. package/viewer/dist/assets/{dist-CkpbBMm1.js → dist-DzXuQd4N.js} +1 -1
  63. package/viewer/dist/assets/{erDiagram-TEJ5UH35-_EpsTRRO.js → erDiagram-TEJ5UH35-DjwFw9yq.js} +1 -1
  64. package/viewer/dist/assets/eventmodeling-FCH6USID-BlKFmSzA.js +1 -0
  65. package/viewer/dist/assets/{flowDiagram-I6XJVG4X-ChGqvvgX.js → flowDiagram-I6XJVG4X-CzXbf7vQ.js} +1 -1
  66. package/viewer/dist/assets/{ganttDiagram-6RSMTGT7-BjcMfREp.js → ganttDiagram-6RSMTGT7-BYcIhfmm.js} +1 -1
  67. package/viewer/dist/assets/{gitGraph-WXDBUCRP-DfwN1rQD.js → gitGraph-WXDBUCRP-H8XeJ9QB.js} +1 -1
  68. package/viewer/dist/assets/{gitGraphDiagram-PVQCEYII-ClI7X9vN.js → gitGraphDiagram-PVQCEYII-DtAPXKFK.js} +1 -1
  69. package/viewer/dist/assets/index-Bqs39Itl.css +2 -0
  70. package/viewer/dist/assets/index-DLPCG_Or.js +98 -0
  71. package/viewer/dist/assets/{info-J43DQDTF-CofQIoJ2.js → info-J43DQDTF-BQScorZ0.js} +1 -1
  72. package/viewer/dist/assets/{infoDiagram-5YYISTIA-D2BcKzo_.js → infoDiagram-5YYISTIA-Udl1omvH.js} +1 -1
  73. package/viewer/dist/assets/{ishikawaDiagram-YF4QCWOH-CXw1XdbZ.js → ishikawaDiagram-YF4QCWOH-VnfzT_hk.js} +1 -1
  74. package/viewer/dist/assets/{journeyDiagram-JHISSGLW-3Jhqf-KB.js → journeyDiagram-JHISSGLW-Btn4EVoD.js} +1 -1
  75. package/viewer/dist/assets/{kanban-definition-UN3LZRKU-ClSj7gDE.js → kanban-definition-UN3LZRKU-flOzWhPe.js} +1 -1
  76. package/viewer/dist/assets/{line-DeameHHf.js → line-DJJ9BLuY.js} +1 -1
  77. package/viewer/dist/assets/{linear-BDDnY--V.js → linear-C2SUy5ns.js} +1 -1
  78. package/viewer/dist/assets/{mermaid-parser.core-Cah87FZ1.js → mermaid-parser.core-xhSeYiZo.js} +2 -2
  79. package/viewer/dist/assets/{mermaid.core-lOcajBDU.js → mermaid.core-DmeSIitY.js} +3 -3
  80. package/viewer/dist/assets/{mindmap-definition-RKZ34NQL-CebNj7Vy.js → mindmap-definition-RKZ34NQL-CCJcMKx1.js} +1 -1
  81. package/viewer/dist/assets/{packet-YPE3B663-BlKTjmdv.js → packet-YPE3B663-DS8RscAk.js} +1 -1
  82. package/viewer/dist/assets/{pie-LRSECV5Y-CHjlSKV3.js → pie-LRSECV5Y-I2ZQhrNJ.js} +1 -1
  83. package/viewer/dist/assets/{pieDiagram-4H26LBE5-zWcP8Zx3.js → pieDiagram-4H26LBE5-BS5HMs4j.js} +1 -1
  84. package/viewer/dist/assets/{quadrantDiagram-W4KKPZXB-BSBO8usz.js → quadrantDiagram-W4KKPZXB-W4H8cw2_.js} +1 -1
  85. package/viewer/dist/assets/{radar-GUYGQ44K-BDmaTdGw.js → radar-GUYGQ44K-kf6QvSne.js} +1 -1
  86. package/viewer/dist/assets/{requirementDiagram-4Y6WPE33-C1wh6GaA.js → requirementDiagram-4Y6WPE33-DSbuDQGQ.js} +1 -1
  87. package/viewer/dist/assets/{sankeyDiagram-5OEKKPKP-L3mqPVcH.js → sankeyDiagram-5OEKKPKP-CH8Qr2vL.js} +1 -1
  88. package/viewer/dist/assets/{sequenceDiagram-3UESZ5HK-7vbfvJiz.js → sequenceDiagram-3UESZ5HK-EugVcdad.js} +1 -1
  89. package/viewer/dist/assets/{src-CslsSLVV.js → src-CM_9kdrU.js} +1 -1
  90. package/viewer/dist/assets/{stateDiagram-AJRCARHV-CfEgJmUy.js → stateDiagram-AJRCARHV-DiFl94Qy.js} +1 -1
  91. package/viewer/dist/assets/stateDiagram-v2-BHNVJYJU-BlJV8F13.js +1 -0
  92. package/viewer/dist/assets/{timeline-definition-PNZ67QCA-DMhMwUyE.js → timeline-definition-PNZ67QCA-B0KW9GUN.js} +1 -1
  93. package/viewer/dist/assets/{treeView-BLDUP644-aGCNEij1.js → treeView-BLDUP644-CAEY4mxq.js} +1 -1
  94. package/viewer/dist/assets/{treemap-LRROVOQU-DTgPn5R6.js → treemap-LRROVOQU-VVaEaTlU.js} +1 -1
  95. package/viewer/dist/assets/{vennDiagram-CIIHVFJN-BZygSp3k.js → vennDiagram-CIIHVFJN-BSLGNfJd.js} +1 -1
  96. package/viewer/dist/assets/{wardley-L42UT6IY-BSxi2k9r.js → wardley-L42UT6IY-C-5cXbAU.js} +1 -1
  97. package/viewer/dist/assets/{wardleyDiagram-YWT4CUSO-ZBjbz3Mj.js → wardleyDiagram-YWT4CUSO-COk4TVnQ.js} +1 -1
  98. package/viewer/dist/assets/{xychartDiagram-2RQKCTM6-VFJI2tv3.js → xychartDiagram-2RQKCTM6-CClGJLJp.js} +1 -1
  99. package/viewer/dist/index.html +2 -2
  100. package/dist/mcp/git.js.map +0 -1
  101. package/viewer/dist/assets/architecture-7EHR7CIX-QBvJmJV9.js +0 -1
  102. package/viewer/dist/assets/channel-COWeTobO.js +0 -1
  103. package/viewer/dist/assets/chunk-QZHKN3VN-D7xg9F2p.js +0 -1
  104. package/viewer/dist/assets/chunk-WU5MYG2G-CWG30QUB.js +0 -1
  105. package/viewer/dist/assets/classDiagram-4FO5ZUOK-BsU5cU-N.js +0 -1
  106. package/viewer/dist/assets/classDiagram-v2-Q7XG4LA2-BsU5cU-N.js +0 -1
  107. package/viewer/dist/assets/eventmodeling-FCH6USID-BEUuQhV3.js +0 -1
  108. package/viewer/dist/assets/index-BRID9hB2.js +0 -98
  109. package/viewer/dist/assets/index-CI5JmpBT.css +0 -2
  110. package/viewer/dist/assets/stateDiagram-v2-BHNVJYJU-Dj6oCjNw.js +0 -1
package/README.md CHANGED
@@ -40,6 +40,9 @@ constellation init # scaffold constellation/ with a starter plan.md
40
40
  constellation lint # validate handles, references, folders, schemas
41
41
  constellation mcp # run the MCP server (stdio) for AI agents
42
42
  constellation serve # open the local viewer (editable; --readonly to disable)
43
+ constellation repos # list sibling repos declared in connected_repos
44
+ constellation version # print the CLI version (`v` also works)
45
+ constellation upgrade # npm install -g @magic-spells/constellation@latest
43
46
  ```
44
47
 
45
48
  Lint errors (broken graph: bad handles, dangling structured references,
@@ -55,7 +58,7 @@ unknown fields, dangling prose links) don't block.
55
58
  | `schemas/` | JSON Schemas: `card.json` (reserved keys) + one per type |
56
59
  | `skill/` | AI authoring skill: `SKILL.md` + per-type references with golden examples |
57
60
  | `src/core/` | Parser, reference extraction, indexer, schema validation, lint |
58
- | `src/cli/` | The `constellation` binary (`lint`, `init`, `mcp`) |
61
+ | `src/cli/` | The `constellation` binary (`init`, `lint`, `mcp`, `serve`, `repos`) |
59
62
  | `src/mcp/` | MCP server: hydrated retrieval, validated writes, git tools |
60
63
  | `examples/constellation/` | Golden sample plan — one card of every type, lints clean, doubles as the test fixture |
61
64
 
@@ -79,6 +82,10 @@ npm run build # tsc → dist/
79
82
  Body-only updates never reformat frontmatter.
80
83
  - **Git-powered change tracking**: `diff_plan` (per-card changes since the sync
81
84
  marker), `plan_log`, `set_sync_point`, `check_integrity`.
85
+ - **Connected repos (multi-repo)**: a plan can declare sibling repos
86
+ (`add_connected_repo` / `list_connected_repos` / `remove_connected_repo`); every
87
+ tool takes an optional `repo` selector to read or write a sibling's plan. Omit it
88
+ and single-repo behavior is unchanged.
82
89
  - **Visual viewer**: `start_viewer` / `stop_viewer` open and close the local web
83
90
  viewer from inside an agent session, returning a clickable URL.
84
91
 
@@ -107,6 +114,31 @@ step back and pressure-test the plan for blind spots (missing unhappy paths, aut
107
114
  forgotten cross-cutting concerns) and recommend. The full method is in
108
115
  [`skill/methodology.md`](skill/methodology.md).
109
116
 
117
+ ### Add to Codex
118
+
119
+ Codex CLI keeps MCP servers in `~/.codex/config.toml` (TOML, not JSON). Add it with the CLI:
120
+
121
+ ```sh
122
+ # Run straight from npm — no install needed:
123
+ codex mcp add constellation -- npx -y @magic-spells/constellation mcp
124
+
125
+ # Or, if installed globally (npm i -g @magic-spells/constellation):
126
+ codex mcp add constellation -- constellation mcp
127
+ ```
128
+
129
+ …or hand-edit the config (a project-scoped `.codex/config.toml` also works in trusted repos):
130
+
131
+ ```toml
132
+ [mcp_servers.constellation]
133
+ command = "npx"
134
+ args = ["-y", "@magic-spells/constellation", "mcp"]
135
+ cwd = "/path/to/your/repo" # so the server walks up to your plan
136
+ ```
137
+
138
+ Launch `codex` from your repo root (or set `cwd` above) so the server starts there and finds
139
+ the plan — otherwise tools return `NO_PLAN_FOUND`. Run `/mcp` inside a Codex session to confirm
140
+ it's connected; manage it with `codex mcp list` and `codex mcp remove constellation`.
141
+
110
142
  ### Other MCP clients
111
143
 
112
144
  Hand-edit the client's config (Claude Desktop, a project `.mcp.json`, etc.):
@@ -130,9 +162,9 @@ may not be your project — in which case tools return `NO_PLAN_FOUND`.
130
162
  ## Viewer
131
163
 
132
164
  `constellation serve` renders the plan as a local website, **editable in place**
133
- (pass `--readonly` to disable writes). Eight themes toggle in the header:
165
+ (pass `--readonly` to disable writes). Nine themes toggle in the header:
134
166
  **observatory** (dark, star-field), **claw** (cream paper, serif, coral accents),
135
- **black**, **synthwave**, **sumi**, **daylight**, **frost**, and **ember**.
167
+ **black**, **synthwave**, **sumi**, **daylight**, **frost**, **ember**, and **corona**.
136
168
  Card pages show structured fields, the
137
169
  markdown body, connection chips in both directions, and a small constellation
138
170
  diagram of the card's neighborhood — its nodes tinted by card type. Mermaid blocks
package/dist/cli/index.js CHANGED
@@ -5,11 +5,43 @@ import process from 'node:process';
5
5
  import { Command } from 'commander';
6
6
  import pc from 'picocolors';
7
7
  import { lintPlan } from '../core/lint.js';
8
+ import { listConnectedRepos } from '../core/repos.js';
8
9
  import { resolvePlanDir } from '../core/resolve.js';
9
10
  import { notifyUpdate } from './update-check.js';
10
11
  const require = createRequire(import.meta.url);
11
12
  const { name, version } = require('../../package.json');
12
13
  const program = new Command();
14
+ async function openUrl(url) {
15
+ try {
16
+ const { spawn } = await import('node:child_process');
17
+ const child = process.platform === 'darwin'
18
+ ? spawn('open', [url], { stdio: 'ignore', detached: true })
19
+ : process.platform === 'win32'
20
+ ? spawn('cmd', ['/c', 'start', '', url], {
21
+ stdio: 'ignore',
22
+ detached: true,
23
+ windowsHide: true,
24
+ })
25
+ : spawn('xdg-open', [url], { stdio: 'ignore', detached: true });
26
+ child.on('error', () => { });
27
+ child.unref();
28
+ }
29
+ catch {
30
+ // Opening the browser is best-effort; the server URL is still printed.
31
+ }
32
+ }
33
+ async function upgradeCli() {
34
+ const { spawn } = await import('node:child_process');
35
+ const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm';
36
+ const child = spawn(npm, ['install', '-g', `${name}@latest`], {
37
+ stdio: 'inherit',
38
+ });
39
+ const code = await new Promise((resolve) => {
40
+ child.on('error', () => resolve(1));
41
+ child.on('close', (exitCode) => resolve(exitCode ?? 1));
42
+ });
43
+ process.exit(code);
44
+ }
13
45
  program
14
46
  .name('constellation')
15
47
  .description('Files-first architecture planning for AI-assisted development')
@@ -17,6 +49,20 @@ program
17
49
  // Update notice on every human command, but never for `mcp` (its stdout is JSON-RPC).
18
50
  if (process.argv[2] !== 'mcp')
19
51
  notifyUpdate(name, version);
52
+ for (const command of ['version', 'v']) {
53
+ program
54
+ .command(command)
55
+ .description('Print the Constellation CLI version')
56
+ .action(() => {
57
+ console.log(version);
58
+ });
59
+ }
60
+ program
61
+ .command('upgrade')
62
+ .description('Upgrade the globally installed Constellation CLI with npm')
63
+ .action(async () => {
64
+ await upgradeCli();
65
+ });
20
66
  program
21
67
  .command('lint')
22
68
  .argument('[path]', 'plan folder, or a directory containing constellation/ (default: walk up from cwd)')
@@ -121,14 +167,36 @@ program
121
167
  console.log(`${pc.green('✓')} Constellation viewer at ${pc.underline(url)}`);
122
168
  console.log(pc.dim(` plan: ${root}`));
123
169
  if (opts.open) {
124
- const { spawn } = await import('node:child_process');
125
- const cmd = process.platform === 'darwin'
126
- ? 'open'
127
- : process.platform === 'win32'
128
- ? 'start'
129
- : 'xdg-open';
130
- spawn(cmd, [url], { stdio: 'ignore', detached: true }).unref();
170
+ await openUrl(url);
171
+ }
172
+ });
173
+ program
174
+ .command('repos')
175
+ .argument('[path]', 'plan folder, or a directory containing constellation/ (default: walk up from cwd)')
176
+ .description('List the sibling repos declared in connected_repos')
177
+ .action(async (target) => {
178
+ const root = await resolvePlanDir(target ?? undefined);
179
+ if (!root) {
180
+ console.error(pc.red('No constellation/ folder found.') +
181
+ ' Run `constellation init` to create one.');
182
+ process.exit(2);
183
+ }
184
+ const repos = await listConnectedRepos(root);
185
+ if (repos.length === 0) {
186
+ console.log(pc.dim('No connected repos declared in plan.md (connected_repos).'));
187
+ return;
188
+ }
189
+ for (const r of repos) {
190
+ const status = r.reachable
191
+ ? pc.green('✓ reachable')
192
+ : pc.yellow('• not found here');
193
+ console.log(`${pc.bold(r.name)} ${pc.dim(r.path)} ${status}`);
194
+ if (r.description)
195
+ console.log(` ${r.description}`);
131
196
  }
197
+ console.log();
198
+ console.log(pc.dim(`${repos.length} connected repo${repos.length === 1 ? '' : 's'}. ` +
199
+ 'Paths are relative to this repo; "not found here" just means a different local layout.'));
132
200
  });
133
201
  program.parseAsync(process.argv).catch((err) => {
134
202
  console.error(pc.red(err instanceof Error ? err.message : String(err)));
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -32,3 +32,22 @@ export interface LogEntry {
32
32
  subject: string;
33
33
  }
34
34
  export declare function planLog(planRoot: string, cardRelPath: string, limit?: number): Promise<LogEntry[]>;
35
+ export interface SyncActivity {
36
+ sha: string;
37
+ short_sha: string;
38
+ date: string;
39
+ subject: string;
40
+ cards: string[];
41
+ is_sync_point: boolean;
42
+ }
43
+ /**
44
+ * Recent commits that touched the plan folder, newest first. Each entry lists the
45
+ * plan-card handles it changed and flags sync-point commits (those that moved the
46
+ * .sync.json marker). Derived live from git — the activity log is never stored.
47
+ */
48
+ export declare function recentPlanActivity(planRoot: string, limit?: number): Promise<SyncActivity[]>;
49
+ /**
50
+ * How many commits between `sinceSha` and HEAD touch files OUTSIDE the plan folder
51
+ * — i.e. how far the code has moved since the plan was last reconciled.
52
+ */
53
+ export declare function countCodeCommitsSince(planRoot: string, sinceSha: string): Promise<number>;
@@ -2,8 +2,8 @@ import { execFile } from 'node:child_process';
2
2
  import { readFile, realpath, writeFile } from 'node:fs/promises';
3
3
  import path from 'node:path';
4
4
  import { promisify } from 'node:util';
5
- import { isHandleShaped, typeForHandle } from '../core/handles.js';
6
- import { parseFile } from '../core/parse.js';
5
+ import { isHandleShaped, typeForHandle } from './handles.js';
6
+ import { parseFile } from './parse.js';
7
7
  const exec = promisify(execFile);
8
8
  async function git(cwd, ...args) {
9
9
  const { stdout } = await exec('git', args, {
@@ -169,4 +169,61 @@ export async function planLog(planRoot, cardRelPath, limit = 20) {
169
169
  return { sha, date, subject: subject.join('\t') };
170
170
  });
171
171
  }
172
+ /**
173
+ * Recent commits that touched the plan folder, newest first. Each entry lists the
174
+ * plan-card handles it changed and flags sync-point commits (those that moved the
175
+ * .sync.json marker). Derived live from git — the activity log is never stored.
176
+ */
177
+ export async function recentPlanActivity(planRoot, limit = 6) {
178
+ const realRoot = await realpath(planRoot);
179
+ const repoRoot = await repoRootFor(realRoot);
180
+ const planRel = path.relative(repoRoot, realRoot) || '.';
181
+ // %x1e (record separator) prefixes each commit; %x1f (unit separator) splits the
182
+ // header fields; --name-only then lists that commit's files (scoped to the plan
183
+ // folder) on their own lines. One git call, parsed defensively.
184
+ const out = await git(repoRoot, 'log', `-n${limit}`, '--pretty=format:%x1e%H%x1f%aI%x1f%s', '--name-only', '--', planRel);
185
+ const activity = [];
186
+ for (const record of out.split('\x1e')) {
187
+ if (!record.trim())
188
+ continue;
189
+ const newline = record.indexOf('\n');
190
+ const header = newline === -1 ? record : record.slice(0, newline);
191
+ const [sha, date, subject] = header.split('\x1f');
192
+ if (!sha)
193
+ continue;
194
+ const files = (newline === -1 ? '' : record.slice(newline + 1))
195
+ .split('\n')
196
+ .map((f) => f.trim())
197
+ .filter(Boolean);
198
+ const cards = [];
199
+ let isSyncPoint = false;
200
+ for (const file of files) {
201
+ if (path.basename(file) === SYNC_FILE)
202
+ isSyncPoint = true;
203
+ const handle = handleForRepoPath(file, planRel);
204
+ if (handle && !cards.includes(handle))
205
+ cards.push(handle);
206
+ }
207
+ activity.push({
208
+ sha,
209
+ short_sha: sha.slice(0, 8),
210
+ date: date ?? '',
211
+ subject: subject ?? '',
212
+ cards,
213
+ is_sync_point: isSyncPoint,
214
+ });
215
+ }
216
+ return activity;
217
+ }
218
+ /**
219
+ * How many commits between `sinceSha` and HEAD touch files OUTSIDE the plan folder
220
+ * — i.e. how far the code has moved since the plan was last reconciled.
221
+ */
222
+ export async function countCodeCommitsSince(planRoot, sinceSha) {
223
+ const realRoot = await realpath(planRoot);
224
+ const repoRoot = await repoRootFor(realRoot);
225
+ const planRel = path.relative(repoRoot, realRoot) || '.';
226
+ const out = await git(repoRoot, 'rev-list', '--count', `${sinceSha}..HEAD`, '--', '.', `:(exclude)${planRel}`);
227
+ return Number.parseInt(out.trim(), 10) || 0;
228
+ }
172
229
  //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/core/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAEjC,KAAK,UAAU,GAAG,CAAC,GAAW,EAAE,GAAG,IAAc;IAC/C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;QACzC,GAAG;QACH,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;KAC5B,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB;IAChD,OAAO,CAAC,MAAM,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,SAAS,GAAG,YAAY,CAAC;AAO/B,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB;IAClD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,OAAO,MAAM,EAAE,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,GAAY;IAEZ,MAAM,QAAQ,GAAG,GAAG;QAClB,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;QAChD,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtD,MAAM,KAAK,GAAc;QACvB,UAAU,EAAE,QAAQ;QACpB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IACF,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAC9B,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EACrC,MAAM,CACP,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB;IAC9C,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC;IACzD,MAAM,GAAG,GAAG,MAAM,GAAG,CACnB,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,IAAI,EACJ,OAAO,EACP,aAAa,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAC7C,CAAC;IACF,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAC/B,CAAC;AAmBD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAAgB,EAChB,IAAa,EACb,IAAa;IAEb,2EAA2E;IAC3E,uEAAuE;IACvE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC;IAEzD,IAAI,YAAY,GAAG,IAAI,CAAC;IACxB,IAAI,UAAU,GAA4B,UAAU,CAAC;IACrD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,MAAM,EAAE,CAAC;YACX,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC;YACjC,UAAU,GAAG,aAAa,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,YAAY,GAAG,MAAM,CAAC;YACtB,UAAU,GAAG,MAAM,CAAC;QACtB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;IAC3D,IAAI,IAAI;QAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC;IAE5C,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC;YAAE,SAAS;QAE7E,MAAM,MAAM,GAAe,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;YAC/C,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,MAAM,KAAK,GAAG;gBACd,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,MAAM,KAAK,GAAG;oBACd,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,UAAU,CAAC;QAEnB,MAAM,IAAI,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QACtD,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM;YAAE,SAAS;QAEtB,MAAM,KAAK,GAAe,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACnD,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAClD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,YAAY,IAAI,OAAO,EAAE,CAAC,CAAC;gBAC1E,MAAM,OAAO,GAAG,IAAI;oBAClB,CAAC,CAAC,MAAM,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC;oBACnD,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;gBACzD,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YAC1D,CAAC;YAAC,MAAM,CAAC;gBACP,0EAA0E;YAC5E,CAAC;QACH,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAED,yEAAyE;IACzE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,SAAS,GAAG,MAAM,GAAG,CACzB,QAAQ,EACR,UAAU,EACV,UAAU,EACV,oBAAoB,EACpB,IAAI,EACJ,OAAO,CACR,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC;gBAAE,SAAS;YACzC,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAChD,IAAI,MAAM;gBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,UAAU;QACvB,IAAI,EAAE,IAAI,IAAI,UAAU;QACxB,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACtB,OAAe,EACf,OAAe;IAEf,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC;QACnB,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;QACrC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;KACtC,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CACnC,CAAC,GAAG,EAAE,EAAE,CACN,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAC7C,CAAC;IACF,OAAO;QACL,YAAY;QACZ,YAAY,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE;KAC9D,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,QAA4B,EAAE,OAAe;IAC/D,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAChE,OAAO,OAAO,KAAK,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB,EAAE,OAAe;IAC1D,MAAM,GAAG,GAAG,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC5E,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,cAAc,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzC,OAAO,cAAc,CAAC,MAAM,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACzE,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,QAAgB,EAChB,WAAmB,EACnB,KAAK,GAAG,EAAE;IAEV,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,WAAW,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB,QAAQ,EACR,KAAK,EACL,KAAK,KAAK,EAAE,EACZ,0BAA0B,EAC1B,UAAU,EACV,IAAI,EACJ,QAAQ,CACT,CAAC;IACF,OAAO,MAAM;SACV,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;AACP,CAAC;AAWD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAgB,EAChB,KAAK,GAAG,CAAC;IAET,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC;IACzD,iFAAiF;IACjF,gFAAgF;IAChF,gEAAgE;IAChE,MAAM,GAAG,GAAG,MAAM,GAAG,CACnB,QAAQ,EACR,KAAK,EACL,KAAK,KAAK,EAAE,EACZ,qCAAqC,EACrC,aAAa,EACb,IAAI,EACJ,OAAO,CACR,CAAC;IACF,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,SAAS;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAClE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,KAAK,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;aAC5D,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC,CAAC;QACnB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,SAAS;gBAAE,WAAW,GAAG,IAAI,CAAC;YAC1D,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAChD,IAAI,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5D,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC;YACZ,GAAG;YACH,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAC1B,IAAI,EAAE,IAAI,IAAI,EAAE;YAChB,OAAO,EAAE,OAAO,IAAI,EAAE;YACtB,KAAK;YACL,aAAa,EAAE,WAAW;SAC3B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAAgB,EAChB,QAAgB;IAEhB,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC;IACzD,MAAM,GAAG,GAAG,MAAM,GAAG,CACnB,QAAQ,EACR,UAAU,EACV,SAAS,EACT,GAAG,QAAQ,QAAQ,EACnB,IAAI,EACJ,GAAG,EACH,aAAa,OAAO,EAAE,CACvB,CAAC;IACF,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC"}
@@ -6,3 +6,4 @@ export * from './indexer.js';
6
6
  export * from './validate.js';
7
7
  export * from './lint.js';
8
8
  export * from './writer.js';
9
+ export * from './repos.js';
@@ -6,4 +6,5 @@ export * from './indexer.js';
6
6
  export * from './validate.js';
7
7
  export * from './lint.js';
8
8
  export * from './writer.js';
9
+ export * from './repos.js';
9
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { ConnectedRepo } from './types.js';
2
+ /**
3
+ * Read the connected_repos declared on PLAN-PROJECT (plan.md at the plan root).
4
+ * Returns [] when there is no plan.md, no frontmatter, or no connected_repos.
5
+ * Malformed entries are skipped silently — lint surfaces the schema warning
6
+ * (W002) separately; this reader stays lenient so a broken entry never crashes
7
+ * a resolution that other entries could still satisfy.
8
+ */
9
+ export declare function readConnectedRepos(planRoot: string): Promise<ConnectedRepo[]>;
10
+ export interface ResolvedRepo {
11
+ /** The connected repo's plan root (its constellation/ folder). */
12
+ root: string;
13
+ /** The connected repo's root directory. */
14
+ repoRoot: string;
15
+ /** The connected_repos name when resolved by name; null when resolved by raw path. */
16
+ name: string | null;
17
+ }
18
+ /**
19
+ * Resolve a `repo` selector against a home plan. `nameOrPath` is either the name
20
+ * of a connected_repos entry on the home plan, or a path (relative to the home
21
+ * repo root, or absolute). Returns null when it can't be resolved to a plan.
22
+ */
23
+ export declare function resolveConnectedRepo(homePlanRoot: string, nameOrPath: string): Promise<ResolvedRepo | null>;
24
+ export interface ConnectedRepoStatus extends ConnectedRepo {
25
+ /** Whether the path resolves to an existing plan on this machine. */
26
+ reachable: boolean;
27
+ /** The resolved plan root, or null when unreachable. */
28
+ planRoot: string | null;
29
+ }
30
+ /** The home plan's connected repos, each annotated with use-time reachability. */
31
+ export declare function listConnectedRepos(homePlanRoot: string): Promise<ConnectedRepoStatus[]>;
32
+ /** Upsert an entry by name (replacing any existing entry with the same name). */
33
+ export declare function upsertConnectedRepo(existing: ConnectedRepo[], entry: ConnectedRepo): ConnectedRepo[];
34
+ /** Remove the entry with the given name. */
35
+ export declare function removeConnectedRepoEntry(existing: ConnectedRepo[], name: string): ConnectedRepo[];
36
+ /**
37
+ * Serialize a ConnectedRepo to a plain frontmatter object, omitting an empty
38
+ * description so we never write `description: null` into a card.
39
+ */
40
+ export declare function connectedRepoToFm(repo: ConnectedRepo): Record<string, unknown>;
@@ -0,0 +1,93 @@
1
+ import path from 'node:path';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { parseFile } from './parse.js';
4
+ import { resolvePlanDir } from './resolve.js';
5
+ /**
6
+ * Connected repos are repo-level links declared on PLAN-PROJECT (plan.md).
7
+ * They never become card connections and the indexer never sees them — they
8
+ * are read on demand here, so a connected repo's plan can be resolved and
9
+ * targeted by the `repo` selector without ever merging two plans.
10
+ */
11
+ /** The directory containing the plan folder — the repo root in the normal layout. */
12
+ function repoRootOf(planRoot) {
13
+ return path.dirname(planRoot);
14
+ }
15
+ /**
16
+ * Read the connected_repos declared on PLAN-PROJECT (plan.md at the plan root).
17
+ * Returns [] when there is no plan.md, no frontmatter, or no connected_repos.
18
+ * Malformed entries are skipped silently — lint surfaces the schema warning
19
+ * (W002) separately; this reader stays lenient so a broken entry never crashes
20
+ * a resolution that other entries could still satisfy.
21
+ */
22
+ export async function readConnectedRepos(planRoot) {
23
+ let raw;
24
+ try {
25
+ raw = await readFile(path.join(planRoot, 'plan.md'), 'utf8');
26
+ }
27
+ catch {
28
+ return [];
29
+ }
30
+ const list = parseFile(raw).frontmatter.connected_repos;
31
+ if (!Array.isArray(list))
32
+ return [];
33
+ const repos = [];
34
+ for (const entry of list) {
35
+ if (!entry || typeof entry !== 'object' || Array.isArray(entry))
36
+ continue;
37
+ const e = entry;
38
+ if (typeof e.name !== 'string' || typeof e.path !== 'string')
39
+ continue;
40
+ repos.push({
41
+ name: e.name,
42
+ path: e.path,
43
+ description: typeof e.description === 'string' ? e.description : undefined,
44
+ });
45
+ }
46
+ return repos;
47
+ }
48
+ /** Resolve a path (relative to the home repo root, or absolute) to a plan root, or null. */
49
+ async function resolveRepoPath(homePlanRoot, rawPath) {
50
+ const abs = path.isAbsolute(rawPath)
51
+ ? rawPath
52
+ : path.resolve(repoRootOf(homePlanRoot), rawPath);
53
+ return resolvePlanDir(abs);
54
+ }
55
+ /**
56
+ * Resolve a `repo` selector against a home plan. `nameOrPath` is either the name
57
+ * of a connected_repos entry on the home plan, or a path (relative to the home
58
+ * repo root, or absolute). Returns null when it can't be resolved to a plan.
59
+ */
60
+ export async function resolveConnectedRepo(homePlanRoot, nameOrPath) {
61
+ const byName = (await readConnectedRepos(homePlanRoot)).find((r) => r.name === nameOrPath);
62
+ const root = await resolveRepoPath(homePlanRoot, byName ? byName.path : nameOrPath);
63
+ if (!root)
64
+ return null;
65
+ return { root, repoRoot: repoRootOf(root), name: byName?.name ?? null };
66
+ }
67
+ /** The home plan's connected repos, each annotated with use-time reachability. */
68
+ export async function listConnectedRepos(homePlanRoot) {
69
+ const repos = await readConnectedRepos(homePlanRoot);
70
+ return Promise.all(repos.map(async (r) => {
71
+ const planRoot = await resolveRepoPath(homePlanRoot, r.path);
72
+ return { ...r, reachable: planRoot !== null, planRoot };
73
+ }));
74
+ }
75
+ /** Upsert an entry by name (replacing any existing entry with the same name). */
76
+ export function upsertConnectedRepo(existing, entry) {
77
+ return [...existing.filter((r) => r.name !== entry.name), entry];
78
+ }
79
+ /** Remove the entry with the given name. */
80
+ export function removeConnectedRepoEntry(existing, name) {
81
+ return existing.filter((r) => r.name !== name);
82
+ }
83
+ /**
84
+ * Serialize a ConnectedRepo to a plain frontmatter object, omitting an empty
85
+ * description so we never write `description: null` into a card.
86
+ */
87
+ export function connectedRepoToFm(repo) {
88
+ const out = { name: repo.name, path: repo.path };
89
+ if (repo.description)
90
+ out.description = repo.description;
91
+ return out;
92
+ }
93
+ //# sourceMappingURL=repos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repos.js","sourceRoot":"","sources":["../../src/core/repos.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type SyncActivity, type SyncPoint } from './git.js';
2
+ export type SyncState = 'in-sync' | 'drifted' | 'dirty' | 'never-synced' | 'no-git';
3
+ export interface SyncStatus {
4
+ state: SyncState;
5
+ marker: SyncPoint | null;
6
+ plan_dirty: boolean;
7
+ plan_changes_since_marker: number;
8
+ code_commits_since_marker: number;
9
+ integrity: {
10
+ errors: number;
11
+ warnings: number;
12
+ orphans: number;
13
+ };
14
+ status_rollup: Record<string, number>;
15
+ total_cards: number;
16
+ activity: SyncActivity[];
17
+ }
18
+ /**
19
+ * The plan's freshness/trust state, computed live from git + lint on every call —
20
+ * never stored, so it cannot go stale or lie. Composes the sync marker
21
+ * (.sync.json), working-tree state, drift since the marker, lint integrity, the
22
+ * card-status rollup, and recent plan activity into one glanceable verdict. When
23
+ * the plan isn't in a git repo, returns `state: 'no-git'` (the viewer hides the
24
+ * freshness pill) but still reports the git-independent lint + rollup.
25
+ */
26
+ export declare function computeSyncStatus(planRoot: string, options?: {
27
+ activityLimit?: number;
28
+ }): Promise<SyncStatus>;
@@ -0,0 +1,85 @@
1
+ import { countCodeCommitsSince, diffPlan, planDirty, readSyncPoint, recentPlanActivity, } from './git.js';
2
+ import { lintPlan } from './lint.js';
3
+ const STATUS_KEYS = ['planned', 'building', 'built', 'verified'];
4
+ /**
5
+ * The plan's freshness/trust state, computed live from git + lint on every call —
6
+ * never stored, so it cannot go stale or lie. Composes the sync marker
7
+ * (.sync.json), working-tree state, drift since the marker, lint integrity, the
8
+ * card-status rollup, and recent plan activity into one glanceable verdict. When
9
+ * the plan isn't in a git repo, returns `state: 'no-git'` (the viewer hides the
10
+ * freshness pill) but still reports the git-independent lint + rollup.
11
+ */
12
+ export async function computeSyncStatus(planRoot, options = {}) {
13
+ const lint = await lintPlan(planRoot);
14
+ const orphans = [...lint.index.cards.keys()].filter((h) => (lint.index.connectedHandles.get(h)?.size ?? 0) === 0);
15
+ const status_rollup = { none: 0 };
16
+ for (const key of STATUS_KEYS)
17
+ status_rollup[key] = 0;
18
+ for (const card of lint.index.cards.values()) {
19
+ const key = card.status ?? 'none';
20
+ status_rollup[key] = (status_rollup[key] ?? 0) + 1;
21
+ }
22
+ const base = {
23
+ integrity: {
24
+ errors: lint.errors.length,
25
+ warnings: lint.warnings.length,
26
+ orphans: orphans.length,
27
+ },
28
+ status_rollup,
29
+ total_cards: lint.index.cards.size,
30
+ };
31
+ let marker = null;
32
+ let plan_dirty = false;
33
+ let plan_changes_since_marker = 0;
34
+ let code_commits_since_marker = 0;
35
+ let activity = [];
36
+ try {
37
+ marker = await readSyncPoint(planRoot);
38
+ plan_dirty = await planDirty(planRoot);
39
+ activity = await recentPlanActivity(planRoot, options.activityLimit ?? 6);
40
+ if (marker) {
41
+ try {
42
+ const diff = await diffPlan(planRoot, marker.synced_sha, 'HEAD');
43
+ plan_changes_since_marker = diff.changes.length;
44
+ }
45
+ catch {
46
+ // marker sha unreachable (e.g. rebased history) — leave 0
47
+ }
48
+ try {
49
+ code_commits_since_marker = await countCodeCommitsSince(planRoot, marker.synced_sha);
50
+ }
51
+ catch {
52
+ // ignore — drift count is best-effort
53
+ }
54
+ }
55
+ }
56
+ catch {
57
+ // repoRootFor threw → not a git repo; no freshness signal is available.
58
+ return {
59
+ state: 'no-git',
60
+ marker: null,
61
+ plan_dirty: false,
62
+ plan_changes_since_marker: 0,
63
+ code_commits_since_marker: 0,
64
+ activity: [],
65
+ ...base,
66
+ };
67
+ }
68
+ const state = !marker
69
+ ? 'never-synced'
70
+ : plan_changes_since_marker > 0 || code_commits_since_marker > 0
71
+ ? 'drifted'
72
+ : plan_dirty
73
+ ? 'dirty'
74
+ : 'in-sync';
75
+ return {
76
+ state,
77
+ marker,
78
+ plan_dirty,
79
+ plan_changes_since_marker,
80
+ code_commits_since_marker,
81
+ activity,
82
+ ...base,
83
+ };
84
+ }
85
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/core/sync.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,18 @@ export interface Connection {
29
29
  a: string;
30
30
  b: string;
31
31
  }
32
+ /**
33
+ * A sibling repo declared in PLAN-PROJECT `connected_repos`. A repo-level link
34
+ * only — never a card connection. The path is local topology (relative to the
35
+ * repo root, or absolute) and is never validated by lint.
36
+ */
37
+ export interface ConnectedRepo {
38
+ /** Lowercase id used as the `repo` selector. */
39
+ name: string;
40
+ /** Path to the connected repo's root, relative to this repo's root (or absolute). */
41
+ path: string;
42
+ description?: string;
43
+ }
32
44
  export type Severity = 'error' | 'warning';
33
45
  export interface Issue {
34
46
  severity: Severity;