@mrpatronz/nexusflow 1.9.0 → 2.0.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.
- package/dist/agent/ProviderRegistry.d.ts +12 -1
- package/dist/agent/ProviderRegistry.d.ts.map +1 -1
- package/dist/agent/ProviderRegistry.js.map +1 -1
- package/dist/agent/ProviderRegistry.test.js +1 -0
- package/dist/agent/ProviderRegistry.test.js.map +1 -1
- package/dist/agent/adapters.d.ts +14 -0
- package/dist/agent/adapters.d.ts.map +1 -1
- package/dist/agent/adapters.js +39 -4
- package/dist/agent/adapters.js.map +1 -1
- package/dist/agent/adapters.test.d.ts +2 -0
- package/dist/agent/adapters.test.d.ts.map +1 -0
- package/dist/agent/adapters.test.js +49 -0
- package/dist/agent/adapters.test.js.map +1 -0
- package/dist/agent/cliAvailability.d.ts +48 -0
- package/dist/agent/cliAvailability.d.ts.map +1 -0
- package/dist/agent/cliAvailability.js +112 -0
- package/dist/agent/cliAvailability.js.map +1 -0
- package/dist/agent/cliAvailability.test.d.ts +2 -0
- package/dist/agent/cliAvailability.test.d.ts.map +1 -0
- package/dist/agent/cliAvailability.test.js +105 -0
- package/dist/agent/cliAvailability.test.js.map +1 -0
- package/dist/analyzers/detect-deps.d.ts.map +1 -1
- package/dist/analyzers/detect-deps.js +16 -19
- package/dist/analyzers/detect-deps.js.map +1 -1
- package/dist/analyzers/index.d.ts +0 -2
- package/dist/analyzers/index.d.ts.map +1 -1
- package/dist/analyzers/index.js +6 -9
- package/dist/analyzers/index.js.map +1 -1
- package/dist/commands/commands.test.js +4 -3
- package/dist/commands/commands.test.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/knowledge.d.ts +10 -0
- package/dist/commands/knowledge.d.ts.map +1 -1
- package/dist/commands/knowledge.js +27 -1
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/knowledge.test.d.ts +2 -0
- package/dist/commands/knowledge.test.d.ts.map +1 -0
- package/dist/commands/knowledge.test.js +77 -0
- package/dist/commands/knowledge.test.js.map +1 -0
- package/dist/commands/refresh.d.ts +2 -4
- package/dist/commands/refresh.d.ts.map +1 -1
- package/dist/commands/refresh.js +4 -20
- package/dist/commands/refresh.js.map +1 -1
- package/dist/core/adapters/registry.d.ts.map +1 -1
- package/dist/core/adapters/registry.js +8 -3
- package/dist/core/adapters/registry.js.map +1 -1
- package/dist/core/adapters/storage.test.js +5 -24
- package/dist/core/adapters/storage.test.js.map +1 -1
- package/dist/core/analysis-cache.d.ts +15 -8
- package/dist/core/analysis-cache.d.ts.map +1 -1
- package/dist/core/analysis-cache.js +61 -10
- package/dist/core/analysis-cache.js.map +1 -1
- package/dist/core/analysis-cache.test.js +17 -4
- package/dist/core/analysis-cache.test.js.map +1 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +5 -4
- package/dist/core/config.js.map +1 -1
- package/dist/core/doctor.d.ts.map +1 -1
- package/dist/core/doctor.js +9 -5
- package/dist/core/doctor.js.map +1 -1
- package/dist/core/knowledge.d.ts +14 -4
- package/dist/core/knowledge.d.ts.map +1 -1
- package/dist/core/knowledge.js +64 -14
- package/dist/core/knowledge.js.map +1 -1
- package/dist/core/knowledge.test.js +54 -2
- package/dist/core/knowledge.test.js.map +1 -1
- package/dist/core/locks.d.ts +43 -0
- package/dist/core/locks.d.ts.map +1 -0
- package/dist/core/locks.js +102 -0
- package/dist/core/locks.js.map +1 -0
- package/dist/core/locks.test.d.ts +2 -0
- package/dist/core/locks.test.d.ts.map +1 -0
- package/dist/core/locks.test.js +95 -0
- package/dist/core/locks.test.js.map +1 -0
- package/dist/core/ports/storage.d.ts +3 -3
- package/dist/core/ports/storage.d.ts.map +1 -1
- package/dist/core/refresh.d.ts +12 -13
- package/dist/core/refresh.d.ts.map +1 -1
- package/dist/core/refresh.js +14 -11
- package/dist/core/refresh.js.map +1 -1
- package/dist/core/refresh.test.js +17 -11
- package/dist/core/refresh.test.js.map +1 -1
- package/dist/core/scheduler.d.ts.map +1 -1
- package/dist/core/scheduler.js +2 -65
- package/dist/core/scheduler.js.map +1 -1
- package/dist/core/sync.js +3 -3
- package/dist/core/sync.js.map +1 -1
- package/dist/core/worktree.js +2 -2
- package/dist/core/worktree.js.map +1 -1
- package/dist/core/worktree.test.js +2 -2
- package/dist/core/worktree.test.js.map +1 -1
- package/dist/generators/base.d.ts +31 -2
- package/dist/generators/base.d.ts.map +1 -1
- package/dist/generators/base.js +174 -238
- package/dist/generators/base.js.map +1 -1
- package/dist/generators/base.test.js +231 -24
- package/dist/generators/base.test.js.map +1 -1
- package/dist/generators/claude.d.ts +19 -5
- package/dist/generators/claude.d.ts.map +1 -1
- package/dist/generators/claude.js +33 -11
- package/dist/generators/claude.js.map +1 -1
- package/dist/generators/index.d.ts +10 -9
- package/dist/generators/index.d.ts.map +1 -1
- package/dist/generators/index.js +103 -118
- package/dist/generators/index.js.map +1 -1
- package/dist/generators/plan-generator.d.ts.map +1 -1
- package/dist/generators/plan-generator.js +217 -193
- package/dist/generators/plan-generator.js.map +1 -1
- package/dist/generators/plan-generator.test.d.ts +2 -0
- package/dist/generators/plan-generator.test.d.ts.map +1 -0
- package/dist/generators/plan-generator.test.js +217 -0
- package/dist/generators/plan-generator.test.js.map +1 -0
- package/dist/gui/assets/{DashboardPage-C3NH97y2.js → DashboardPage-HNC3-OP0.js} +1 -1
- package/dist/gui/assets/{GettingStartedPage-og-Kv7Sm.js → GettingStartedPage-Dguoya_Z.js} +1 -1
- package/dist/gui/assets/{ProjectsPage-COqqadEr.js → ProjectsPage-DVR4j4sw.js} +1 -1
- package/dist/gui/assets/{ScaffoldRepoInline-DRipQsos.js → ScaffoldRepoInline-D-2ZeuDK.js} +1 -1
- package/dist/gui/assets/{SettingsPage-CpU3V9oU.js → SettingsPage-Bauo77q3.js} +1 -1
- package/dist/gui/assets/{StartWorkPage-DIND0hJy.js → StartWorkPage-DvuFEa5Y.js} +1 -1
- package/dist/gui/assets/{StrategiesPage-6LWOnKdk.js → StrategiesPage-Cizm0GWk.js} +1 -1
- package/dist/gui/assets/{WorkspacesPage-BUqgOhuy.js → WorkspacesPage-DYOVfZqy.js} +1 -1
- package/dist/gui/assets/{index-CyYbQwRf.js → index-BqeoAIB1.js} +6 -6
- package/dist/gui/index.html +1 -1
- package/dist/index.js +2 -4
- package/dist/index.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +11 -15
- package/dist/mcp/tools.js.map +1 -1
- package/dist/resources/workflows/plan-implement-review.md +8 -0
- package/dist/resources/workflows/research-verify.md +6 -0
- package/dist/resources/workflows/solo-developer.md +3 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1 -2
- package/dist/server.js.map +1 -1
- package/dist/server.test.js +4 -2
- package/dist/server.test.js.map +1 -1
- package/dist/types.d.ts +0 -24
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/prompts.js +2 -2
- package/dist/utils/prompts.js.map +1 -1
- package/dist/utils/resources.d.ts +28 -0
- package/dist/utils/resources.d.ts.map +1 -0
- package/dist/utils/resources.js +54 -0
- package/dist/utils/resources.js.map +1 -0
- package/dist/utils/workflow-advisor.d.ts.map +1 -1
- package/dist/utils/workflow-advisor.js +17 -27
- package/dist/utils/workflow-advisor.js.map +1 -1
- package/dist/utils/workflows.d.ts.map +1 -1
- package/dist/utils/workflows.js +6 -2
- package/dist/utils/workflows.js.map +1 -1
- package/package.json +5 -3
- package/resources/workflows/plan-implement-review.md +8 -0
- package/resources/workflows/research-verify.md +6 -0
- package/resources/workflows/solo-developer.md +3 -0
- package/dist/analyzers/detect-apis.d.ts +0 -19
- package/dist/analyzers/detect-apis.d.ts.map +0 -1
- package/dist/analyzers/detect-apis.js +0 -250
- package/dist/analyzers/detect-apis.js.map +0 -1
- package/dist/analyzers/messaging-analyzer.d.ts +0 -17
- package/dist/analyzers/messaging-analyzer.d.ts.map +0 -1
- package/dist/analyzers/messaging-analyzer.js +0 -229
- package/dist/analyzers/messaging-analyzer.js.map +0 -1
- package/dist/core/adapters/vault-storage.d.ts +0 -16
- package/dist/core/adapters/vault-storage.d.ts.map +0 -1
- package/dist/core/adapters/vault-storage.js +0 -77
- package/dist/core/adapters/vault-storage.js.map +0 -1
- package/dist/core/graph.d.ts +0 -35
- package/dist/core/graph.d.ts.map +0 -1
- package/dist/core/graph.js +0 -281
- package/dist/core/graph.js.map +0 -1
- package/dist/generators/diff-context.d.ts +0 -6
- package/dist/generators/diff-context.d.ts.map +0 -1
- package/dist/generators/diff-context.js +0 -70
- package/dist/generators/diff-context.js.map +0 -1
- package/dist/generators/map-generator.d.ts +0 -15
- package/dist/generators/map-generator.d.ts.map +0 -1
- package/dist/generators/map-generator.js +0 -514
- package/dist/generators/map-generator.js.map +0 -1
- package/dist/generators/map-generator.test.d.ts +0 -2
- package/dist/generators/map-generator.test.d.ts.map +0 -1
- package/dist/generators/map-generator.test.js +0 -147
- package/dist/generators/map-generator.test.js.map +0 -1
|
@@ -3,29 +3,26 @@ import * as fs from 'node:fs/promises';
|
|
|
3
3
|
import * as os from 'node:os';
|
|
4
4
|
import * as path from 'node:path';
|
|
5
5
|
import { buildContextContent } from './base.js';
|
|
6
|
-
/** Minimal ProjectAnalysis with the fields the
|
|
6
|
+
/** Minimal ProjectAnalysis with the fields the context builder reads. */
|
|
7
7
|
function analysisFor(name, repoPath, languages) {
|
|
8
8
|
return {
|
|
9
9
|
name,
|
|
10
10
|
path: repoPath,
|
|
11
11
|
techStack: { languages, frameworks: [], buildTools: [], projectType: 'backend' },
|
|
12
|
-
endpoints: [],
|
|
13
12
|
ports: [],
|
|
14
13
|
existingAIConfigs: [],
|
|
15
14
|
readmeSummary: '',
|
|
16
15
|
};
|
|
17
16
|
}
|
|
18
|
-
describe('buildContextContent
|
|
17
|
+
describe('buildContextContent', () => {
|
|
19
18
|
let dir;
|
|
20
19
|
let nodeRepo;
|
|
21
20
|
let pyRepo;
|
|
22
21
|
beforeAll(async () => {
|
|
23
22
|
dir = await fs.mkdtemp(path.join(os.tmpdir(), 'nexusflow-base-test-'));
|
|
24
|
-
// A Node repo with a detectable dev script.
|
|
25
23
|
nodeRepo = path.join(dir, 'my-web');
|
|
26
24
|
await fs.mkdir(nodeRepo, { recursive: true });
|
|
27
25
|
await fs.writeFile(path.join(nodeRepo, 'package.json'), JSON.stringify({ name: 'my-web', scripts: { dev: 'vite --port 5173' } }), 'utf-8');
|
|
28
|
-
// A Python repo with no runnable service config.
|
|
29
26
|
pyRepo = path.join(dir, 'my-tool');
|
|
30
27
|
await fs.mkdir(pyRepo, { recursive: true });
|
|
31
28
|
});
|
|
@@ -36,7 +33,7 @@ describe('buildContextContent — Verification & Services section', () => {
|
|
|
36
33
|
const base = {
|
|
37
34
|
id: 'feat',
|
|
38
35
|
branchName: 'feat',
|
|
39
|
-
description: '
|
|
36
|
+
description: 'add a discount code to checkout',
|
|
40
37
|
repos: [nodeRepo, pyRepo],
|
|
41
38
|
assistants: ['claude'],
|
|
42
39
|
workspacePath: path.join(dir, 'ws'),
|
|
@@ -55,26 +52,236 @@ describe('buildContextContent — Verification & Services section', () => {
|
|
|
55
52
|
]),
|
|
56
53
|
};
|
|
57
54
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
55
|
+
/** `my-tool` publishes a package `my-web` consumes. */
|
|
56
|
+
function relatedCtx() {
|
|
57
|
+
const ctx = ctxFor({});
|
|
58
|
+
const tool = ctx.analysis.get(pyRepo);
|
|
59
|
+
const web = ctx.analysis.get(nodeRepo);
|
|
60
|
+
tool.produces = [{ name: 'shared-lib', type: 'npm' }];
|
|
61
|
+
web.dependencies = [
|
|
62
|
+
{ name: 'shared-lib', type: 'npm' },
|
|
63
|
+
{ name: 'react', type: 'npm' },
|
|
64
|
+
];
|
|
65
|
+
return ctx;
|
|
66
|
+
}
|
|
67
|
+
describe('what it must say', () => {
|
|
68
|
+
it('leads with the task, because that is what the work is', async () => {
|
|
69
|
+
const content = await buildContextContent(ctxFor({}));
|
|
70
|
+
expect(content.startsWith('# feat')).toBe(true);
|
|
71
|
+
expect(content).toContain('add a discount code to checkout');
|
|
72
|
+
});
|
|
73
|
+
it('gives every repo a location and a verify command in one row', async () => {
|
|
74
|
+
const content = await buildContextContent(ctxFor({}));
|
|
75
|
+
expect(content).toContain('| `my-web` | `my-web` | `npm test` |');
|
|
76
|
+
expect(content).toContain('| `my-tool` | `my-tool` | `pytest` |');
|
|
77
|
+
});
|
|
78
|
+
it('states the cross-repo tie in both directions', async () => {
|
|
79
|
+
// The one thing a single-repo view cannot show, and the reason a
|
|
80
|
+
// multi-repo workspace is worth generating at all.
|
|
81
|
+
const content = await buildContextContent(relatedCtx());
|
|
82
|
+
expect(content).toContain('used by `my-web`');
|
|
83
|
+
expect(content).toContain('needs `my-tool`');
|
|
84
|
+
});
|
|
85
|
+
it('does not invent a dependency from a coincidental name fragment', async () => {
|
|
86
|
+
// `findInterRepoDependencies` had a substring fallback. Its only consumer
|
|
87
|
+
// was a graph nobody read; now it feeds the auto-loaded context file, where
|
|
88
|
+
// a repo called `my-tool` beside one declaring `@babel/my-tool-kit` would
|
|
89
|
+
// manufacture `needs`, `used by` and a start order out of nothing.
|
|
90
|
+
const ctx = ctxFor({});
|
|
91
|
+
ctx.analysis.get(pyRepo).produces = [
|
|
92
|
+
{ name: 'my-tool', type: 'npm' },
|
|
93
|
+
];
|
|
94
|
+
ctx.analysis.get(nodeRepo).dependencies = [
|
|
95
|
+
{ name: '@babel/my-tool-kit', type: 'npm' },
|
|
96
|
+
{ name: 'my-tooling', type: 'npm' },
|
|
97
|
+
];
|
|
98
|
+
const content = await buildContextContent(ctx);
|
|
99
|
+
expect(content).not.toContain('needs `');
|
|
100
|
+
expect(content).not.toContain('used by `');
|
|
101
|
+
expect(content).not.toContain('Start with');
|
|
102
|
+
});
|
|
103
|
+
it('names where to start, and orders the rows to match', async () => {
|
|
104
|
+
const content = await buildContextContent(relatedCtx());
|
|
105
|
+
expect(content).toContain('Start with `my-tool`');
|
|
106
|
+
expect(content.indexOf('| `my-tool` |')).toBeLessThan(content.indexOf('| `my-web` |'));
|
|
107
|
+
});
|
|
108
|
+
it('does not name a starting repo that nothing builds on', async () => {
|
|
109
|
+
// The old test was "does any repo anywhere have a dependency", so a
|
|
110
|
+
// workspace whose first repo is independent still got "Start with `x` —
|
|
111
|
+
// the others build on it" directly under x's own all-dashes row.
|
|
112
|
+
const ctx = relatedCtx();
|
|
113
|
+
const alpha = path.join(dir, 'alpha');
|
|
114
|
+
ctx.repos = [{ name: 'alpha', path: alpha, defaultBranch: 'main' }, ...ctx.repos];
|
|
115
|
+
ctx.analysis.set(alpha, analysisFor('alpha', alpha, ['typescript']));
|
|
116
|
+
const content = await buildContextContent(ctx);
|
|
117
|
+
expect(content).not.toContain('Start with `alpha`');
|
|
118
|
+
expect(content).toContain('Start with `my-tool`');
|
|
119
|
+
});
|
|
120
|
+
it('surfaces hand-entered commands, which no manifest states', async () => {
|
|
121
|
+
// The only reader of feature.resumption was deleted as dead code, while
|
|
122
|
+
// the create API still accepted and persisted these.
|
|
123
|
+
const ctx = ctxFor({});
|
|
124
|
+
ctx.feature.resumption = {
|
|
125
|
+
testCommand: 'npm run verify:all',
|
|
126
|
+
mockCommand: 'docker compose up -d',
|
|
127
|
+
startCommand: 'npm run dev:all',
|
|
128
|
+
};
|
|
129
|
+
const content = await buildContextContent(ctx);
|
|
130
|
+
expect(content).toContain('npm run verify:all');
|
|
131
|
+
expect(content).toContain('docker compose up -d');
|
|
132
|
+
expect(content).toContain('npm run dev:all');
|
|
133
|
+
});
|
|
134
|
+
it('says nothing about custom commands when none were entered', async () => {
|
|
135
|
+
const content = await buildContextContent(ctxFor({}));
|
|
136
|
+
expect(content).not.toContain('Commands recorded for this workspace');
|
|
137
|
+
});
|
|
138
|
+
it('keeps the worktree rule, which is not inferable', async () => {
|
|
139
|
+
const content = await buildContextContent(ctxFor({}));
|
|
140
|
+
expect(content).toContain('Do not edit the original repositories elsewhere on disk');
|
|
141
|
+
expect(content).toContain('`feat`');
|
|
142
|
+
});
|
|
143
|
+
it('points at the other files rather than inlining them', async () => {
|
|
144
|
+
const content = await buildContextContent(ctxFor({}));
|
|
145
|
+
expect(content).toContain('nexusflow-knowledge.md');
|
|
146
|
+
expect(content).toContain('nexusflow-plan.md');
|
|
147
|
+
});
|
|
148
|
+
it('does not send the agent to read derived facts it could grep', async () => {
|
|
149
|
+
// The architecture map restated the repo's package.json, and the branch
|
|
150
|
+
// diff was `git diff --name-only` with absolute file:/// URLs. Both were
|
|
151
|
+
// pointed at ahead of any real work.
|
|
152
|
+
const content = await buildContextContent(ctxFor({}));
|
|
153
|
+
expect(content).not.toContain('nexusflow-map');
|
|
154
|
+
expect(content).not.toContain('.nexusflow/base');
|
|
155
|
+
expect(content).not.toContain('nexusflow-diff-context');
|
|
156
|
+
});
|
|
157
|
+
it('tells the agent to search the knowledge file, not read it whole', async () => {
|
|
158
|
+
// It reached 38 KB on a real workspace — about 9,500 tokens — while the
|
|
159
|
+
// pointer said "skim the headings", which costs the entire file to do.
|
|
160
|
+
const content = await buildContextContent(ctxFor({}));
|
|
161
|
+
expect(content).toContain('`###` heading');
|
|
162
|
+
expect(content).toContain('not the whole file');
|
|
163
|
+
});
|
|
164
|
+
it('names repos that carry their own instructions, which override these', async () => {
|
|
165
|
+
const ctx = ctxFor({});
|
|
166
|
+
ctx.analysis.get(nodeRepo).existingAIConfigs = [
|
|
167
|
+
{ relativePath: 'CLAUDE.md', assistant: 'claude' },
|
|
168
|
+
];
|
|
169
|
+
const content = await buildContextContent(ctx);
|
|
170
|
+
expect(content).toContain('take precedence');
|
|
171
|
+
expect(content).toContain('`my-web` (CLAUDE.md)');
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
describe('what it must NOT say', () => {
|
|
175
|
+
// Two independent agents evaluating a generated workspace used none of this,
|
|
176
|
+
// and it is where a wrong claim appeared: "Build tools: none detected" for a
|
|
177
|
+
// repo whose package.json has "build": "tsc". Anything a manifest already
|
|
178
|
+
// states is better read from the manifest, where it cannot go stale.
|
|
179
|
+
it('omits per-repo tech-stack metadata, which is derivable and went stale', async () => {
|
|
180
|
+
const content = await buildContextContent(ctxFor({}));
|
|
181
|
+
for (const label of ['**Type**', '**Languages**', '**Frameworks**', '**Build tools**', '**Ports**']) {
|
|
182
|
+
expect(content, label).not.toContain(label);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
it('omits First Steps, which told the agent to stop and ask for approval', async () => {
|
|
186
|
+
const content = await buildContextContent(ctxFor({}));
|
|
187
|
+
expect(content).not.toContain('First Steps');
|
|
188
|
+
expect(content).not.toContain('Obtain Approval');
|
|
189
|
+
expect(content).not.toContain('before writing any code');
|
|
190
|
+
});
|
|
191
|
+
it('omits absolute file:/// links, which were 24% of the old file', async () => {
|
|
192
|
+
const content = await buildContextContent(ctxFor({}));
|
|
193
|
+
expect(content).not.toContain('file:///');
|
|
194
|
+
});
|
|
195
|
+
it('omits the git and npm advice any assistant already follows', async () => {
|
|
196
|
+
const content = await buildContextContent(ctxFor({}));
|
|
197
|
+
expect(content).not.toContain('git status');
|
|
198
|
+
expect(content).not.toContain('npm install');
|
|
199
|
+
expect(content).not.toContain('**Instruction**');
|
|
200
|
+
});
|
|
201
|
+
it('says nothing about relationships or ordering when there are none', async () => {
|
|
202
|
+
// An empty "needs: none" column and a start hint that asserts a
|
|
203
|
+
// non-existent dependency would both be worse than silence.
|
|
204
|
+
const content = await buildContextContent(ctxFor({}));
|
|
205
|
+
expect(content).not.toContain('needs `');
|
|
206
|
+
expect(content).not.toContain('used by `');
|
|
207
|
+
expect(content).not.toContain('Start with');
|
|
208
|
+
});
|
|
67
209
|
});
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
210
|
+
describe('size', () => {
|
|
211
|
+
it('stays small enough not to crowd the context window', async () => {
|
|
212
|
+
// The docs advise under 200 lines because longer files reduce adherence,
|
|
213
|
+
// not merely cost tokens. Two repos should be nowhere near that.
|
|
214
|
+
const content = await buildContextContent(relatedCtx());
|
|
215
|
+
expect(content.split('\n').length).toBeLessThan(40);
|
|
216
|
+
expect(content.length).toBeLessThan(1600);
|
|
217
|
+
});
|
|
73
218
|
});
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
219
|
+
describe('in-place mode', () => {
|
|
220
|
+
it('gives absolute paths and each repo branch, which vary per repo', async () => {
|
|
221
|
+
const ctx = ctxFor({ mode: 'in-place' });
|
|
222
|
+
ctx.feature.repoBranches = { 'my-web': 'existing-feature' };
|
|
223
|
+
const content = await buildContextContent(ctx);
|
|
224
|
+
expect(content).toContain(nodeRepo);
|
|
225
|
+
expect(content).toContain('(on existing-feature)');
|
|
226
|
+
expect(content).toContain('NexusFlow does not manage branches here');
|
|
227
|
+
expect(content).not.toContain('Do not edit the original repositories');
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
describe('robustness', () => {
|
|
231
|
+
it('keeps both repos when two share a basename', async () => {
|
|
232
|
+
// In-place workspaces can hold /org1/api and /org2/api. Ordering keyed by
|
|
233
|
+
// name collapsed them and one row vanished from the table with no error.
|
|
234
|
+
const ctx = ctxFor({ mode: 'in-place' });
|
|
235
|
+
const other = path.join(dir, 'org2', 'my-web');
|
|
236
|
+
ctx.repos = [
|
|
237
|
+
{ name: 'my-web', path: nodeRepo, defaultBranch: 'main' },
|
|
238
|
+
{ name: 'my-web', path: other, defaultBranch: 'main' },
|
|
239
|
+
];
|
|
240
|
+
ctx.feature.repos = [nodeRepo, other];
|
|
241
|
+
const content = await buildContextContent(ctx);
|
|
242
|
+
expect(content).toContain(nodeRepo);
|
|
243
|
+
expect(content).toContain(other);
|
|
244
|
+
expect(content.split('\n').filter((l) => l.startsWith('| `my-web`')).length).toBe(2);
|
|
245
|
+
});
|
|
246
|
+
it('survives an analysis with no dependency list rather than throwing', async () => {
|
|
247
|
+
await expect(buildContextContent(ctxFor({}))).resolves.toContain('## Repos');
|
|
248
|
+
});
|
|
249
|
+
it('still lists repos when there is no analysis at all', async () => {
|
|
250
|
+
const ctx = ctxFor({});
|
|
251
|
+
ctx.analysis = undefined;
|
|
252
|
+
const content = await buildContextContent(ctx);
|
|
253
|
+
expect(content).toContain('`my-web`');
|
|
254
|
+
expect(content).toContain('`my-tool`');
|
|
255
|
+
});
|
|
256
|
+
it('says the workspace is empty rather than heading an empty table', async () => {
|
|
257
|
+
// A table header over no rows followed by "Each repo above is a separate
|
|
258
|
+
// git worktree" describes nothing at all.
|
|
259
|
+
const ctx = ctxFor({});
|
|
260
|
+
ctx.repos = [];
|
|
261
|
+
ctx.feature.repos = [];
|
|
262
|
+
const content = await buildContextContent(ctx);
|
|
263
|
+
expect(content).toContain('no repositories yet');
|
|
264
|
+
expect(content).not.toContain('| Repo |');
|
|
265
|
+
expect(content).not.toContain('Each repo above');
|
|
266
|
+
});
|
|
267
|
+
it('names own-instruction repos only from this workspace', async () => {
|
|
268
|
+
// The list walked the analysis map, so an entry for a repo outside this
|
|
269
|
+
// workspace could put its name in the generated file.
|
|
270
|
+
const ctx = ctxFor({});
|
|
271
|
+
const stranger = path.join(dir, 'not-in-this-workspace');
|
|
272
|
+
const strayAnalysis = analysisFor('stranger', stranger, ['typescript']);
|
|
273
|
+
strayAnalysis.existingAIConfigs = [
|
|
274
|
+
{ relativePath: 'CLAUDE.md', assistant: 'claude' },
|
|
275
|
+
];
|
|
276
|
+
ctx.analysis.set(stranger, strayAnalysis);
|
|
277
|
+
const content = await buildContextContent(ctx);
|
|
278
|
+
expect(content).not.toContain('stranger');
|
|
279
|
+
});
|
|
280
|
+
it('carries the teamwork strategy when one was chosen', async () => {
|
|
281
|
+
const content = await buildContextContent(ctxFor({ teamworkInstructions: '# Plan then implement' }));
|
|
282
|
+
expect(content).toContain('How to work together');
|
|
283
|
+
expect(content).toContain('Plan then implement');
|
|
284
|
+
});
|
|
78
285
|
});
|
|
79
286
|
});
|
|
80
287
|
//# sourceMappingURL=base.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.test.js","sourceRoot":"","sources":["../../src/generators/base.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"base.test.js","sourceRoot":"","sources":["../../src/generators/base.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module generators/claude
|
|
3
|
-
* Generates
|
|
4
|
-
*
|
|
3
|
+
* Generates `CLAUDE.md` as a thin import of the canonical `AGENTS.md`.
|
|
4
|
+
*
|
|
5
|
+
* Claude Code reads `CLAUDE.md`, not `AGENTS.md` — but its documented pattern for
|
|
6
|
+
* a repo that already has `AGENTS.md` is a `CLAUDE.md` that imports it, "so both
|
|
7
|
+
* tools read the same instructions without duplicating them".
|
|
8
|
+
*
|
|
9
|
+
* The import costs nothing: `@path` files are expanded into context at launch,
|
|
10
|
+
* so this is an include rather than a link — Claude gets the full body without a
|
|
11
|
+
* tool call. That is what makes `AGENTS.md` the single source of truth while
|
|
12
|
+
* still being read by the one tool that will not look at it.
|
|
13
|
+
*
|
|
14
|
+
* A symlink would also work, but creating one on Windows needs Administrator
|
|
15
|
+
* rights or Developer Mode, so the import is the portable choice.
|
|
5
16
|
*/
|
|
6
17
|
import type { WorkspaceContext } from '../types.js';
|
|
7
18
|
/**
|
|
8
|
-
*
|
|
19
|
+
* Writes a `CLAUDE.md` that imports `AGENTS.md`, plus anything Claude-specific.
|
|
9
20
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
21
|
+
* Written through the storage layer, like `AGENTS.md` — not with a raw path join.
|
|
22
|
+
* The two must land in the same directory or the import resolves to nothing, and
|
|
23
|
+
* an unresolved `@`-import is silent: Claude Code would start with no workspace
|
|
24
|
+
* context and no error. Routing both through one writer is what keeps them
|
|
25
|
+
* together no matter which backend is active.
|
|
12
26
|
*
|
|
13
27
|
* @param ctx - The workspace context (feature + repos + analysis).
|
|
14
28
|
* @param workspacePath - Absolute path to the workspace root directory.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/generators/claude.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/generators/claude.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;;;GAWG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,gBAAgB,EACrB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAoBf"}
|
|
@@ -1,25 +1,47 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module generators/claude
|
|
3
|
-
* Generates
|
|
4
|
-
*
|
|
3
|
+
* Generates `CLAUDE.md` as a thin import of the canonical `AGENTS.md`.
|
|
4
|
+
*
|
|
5
|
+
* Claude Code reads `CLAUDE.md`, not `AGENTS.md` — but its documented pattern for
|
|
6
|
+
* a repo that already has `AGENTS.md` is a `CLAUDE.md` that imports it, "so both
|
|
7
|
+
* tools read the same instructions without duplicating them".
|
|
8
|
+
*
|
|
9
|
+
* The import costs nothing: `@path` files are expanded into context at launch,
|
|
10
|
+
* so this is an include rather than a link — Claude gets the full body without a
|
|
11
|
+
* tool call. That is what makes `AGENTS.md` the single source of truth while
|
|
12
|
+
* still being read by the one tool that will not look at it.
|
|
13
|
+
*
|
|
14
|
+
* A symlink would also work, but creating one on Windows needs Administrator
|
|
15
|
+
* rights or Developer Mode, so the import is the portable choice.
|
|
5
16
|
*/
|
|
6
|
-
import
|
|
7
|
-
import fse from 'fs-extra';
|
|
8
|
-
import { buildContextContent } from './base.js';
|
|
17
|
+
import { writeWorkspaceFile } from '../core/storage.js';
|
|
9
18
|
/**
|
|
10
|
-
*
|
|
19
|
+
* Writes a `CLAUDE.md` that imports `AGENTS.md`, plus anything Claude-specific.
|
|
11
20
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
21
|
+
* Written through the storage layer, like `AGENTS.md` — not with a raw path join.
|
|
22
|
+
* The two must land in the same directory or the import resolves to nothing, and
|
|
23
|
+
* an unresolved `@`-import is silent: Claude Code would start with no workspace
|
|
24
|
+
* context and no error. Routing both through one writer is what keeps them
|
|
25
|
+
* together no matter which backend is active.
|
|
14
26
|
*
|
|
15
27
|
* @param ctx - The workspace context (feature + repos + analysis).
|
|
16
28
|
* @param workspacePath - Absolute path to the workspace root directory.
|
|
17
29
|
*/
|
|
18
30
|
export async function generateClaudeConfig(ctx, workspacePath) {
|
|
19
|
-
const content =
|
|
20
|
-
|
|
31
|
+
const content = `@AGENTS.md
|
|
32
|
+
|
|
33
|
+
<!-- AGENTS.md holds the workspace context and is read by every other agent
|
|
34
|
+
tool. Claude Code does not read it, so this file imports it: @-imports are
|
|
35
|
+
expanded into context at launch, so nothing is duplicated and nothing costs
|
|
36
|
+
an extra read. Put Claude-only instructions below, not above. -->
|
|
37
|
+
|
|
38
|
+
## Claude Code
|
|
39
|
+
|
|
40
|
+
- Prefer \`/plan\` before a change that spans more than one repository in this workspace.
|
|
41
|
+
- Record durable findings with \`nexusflow knowledge add\` rather than in chat, so the next session inherits them.
|
|
42
|
+
`;
|
|
21
43
|
try {
|
|
22
|
-
await
|
|
44
|
+
await writeWorkspaceFile(workspacePath, ctx.feature.id, 'CLAUDE.md', content);
|
|
23
45
|
}
|
|
24
46
|
catch (error) {
|
|
25
47
|
const message = error instanceof Error ? error.message : String(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/generators/claude.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/generators/claude.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,GAAqB,EACrB,aAAqB;IAErB,MAAM,OAAO,GAAG;;;;;;;;;;;CAWjB,CAAC;IAEA,IAAI,CAAC;QACH,MAAM,kBAAkB,CAAC,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAChF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC"}
|
|
@@ -10,21 +10,22 @@ export declare function buildBaseKnowledgeContent(repoName: string): string;
|
|
|
10
10
|
* Generates AI context files for each of the selected assistants.
|
|
11
11
|
*
|
|
12
12
|
* Also generates:
|
|
13
|
-
* - WORKSPACE.md —
|
|
14
|
-
* - nexusflow-knowledge.md —
|
|
13
|
+
* - WORKSPACE.md — a short index for people, not an assistant-facing file
|
|
14
|
+
* - nexusflow-knowledge.md — accumulated decisions and gotchas, if absent
|
|
15
15
|
* - nexusflow-plan.md — implementation order based on dependency analysis
|
|
16
16
|
*
|
|
17
|
+
* Every file it writes describes the whole workspace, so there is no per-repo or
|
|
18
|
+
* base-only subset to generate. The `onlyRepo` and `onlyBase` parameters are
|
|
19
|
+
* gone with the per-repo architecture maps that were the only thing they scoped:
|
|
20
|
+
* once the maps went, `onlyBase` made this function write nothing while its
|
|
21
|
+
* caller still reported success, and `onlyRepo` narrowed a logging loop while
|
|
22
|
+
* every generated file was rewritten in full.
|
|
23
|
+
*
|
|
17
24
|
* @param ctx - The workspace context (feature + repos).
|
|
18
25
|
* @param assistants - Which AI assistants to generate context files for.
|
|
19
26
|
* @param workspacePath - Absolute path to the workspace root directory.
|
|
20
|
-
* @param onlyRepo - Restrict per-repo output to a single repo by name.
|
|
21
|
-
* @param onlyBase - Only generate base-layer maps/knowledge.
|
|
22
|
-
* @param changedRepos - When provided, per-repo architecture maps are only
|
|
23
|
-
* rewritten for these repos (unchanged repos keep their
|
|
24
|
-
* existing map byte-identical, preserving AI prompt
|
|
25
|
-
* caches). A missing map file is generated regardless.
|
|
26
27
|
*/
|
|
27
|
-
export declare function generateContextFiles(ctx: WorkspaceContext, assistants: AIAssistant[], workspacePath: string
|
|
28
|
+
export declare function generateContextFiles(ctx: WorkspaceContext, assistants: AIAssistant[], workspacePath: string): Promise<void>;
|
|
28
29
|
export { generateClaudeConfig } from './claude.js';
|
|
29
30
|
export { generateAntigravityConfig } from './antigravity.js';
|
|
30
31
|
export { generateCodexConfig } from './codex.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAwHjE;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAuBlE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,gBAAgB,EACrB,UAAU,EAAE,WAAW,EAAE,EACzB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAsIf;AAGD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC"}
|