@mrpatronz/nexusflow 2.8.0 → 2.9.0

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 (167) hide show
  1. package/README.md +15 -12
  2. package/dist/agent/orchestrator.d.ts.map +1 -1
  3. package/dist/agent/orchestrator.js +8 -0
  4. package/dist/agent/orchestrator.js.map +1 -1
  5. package/dist/commands/commands.test.js +3 -0
  6. package/dist/commands/commands.test.js.map +1 -1
  7. package/dist/commands/doctor.d.ts.map +1 -1
  8. package/dist/commands/doctor.js +2 -0
  9. package/dist/commands/doctor.js.map +1 -1
  10. package/dist/commands/init.d.ts +3 -1
  11. package/dist/commands/init.d.ts.map +1 -1
  12. package/dist/commands/init.js +9 -1
  13. package/dist/commands/init.js.map +1 -1
  14. package/dist/commands/knowledge.d.ts +9 -0
  15. package/dist/commands/knowledge.d.ts.map +1 -1
  16. package/dist/commands/knowledge.js +59 -2
  17. package/dist/commands/knowledge.js.map +1 -1
  18. package/dist/commands/knowledge.test.js +14 -1
  19. package/dist/commands/knowledge.test.js.map +1 -1
  20. package/dist/commands/progress.d.ts +4 -0
  21. package/dist/commands/progress.d.ts.map +1 -0
  22. package/dist/commands/progress.js +33 -0
  23. package/dist/commands/progress.js.map +1 -0
  24. package/dist/commands/refresh.d.ts +1 -0
  25. package/dist/commands/refresh.d.ts.map +1 -1
  26. package/dist/commands/refresh.js +17 -2
  27. package/dist/commands/refresh.js.map +1 -1
  28. package/dist/commands/remote.d.ts +4 -0
  29. package/dist/commands/remote.d.ts.map +1 -0
  30. package/dist/commands/remote.js +28 -0
  31. package/dist/commands/remote.js.map +1 -0
  32. package/dist/commands/status.d.ts.map +1 -1
  33. package/dist/commands/status.js +14 -1
  34. package/dist/commands/status.js.map +1 -1
  35. package/dist/commands/status.test.d.ts +2 -0
  36. package/dist/commands/status.test.d.ts.map +1 -0
  37. package/dist/commands/status.test.js +31 -0
  38. package/dist/commands/status.test.js.map +1 -0
  39. package/dist/core/analysis-cache.d.ts +13 -3
  40. package/dist/core/analysis-cache.d.ts.map +1 -1
  41. package/dist/core/analysis-cache.js +41 -31
  42. package/dist/core/analysis-cache.js.map +1 -1
  43. package/dist/core/analysis-cache.test.js +50 -8
  44. package/dist/core/analysis-cache.test.js.map +1 -1
  45. package/dist/core/doctor.d.ts.map +1 -1
  46. package/dist/core/doctor.js +61 -0
  47. package/dist/core/doctor.js.map +1 -1
  48. package/dist/core/generation-lock.d.ts +58 -0
  49. package/dist/core/generation-lock.d.ts.map +1 -0
  50. package/dist/core/generation-lock.js +233 -0
  51. package/dist/core/generation-lock.js.map +1 -0
  52. package/dist/core/generation-lock.test.d.ts +2 -0
  53. package/dist/core/generation-lock.test.d.ts.map +1 -0
  54. package/dist/core/generation-lock.test.js +134 -0
  55. package/dist/core/generation-lock.test.js.map +1 -0
  56. package/dist/core/isolate.test.js +30 -0
  57. package/dist/core/isolate.test.js.map +1 -1
  58. package/dist/core/knowledge.d.ts +20 -0
  59. package/dist/core/knowledge.d.ts.map +1 -1
  60. package/dist/core/knowledge.js +184 -36
  61. package/dist/core/knowledge.js.map +1 -1
  62. package/dist/core/knowledge.test.js +93 -15
  63. package/dist/core/knowledge.test.js.map +1 -1
  64. package/dist/core/progress.d.ts +21 -0
  65. package/dist/core/progress.d.ts.map +1 -0
  66. package/dist/core/progress.js +40 -0
  67. package/dist/core/progress.js.map +1 -0
  68. package/dist/core/progress.test.d.ts +2 -0
  69. package/dist/core/progress.test.d.ts.map +1 -0
  70. package/dist/core/progress.test.js +52 -0
  71. package/dist/core/progress.test.js.map +1 -0
  72. package/dist/core/refresh.d.ts +5 -0
  73. package/dist/core/refresh.d.ts.map +1 -1
  74. package/dist/core/refresh.js +25 -0
  75. package/dist/core/refresh.js.map +1 -1
  76. package/dist/core/refresh.test.js +20 -0
  77. package/dist/core/refresh.test.js.map +1 -1
  78. package/dist/core/status.d.ts +2 -0
  79. package/dist/core/status.d.ts.map +1 -1
  80. package/dist/core/status.js +6 -1
  81. package/dist/core/status.js.map +1 -1
  82. package/dist/core/sync.d.ts.map +1 -1
  83. package/dist/core/sync.js +22 -1
  84. package/dist/core/sync.js.map +1 -1
  85. package/dist/core/sync.test.js +27 -0
  86. package/dist/core/sync.test.js.map +1 -1
  87. package/dist/core/workspace-git.d.ts +15 -0
  88. package/dist/core/workspace-git.d.ts.map +1 -0
  89. package/dist/core/workspace-git.js +131 -0
  90. package/dist/core/workspace-git.js.map +1 -0
  91. package/dist/core/workspace-git.test.d.ts +2 -0
  92. package/dist/core/workspace-git.test.d.ts.map +1 -0
  93. package/dist/core/workspace-git.test.js +52 -0
  94. package/dist/core/workspace-git.test.js.map +1 -0
  95. package/dist/core/workspace-skills-workflow.integration.test.js +15 -0
  96. package/dist/core/workspace-skills-workflow.integration.test.js.map +1 -1
  97. package/dist/core/workspace.create.test.js +5 -2
  98. package/dist/core/workspace.create.test.js.map +1 -1
  99. package/dist/core/workspace.d.ts.map +1 -1
  100. package/dist/core/workspace.js +11 -6
  101. package/dist/core/workspace.js.map +1 -1
  102. package/dist/generators/antigravity.d.ts.map +1 -1
  103. package/dist/generators/antigravity.js +2 -1
  104. package/dist/generators/antigravity.js.map +1 -1
  105. package/dist/generators/base.d.ts.map +1 -1
  106. package/dist/generators/base.js +5 -3
  107. package/dist/generators/base.js.map +1 -1
  108. package/dist/generators/claude.d.ts.map +1 -1
  109. package/dist/generators/claude.js +4 -1
  110. package/dist/generators/claude.js.map +1 -1
  111. package/dist/generators/codex.d.ts.map +1 -1
  112. package/dist/generators/codex.js +2 -1
  113. package/dist/generators/codex.js.map +1 -1
  114. package/dist/generators/copilot.d.ts.map +1 -1
  115. package/dist/generators/copilot.js +4 -3
  116. package/dist/generators/copilot.js.map +1 -1
  117. package/dist/generators/cursor.d.ts.map +1 -1
  118. package/dist/generators/cursor.js +6 -3
  119. package/dist/generators/cursor.js.map +1 -1
  120. package/dist/generators/index.d.ts +2 -0
  121. package/dist/generators/index.d.ts.map +1 -1
  122. package/dist/generators/index.js +79 -45
  123. package/dist/generators/index.js.map +1 -1
  124. package/dist/generators/knowledge-migration.test.d.ts +2 -0
  125. package/dist/generators/knowledge-migration.test.d.ts.map +1 -0
  126. package/dist/generators/knowledge-migration.test.js +22 -0
  127. package/dist/generators/knowledge-migration.test.js.map +1 -0
  128. package/dist/generators/plan-generator.d.ts.map +1 -1
  129. package/dist/generators/plan-generator.js +18 -9
  130. package/dist/generators/plan-generator.js.map +1 -1
  131. package/dist/generators/plan-generator.test.js +4 -1
  132. package/dist/generators/plan-generator.test.js.map +1 -1
  133. package/dist/gui/assets/{AgentsPage-Bfyu13gc.js → AgentsPage-B4fx43rd.js} +1 -1
  134. package/dist/gui/assets/{DashboardPage-O5wj99kn.js → DashboardPage-DH52G8IG.js} +1 -1
  135. package/dist/gui/assets/{GettingStartedPage-DDWBueC7.js → GettingStartedPage-BlTrQhvi.js} +1 -1
  136. package/dist/gui/assets/{ProjectsPage-NHkXrDM2.js → ProjectsPage-BPVSLPXv.js} +1 -1
  137. package/dist/gui/assets/{ScaffoldRepoInline-Cmqg_s94.js → ScaffoldRepoInline-ywcpq9PX.js} +1 -1
  138. package/dist/gui/assets/{SettingsPage-Cc77HBp7.js → SettingsPage-RQr8SalV.js} +1 -1
  139. package/dist/gui/assets/{SkillsPage-D4CVxwrI.js → SkillsPage-CYoSRrwx.js} +1 -1
  140. package/dist/gui/assets/StartWorkPage-DBKK4lFi.js +1 -0
  141. package/dist/gui/assets/{StrategiesPage-Dn66xfZN.js → StrategiesPage-C36TZgDX.js} +1 -1
  142. package/dist/gui/assets/{WorkspacesPage-BgdoM5Hs.js → WorkspacesPage-DxEONvSq.js} +1 -1
  143. package/dist/gui/assets/{alert-dialog-BYZ7cgWA.js → alert-dialog-CQAX2yRx.js} +1 -1
  144. package/dist/gui/assets/index-BF6pre6G.css +2 -0
  145. package/dist/gui/assets/{index-CoNaATPd.js → index-C_rwnBzF.js} +2 -2
  146. package/dist/gui/assets/{vsc-BTST_4ex.js → vsc-DFh0-53h.js} +1 -1
  147. package/dist/gui/index.html +2 -2
  148. package/dist/index.js +48 -4
  149. package/dist/index.js.map +1 -1
  150. package/dist/mcp/tools.d.ts.map +1 -1
  151. package/dist/mcp/tools.js +19 -8
  152. package/dist/mcp/tools.js.map +1 -1
  153. package/dist/mcp/tools.test.js +15 -0
  154. package/dist/mcp/tools.test.js.map +1 -1
  155. package/dist/resources/materializer.d.ts.map +1 -1
  156. package/dist/resources/materializer.js +11 -3
  157. package/dist/resources/materializer.js.map +1 -1
  158. package/dist/server.d.ts.map +1 -1
  159. package/dist/server.js +22 -3
  160. package/dist/server.js.map +1 -1
  161. package/dist/server.test.js +25 -0
  162. package/dist/server.test.js.map +1 -1
  163. package/dist/types.d.ts +17 -0
  164. package/dist/types.d.ts.map +1 -1
  165. package/package.json +1 -1
  166. package/dist/gui/assets/StartWorkPage-RPZTN3Ui.js +0 -1
  167. package/dist/gui/assets/index-BmH7a-Qy.css +0 -2
@@ -14,6 +14,8 @@ import { getRepoStatus } from '../utils/multi-git.js';
14
14
  import { workspaceFileExists } from './storage.js';
15
15
  import { analyzeAllReposCached } from '../analyzers/index.js';
16
16
  import { findExecutable } from '../agent/cliAvailability.js';
17
+ import { checkGenerationLock } from './generation-lock.js';
18
+ import { readWorkspaceKnowledge } from './knowledge.js';
17
19
  /**
18
20
  * Runs all workspace diagnostics and returns a structured report.
19
21
  *
@@ -64,6 +66,54 @@ export async function runDoctor(workspacePath) {
64
66
  }
65
67
  // ── 2. Analysis (feeds later checks) ───────────────────────────────────
66
68
  const { analysis } = await analyzeAllReposCached(allRepos, workspacePath);
69
+ // Explicit runtime seams complement the package graph. Validate them here so
70
+ // a typo cannot leave a contract pointing at nonexistent evidence.
71
+ if (feature.contracts?.length) {
72
+ const knowledge = await readWorkspaceKnowledge(workspacePath) ?? '';
73
+ const endpointExists = async (value) => {
74
+ if (allRepos.some((repo) => repo.name === value || repo.path === value || path.basename(repo.path) === value)) {
75
+ return true;
76
+ }
77
+ for (const repo of allRepos) {
78
+ try {
79
+ const candidate = path.resolve(repo.path, value);
80
+ const relative = path.relative(repo.path, candidate);
81
+ if (relative.startsWith('..') || path.isAbsolute(relative))
82
+ continue;
83
+ await fs.access(candidate);
84
+ return true;
85
+ }
86
+ catch {
87
+ // Try the next repository root.
88
+ }
89
+ }
90
+ return false;
91
+ };
92
+ for (const contract of feature.contracts) {
93
+ const values = [contract.from, contract.to];
94
+ const invalidPath = values.some((value) => !value || value.includes('..') || path.isAbsolute(value));
95
+ const validEntry = /^\d{4}-\d{2}-\d{2}-[a-z0-9]+(?:-[a-z0-9]+)*$/.test(contract.entry);
96
+ const heading = contract.entry.replace(/^(\d{4}-\d{2}-\d{2})-/, '$1 — ');
97
+ if (invalidPath || !contract.kind || !validEntry) {
98
+ const message = `Invalid explicit contract ${contract.from || '?'} -> ${contract.to || '?'}.`;
99
+ errors.push(message);
100
+ checks.push({ category: 'Explicit Contracts', name: contract.kind || 'contract', status: 'fail', message });
101
+ }
102
+ else if (!(await endpointExists(contract.from)) || !(await endpointExists(contract.to))) {
103
+ const message = `Contract ${contract.from} -> ${contract.to} references a repository or path that does not exist.`;
104
+ errors.push(message);
105
+ checks.push({ category: 'Explicit Contracts', name: contract.kind, status: 'fail', message });
106
+ }
107
+ else if (!knowledge.includes(`### ${heading}`)) {
108
+ const message = `Contract ${contract.from} -> ${contract.to} references missing knowledge entry ${contract.entry}.`;
109
+ warnings.push(message);
110
+ checks.push({ category: 'Explicit Contracts', name: contract.kind, status: 'warn', message });
111
+ }
112
+ else {
113
+ checks.push({ category: 'Explicit Contracts', name: contract.kind, status: 'pass', message: `${contract.from} -> ${contract.to} is backed by ${contract.entry}` });
114
+ }
115
+ }
116
+ }
67
117
  // ── 3. Branch Alignment & Git Status ───────────────────────────────────
68
118
  for (const repo of allRepos) {
69
119
  let branch = 'unknown';
@@ -201,6 +251,7 @@ export async function runDoctor(workspacePath) {
201
251
  { name: 'WORKSPACE.md', exists: () => workspaceFileExists(workspacePath, featureId, 'WORKSPACE.md') },
202
252
  { name: 'nexusflow-knowledge.md', exists: () => workspaceFileExists(workspacePath, featureId, 'nexusflow-knowledge.md') },
203
253
  { name: 'nexusflow-plan.md', exists: () => workspaceFileExists(workspacePath, featureId, 'nexusflow-plan.md') },
254
+ { name: 'nexusflow.lock', exists: async () => fs.access(path.join(workspacePath, 'nexusflow.lock')).then(() => true).catch(() => false) },
204
255
  ];
205
256
  // Per-repo architecture maps are no longer generated — everything they held
206
257
  // came from the repo's package.json — so their absence is not a fault.
@@ -213,6 +264,16 @@ export async function runDoctor(workspacePath) {
213
264
  checks.push({ category: 'Core Artifacts', name: file.name, status: 'warn', message: 'is missing' });
214
265
  }
215
266
  }
267
+ const generation = await checkGenerationLock(workspacePath, { markDocuments: true });
268
+ if (generation.fresh) {
269
+ checks.push({ category: 'Generated Context', name: 'provenance', status: 'pass', message: 'repo snapshot and generated-view hashes match nexusflow.lock' });
270
+ }
271
+ else {
272
+ for (const item of generation.drift) {
273
+ warnings.push(item.message);
274
+ checks.push({ category: 'Generated Context', name: item.name, status: 'warn', message: item.message });
275
+ }
276
+ }
216
277
  const workspaceName = path.basename(workspacePath);
217
278
  const codeWorkspacePath = path.join(workspacePath, `${workspaceName}.code-workspace`);
218
279
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/core/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/core/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @module core/generation-lock
3
+ * Provenance and drift detection for NexusFlow-generated workspace artifacts.
4
+ *
5
+ * The lock is written last, after a complete generation pass. It therefore
6
+ * describes one immutable input/output snapshot rather than whichever files
7
+ * happened to be written before a partial failure.
8
+ */
9
+ import type { RepoInfo } from '../types.js';
10
+ export declare const GENERATION_LOCK_FILE = "nexusflow.lock";
11
+ export declare const GENERATED_VIEW_HEADER = "<!-- AUTO-GENERATED from AGENTS.md \u2014 do not edit -->";
12
+ export declare const GENERATED_SNAPSHOT_HEADER = "<!-- AUTO-GENERATED by NexusFlow from live workspace state \u2014 do not edit -->";
13
+ export interface GenerationRepoState {
14
+ sha: string;
15
+ fingerprint: string;
16
+ }
17
+ export interface GenerationSnapshot {
18
+ generatedAt: string;
19
+ toolVersion: string;
20
+ repos: Record<string, GenerationRepoState>;
21
+ }
22
+ export interface GenerationOutputState {
23
+ hash: string;
24
+ source: string;
25
+ /** Workspace documents use the active storage adapter; resources are local artifacts. */
26
+ location?: 'workspace' | 'local';
27
+ }
28
+ export interface GenerationLock extends GenerationSnapshot {
29
+ schemaVersion: 1;
30
+ outputs: Record<string, GenerationOutputState>;
31
+ }
32
+ export interface GenerationDrift {
33
+ kind: 'missing-lock' | 'tool' | 'repo' | 'output';
34
+ name: string;
35
+ generated?: string;
36
+ current?: string;
37
+ message: string;
38
+ }
39
+ export interface GenerationCheck {
40
+ fresh: boolean;
41
+ lock: GenerationLock | null;
42
+ drift: GenerationDrift[];
43
+ }
44
+ /** Banner text is mutable diagnostic state and is excluded from content hashes. */
45
+ export declare function normalizeGeneratedContent(content: string): string;
46
+ export declare function hashGeneratedContent(content: string | Uint8Array): string;
47
+ export declare function renderFreshnessBanner(snapshot: GenerationSnapshot, drift?: GenerationDrift[]): string;
48
+ export declare function captureGenerationSnapshot(repos: RepoInfo[]): Promise<GenerationSnapshot>;
49
+ export declare function writeGenerationLock(workspacePath: string, snapshot: GenerationSnapshot, outputs: Array<{
50
+ path: string;
51
+ source: string;
52
+ location?: 'workspace' | 'local';
53
+ }>): Promise<GenerationLock>;
54
+ export declare function readGenerationLock(workspacePath: string): Promise<GenerationLock | null>;
55
+ export declare function checkGenerationLock(workspacePath: string, options?: {
56
+ markDocuments?: boolean;
57
+ }): Promise<GenerationCheck>;
58
+ //# sourceMappingURL=generation-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generation-lock.d.ts","sourceRoot":"","sources":["../../src/core/generation-lock.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AACrD,eAAO,MAAM,qBAAqB,8DAAyD,CAAC;AAC5F,eAAO,MAAM,yBAAyB,sFAAiF,CAAC;AAMxH,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,yFAAyF;IACzF,QAAQ,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,cAAe,SAAQ,kBAAkB;IACxD,aAAa,EAAE,CAAC,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAUD,mFAAmF;AACnF,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKjE;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAGzE;AAuBD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,GAAE,eAAe,EAAO,GAC5B,MAAM,CAuBR;AAED,wBAAsB,yBAAyB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkB9F;AAED,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,WAAW,GAAG,OAAO,CAAA;CAAE,CAAC,GACjF,OAAO,CAAC,cAAc,CAAC,CAyBzB;AAED,wBAAsB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAQ9F;AAQD,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,GACxC,OAAO,CAAC,eAAe,CAAC,CAkE1B"}
@@ -0,0 +1,233 @@
1
+ /**
2
+ * @module core/generation-lock
3
+ * Provenance and drift detection for NexusFlow-generated workspace artifacts.
4
+ *
5
+ * The lock is written last, after a complete generation pass. It therefore
6
+ * describes one immutable input/output snapshot rather than whichever files
7
+ * happened to be written before a partial failure.
8
+ */
9
+ import { createHash, randomUUID } from 'node:crypto';
10
+ import * as fs from 'node:fs/promises';
11
+ import * as path from 'node:path';
12
+ import { execa } from 'execa';
13
+ import { getGeneratorVersion, getRepoFingerprint } from './analysis-cache.js';
14
+ import { loadFeatureConfig, resolveRepoInfos } from './workspace.js';
15
+ import { readWorkspaceFile, writeWorkspaceFile } from './storage.js';
16
+ import { resolveFeatureRepoPath } from '../utils/feature.js';
17
+ export const GENERATION_LOCK_FILE = 'nexusflow.lock';
18
+ export const GENERATED_VIEW_HEADER = '<!-- AUTO-GENERATED from AGENTS.md — do not edit -->';
19
+ export const GENERATED_SNAPSHOT_HEADER = '<!-- AUTO-GENERATED by NexusFlow from live workspace state — do not edit -->';
20
+ const BANNER_START = '<!-- NEXUSFLOW:FRESHNESS:START -->';
21
+ const BANNER_END = '<!-- NEXUSFLOW:FRESHNESS:END -->';
22
+ const UNCACHEABLE_FINGERPRINT_PREFIX = 'uncacheable:';
23
+ function assertRelativeOutput(relativePath) {
24
+ const normalized = relativePath.replace(/\\/g, '/');
25
+ if (!normalized || path.isAbsolute(normalized) || normalized.split('/').includes('..')) {
26
+ throw new Error(`Invalid generated output path: ${relativePath}`);
27
+ }
28
+ return normalized;
29
+ }
30
+ /** Banner text is mutable diagnostic state and is excluded from content hashes. */
31
+ export function normalizeGeneratedContent(content) {
32
+ const start = content.indexOf(BANNER_START);
33
+ const end = content.indexOf(BANNER_END);
34
+ if (start < 0 || end < start)
35
+ return content;
36
+ return `${content.slice(0, start)}${BANNER_START}\n${BANNER_END}${content.slice(end + BANNER_END.length)}`;
37
+ }
38
+ export function hashGeneratedContent(content) {
39
+ const retained = typeof content === 'string' ? normalizeGeneratedContent(content) : content;
40
+ return createHash('sha256').update(retained).digest('hex');
41
+ }
42
+ function inferOutputLocation(relativePath) {
43
+ const normalized = relativePath.replace(/\\/g, '/');
44
+ return normalized === '.nexusflow/resources.lock.json' ||
45
+ normalized.startsWith('.agents/skills/') ||
46
+ normalized.startsWith('.claude/skills/') ||
47
+ normalized.startsWith('.codex/agents/')
48
+ ? 'local'
49
+ : 'workspace';
50
+ }
51
+ async function readOutput(workspacePath, featureId, relativePath, location) {
52
+ return location === 'workspace'
53
+ ? readWorkspaceFile(workspacePath, featureId, relativePath)
54
+ : fs.readFile(path.join(workspacePath, relativePath));
55
+ }
56
+ export function renderFreshnessBanner(snapshot, drift = []) {
57
+ const repoSummary = Object.entries(snapshot.repos)
58
+ .map(([name, state]) => `${name}@${state.sha.slice(0, 12)}`)
59
+ .join(', ');
60
+ const unverifiable = Object.entries(snapshot.repos)
61
+ .filter(([, state]) => state.fingerprint.startsWith(UNCACHEABLE_FINGERPRINT_PREFIX))
62
+ .map(([name]) => name);
63
+ const lines = drift.length === 0 && unverifiable.length > 0
64
+ ? [
65
+ '> **⚠ NEXUSFLOW CONTEXT FRESHNESS CANNOT BE VERIFIED.**',
66
+ `> Regenerated from ${unverifiable.join(', ')} with uncommitted files that cannot be safely fingerprinted on this platform.`,
67
+ '> Treat generated facts as provisional; commit the files or verify live state with `nexusflow status`.',
68
+ ]
69
+ : drift.length === 0
70
+ ? [
71
+ '> **NexusFlow snapshot:** ' + (repoSummary || 'no repositories') + `. Verify live state with \`nexusflow refresh --check\`.`,
72
+ ]
73
+ : [
74
+ '> **⚠ STALE NEXUSFLOW CONTEXT — GENERATED FACTS MAY BE WRONG.**',
75
+ ...drift.map((item) => `> ${item.message}`),
76
+ '> Run `nexusflow refresh` before relying on generated facts.',
77
+ ];
78
+ return [BANNER_START, ...lines, BANNER_END].join('\n');
79
+ }
80
+ export async function captureGenerationSnapshot(repos) {
81
+ const states = await Promise.all(repos.map(async (repo) => {
82
+ const [{ stdout }, fingerprint] = await Promise.all([
83
+ execa('git', ['rev-parse', 'HEAD'], { cwd: repo.path }),
84
+ getRepoFingerprint(repo.path),
85
+ ]);
86
+ // A null fingerprint means cache reuse is unsafe, not that generation is
87
+ // impossible. Preserve the generated output with an explicit unverifiable
88
+ // snapshot that always trips the next freshness check.
89
+ const recordedFingerprint = fingerprint ?? `${UNCACHEABLE_FINGERPRINT_PREFIX}${randomUUID()}`;
90
+ return [repo.name, { sha: stdout.trim(), fingerprint: recordedFingerprint }];
91
+ }));
92
+ return {
93
+ generatedAt: new Date().toISOString(),
94
+ toolVersion: getGeneratorVersion(),
95
+ repos: Object.fromEntries(states),
96
+ };
97
+ }
98
+ export async function writeGenerationLock(workspacePath, snapshot, outputs) {
99
+ const feature = await loadFeatureConfig(workspacePath);
100
+ const featureId = feature?.id ?? path.basename(workspacePath);
101
+ const outputEntries = await Promise.all(outputs.map(async (output) => {
102
+ const relativePath = assertRelativeOutput(output.path);
103
+ const location = output.location ?? inferOutputLocation(relativePath);
104
+ const content = await readOutput(workspacePath, featureId, relativePath, location);
105
+ return [relativePath, { hash: hashGeneratedContent(content), source: output.source, location }];
106
+ }));
107
+ const outputState = Object.fromEntries(outputEntries);
108
+ const previous = await readGenerationLock(workspacePath);
109
+ const unchanged = previous?.toolVersion === snapshot.toolVersion &&
110
+ JSON.stringify(previous.repos) === JSON.stringify(snapshot.repos) &&
111
+ JSON.stringify(previous.outputs) === JSON.stringify(outputState);
112
+ const lock = {
113
+ schemaVersion: 1,
114
+ ...snapshot,
115
+ generatedAt: unchanged ? previous.generatedAt : snapshot.generatedAt,
116
+ outputs: outputState,
117
+ };
118
+ const target = path.join(workspacePath, GENERATION_LOCK_FILE);
119
+ const temp = `${target}.tmp-${process.pid}-${randomUUID()}`;
120
+ await fs.writeFile(temp, JSON.stringify(lock, null, 2) + '\n', 'utf-8');
121
+ await fs.rename(temp, target);
122
+ return lock;
123
+ }
124
+ export async function readGenerationLock(workspacePath) {
125
+ try {
126
+ const parsed = JSON.parse(await fs.readFile(path.join(workspacePath, GENERATION_LOCK_FILE), 'utf-8'));
127
+ if (parsed.schemaVersion !== 1 || !parsed.repos || !parsed.outputs)
128
+ return null;
129
+ return parsed;
130
+ }
131
+ catch {
132
+ return null;
133
+ }
134
+ }
135
+ async function currentWorkspaceRepos(workspacePath) {
136
+ const feature = await loadFeatureConfig(workspacePath);
137
+ if (!feature)
138
+ throw new Error(`Workspace manifest not found at ${workspacePath}.`);
139
+ return resolveRepoInfos(feature.repos.map((repo) => resolveFeatureRepoPath(feature, workspacePath, repo)));
140
+ }
141
+ export async function checkGenerationLock(workspacePath, options = {}) {
142
+ const lock = await readGenerationLock(workspacePath);
143
+ if (!lock) {
144
+ return {
145
+ fresh: false,
146
+ lock: null,
147
+ drift: [{ kind: 'missing-lock', name: GENERATION_LOCK_FILE, message: 'nexusflow.lock is missing or invalid.' }],
148
+ };
149
+ }
150
+ const drift = [];
151
+ const currentToolVersion = getGeneratorVersion();
152
+ if (lock.toolVersion !== currentToolVersion) {
153
+ drift.push({
154
+ kind: 'tool',
155
+ name: 'NexusFlow',
156
+ generated: lock.toolVersion,
157
+ current: currentToolVersion,
158
+ message: `Generated with NexusFlow ${lock.toolVersion}; current tool is ${currentToolVersion}.`,
159
+ });
160
+ }
161
+ const repos = await currentWorkspaceRepos(workspacePath);
162
+ const repoDrift = await Promise.all(repos.map(async (repo) => {
163
+ const recorded = lock.repos[repo.name];
164
+ const current = await getRepoFingerprint(repo.path);
165
+ if (!recorded || !current || recorded.fingerprint !== current) {
166
+ const sha = await execa('git', ['rev-parse', 'HEAD'], { cwd: repo.path })
167
+ .then((result) => result.stdout.trim())
168
+ .catch(() => 'unavailable');
169
+ const wasUncacheable = recorded?.fingerprint.startsWith(UNCACHEABLE_FINGERPRINT_PREFIX);
170
+ return {
171
+ kind: 'repo',
172
+ name: repo.name,
173
+ generated: recorded?.sha,
174
+ current: sha,
175
+ message: wasUncacheable
176
+ ? `Generated from ${repo.name}@${recorded?.sha.slice(0, 12) ?? 'unknown'} while dirty-file freshness could not be safely verified on this platform.`
177
+ : `Generated at ${repo.name}@${recorded?.sha.slice(0, 12) ?? 'unknown'}; repo now at ${sha.slice(0, 12)}${current?.includes('+') ? ' with uncommitted changes' : ''}.`,
178
+ };
179
+ }
180
+ return null;
181
+ }));
182
+ drift.push(...repoDrift.filter((item) => item !== null));
183
+ const feature = await loadFeatureConfig(workspacePath);
184
+ const featureId = feature?.id ?? path.basename(workspacePath);
185
+ const outputDrift = await Promise.all(Object.entries(lock.outputs).map(async ([relativePath, output]) => {
186
+ try {
187
+ const safePath = assertRelativeOutput(relativePath);
188
+ const location = output.location ?? inferOutputLocation(safePath);
189
+ const content = await readOutput(workspacePath, featureId, safePath, location);
190
+ const current = hashGeneratedContent(content);
191
+ if (current !== output.hash) {
192
+ return { kind: 'output', name: relativePath, generated: output.hash, current, message: `Generated view ${relativePath} has drifted from its recorded hash.` };
193
+ }
194
+ }
195
+ catch {
196
+ return { kind: 'output', name: relativePath, generated: output.hash, message: `Generated view ${relativePath} is missing.` };
197
+ }
198
+ return null;
199
+ }));
200
+ drift.push(...outputDrift.filter((item) => item !== null));
201
+ if (options.markDocuments && drift.some((item) => item.kind === 'repo' || item.kind === 'tool')) {
202
+ await markFreshnessBanners(workspacePath, lock, drift);
203
+ }
204
+ return { fresh: drift.length === 0, lock, drift };
205
+ }
206
+ async function markFreshnessBanners(workspacePath, snapshot, drift) {
207
+ const banner = renderFreshnessBanner(snapshot, drift.filter((item) => item.kind === 'repo' || item.kind === 'tool'));
208
+ const feature = await loadFeatureConfig(workspacePath);
209
+ const featureId = feature?.id ?? path.basename(workspacePath);
210
+ for (const [relativePath, output] of Object.entries(snapshot.outputs ?? {})) {
211
+ const safePath = assertRelativeOutput(relativePath);
212
+ const location = output.location ?? inferOutputLocation(safePath);
213
+ try {
214
+ const raw = await readOutput(workspacePath, featureId, safePath, location);
215
+ if (typeof raw !== 'string')
216
+ continue;
217
+ const content = raw;
218
+ const start = content.indexOf(BANNER_START);
219
+ const end = content.indexOf(BANNER_END);
220
+ if (start < 0 || end < start)
221
+ continue;
222
+ const updated = `${content.slice(0, start)}${banner}${content.slice(end + BANNER_END.length)}`;
223
+ if (location === 'workspace')
224
+ await writeWorkspaceFile(workspacePath, featureId, safePath, updated);
225
+ else
226
+ await fs.writeFile(path.join(workspacePath, safePath), updated, 'utf-8');
227
+ }
228
+ catch {
229
+ // Missing files are already reported as output drift.
230
+ }
231
+ }
232
+ }
233
+ //# sourceMappingURL=generation-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generation-lock.js","sourceRoot":"","sources":["../../src/core/generation-lock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=generation-lock.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generation-lock.test.d.ts","sourceRoot":"","sources":["../../src/core/generation-lock.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,134 @@
1
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
2
+ import { constants } from 'node:fs';
3
+ import * as fs from 'node:fs/promises';
4
+ import * as os from 'node:os';
5
+ import * as path from 'node:path';
6
+ import fse from 'fs-extra';
7
+ import { execa } from 'execa';
8
+ import { captureGenerationSnapshot, checkGenerationLock, renderFreshnessBanner, writeGenerationLock, } from './generation-lock.js';
9
+ import { getStorageProvider, setActiveStorageProvider } from './adapters/registry.js';
10
+ describe('generation lock', () => {
11
+ let workspacePath;
12
+ let repoPath;
13
+ beforeEach(async () => {
14
+ setActiveStorageProvider(getStorageProvider('local'));
15
+ workspacePath = await fs.mkdtemp(path.join(os.tmpdir(), 'nexusflow-lock-'));
16
+ repoPath = path.join(workspacePath, 'repo');
17
+ await fs.mkdir(repoPath);
18
+ await execa('git', ['init'], { cwd: repoPath });
19
+ await execa('git', ['config', 'user.name', 'NexusFlow Test'], { cwd: repoPath });
20
+ await execa('git', ['config', 'user.email', 'nexusflow-test@local'], { cwd: repoPath });
21
+ await fs.writeFile(path.join(repoPath, 'README.md'), '# repo\n');
22
+ await execa('git', ['add', 'README.md'], { cwd: repoPath });
23
+ await execa('git', ['commit', '-m', 'fixture'], { cwd: repoPath });
24
+ await fs.writeFile(path.join(workspacePath, 'nexusflow.json'), JSON.stringify({
25
+ id: 'lock-test', mode: 'in-place', branchName: 'lock-test', description: 'test',
26
+ repos: [repoPath], assistants: [], workspacePath, createdAt: new Date().toISOString(),
27
+ }));
28
+ });
29
+ afterEach(async () => {
30
+ setActiveStorageProvider(getStorageProvider('local'));
31
+ await fse.remove(workspacePath);
32
+ });
33
+ async function createLock() {
34
+ const repos = [{ name: 'repo', path: repoPath, defaultBranch: 'main' }];
35
+ const snapshot = await captureGenerationSnapshot(repos);
36
+ await fs.writeFile(path.join(workspacePath, 'AGENTS.md'), `${renderFreshnessBanner(snapshot)}\n\n# Test\n`);
37
+ await writeGenerationLock(workspacePath, snapshot, [{ path: 'AGENTS.md', source: 'test' }]);
38
+ }
39
+ it('accepts the exact repo and generated-output snapshot', async () => {
40
+ await createLock();
41
+ await expect(checkGenerationLock(workspacePath)).resolves.toMatchObject({ fresh: true, drift: [] });
42
+ });
43
+ it('retains generatedAt when refresh reproduces the identical snapshot and outputs', async () => {
44
+ await createLock();
45
+ const before = JSON.parse(await fs.readFile(path.join(workspacePath, 'nexusflow.lock'), 'utf-8'));
46
+ const snapshot = await captureGenerationSnapshot([{ name: 'repo', path: repoPath, defaultBranch: 'main' }]);
47
+ snapshot.generatedAt = '2099-01-01T00:00:00.000Z';
48
+ await writeGenerationLock(workspacePath, snapshot, [{ path: 'AGENTS.md', source: 'test' }]);
49
+ const after = JSON.parse(await fs.readFile(path.join(workspacePath, 'nexusflow.lock'), 'utf-8'));
50
+ expect(after.generatedAt).toBe(before.generatedAt);
51
+ });
52
+ it('detects dirty repo state and injects a loud bounded banner', async () => {
53
+ await createLock();
54
+ await fs.writeFile(path.join(repoPath, 'README.md'), '# changed\n');
55
+ const result = await checkGenerationLock(workspacePath, { markDocuments: true });
56
+ expect(result.fresh).toBe(false);
57
+ expect(result.drift).toEqual(expect.arrayContaining([expect.objectContaining({ kind: 'repo', name: 'repo' })]));
58
+ expect(await fs.readFile(path.join(workspacePath, 'AGENTS.md'), 'utf-8')).toContain('STALE NEXUSFLOW CONTEXT');
59
+ });
60
+ it('keeps generation usable when dirty files cannot be safely fingerprinted', async () => {
61
+ await fs.writeFile(path.join(repoPath, 'README.md'), '# dirty\n');
62
+ const snapshot = await captureGenerationSnapshot([
63
+ { name: 'repo', path: repoPath, defaultBranch: 'main' },
64
+ ]);
65
+ if (typeof constants.O_NOFOLLOW === 'number') {
66
+ expect(snapshot.repos.repo.fingerprint).toContain('+');
67
+ expect(renderFreshnessBanner(snapshot)).not.toContain('CANNOT BE VERIFIED');
68
+ }
69
+ else {
70
+ expect(snapshot.repos.repo.fingerprint).toMatch(/^uncacheable:/);
71
+ expect(renderFreshnessBanner(snapshot)).toContain('CANNOT BE VERIFIED');
72
+ }
73
+ });
74
+ it('detects edits outside the mutable freshness banner', async () => {
75
+ await createLock();
76
+ await fs.appendFile(path.join(workspacePath, 'AGENTS.md'), 'manual edit\n');
77
+ const result = await checkGenerationLock(workspacePath);
78
+ expect(result.drift).toEqual(expect.arrayContaining([expect.objectContaining({ kind: 'output', name: 'AGENTS.md' })]));
79
+ });
80
+ it('marks context stale when the generator version changes', async () => {
81
+ await createLock();
82
+ const lockPath = path.join(workspacePath, 'nexusflow.lock');
83
+ const lock = JSON.parse(await fs.readFile(lockPath, 'utf-8'));
84
+ lock.toolVersion = '0.0.0-old';
85
+ await fs.writeFile(lockPath, JSON.stringify(lock, null, 2) + '\n');
86
+ const result = await checkGenerationLock(workspacePath, { markDocuments: true });
87
+ expect(result.drift).toEqual(expect.arrayContaining([expect.objectContaining({ kind: 'tool' })]));
88
+ expect(await fs.readFile(path.join(workspacePath, 'AGENTS.md'), 'utf-8')).toContain('Generated with NexusFlow 0.0.0-old');
89
+ });
90
+ it('hashes local binary resource bytes without UTF-8 replacement collisions', async () => {
91
+ const assetPath = path.join(workspacePath, '.agents', 'skills', 'demo', 'assets', 'sample.bin');
92
+ await fs.mkdir(path.dirname(assetPath), { recursive: true });
93
+ await fs.writeFile(assetPath, Buffer.from([0x80]));
94
+ const snapshot = await captureGenerationSnapshot([{ name: 'repo', path: repoPath, defaultBranch: 'main' }]);
95
+ await writeGenerationLock(workspacePath, snapshot, [{
96
+ path: '.agents/skills/demo/assets/sample.bin',
97
+ source: 'test asset',
98
+ location: 'local',
99
+ }]);
100
+ await fs.writeFile(assetPath, Buffer.from([0x81]));
101
+ const result = await checkGenerationLock(workspacePath);
102
+ expect(result.drift).toEqual(expect.arrayContaining([
103
+ expect.objectContaining({ kind: 'output', name: '.agents/skills/demo/assets/sample.bin' }),
104
+ ]));
105
+ });
106
+ it('reads workspace documents through the active storage adapter', async () => {
107
+ const documents = new Map([['AGENTS.md', '# Adapter context\n']]);
108
+ const adapter = {
109
+ meta: { name: 'memory', displayName: 'Memory', description: 'test', configFields: [] },
110
+ writeWorkspaceFile: async (_workspace, _feature, filename, content) => { documents.set(filename, content); },
111
+ readWorkspaceFile: async (_workspace, _feature, filename) => {
112
+ const content = documents.get(filename);
113
+ if (content === undefined)
114
+ throw new Error('missing');
115
+ return content;
116
+ },
117
+ workspaceFileExists: async (_workspace, _feature, filename) => documents.has(filename),
118
+ resolveWorkspaceFileUrl: (_workspace, _feature, filename) => `memory:${filename}`,
119
+ writeBaseFile: async () => { },
120
+ readBaseFile: async () => '',
121
+ baseFileExists: async () => false,
122
+ resolveBaseFileUrl: () => 'memory:base',
123
+ deleteWorkspace: async () => { },
124
+ };
125
+ setActiveStorageProvider(adapter);
126
+ const snapshot = await captureGenerationSnapshot([{ name: 'repo', path: repoPath, defaultBranch: 'main' }]);
127
+ await writeGenerationLock(workspacePath, snapshot, [{ path: 'AGENTS.md', source: 'test', location: 'workspace' }]);
128
+ await expect(checkGenerationLock(workspacePath)).resolves.toMatchObject({ fresh: true });
129
+ documents.set('AGENTS.md', '# Changed adapter context\n');
130
+ const result = await checkGenerationLock(workspacePath);
131
+ expect(result.drift).toEqual(expect.arrayContaining([expect.objectContaining({ kind: 'output', name: 'AGENTS.md' })]));
132
+ });
133
+ });
134
+ //# sourceMappingURL=generation-lock.test.js.map