@nathapp/nax 0.50.3 → 0.51.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/CHANGELOG.md +30 -0
- package/dist/nax.js +393 -197
- package/package.json +1 -3
- package/bin/nax.ts +0 -1195
- package/src/acceptance/fix-generator.ts +0 -322
- package/src/acceptance/generator.ts +0 -415
- package/src/acceptance/index.ts +0 -42
- package/src/acceptance/refinement.ts +0 -224
- package/src/acceptance/templates/cli.ts +0 -47
- package/src/acceptance/templates/component.ts +0 -78
- package/src/acceptance/templates/e2e.ts +0 -43
- package/src/acceptance/templates/index.ts +0 -21
- package/src/acceptance/templates/snapshot.ts +0 -50
- package/src/acceptance/templates/unit.ts +0 -48
- package/src/acceptance/types.ts +0 -138
- package/src/agents/acp/adapter.ts +0 -888
- package/src/agents/acp/cost.ts +0 -9
- package/src/agents/acp/index.ts +0 -7
- package/src/agents/acp/interaction-bridge.ts +0 -126
- package/src/agents/acp/parser.ts +0 -119
- package/src/agents/acp/spawn-client.ts +0 -373
- package/src/agents/acp/types.ts +0 -22
- package/src/agents/aider/adapter.ts +0 -135
- package/src/agents/claude/adapter.ts +0 -258
- package/src/agents/claude/complete.ts +0 -80
- package/src/agents/claude/cost.ts +0 -16
- package/src/agents/claude/execution.ts +0 -215
- package/src/agents/claude/index.ts +0 -3
- package/src/agents/claude/interactive.ts +0 -77
- package/src/agents/claude/plan.ts +0 -179
- package/src/agents/codex/adapter.ts +0 -153
- package/src/agents/cost/calculate.ts +0 -154
- package/src/agents/cost/index.ts +0 -10
- package/src/agents/cost/parse.ts +0 -97
- package/src/agents/cost/pricing.ts +0 -59
- package/src/agents/cost/types.ts +0 -45
- package/src/agents/gemini/adapter.ts +0 -177
- package/src/agents/index.ts +0 -18
- package/src/agents/opencode/adapter.ts +0 -106
- package/src/agents/registry.ts +0 -136
- package/src/agents/shared/decompose.ts +0 -154
- package/src/agents/shared/model-resolution.ts +0 -43
- package/src/agents/shared/types-extended.ts +0 -164
- package/src/agents/shared/validation.ts +0 -69
- package/src/agents/shared/version-detection.ts +0 -109
- package/src/agents/types.ts +0 -205
- package/src/analyze/classifier.ts +0 -282
- package/src/analyze/index.ts +0 -16
- package/src/analyze/scanner.ts +0 -171
- package/src/analyze/types.ts +0 -51
- package/src/cli/accept.ts +0 -108
- package/src/cli/agents.ts +0 -87
- package/src/cli/analyze-parser.ts +0 -291
- package/src/cli/analyze.ts +0 -352
- package/src/cli/config-descriptions.ts +0 -219
- package/src/cli/config-diff.ts +0 -103
- package/src/cli/config-display.ts +0 -285
- package/src/cli/config-get.ts +0 -55
- package/src/cli/config.ts +0 -14
- package/src/cli/constitution.ts +0 -17
- package/src/cli/diagnose-analysis.ts +0 -159
- package/src/cli/diagnose-formatter.ts +0 -87
- package/src/cli/diagnose.ts +0 -203
- package/src/cli/generate.ts +0 -250
- package/src/cli/index.ts +0 -42
- package/src/cli/init-context.ts +0 -405
- package/src/cli/init-detect.ts +0 -303
- package/src/cli/init.ts +0 -296
- package/src/cli/interact.ts +0 -295
- package/src/cli/plan.ts +0 -509
- package/src/cli/plugins.ts +0 -122
- package/src/cli/prompts-export.ts +0 -58
- package/src/cli/prompts-init.ts +0 -200
- package/src/cli/prompts-main.ts +0 -183
- package/src/cli/prompts-shared.ts +0 -70
- package/src/cli/prompts-tdd.ts +0 -88
- package/src/cli/prompts.ts +0 -17
- package/src/cli/runs.ts +0 -174
- package/src/cli/status-cost.ts +0 -151
- package/src/cli/status-features.ts +0 -405
- package/src/cli/status.ts +0 -13
- package/src/commands/common.ts +0 -171
- package/src/commands/diagnose.ts +0 -17
- package/src/commands/index.ts +0 -9
- package/src/commands/logs-formatter.ts +0 -201
- package/src/commands/logs-reader.ts +0 -171
- package/src/commands/logs.ts +0 -103
- package/src/commands/precheck.ts +0 -86
- package/src/commands/runs.ts +0 -220
- package/src/commands/unlock.ts +0 -96
- package/src/config/defaults.ts +0 -218
- package/src/config/index.ts +0 -22
- package/src/config/loader.ts +0 -143
- package/src/config/merge.ts +0 -106
- package/src/config/merger.ts +0 -147
- package/src/config/path-security.ts +0 -121
- package/src/config/paths.ts +0 -27
- package/src/config/permissions.ts +0 -63
- package/src/config/runtime-types.ts +0 -522
- package/src/config/schema-types.ts +0 -53
- package/src/config/schema.ts +0 -60
- package/src/config/schemas.ts +0 -426
- package/src/config/test-strategy.ts +0 -71
- package/src/config/types.ts +0 -57
- package/src/config/validate.ts +0 -103
- package/src/constitution/generator.ts +0 -158
- package/src/constitution/generators/aider.ts +0 -41
- package/src/constitution/generators/claude.ts +0 -35
- package/src/constitution/generators/cursor.ts +0 -36
- package/src/constitution/generators/opencode.ts +0 -38
- package/src/constitution/generators/types.ts +0 -33
- package/src/constitution/generators/windsurf.ts +0 -36
- package/src/constitution/index.ts +0 -11
- package/src/constitution/loader.ts +0 -121
- package/src/constitution/types.ts +0 -31
- package/src/context/auto-detect.ts +0 -228
- package/src/context/builder.ts +0 -299
- package/src/context/elements.ts +0 -122
- package/src/context/formatter.ts +0 -107
- package/src/context/generator.ts +0 -343
- package/src/context/generators/aider.ts +0 -34
- package/src/context/generators/claude.ts +0 -28
- package/src/context/generators/codex.ts +0 -28
- package/src/context/generators/cursor.ts +0 -28
- package/src/context/generators/gemini.ts +0 -28
- package/src/context/generators/opencode.ts +0 -30
- package/src/context/generators/windsurf.ts +0 -28
- package/src/context/greenfield.ts +0 -114
- package/src/context/index.ts +0 -34
- package/src/context/injector.ts +0 -279
- package/src/context/parent-context.ts +0 -39
- package/src/context/test-scanner.ts +0 -370
- package/src/context/types.ts +0 -98
- package/src/decompose/apply.ts +0 -50
- package/src/decompose/builder.ts +0 -181
- package/src/decompose/index.ts +0 -8
- package/src/decompose/sections/codebase.ts +0 -26
- package/src/decompose/sections/constraints.ts +0 -32
- package/src/decompose/sections/index.ts +0 -4
- package/src/decompose/sections/sibling-stories.ts +0 -25
- package/src/decompose/sections/target-story.ts +0 -31
- package/src/decompose/types.ts +0 -55
- package/src/decompose/validators/complexity.ts +0 -45
- package/src/decompose/validators/coverage.ts +0 -134
- package/src/decompose/validators/dependency.ts +0 -91
- package/src/decompose/validators/index.ts +0 -35
- package/src/decompose/validators/overlap.ts +0 -128
- package/src/errors.ts +0 -67
- package/src/execution/batching.ts +0 -157
- package/src/execution/crash-heartbeat.ts +0 -77
- package/src/execution/crash-recovery.ts +0 -79
- package/src/execution/crash-signals.ts +0 -165
- package/src/execution/crash-writer.ts +0 -154
- package/src/execution/deferred-review.ts +0 -105
- package/src/execution/dry-run.ts +0 -81
- package/src/execution/escalation/escalation.ts +0 -46
- package/src/execution/escalation/index.ts +0 -13
- package/src/execution/escalation/tier-escalation.ts +0 -346
- package/src/execution/escalation/tier-outcome.ts +0 -143
- package/src/execution/executor-types.ts +0 -73
- package/src/execution/helpers.ts +0 -38
- package/src/execution/index.ts +0 -27
- package/src/execution/iteration-runner.ts +0 -160
- package/src/execution/lifecycle/acceptance-loop.ts +0 -309
- package/src/execution/lifecycle/headless-formatter.ts +0 -83
- package/src/execution/lifecycle/index.ts +0 -11
- package/src/execution/lifecycle/parallel-lifecycle.ts +0 -101
- package/src/execution/lifecycle/precheck-runner.ts +0 -140
- package/src/execution/lifecycle/run-cleanup.ts +0 -81
- package/src/execution/lifecycle/run-completion.ts +0 -247
- package/src/execution/lifecycle/run-initialization.ts +0 -187
- package/src/execution/lifecycle/run-regression.ts +0 -305
- package/src/execution/lifecycle/run-setup.ts +0 -240
- package/src/execution/lifecycle/story-size-prompts.ts +0 -123
- package/src/execution/lock.ts +0 -129
- package/src/execution/parallel-coordinator.ts +0 -281
- package/src/execution/parallel-executor-rectification-pass.ts +0 -117
- package/src/execution/parallel-executor-rectify.ts +0 -136
- package/src/execution/parallel-executor.ts +0 -330
- package/src/execution/parallel-worker.ts +0 -149
- package/src/execution/parallel.ts +0 -13
- package/src/execution/pid-registry.ts +0 -275
- package/src/execution/pipeline-result-handler.ts +0 -221
- package/src/execution/progress.ts +0 -27
- package/src/execution/queue-handler.ts +0 -109
- package/src/execution/runner-completion.ts +0 -171
- package/src/execution/runner-execution.ts +0 -243
- package/src/execution/runner-setup.ts +0 -86
- package/src/execution/runner.ts +0 -265
- package/src/execution/sequential-executor.ts +0 -219
- package/src/execution/status-file.ts +0 -264
- package/src/execution/status-writer.ts +0 -181
- package/src/execution/story-context.ts +0 -266
- package/src/execution/story-selector.ts +0 -76
- package/src/execution/test-output-parser.ts +0 -14
- package/src/execution/timeout-handler.ts +0 -100
- package/src/hooks/index.ts +0 -2
- package/src/hooks/runner.ts +0 -280
- package/src/hooks/types.ts +0 -79
- package/src/interaction/chain.ts +0 -170
- package/src/interaction/index.ts +0 -61
- package/src/interaction/init.ts +0 -84
- package/src/interaction/plugins/auto.ts +0 -243
- package/src/interaction/plugins/cli.ts +0 -300
- package/src/interaction/plugins/telegram.ts +0 -384
- package/src/interaction/plugins/webhook.ts +0 -286
- package/src/interaction/state.ts +0 -171
- package/src/interaction/triggers.ts +0 -250
- package/src/interaction/types.ts +0 -170
- package/src/logger/formatters.ts +0 -84
- package/src/logger/index.ts +0 -16
- package/src/logger/logger.ts +0 -296
- package/src/logger/types.ts +0 -48
- package/src/logging/formatter.ts +0 -355
- package/src/logging/index.ts +0 -22
- package/src/logging/types.ts +0 -93
- package/src/metrics/aggregator.ts +0 -191
- package/src/metrics/index.ts +0 -14
- package/src/metrics/tracker.ts +0 -200
- package/src/metrics/types.ts +0 -115
- package/src/optimizer/index.ts +0 -63
- package/src/optimizer/noop.optimizer.ts +0 -24
- package/src/optimizer/rule-based.optimizer.ts +0 -248
- package/src/optimizer/types.ts +0 -53
- package/src/pipeline/event-bus.ts +0 -297
- package/src/pipeline/events.ts +0 -130
- package/src/pipeline/index.ts +0 -19
- package/src/pipeline/runner.ts +0 -149
- package/src/pipeline/stages/acceptance-setup.ts +0 -144
- package/src/pipeline/stages/acceptance.ts +0 -215
- package/src/pipeline/stages/autofix.ts +0 -262
- package/src/pipeline/stages/completion.ts +0 -110
- package/src/pipeline/stages/constitution.ts +0 -63
- package/src/pipeline/stages/context.ts +0 -122
- package/src/pipeline/stages/execution.ts +0 -359
- package/src/pipeline/stages/index.ts +0 -86
- package/src/pipeline/stages/optimizer.ts +0 -74
- package/src/pipeline/stages/prompt.ts +0 -79
- package/src/pipeline/stages/queue-check.ts +0 -103
- package/src/pipeline/stages/rectify.ts +0 -101
- package/src/pipeline/stages/regression.ts +0 -99
- package/src/pipeline/stages/review.ts +0 -94
- package/src/pipeline/stages/routing.ts +0 -276
- package/src/pipeline/stages/verify.ts +0 -286
- package/src/pipeline/subscribers/events-writer.ts +0 -135
- package/src/pipeline/subscribers/hooks.ts +0 -179
- package/src/pipeline/subscribers/interaction.ts +0 -103
- package/src/pipeline/subscribers/registry.ts +0 -73
- package/src/pipeline/subscribers/reporters.ts +0 -174
- package/src/pipeline/types.ts +0 -220
- package/src/plugins/extensions.ts +0 -225
- package/src/plugins/index.ts +0 -33
- package/src/plugins/loader.ts +0 -352
- package/src/plugins/plugin-logger.ts +0 -41
- package/src/plugins/registry.ts +0 -168
- package/src/plugins/types.ts +0 -206
- package/src/plugins/validator.ts +0 -352
- package/src/prd/index.ts +0 -220
- package/src/prd/schema.ts +0 -268
- package/src/prd/types.ts +0 -273
- package/src/prd/validate.ts +0 -41
- package/src/precheck/checks-agents.ts +0 -63
- package/src/precheck/checks-blockers.ts +0 -23
- package/src/precheck/checks-cli.ts +0 -68
- package/src/precheck/checks-config.ts +0 -102
- package/src/precheck/checks-git.ts +0 -117
- package/src/precheck/checks-system.ts +0 -101
- package/src/precheck/checks-warnings.ts +0 -221
- package/src/precheck/checks.ts +0 -36
- package/src/precheck/index.ts +0 -374
- package/src/precheck/story-size-gate.ts +0 -144
- package/src/precheck/types.ts +0 -31
- package/src/prompts/builder.ts +0 -166
- package/src/prompts/index.ts +0 -2
- package/src/prompts/loader.ts +0 -43
- package/src/prompts/sections/conventions.ts +0 -19
- package/src/prompts/sections/hermetic.ts +0 -41
- package/src/prompts/sections/index.ts +0 -12
- package/src/prompts/sections/isolation.ts +0 -70
- package/src/prompts/sections/role-task.ts +0 -182
- package/src/prompts/sections/story.ts +0 -55
- package/src/prompts/sections/verdict.ts +0 -70
- package/src/prompts/types.ts +0 -21
- package/src/queue/index.ts +0 -2
- package/src/queue/manager.ts +0 -254
- package/src/queue/types.ts +0 -54
- package/src/review/index.ts +0 -8
- package/src/review/orchestrator.ts +0 -154
- package/src/review/runner.ts +0 -303
- package/src/review/types.ts +0 -70
- package/src/routing/batch-route.ts +0 -35
- package/src/routing/builder.ts +0 -81
- package/src/routing/chain.ts +0 -75
- package/src/routing/content-hash.ts +0 -25
- package/src/routing/index.ts +0 -20
- package/src/routing/loader.ts +0 -62
- package/src/routing/router.ts +0 -305
- package/src/routing/strategies/adaptive.ts +0 -215
- package/src/routing/strategies/index.ts +0 -8
- package/src/routing/strategies/keyword.ts +0 -180
- package/src/routing/strategies/llm-prompts.ts +0 -224
- package/src/routing/strategies/llm.ts +0 -320
- package/src/routing/strategies/manual.ts +0 -50
- package/src/routing/strategy.ts +0 -102
- package/src/tdd/cleanup.ts +0 -120
- package/src/tdd/index.ts +0 -22
- package/src/tdd/isolation.ts +0 -117
- package/src/tdd/orchestrator.ts +0 -406
- package/src/tdd/prompts.ts +0 -40
- package/src/tdd/rectification-gate.ts +0 -274
- package/src/tdd/session-runner.ts +0 -263
- package/src/tdd/types.ts +0 -84
- package/src/tdd/verdict-reader.ts +0 -266
- package/src/tdd/verdict.ts +0 -152
- package/src/tui/App.tsx +0 -265
- package/src/tui/components/AgentPanel.tsx +0 -75
- package/src/tui/components/CostOverlay.tsx +0 -118
- package/src/tui/components/HelpOverlay.tsx +0 -107
- package/src/tui/components/StatusBar.tsx +0 -63
- package/src/tui/components/StoriesPanel.tsx +0 -177
- package/src/tui/hooks/useKeyboard.ts +0 -142
- package/src/tui/hooks/useLayout.ts +0 -137
- package/src/tui/hooks/usePipelineEvents.ts +0 -183
- package/src/tui/hooks/usePty.ts +0 -189
- package/src/tui/index.tsx +0 -38
- package/src/tui/types.ts +0 -76
- package/src/utils/errors.ts +0 -12
- package/src/utils/git.ts +0 -245
- package/src/utils/json-file.ts +0 -72
- package/src/utils/log-test-output.ts +0 -25
- package/src/utils/path-security.ts +0 -73
- package/src/utils/queue-writer.ts +0 -54
- package/src/verification/crash-detector.ts +0 -34
- package/src/verification/executor.ts +0 -250
- package/src/verification/index.ts +0 -12
- package/src/verification/orchestrator-types.ts +0 -154
- package/src/verification/orchestrator.ts +0 -76
- package/src/verification/parser.ts +0 -220
- package/src/verification/rectification-loop.ts +0 -172
- package/src/verification/rectification.ts +0 -108
- package/src/verification/runners.ts +0 -129
- package/src/verification/smart-runner.ts +0 -307
- package/src/verification/strategies/acceptance.ts +0 -136
- package/src/verification/strategies/regression.ts +0 -90
- package/src/verification/strategies/scoped.ts +0 -154
- package/src/verification/types.ts +0 -117
- package/src/version.ts +0 -40
- package/src/worktree/dispatcher.ts +0 -6
- package/src/worktree/index.ts +0 -2
- package/src/worktree/manager.ts +0 -193
- package/src/worktree/merge.ts +0 -302
- package/src/worktree/types.ts +0 -4
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Constitution Generator Orchestrator
|
|
3
|
-
*
|
|
4
|
-
* Generates agent-specific config files from nax/constitution.md.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { existsSync } from "node:fs";
|
|
8
|
-
import { join } from "node:path";
|
|
9
|
-
import { validateFilePath } from "../config/path-security";
|
|
10
|
-
import { aiderGenerator } from "./generators/aider";
|
|
11
|
-
import { claudeGenerator } from "./generators/claude";
|
|
12
|
-
import { cursorGenerator } from "./generators/cursor";
|
|
13
|
-
import { opencodeGenerator } from "./generators/opencode";
|
|
14
|
-
import type { AgentConfigGenerator, AgentType, ConstitutionContent, GeneratorMap } from "./generators/types";
|
|
15
|
-
import { windsurfGenerator } from "./generators/windsurf";
|
|
16
|
-
|
|
17
|
-
/** Generator registry */
|
|
18
|
-
const GENERATORS: GeneratorMap = {
|
|
19
|
-
claude: claudeGenerator,
|
|
20
|
-
opencode: opencodeGenerator,
|
|
21
|
-
cursor: cursorGenerator,
|
|
22
|
-
windsurf: windsurfGenerator,
|
|
23
|
-
aider: aiderGenerator,
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
/** Generation result for a single agent */
|
|
27
|
-
export interface GenerationResult {
|
|
28
|
-
agent: AgentType;
|
|
29
|
-
outputFile: string;
|
|
30
|
-
content: string;
|
|
31
|
-
written: boolean;
|
|
32
|
-
error?: string;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/** Generate options */
|
|
36
|
-
export interface GenerateOptions {
|
|
37
|
-
/** Constitution file path (default: nax/constitution.md) */
|
|
38
|
-
constitutionPath: string;
|
|
39
|
-
/** Output directory (default: project root) */
|
|
40
|
-
outputDir: string;
|
|
41
|
-
/** Dry run mode (don't write files) */
|
|
42
|
-
dryRun?: boolean;
|
|
43
|
-
/** Specific agent to generate for (default: all) */
|
|
44
|
-
agent?: AgentType;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Load constitution content from file
|
|
49
|
-
*/
|
|
50
|
-
async function loadConstitutionContent(constitutionPath: string): Promise<ConstitutionContent> {
|
|
51
|
-
if (!existsSync(constitutionPath)) {
|
|
52
|
-
throw new Error(`Constitution file not found: ${constitutionPath}`);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const file = Bun.file(constitutionPath);
|
|
56
|
-
const markdown = await file.text();
|
|
57
|
-
|
|
58
|
-
return {
|
|
59
|
-
markdown,
|
|
60
|
-
sections: {}, // TODO: implement section parsing if needed
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Generate config for a specific agent
|
|
66
|
-
*/
|
|
67
|
-
function generateForAgent(
|
|
68
|
-
agent: AgentType,
|
|
69
|
-
constitution: ConstitutionContent,
|
|
70
|
-
): { content: string; outputFile: string } {
|
|
71
|
-
const generator = GENERATORS[agent];
|
|
72
|
-
if (!generator) {
|
|
73
|
-
throw new Error(`Unknown agent type: ${agent}`);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const content = generator.generate(constitution);
|
|
77
|
-
return {
|
|
78
|
-
content,
|
|
79
|
-
outputFile: generator.outputFile,
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Write generated content to file
|
|
85
|
-
*/
|
|
86
|
-
async function writeGeneratedFile(outputDir: string, filename: string, content: string): Promise<void> {
|
|
87
|
-
const outputPath = join(outputDir, filename);
|
|
88
|
-
|
|
89
|
-
// SEC-5: Validate path before writing
|
|
90
|
-
const validatedPath = validateFilePath(outputPath, outputDir);
|
|
91
|
-
|
|
92
|
-
await Bun.write(validatedPath, content);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Generate config for a specific agent
|
|
97
|
-
*
|
|
98
|
-
* @param agent - Agent type to generate for
|
|
99
|
-
* @param constitutionPath - Path to constitution file
|
|
100
|
-
* @param outputDir - Directory to write output file
|
|
101
|
-
* @param dryRun - If true, don't write files
|
|
102
|
-
* @returns Generation result
|
|
103
|
-
*/
|
|
104
|
-
export async function generateFor(
|
|
105
|
-
agent: AgentType,
|
|
106
|
-
constitutionPath: string,
|
|
107
|
-
outputDir: string,
|
|
108
|
-
dryRun = false,
|
|
109
|
-
): Promise<GenerationResult> {
|
|
110
|
-
try {
|
|
111
|
-
const constitution = await loadConstitutionContent(constitutionPath);
|
|
112
|
-
const { content, outputFile } = generateForAgent(agent, constitution);
|
|
113
|
-
|
|
114
|
-
if (!dryRun) {
|
|
115
|
-
await writeGeneratedFile(outputDir, outputFile, content);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
return {
|
|
119
|
-
agent,
|
|
120
|
-
outputFile,
|
|
121
|
-
content,
|
|
122
|
-
written: !dryRun,
|
|
123
|
-
};
|
|
124
|
-
} catch (err) {
|
|
125
|
-
const error = err instanceof Error ? err.message : String(err);
|
|
126
|
-
return {
|
|
127
|
-
agent,
|
|
128
|
-
outputFile: GENERATORS[agent].outputFile,
|
|
129
|
-
content: "",
|
|
130
|
-
written: false,
|
|
131
|
-
error,
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Generate config files for all agents
|
|
138
|
-
*
|
|
139
|
-
* @param constitutionPath - Path to constitution file
|
|
140
|
-
* @param outputDir - Directory to write output files
|
|
141
|
-
* @param dryRun - If true, don't write files
|
|
142
|
-
* @returns Array of generation results
|
|
143
|
-
*/
|
|
144
|
-
export async function generateAll(
|
|
145
|
-
constitutionPath: string,
|
|
146
|
-
outputDir: string,
|
|
147
|
-
dryRun = false,
|
|
148
|
-
): Promise<GenerationResult[]> {
|
|
149
|
-
const agents: AgentType[] = ["claude", "opencode", "cursor", "windsurf", "aider"];
|
|
150
|
-
const results: GenerationResult[] = [];
|
|
151
|
-
|
|
152
|
-
for (const agent of agents) {
|
|
153
|
-
const result = await generateFor(agent, constitutionPath, outputDir, dryRun);
|
|
154
|
-
results.push(result);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
return results;
|
|
158
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Aider Config Generator
|
|
3
|
-
*
|
|
4
|
-
* Generates .aider.conf.yml from nax/constitution.md.
|
|
5
|
-
* Aider uses YAML format for configuration.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { AgentConfigGenerator, ConstitutionContent } from "./types";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Generate .aider.conf.yml from constitution
|
|
12
|
-
*/
|
|
13
|
-
function generateAiderConfig(constitution: ConstitutionContent): string {
|
|
14
|
-
const { markdown } = constitution;
|
|
15
|
-
|
|
16
|
-
// Build .aider.conf.yml format
|
|
17
|
-
const header = `# Aider Configuration
|
|
18
|
-
# Auto-generated from nax/constitution.md
|
|
19
|
-
# DO NOT EDIT MANUALLY
|
|
20
|
-
|
|
21
|
-
# Project instructions
|
|
22
|
-
instructions: |
|
|
23
|
-
`;
|
|
24
|
-
|
|
25
|
-
// Indent all lines of markdown for YAML multi-line string
|
|
26
|
-
const indentedMarkdown = markdown
|
|
27
|
-
.split("\n")
|
|
28
|
-
.map((line) => ` ${line}`)
|
|
29
|
-
.join("\n");
|
|
30
|
-
|
|
31
|
-
return `${header}${indentedMarkdown}\n`;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Aider generator
|
|
36
|
-
*/
|
|
37
|
-
export const aiderGenerator: AgentConfigGenerator = {
|
|
38
|
-
name: "aider",
|
|
39
|
-
outputFile: ".aider.conf.yml",
|
|
40
|
-
generate: generateAiderConfig,
|
|
41
|
-
};
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Claude Code Config Generator
|
|
3
|
-
*
|
|
4
|
-
* Generates CLAUDE.md from nax/constitution.md.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import type { AgentConfigGenerator, ConstitutionContent } from "./types";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Generate CLAUDE.md from constitution
|
|
11
|
-
*/
|
|
12
|
-
function generateClaudeConfig(constitution: ConstitutionContent): string {
|
|
13
|
-
const { markdown } = constitution;
|
|
14
|
-
|
|
15
|
-
// Build CLAUDE.md format
|
|
16
|
-
const header = `# Project Constitution
|
|
17
|
-
|
|
18
|
-
This file is auto-generated from \`nax/constitution.md\`.
|
|
19
|
-
DO NOT EDIT MANUALLY — changes will be overwritten.
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
`;
|
|
24
|
-
|
|
25
|
-
return header + markdown;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Claude Code generator
|
|
30
|
-
*/
|
|
31
|
-
export const claudeGenerator: AgentConfigGenerator = {
|
|
32
|
-
name: "claude",
|
|
33
|
-
outputFile: "CLAUDE.md",
|
|
34
|
-
generate: generateClaudeConfig,
|
|
35
|
-
};
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cursor Rules Generator
|
|
3
|
-
*
|
|
4
|
-
* Generates .cursorrules from nax/constitution.md.
|
|
5
|
-
* Cursor uses a simple text format similar to Claude but in a dotfile.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { AgentConfigGenerator, ConstitutionContent } from "./types";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Generate .cursorrules from constitution
|
|
12
|
-
*/
|
|
13
|
-
function generateCursorRules(constitution: ConstitutionContent): string {
|
|
14
|
-
const { markdown } = constitution;
|
|
15
|
-
|
|
16
|
-
// Build .cursorrules format
|
|
17
|
-
const header = `# Project Rules
|
|
18
|
-
|
|
19
|
-
Auto-generated from nax/constitution.md
|
|
20
|
-
DO NOT EDIT MANUALLY
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
`;
|
|
25
|
-
|
|
26
|
-
return header + markdown;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Cursor generator
|
|
31
|
-
*/
|
|
32
|
-
export const cursorGenerator: AgentConfigGenerator = {
|
|
33
|
-
name: "cursor",
|
|
34
|
-
outputFile: ".cursorrules",
|
|
35
|
-
generate: generateCursorRules,
|
|
36
|
-
};
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenCode Config Generator
|
|
3
|
-
*
|
|
4
|
-
* Generates AGENTS.md from nax/constitution.md.
|
|
5
|
-
* Format is similar to CLAUDE.md but with OpenCode-specific headers.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { AgentConfigGenerator, ConstitutionContent } from "./types";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Generate AGENTS.md from constitution
|
|
12
|
-
*/
|
|
13
|
-
function generateOpencodeConfig(constitution: ConstitutionContent): string {
|
|
14
|
-
const { markdown } = constitution;
|
|
15
|
-
|
|
16
|
-
// Build AGENTS.md format (OpenCode/Codex format)
|
|
17
|
-
const header = `# Agent Instructions
|
|
18
|
-
|
|
19
|
-
This file is auto-generated from \`nax/constitution.md\`.
|
|
20
|
-
DO NOT EDIT MANUALLY — changes will be overwritten.
|
|
21
|
-
|
|
22
|
-
These instructions apply to all AI coding agents in this project.
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
`;
|
|
27
|
-
|
|
28
|
-
return header + markdown;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* OpenCode generator
|
|
33
|
-
*/
|
|
34
|
-
export const opencodeGenerator: AgentConfigGenerator = {
|
|
35
|
-
name: "opencode",
|
|
36
|
-
outputFile: "AGENTS.md",
|
|
37
|
-
generate: generateOpencodeConfig,
|
|
38
|
-
};
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Constitution Generator Types
|
|
3
|
-
*
|
|
4
|
-
* Defines the interface for generating agent-specific config files from nax/constitution.md.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
/** Constitution content structure for generators */
|
|
8
|
-
export interface ConstitutionContent {
|
|
9
|
-
/** Full constitution markdown content */
|
|
10
|
-
markdown: string;
|
|
11
|
-
/** Parsed sections (optional, for structured generation) */
|
|
12
|
-
sections?: Record<string, string>;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/** Agent config generator interface */
|
|
16
|
-
export interface AgentConfigGenerator {
|
|
17
|
-
/** Generator name (e.g., 'claude', 'opencode', 'cursor') */
|
|
18
|
-
name: string;
|
|
19
|
-
/** Output filename (e.g., 'CLAUDE.md', '.cursorrules') */
|
|
20
|
-
outputFile: string;
|
|
21
|
-
/**
|
|
22
|
-
* Generate agent-specific config file content from constitution
|
|
23
|
-
* @param constitution - Constitution content
|
|
24
|
-
* @returns Generated config file content
|
|
25
|
-
*/
|
|
26
|
-
generate(constitution: ConstitutionContent): string;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/** All available generator types */
|
|
30
|
-
export type AgentType = "claude" | "opencode" | "cursor" | "windsurf" | "aider";
|
|
31
|
-
|
|
32
|
-
/** Generator registry map */
|
|
33
|
-
export type GeneratorMap = Record<AgentType, AgentConfigGenerator>;
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Windsurf Rules Generator
|
|
3
|
-
*
|
|
4
|
-
* Generates .windsurfrules from nax/constitution.md.
|
|
5
|
-
* Windsurf uses a similar format to Cursor.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { AgentConfigGenerator, ConstitutionContent } from "./types";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Generate .windsurfrules from constitution
|
|
12
|
-
*/
|
|
13
|
-
function generateWindsurfRules(constitution: ConstitutionContent): string {
|
|
14
|
-
const { markdown } = constitution;
|
|
15
|
-
|
|
16
|
-
// Build .windsurfrules format
|
|
17
|
-
const header = `# Windsurf Project Rules
|
|
18
|
-
|
|
19
|
-
Auto-generated from nax/constitution.md
|
|
20
|
-
DO NOT EDIT MANUALLY
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
`;
|
|
25
|
-
|
|
26
|
-
return header + markdown;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Windsurf generator
|
|
31
|
-
*/
|
|
32
|
-
export const windsurfGenerator: AgentConfigGenerator = {
|
|
33
|
-
name: "windsurf",
|
|
34
|
-
outputFile: ".windsurfrules",
|
|
35
|
-
generate: generateWindsurfRules,
|
|
36
|
-
};
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Constitution system
|
|
3
|
-
*
|
|
4
|
-
* Provides project-level governance by injecting a constitution.md file
|
|
5
|
-
* into every agent session prompt. The constitution defines coding standards,
|
|
6
|
-
* architectural rules, testing requirements, and forbidden patterns.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
export type { ConstitutionConfig, ConstitutionResult } from "./types";
|
|
10
|
-
export { loadConstitution, truncateToTokens } from "./loader";
|
|
11
|
-
export { estimateTokens } from "../optimizer/types";
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Constitution loader
|
|
3
|
-
*
|
|
4
|
-
* Loads and processes global + project constitution files.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { existsSync } from "node:fs";
|
|
8
|
-
import { join } from "node:path";
|
|
9
|
-
import { validateFilePath } from "../config/path-security";
|
|
10
|
-
import { globalConfigDir } from "../config/paths";
|
|
11
|
-
import { estimateTokens } from "../optimizer/types";
|
|
12
|
-
import type { ConstitutionConfig, ConstitutionResult } from "./types";
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Truncate text to fit within token limit
|
|
16
|
-
*
|
|
17
|
-
* Truncates at word boundaries to avoid cutting mid-word.
|
|
18
|
-
*
|
|
19
|
-
* @param text - Text to truncate
|
|
20
|
-
* @param maxTokens - Maximum tokens allowed
|
|
21
|
-
* @returns Truncated text
|
|
22
|
-
*/
|
|
23
|
-
export function truncateToTokens(text: string, maxTokens: number): string {
|
|
24
|
-
const maxChars = maxTokens * 3; // 1 token ≈ 3 chars
|
|
25
|
-
|
|
26
|
-
if (text.length <= maxChars) {
|
|
27
|
-
return text;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Find last word boundary before maxChars
|
|
31
|
-
const truncated = text.slice(0, maxChars);
|
|
32
|
-
const lastSpace = truncated.lastIndexOf(" ");
|
|
33
|
-
const lastNewline = truncated.lastIndexOf("\n");
|
|
34
|
-
const cutPoint = Math.max(lastSpace, lastNewline);
|
|
35
|
-
|
|
36
|
-
if (cutPoint > 0) {
|
|
37
|
-
return truncated.slice(0, cutPoint);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// Fallback: hard cut if no word boundary found
|
|
41
|
-
return truncated;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Load constitution from global and project directories.
|
|
46
|
-
*
|
|
47
|
-
* Prepends global constitution to project constitution with --- separator.
|
|
48
|
-
* Respects skipGlobal flag in config.
|
|
49
|
-
*
|
|
50
|
-
* @param projectDir - Path to project nax/ directory
|
|
51
|
-
* @param config - Constitution configuration
|
|
52
|
-
* @returns Constitution result or null if disabled/missing
|
|
53
|
-
*/
|
|
54
|
-
export async function loadConstitution(
|
|
55
|
-
projectDir: string,
|
|
56
|
-
config: ConstitutionConfig,
|
|
57
|
-
): Promise<ConstitutionResult | null> {
|
|
58
|
-
if (!config.enabled) {
|
|
59
|
-
return null;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
let combinedContent = "";
|
|
63
|
-
|
|
64
|
-
// Load global constitution (unless skipGlobal is true)
|
|
65
|
-
if (!config.skipGlobal) {
|
|
66
|
-
const globalPath = join(globalConfigDir(), config.path);
|
|
67
|
-
if (existsSync(globalPath)) {
|
|
68
|
-
// SEC-5: Validate path before reading
|
|
69
|
-
const validatedPath = validateFilePath(globalPath, globalConfigDir());
|
|
70
|
-
const globalFile = Bun.file(validatedPath);
|
|
71
|
-
const globalContent = await globalFile.text();
|
|
72
|
-
if (globalContent.trim()) {
|
|
73
|
-
combinedContent = globalContent.trim();
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// Load project constitution
|
|
79
|
-
const projectPath = join(projectDir, config.path);
|
|
80
|
-
if (existsSync(projectPath)) {
|
|
81
|
-
// SEC-5: Validate path before reading
|
|
82
|
-
const validatedPath = validateFilePath(projectPath, projectDir);
|
|
83
|
-
const projectFile = Bun.file(validatedPath);
|
|
84
|
-
const projectContent = await projectFile.text();
|
|
85
|
-
if (projectContent.trim()) {
|
|
86
|
-
// Concatenate with separator if both exist
|
|
87
|
-
if (combinedContent) {
|
|
88
|
-
combinedContent += `\n\n---\n\n${projectContent.trim()}`;
|
|
89
|
-
} else {
|
|
90
|
-
// If no global content, preserve exact project content (including trailing newline)
|
|
91
|
-
combinedContent = projectContent;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// Return null if no content loaded
|
|
97
|
-
if (!combinedContent) {
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const tokens = estimateTokens(combinedContent);
|
|
102
|
-
|
|
103
|
-
if (tokens <= config.maxTokens) {
|
|
104
|
-
return {
|
|
105
|
-
content: combinedContent,
|
|
106
|
-
tokens,
|
|
107
|
-
truncated: false,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Truncate to fit within maxTokens
|
|
112
|
-
const truncatedContent = truncateToTokens(combinedContent, config.maxTokens);
|
|
113
|
-
const truncatedTokens = estimateTokens(truncatedContent);
|
|
114
|
-
|
|
115
|
-
return {
|
|
116
|
-
content: truncatedContent,
|
|
117
|
-
tokens: truncatedTokens,
|
|
118
|
-
truncated: true,
|
|
119
|
-
originalTokens: tokens,
|
|
120
|
-
};
|
|
121
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Constitution types
|
|
3
|
-
*
|
|
4
|
-
* The constitution is a project-level governance document that defines coding
|
|
5
|
-
* standards, architectural rules, testing requirements, and forbidden patterns.
|
|
6
|
-
* It gets injected into every agent session prompt.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
/** Constitution configuration */
|
|
10
|
-
export interface ConstitutionConfig {
|
|
11
|
-
/** Enable constitution loading and injection */
|
|
12
|
-
enabled: boolean;
|
|
13
|
-
/** Path to constitution file relative to nax/ directory */
|
|
14
|
-
path: string;
|
|
15
|
-
/** Maximum tokens allowed for constitution content */
|
|
16
|
-
maxTokens: number;
|
|
17
|
-
/** Skip loading global constitution (default: false) */
|
|
18
|
-
skipGlobal?: boolean;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/** Constitution load result */
|
|
22
|
-
export interface ConstitutionResult {
|
|
23
|
-
/** Constitution content (may be truncated) */
|
|
24
|
-
content: string;
|
|
25
|
-
/** Estimated token count */
|
|
26
|
-
tokens: number;
|
|
27
|
-
/** Whether content was truncated */
|
|
28
|
-
truncated: boolean;
|
|
29
|
-
/** Original token count before truncation (if truncated) */
|
|
30
|
-
originalTokens?: number;
|
|
31
|
-
}
|