@rsaglobaltech/specgate 0.18.0 → 0.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +77 -1
- package/bin/specgate.ts +47 -47
- package/dist/bin/specgate.js +47 -46
- package/dist/bin/specgate.js.map +1 -1
- package/dist/packages/core/src/application/ArchiveChangeUseCase.js +1 -1
- package/dist/packages/core/src/application/ArchiveChangeUseCase.js.map +1 -1
- package/dist/packages/core/src/application/ValidateProjectUseCase.js +1 -1
- package/dist/packages/core/src/application/ValidateProjectUseCase.js.map +1 -1
- package/dist/packages/core/src/domain/ChangeTemplates.js +1 -1
- package/dist/packages/core/src/domain/DeltaFeature.js +3 -3
- package/dist/packages/core/src/domain/DeltaFeature.js.map +1 -1
- package/dist/packages/core/src/domain/DerivedMatrix.js +9 -9
- package/dist/packages/core/src/domain/DerivedMatrix.js.map +1 -1
- package/dist/packages/core/src/domain/DoneVerification.js +1 -1
- package/dist/packages/core/src/domain/DoneVerification.js.map +1 -1
- package/dist/packages/core/src/domain/DraftChecklist.js +3 -3
- package/dist/packages/core/src/domain/DraftChecklist.js.map +1 -1
- package/dist/packages/core/src/domain/GherkinTags.js +12 -12
- package/dist/packages/core/src/domain/GherkinTags.js.map +1 -1
- package/dist/packages/core/src/domain/InboundChange.js +1 -1
- package/dist/packages/core/src/domain/InboundChange.js.map +1 -1
- package/dist/packages/core/src/domain/Language.js +2 -2
- package/dist/packages/core/src/domain/Language.js.map +1 -1
- package/dist/packages/core/src/domain/Lockfile.js +7 -7
- package/dist/packages/core/src/domain/Lockfile.js.map +1 -1
- package/dist/packages/core/src/domain/PackDelta.js +1 -1
- package/dist/packages/core/src/domain/PackDelta.js.map +1 -1
- package/dist/packages/core/src/domain/RequirementGraph.js +2 -2
- package/dist/packages/core/src/domain/SpecParser.js +6 -6
- package/dist/packages/core/src/domain/SpecParser.js.map +1 -1
- package/dist/packages/core/src/domain/TraceMerge.js +4 -4
- package/dist/packages/core/src/domain/TraceMerge.js.map +1 -1
- package/dist/packages/core/src/domain/TraceabilityFormat.js +4 -4
- package/dist/packages/core/src/domain/TraceabilityFormat.js.map +1 -1
- package/dist/packages/core/src/domain/ValueAnnotations.js +8 -8
- package/dist/packages/core/src/domain/ValueAnnotations.js.map +1 -1
- package/dist/packages/core/src/domain/WriteScope.js +3 -3
- package/dist/packages/core/src/domain/WriteScope.js.map +1 -1
- package/dist/packages/core/src/infrastructure/ChangeWorkspace.js +2 -2
- package/dist/packages/core/src/infrastructure/ChangeWorkspace.js.map +1 -1
- package/dist/packages/core/src/infrastructure/ConsoleReporter.js +2 -2
- package/dist/packages/core/src/infrastructure/ConsoleReporter.js.map +1 -1
- package/dist/packages/core/src/infrastructure/DerivedMatrixSources.js +2 -2
- package/dist/packages/core/src/infrastructure/DerivedMatrixSources.js.map +1 -1
- package/dist/packages/core/src/infrastructure/DiskLanguageRepository.js +4 -4
- package/dist/packages/core/src/infrastructure/DiskLanguageRepository.js.map +1 -1
- package/dist/packages/core/src/infrastructure/DiskPackDeltaRepository.js +1 -1
- package/dist/packages/core/src/infrastructure/DiskPackDeltaRepository.js.map +1 -1
- package/dist/packages/core/src/infrastructure/GitContributionStager.js +3 -3
- package/dist/packages/core/src/infrastructure/GitContributionStager.js.map +1 -1
- package/dist/packages/core/src/infrastructure/RemotePackResolver.js +5 -5
- package/dist/packages/core/src/infrastructure/RemotePackResolver.js.map +1 -1
- package/dist/packages/core/test/unit/delta-feature.test.js +3 -3
- package/dist/packages/core/test/unit/delta-feature.test.js.map +1 -1
- package/dist/packages/core/test/unit/derived-matrix.test.js +8 -8
- package/dist/packages/core/test/unit/derived-matrix.test.js.map +1 -1
- package/dist/packages/core/test/unit/gherkin-tags.test.js +8 -8
- package/dist/packages/core/test/unit/gherkin-tags.test.js.map +1 -1
- package/dist/packages/core/test/unit/inbound-change.test.js +1 -1
- package/dist/packages/core/test/unit/inbound-change.test.js.map +1 -1
- package/dist/packages/core/test/unit/matrix-dependencies.test.js +5 -5
- package/dist/packages/core/test/unit/matrix-dependencies.test.js.map +1 -1
- package/dist/packages/core/test/unit/new-requirement.test.js +1 -1
- package/dist/packages/core/test/unit/new-requirement.test.js.map +1 -1
- package/dist/packages/core/test/unit/value-annotations.test.js +5 -5
- package/dist/packages/core/test/unit/value-annotations.test.js.map +1 -1
- package/dist/packages/core/test/unit/write-scope-status.test.js +5 -5
- package/dist/packages/core/test/unit/write-scope-status.test.js.map +1 -1
- package/dist/packages/mcp-spec-driven/src/native-tools.js +3 -3
- package/dist/packages/mcp-spec-driven/src/native-tools.js.map +1 -1
- package/dist/packages/mcp-spec-driven/src/server.js +1 -7
- package/dist/packages/mcp-spec-driven/src/server.js.map +1 -1
- package/dist/packages/mcp-spec-driven/src/tools.js +4 -4
- package/dist/packages/mcp-spec-driven/src/tools.js.map +1 -1
- package/dist/scripts/agents/init.js +26 -47
- package/dist/scripts/agents/init.js.map +1 -1
- package/dist/scripts/alm/cli.js +37 -3
- package/dist/scripts/alm/cli.js.map +1 -1
- package/dist/scripts/alm/providers/index.js +1 -1
- package/dist/scripts/alm/providers/index.js.map +1 -1
- package/dist/scripts/change/instructions.js +2 -2
- package/dist/scripts/change/instructions.js.map +1 -1
- package/dist/scripts/cli/commands/alm/PullCommand.js +1 -1
- package/dist/scripts/cli/commands/alm/PullCommand.js.map +1 -1
- package/dist/scripts/cli/commands/change/ChangeCommand.js +99 -98
- package/dist/scripts/cli/commands/change/ChangeCommand.js.map +1 -1
- package/dist/scripts/cli/commands/config/CiInitCommand.js +6 -4
- package/dist/scripts/cli/commands/config/CiInitCommand.js.map +1 -1
- package/dist/scripts/cli/commands/config/CompletionCommand.js +10 -10
- package/dist/scripts/cli/commands/config/CompletionCommand.js.map +1 -1
- package/dist/scripts/cli/commands/config/ConfigInitCommand.js +11 -19
- package/dist/scripts/cli/commands/config/ConfigInitCommand.js.map +1 -1
- package/dist/scripts/cli/commands/config/ConfigSetCommand.js +5 -1
- package/dist/scripts/cli/commands/config/ConfigSetCommand.js.map +1 -1
- package/dist/scripts/cli/commands/harness/RunCommand.js +73 -38
- package/dist/scripts/cli/commands/harness/RunCommand.js.map +1 -1
- package/dist/scripts/cli/commands/pack/BundlePackCommand.js +36 -2
- package/dist/scripts/cli/commands/pack/BundlePackCommand.js.map +1 -1
- package/dist/scripts/cli/commands/pack/ExpandDomainPackCommand.js +2 -2
- package/dist/scripts/cli/commands/pack/ExpandDomainPackCommand.js.map +1 -1
- package/dist/scripts/cli/commands/pack/InferPackCommand.js +2 -1
- package/dist/scripts/cli/commands/pack/InferPackCommand.js.map +1 -1
- package/dist/scripts/cli/commands/pack/InitPackCommand.js +23 -32
- package/dist/scripts/cli/commands/pack/InitPackCommand.js.map +1 -1
- package/dist/scripts/cli/commands/pack/LintPackCommand.js +4 -3
- package/dist/scripts/cli/commands/pack/LintPackCommand.js.map +1 -1
- package/dist/scripts/cli/commands/project/AdoptCommand.js +9 -3
- package/dist/scripts/cli/commands/project/AdoptCommand.js.map +1 -1
- package/dist/scripts/cli/commands/project/InitProjectCommand.js +8 -5
- package/dist/scripts/cli/commands/project/InitProjectCommand.js.map +1 -1
- package/dist/scripts/cli/commands/project/OnboardCommand.js +17 -24
- package/dist/scripts/cli/commands/project/OnboardCommand.js.map +1 -1
- package/dist/scripts/cli/commands/project/UpdateCommand.js +23 -43
- package/dist/scripts/cli/commands/project/UpdateCommand.js.map +1 -1
- package/dist/scripts/cli/commands/quality/CheckCommand.js +30 -17
- package/dist/scripts/cli/commands/quality/CheckCommand.js.map +1 -1
- package/dist/scripts/cli/commands/quality/DoctorCommand.js +27 -10
- package/dist/scripts/cli/commands/quality/DoctorCommand.js.map +1 -1
- package/dist/scripts/cli/commands/quality/FixCommand.js +24 -29
- package/dist/scripts/cli/commands/quality/FixCommand.js.map +1 -1
- package/dist/scripts/cli/commands/quality/ReportCommand.js +8 -4
- package/dist/scripts/cli/commands/quality/ReportCommand.js.map +1 -1
- package/dist/scripts/cli/commands/quality/ValidateSpecsCommand.js +69 -16
- package/dist/scripts/cli/commands/quality/ValidateSpecsCommand.js.map +1 -1
- package/dist/scripts/cli/commands/spec/DoneCommand.js +37 -23
- package/dist/scripts/cli/commands/spec/DoneCommand.js.map +1 -1
- package/dist/scripts/cli/commands/spec/DraftCommand.js +166 -81
- package/dist/scripts/cli/commands/spec/DraftCommand.js.map +1 -1
- package/dist/scripts/cli/commands/spec/MatrixCommand.js +24 -27
- package/dist/scripts/cli/commands/spec/MatrixCommand.js.map +1 -1
- package/dist/scripts/cli/commands/spec/NewCommand.js +11 -14
- package/dist/scripts/cli/commands/spec/NewCommand.js.map +1 -1
- package/dist/scripts/cli/commands/spec/PetCommand.js +102 -0
- package/dist/scripts/cli/commands/spec/PetCommand.js.map +1 -0
- package/dist/scripts/cli/commands/spec/PlanCommand.js +34 -39
- package/dist/scripts/cli/commands/spec/PlanCommand.js.map +1 -1
- package/dist/scripts/cli/commands/spec/ReqCommand.js +51 -58
- package/dist/scripts/cli/commands/spec/ReqCommand.js.map +1 -1
- package/dist/scripts/cli/commands/spec/StatusCommand.js +59 -44
- package/dist/scripts/cli/commands/spec/StatusCommand.js.map +1 -1
- package/dist/scripts/cli/commands/spec/StudioCommand.js +16 -24
- package/dist/scripts/cli/commands/spec/StudioCommand.js.map +1 -1
- package/dist/scripts/cli/commands/specops/ContributeCommand.js +24 -32
- package/dist/scripts/cli/commands/specops/ContributeCommand.js.map +1 -1
- package/dist/scripts/cli/commands/specops/DiffCommand.js +3 -2
- package/dist/scripts/cli/commands/specops/DiffCommand.js.map +1 -1
- package/dist/scripts/cli/commands/specops/SyncCommand.js +4 -3
- package/dist/scripts/cli/commands/specops/SyncCommand.js.map +1 -1
- package/dist/scripts/docs/blocks.js +4 -4
- package/dist/scripts/docs/blocks.js.map +1 -1
- package/dist/scripts/docs/build-site.js +23 -8
- package/dist/scripts/docs/build-site.js.map +1 -1
- package/dist/scripts/docs/components.js +24 -24
- package/dist/scripts/docs/components.js.map +1 -1
- package/dist/scripts/docs/nav.js +8 -18
- package/dist/scripts/docs/nav.js.map +1 -1
- package/dist/scripts/docs/record-journey.js +2 -2
- package/dist/scripts/docs/record-journey.js.map +1 -1
- package/dist/scripts/docs/record-terminal.js +12 -12
- package/dist/scripts/docs/record-terminal.js.map +1 -1
- package/dist/scripts/draft/brief-setup.js +4 -0
- package/dist/scripts/draft/brief-setup.js.map +1 -1
- package/dist/scripts/draft/confined-agent.js +19 -0
- package/dist/scripts/draft/confined-agent.js.map +1 -1
- package/dist/scripts/draft/drafting-guide.js +3 -1
- package/dist/scripts/draft/drafting-guide.js.map +1 -1
- package/dist/scripts/gen_mcp_tools.js +4 -4
- package/dist/scripts/gen_mcp_tools.js.map +1 -1
- package/dist/scripts/harness/init.js +25 -16
- package/dist/scripts/harness/init.js.map +1 -1
- package/dist/scripts/harness/report.js +39 -40
- package/dist/scripts/harness/report.js.map +1 -1
- package/dist/scripts/harness/worktree-lock.js +2 -2
- package/dist/scripts/harness/worktree-lock.js.map +1 -1
- package/dist/scripts/lib/command.js +3 -2
- package/dist/scripts/lib/command.js.map +1 -1
- package/dist/scripts/lib/derived-writes.js +1 -1
- package/dist/scripts/lib/diagnostics.js +12 -16
- package/dist/scripts/lib/diagnostics.js.map +1 -1
- package/dist/scripts/lib/placeholders.js +4 -4
- package/dist/scripts/lib/placeholders.js.map +1 -1
- package/dist/scripts/lib/surface.js +25 -14
- package/dist/scripts/lib/surface.js.map +1 -1
- package/dist/scripts/lib/ui.js +356 -0
- package/dist/scripts/lib/ui.js.map +1 -0
- package/dist/scripts/merge-traceability.js +3 -3
- package/dist/scripts/pet/pet.js +331 -0
- package/dist/scripts/pet/pet.js.map +1 -0
- package/dist/scripts/pet.js +10 -0
- package/dist/scripts/pet.js.map +1 -0
- package/dist/scripts/plugin/gate-hook.js +1 -1
- package/dist/scripts/plugin/gate-hook.js.map +1 -1
- package/dist/scripts/schema/registry.js +2 -2
- package/dist/scripts/schema/registry.js.map +1 -1
- package/dist/scripts/specops/add.js +23 -32
- package/dist/scripts/specops/add.js.map +1 -1
- package/dist/scripts/specops/lock.js +4 -4
- package/dist/scripts/specops/lock.js.map +1 -1
- package/dist/scripts/specops/remove.js +15 -24
- package/dist/scripts/specops/remove.js.map +1 -1
- package/package.json +1 -2
|
@@ -65,7 +65,7 @@ ${subCases}
|
|
|
65
65
|
esac
|
|
66
66
|
fi
|
|
67
67
|
}
|
|
68
|
-
complete -F _specgate specgate
|
|
68
|
+
complete -F _specgate specgate create-spec-driven-app
|
|
69
69
|
`;
|
|
70
70
|
}
|
|
71
71
|
function zshScript() {
|
|
@@ -73,7 +73,7 @@ function zshScript() {
|
|
|
73
73
|
const subCases = Object.entries(exports.SUBCOMMANDS)
|
|
74
74
|
.map(([cmd, subs]) => ` ${cmd}) compadd ${subs.join(" ")} ;;`)
|
|
75
75
|
.join("\n");
|
|
76
|
-
return `#compdef specgate
|
|
76
|
+
return `#compdef specgate create-spec-driven-app
|
|
77
77
|
# specgate zsh completion
|
|
78
78
|
_specgate() {
|
|
79
79
|
if (( CURRENT == 2 )); then
|
|
@@ -86,7 +86,7 @@ ${subCases}
|
|
|
86
86
|
esac
|
|
87
87
|
fi
|
|
88
88
|
}
|
|
89
|
-
compdef _specgate specgate
|
|
89
|
+
compdef _specgate specgate create-spec-driven-app
|
|
90
90
|
`;
|
|
91
91
|
}
|
|
92
92
|
function fishScript() {
|
|
@@ -94,11 +94,11 @@ function fishScript() {
|
|
|
94
94
|
"# specgate fish completion",
|
|
95
95
|
"# Only complete the first word when no subcommand has been given yet.",
|
|
96
96
|
`complete -c specgate -n __fish_use_subcommand -a "${exports.COMMANDS.join(" ")}"`,
|
|
97
|
-
`complete -c
|
|
97
|
+
`complete -c specgate -n __fish_use_subcommand -a "${exports.COMMANDS.join(" ")}"`,
|
|
98
98
|
`complete -c create-spec-driven-app -n __fish_use_subcommand -a "${exports.COMMANDS.join(" ")}"`,
|
|
99
99
|
];
|
|
100
100
|
for (const [cmd, subs] of Object.entries(exports.SUBCOMMANDS)) {
|
|
101
|
-
lines.push(`complete -c specgate -n "__fish_seen_subcommand_from ${cmd}" -a "${subs.join(" ")}"`, `complete -c
|
|
101
|
+
lines.push(`complete -c specgate -n "__fish_seen_subcommand_from ${cmd}" -a "${subs.join(" ")}"`, `complete -c specgate -n "__fish_seen_subcommand_from ${cmd}" -a "${subs.join(" ")}"`, `complete -c create-spec-driven-app -n "__fish_seen_subcommand_from ${cmd}" -a "${subs.join(" ")}"`);
|
|
102
102
|
}
|
|
103
103
|
return `${lines.join("\n")}\n`;
|
|
104
104
|
}
|
|
@@ -110,25 +110,25 @@ exports.GENERATORS = {
|
|
|
110
110
|
function installTarget(shell) {
|
|
111
111
|
const home = os.homedir();
|
|
112
112
|
if (shell === "fish") {
|
|
113
|
-
return { file: path.join(home, ".config/fish/completions/
|
|
113
|
+
return { file: path.join(home, ".config/fish/completions/specgate.fish"), autoloaded: true };
|
|
114
114
|
}
|
|
115
115
|
if (shell === "zsh") {
|
|
116
116
|
return {
|
|
117
|
-
file: path.join(home, ".zsh/completions/
|
|
117
|
+
file: path.join(home, ".zsh/completions/_specgate"),
|
|
118
118
|
autoloaded: false,
|
|
119
119
|
hint: "Add to ~/.zshrc: fpath=(~/.zsh/completions $fpath) && autoload -Uz compinit && compinit",
|
|
120
120
|
};
|
|
121
121
|
}
|
|
122
122
|
return {
|
|
123
|
-
file: path.join(home, ".
|
|
123
|
+
file: path.join(home, ".specgate-completion.bash"),
|
|
124
124
|
autoloaded: false,
|
|
125
|
-
hint: "Add to ~/.bashrc: source ~/.
|
|
125
|
+
hint: "Add to ~/.bashrc: source ~/.specgate-completion.bash",
|
|
126
126
|
};
|
|
127
127
|
}
|
|
128
128
|
function usage() {
|
|
129
129
|
process.stderr.write("Usage: specgate completion <bash|zsh|fish> [--install]\n\n" +
|
|
130
130
|
" specgate completion fish --install write it where fish already looks\n" +
|
|
131
|
-
" specgate completion zsh > ~/.
|
|
131
|
+
" specgate completion zsh > ~/.specgate-completion.zsh\n" +
|
|
132
132
|
" specgate completion bash >> ~/.bashrc\n");
|
|
133
133
|
}
|
|
134
134
|
class CompletionCommand extends command_1.BaseCommand {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CompletionCommand.js","sourceRoot":"","sources":["../../../../../scripts/cli/commands/config/CompletionCommand.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,gCAwBC;AAED,8BAoBC;AAED,gCAgBC;AAQD,sCAiBC;AAlGD,4CAA8B;AAC9B,4CAA8B;AAC9B,gDAAkC;AAClC,kDAAqE;AACrE,kDAAmD;AAEtC,QAAA,QAAQ,GAAG,IAAA,sBAAY,GAAE,CAAC;AAC1B,QAAA,WAAW,GAA6B,IAAA,yBAAe,GAAE,CAAC;AAEvE,SAAgB,UAAU;IACxB,MAAM,IAAI,GAAG,gBAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAW,CAAC;SACzC,GAAG,CACF,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,SAAS,GAAG,+BAA+B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAC9F;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO;;;;;;gCAMuB,IAAI;;;;;EAKlC,QAAQ;;;;;CAKT,CAAC;AACF,CAAC;AAED,SAAgB,SAAS;IACvB,MAAM,IAAI,GAAG,gBAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAW,CAAC;SACzC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,WAAW,GAAG,aAAa,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;SACpE,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO;;;;cAIK,IAAI;;;;;EAKhB,QAAQ;;;;;CAKT,CAAC;AACF,CAAC;AAED,SAAgB,UAAU;IACxB,MAAM,KAAK,GAAG;QACZ,4BAA4B;QAC5B,uEAAuE;QACvE,qDAAqD,gBAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;QAC1E,
|
|
1
|
+
{"version":3,"file":"CompletionCommand.js","sourceRoot":"","sources":["../../../../../scripts/cli/commands/config/CompletionCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,15 +38,7 @@ exports.parseArgs = parseArgs;
|
|
|
38
38
|
const fs = __importStar(require("node:fs"));
|
|
39
39
|
const path = __importStar(require("node:path"));
|
|
40
40
|
const command_1 = require("../../../lib/command");
|
|
41
|
-
const
|
|
42
|
-
const c = {
|
|
43
|
-
reset: COLOR_ENABLED ? "\x1b[0m" : "",
|
|
44
|
-
bold: COLOR_ENABLED ? "\x1b[1m" : "",
|
|
45
|
-
dim: COLOR_ENABLED ? "\x1b[2m" : "",
|
|
46
|
-
red: COLOR_ENABLED ? "\x1b[31m" : "",
|
|
47
|
-
green: COLOR_ENABLED ? "\x1b[32m" : "",
|
|
48
|
-
cyan: COLOR_ENABLED ? "\x1b[36m" : "",
|
|
49
|
-
};
|
|
41
|
+
const ui_1 = require("../../../lib/ui");
|
|
50
42
|
exports.TEMPLATE = `# project.yaml — spec-driven project config
|
|
51
43
|
# Fill these in, then: specgate init --config project.yaml --out .
|
|
52
44
|
# Required keys:
|
|
@@ -63,13 +55,13 @@ TESTING: Vitest, Cucumber
|
|
|
63
55
|
# MODULES: "auth,billing" # comma-separated feature modules
|
|
64
56
|
`;
|
|
65
57
|
function usage() {
|
|
66
|
-
process.stdout.write(`\n ${c.bold}${c.cyan}⚙️ config init${c.reset} ${c.dim}— write a commented project.yaml starter${c.reset}\n\n` +
|
|
67
|
-
` ${c.bold}USAGE${c.reset}\n` +
|
|
68
|
-
` ${c.cyan}specgate config init${c.reset} [--out <path>] [--force]\n\n` +
|
|
69
|
-
` ${c.bold}OPTIONS${c.reset}\n` +
|
|
70
|
-
` ${c.green}--out <path>${c.reset} ${c.dim}Target file (default: ./project.yaml).${c.reset}\n` +
|
|
71
|
-
` ${c.green}--force${c.reset} ${c.dim}Overwrite if the file already exists.${c.reset}\n` +
|
|
72
|
-
` ${c.green}-h, --help${c.reset} ${c.dim}Show this help.${c.reset}\n\n`);
|
|
58
|
+
process.stdout.write(`\n ${ui_1.c.bold}${ui_1.c.cyan}⚙️ config init${ui_1.c.reset} ${ui_1.c.dim}— write a commented project.yaml starter${ui_1.c.reset}\n\n` +
|
|
59
|
+
` ${ui_1.c.bold}USAGE${ui_1.c.reset}\n` +
|
|
60
|
+
` ${ui_1.c.cyan}specgate config init${ui_1.c.reset} [--out <path>] [--force]\n\n` +
|
|
61
|
+
` ${ui_1.c.bold}OPTIONS${ui_1.c.reset}\n` +
|
|
62
|
+
` ${ui_1.c.green}--out <path>${ui_1.c.reset} ${ui_1.c.dim}Target file (default: ./project.yaml).${ui_1.c.reset}\n` +
|
|
63
|
+
` ${ui_1.c.green}--force${ui_1.c.reset} ${ui_1.c.dim}Overwrite if the file already exists.${ui_1.c.reset}\n` +
|
|
64
|
+
` ${ui_1.c.green}-h, --help${ui_1.c.reset} ${ui_1.c.dim}Show this help.${ui_1.c.reset}\n\n`);
|
|
73
65
|
}
|
|
74
66
|
function parseArgs(argv) {
|
|
75
67
|
const opts = { out: "project.yaml", force: false };
|
|
@@ -95,12 +87,12 @@ class ConfigInitCommand extends command_1.BaseCommand {
|
|
|
95
87
|
const opts = parseArgs(this.args);
|
|
96
88
|
const dest = path.resolve(opts.out);
|
|
97
89
|
if (fs.existsSync(dest) && !opts.force) {
|
|
98
|
-
process.stderr.write(`${c.red}✖${c.reset} ${opts.out} already exists (use --force to overwrite).\n`);
|
|
90
|
+
process.stderr.write(`${ui_1.c.red}✖${ui_1.c.reset} ${opts.out} already exists (use --force to overwrite).\n`);
|
|
99
91
|
process.exit(2);
|
|
100
92
|
}
|
|
101
93
|
fs.writeFileSync(dest, exports.TEMPLATE, "utf8");
|
|
102
|
-
process.stdout.write(`${c.green}✔${c.reset} Wrote ${c.bold}${opts.out}${c.reset}\n` +
|
|
103
|
-
` ${c.dim}▶ next: edit the values, then \`specgate init --config ${opts.out} --out .\`${c.reset}\n`);
|
|
94
|
+
process.stdout.write(`${ui_1.c.green}✔${ui_1.c.reset} Wrote ${ui_1.c.bold}${opts.out}${ui_1.c.reset}\n` +
|
|
95
|
+
` ${ui_1.c.dim}▶ next: edit the values, then \`specgate init --config ${opts.out} --out .\`${ui_1.c.reset}\n`);
|
|
104
96
|
process.exit(0);
|
|
105
97
|
}
|
|
106
98
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigInitCommand.js","sourceRoot":"","sources":["../../../../../scripts/cli/commands/config/ConfigInitCommand.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"ConfigInitCommand.js","sourceRoot":"","sources":["../../../../../scripts/cli/commands/config/ConfigInitCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,7 +43,7 @@ const diagnostics_1 = require("../../../lib/diagnostics");
|
|
|
43
43
|
const agent_1 = require("../../../lib/agent");
|
|
44
44
|
const command_1 = require("../../../lib/command");
|
|
45
45
|
const HarnessConfigFile_1 = require("../../../../packages/core/src/infrastructure/HarnessConfigFile");
|
|
46
|
-
exports.CONFIG_DIR = ".
|
|
46
|
+
exports.CONFIG_DIR = ".specgate";
|
|
47
47
|
exports.CONFIG_FILE = "config.json";
|
|
48
48
|
exports.KEYS = {
|
|
49
49
|
profile: {
|
|
@@ -54,6 +54,10 @@ exports.KEYS = {
|
|
|
54
54
|
values: null,
|
|
55
55
|
describe: "Language for generated prose. Technical terms stay in English.",
|
|
56
56
|
},
|
|
57
|
+
pet: {
|
|
58
|
+
values: ["on", "off"],
|
|
59
|
+
describe: "Whether Gato, the cat that keeps the gate, shows up at the end of `status`.",
|
|
60
|
+
},
|
|
57
61
|
test_cmd: {
|
|
58
62
|
values: null,
|
|
59
63
|
describe: `The command \`check\` and \`done\` run as your tests. Kept in ${HarnessConfigFile_1.HARNESS_CONFIG_FILE}.`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigSetCommand.js","sourceRoot":"","sources":["../../../../../scripts/cli/commands/config/ConfigSetCommand.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"ConfigSetCommand.js","sourceRoot":"","sources":["../../../../../scripts/cli/commands/config/ConfigSetCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -66,6 +66,7 @@ exports.runLevels = runLevels;
|
|
|
66
66
|
const run_with_deadline_1 = require("../../../lib/run-with-deadline");
|
|
67
67
|
const MatrixCommand_1 = require("../spec/MatrixCommand");
|
|
68
68
|
const derived_writes_1 = require("../../../lib/derived-writes");
|
|
69
|
+
const ui = __importStar(require("../../../lib/ui"));
|
|
69
70
|
const fs = __importStar(require("node:fs"));
|
|
70
71
|
const os = __importStar(require("node:os"));
|
|
71
72
|
const path = __importStar(require("node:path"));
|
|
@@ -118,14 +119,27 @@ let jsonMode = false;
|
|
|
118
119
|
function setJsonMode(on) {
|
|
119
120
|
jsonMode = Boolean(on);
|
|
120
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* A progress line. `REQ-001: attempt 1/3` is drawn with the requirement in its
|
|
124
|
+
* own column, so a run over many requirements reads down one edge; a line that
|
|
125
|
+
* starts with spaces continues the one above it.
|
|
126
|
+
*/
|
|
127
|
+
function progressLine(mark, msg) {
|
|
128
|
+
const m = /^([A-Z][A-Z0-9]*-[\w.-]+): (.*)$/s.exec(msg);
|
|
129
|
+
if (m)
|
|
130
|
+
return ` ${mark} ${ui.c.accent}${ui.pad(m[1], 9)}${ui.c.reset} ${m[2]}\n`;
|
|
131
|
+
if (/^\s{2,}/.test(msg))
|
|
132
|
+
return ` ${ui.pad("", 9)} ${ui.muted(msg.trim())}\n`;
|
|
133
|
+
return ` ${mark} ${msg}\n`;
|
|
134
|
+
}
|
|
121
135
|
function info(msg) {
|
|
122
|
-
(jsonMode ? process.stderr : process.stdout).write(
|
|
136
|
+
(jsonMode ? process.stderr : process.stdout).write(progressLine(`${ui.c.brand}${ui.ASCII ? "*" : "◇"}${ui.c.reset}`, msg));
|
|
123
137
|
}
|
|
124
138
|
function warn(msg) {
|
|
125
|
-
(jsonMode ? process.stderr : process.stdout).write(
|
|
139
|
+
(jsonMode ? process.stderr : process.stdout).write(progressLine(`${ui.c.warn}${ui.sym.warn}${ui.c.reset}`, msg));
|
|
126
140
|
}
|
|
127
141
|
function error(msg) {
|
|
128
|
-
process.stderr.write(
|
|
142
|
+
process.stderr.write(ui.fail(msg));
|
|
129
143
|
}
|
|
130
144
|
function usage() {
|
|
131
145
|
process.stdout.write("Usage:\n" +
|
|
@@ -534,7 +548,7 @@ function runAdversarialProbe(worktreeDir, req, settings, timeoutMs, promptFor) {
|
|
|
534
548
|
`empty input, a boundary, a duplicate, a failure path. Write the test and ` +
|
|
535
549
|
`nothing else. Do not modify the implementation, the specification or any ` +
|
|
536
550
|
`existing test.`;
|
|
537
|
-
const promptFile = path.join(os.tmpdir(), `
|
|
551
|
+
const promptFile = path.join(os.tmpdir(), `specgate-probe-${req.requirement}-${crypto.randomBytes(4).toString("hex")}.md`);
|
|
538
552
|
try {
|
|
539
553
|
fs.writeFileSync(promptFile, promptFor(instruction), "utf8");
|
|
540
554
|
const agent = (0, node_child_process_1.spawnSync)((0, HarnessRun_1.substituteAgentCommand)(command, promptFile), {
|
|
@@ -848,7 +862,7 @@ function attemptRequirement(req, ctx) {
|
|
|
848
862
|
// sibling requirement this same run happens to be writing.
|
|
849
863
|
withPrecedents: settings.promptPrecedents === true,
|
|
850
864
|
});
|
|
851
|
-
const promptFile = path.join(os.tmpdir(), `
|
|
865
|
+
const promptFile = path.join(os.tmpdir(), `specgate-harness-prompt-${req.requirement}-${crypto.randomBytes(4).toString("hex")}.md`);
|
|
852
866
|
fs.writeFileSync(promptFile, prompt, "utf8");
|
|
853
867
|
archivePrompt(worktreeDir, req.requirement, attempt, step, prompt);
|
|
854
868
|
// D1: a profile chosen by matching this requirement, when one matches.
|
|
@@ -1242,7 +1256,7 @@ function deriveBase(projectDir, reqId, deps, passed, ctx) {
|
|
|
1242
1256
|
if (cut.status !== 0) {
|
|
1243
1257
|
return { error: `could not create ${integration}: ${cut.stderr || cut.stdout}` };
|
|
1244
1258
|
}
|
|
1245
|
-
const worktree = path.join(os.tmpdir(), `
|
|
1259
|
+
const worktree = path.join(os.tmpdir(), `specgate-harness-base-${reqId}-${crypto.randomBytes(4).toString("hex")}`);
|
|
1246
1260
|
const add = git(projectDir, ["worktree", "add", worktree, integration]);
|
|
1247
1261
|
if (add.status !== 0) {
|
|
1248
1262
|
return { error: `could not check out ${integration}: ${add.stderr || add.stdout}` };
|
|
@@ -1521,7 +1535,7 @@ function processRequirement(req, ctx) {
|
|
|
1521
1535
|
.join(", ")}. Fix the blockers above, or drop --skip-not-ready to run it anyway.`,
|
|
1522
1536
|
};
|
|
1523
1537
|
}
|
|
1524
|
-
const worktreeDir = path.join(os.tmpdir(), `
|
|
1538
|
+
const worktreeDir = path.join(os.tmpdir(), `specgate-harness-${req.requirement}-${crypto.randomBytes(4).toString("hex")}`);
|
|
1525
1539
|
// Three ways to meet an existing branch, and until C3 there were only two:
|
|
1526
1540
|
// skip it, or delete it with --force. After an interruption — a crash, a
|
|
1527
1541
|
// Ctrl-C, a spend limit — neither is what anyone wants.
|
|
@@ -1700,7 +1714,7 @@ function publishBranch(projectDir, branch, req, settings) {
|
|
|
1700
1714
|
* enough that ten failed requirements do not bury the summary.
|
|
1701
1715
|
*/
|
|
1702
1716
|
const FAILURE_TAIL_LINES = 20;
|
|
1703
|
-
function printReport(results, format) {
|
|
1717
|
+
function printReport(results, format, recorded) {
|
|
1704
1718
|
if (format === "json") {
|
|
1705
1719
|
const summary = results.reduce((acc, r) => {
|
|
1706
1720
|
acc[r.result] = (acc[r.result] || 0) + 1;
|
|
@@ -1709,19 +1723,24 @@ function printReport(results, format) {
|
|
|
1709
1723
|
process.stdout.write(JSON.stringify({ schemaVersion: 1, total: results.length, summary, results }, null, 2) + "\n");
|
|
1710
1724
|
return;
|
|
1711
1725
|
}
|
|
1712
|
-
|
|
1726
|
+
const MARK = {
|
|
1727
|
+
pass: `${ui.c.ok}${ui.sym.ok}${ui.c.reset}`,
|
|
1728
|
+
fail: `${ui.c.bad}${ui.sym.fail}${ui.c.reset}`,
|
|
1729
|
+
blocked: `${ui.c.warn}${ui.sym.warn}${ui.c.reset}`,
|
|
1730
|
+
skipped: `${ui.c.muted}${ui.sym.empty}${ui.c.reset}`,
|
|
1731
|
+
};
|
|
1732
|
+
const COLOR = { pass: ui.c.ok, fail: ui.c.bad, blocked: ui.c.warn, skipped: ui.c.muted };
|
|
1733
|
+
const idWidth = Math.max(9, ...results.map((r) => String(r.requirement).length));
|
|
1734
|
+
process.stdout.write("\n" + ui.section("Harness report"));
|
|
1713
1735
|
for (const r of results) {
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
? "⛔"
|
|
1720
|
-
: "❌";
|
|
1721
|
-
process.stdout.write(` ${icon} ${r.requirement} ${r.result} (${r.attempts} attempt${r.attempts === 1 ? "" : "s"}) → ${r.branch}\n`);
|
|
1736
|
+
process.stdout.write(` ${MARK[r.result] || MARK.fail} ${ui.c.bold}${ui.pad(String(r.requirement), idWidth)}${ui.c.reset} ` +
|
|
1737
|
+
`${COLOR[r.result] || ""}${ui.pad(r.result, 8)}${ui.c.reset}` +
|
|
1738
|
+
ui.muted(`${r.attempts} attempt${r.attempts === 1 ? "" : "s"}`) +
|
|
1739
|
+
` ${ui.c.accent}${ui.sym.arrow} ${r.branch}${ui.c.reset}\n`);
|
|
1740
|
+
const sub = (t) => process.stdout.write(` ${t}\n`);
|
|
1722
1741
|
if (r.result === "blocked") {
|
|
1723
1742
|
// Nothing ran, so there is no gate output to show — only the reason.
|
|
1724
|
-
|
|
1743
|
+
sub(r.error);
|
|
1725
1744
|
continue;
|
|
1726
1745
|
}
|
|
1727
1746
|
if (r.result !== "pass" && r.error) {
|
|
@@ -1736,24 +1755,24 @@ function printReport(results, format) {
|
|
|
1736
1755
|
.slice(1)
|
|
1737
1756
|
.filter((l) => l.trim() !== "")
|
|
1738
1757
|
.slice(-FAILURE_TAIL_LINES);
|
|
1739
|
-
|
|
1758
|
+
sub(head);
|
|
1740
1759
|
for (const line of tail)
|
|
1741
|
-
|
|
1760
|
+
sub(`${ui.muted(ui.sym.pipe)} ${line}`);
|
|
1742
1761
|
if (tail.length > 0) {
|
|
1743
|
-
|
|
1762
|
+
sub(ui.muted(`${ui.sym.corner} full output: --format json · reproduce: --keep-worktrees`));
|
|
1744
1763
|
}
|
|
1745
1764
|
if (r.workPreserved) {
|
|
1746
|
-
|
|
1765
|
+
sub(ui.muted(`↳ the attempt is committed on ${r.branch} — review it`));
|
|
1747
1766
|
}
|
|
1748
1767
|
else if (r.result === "fail") {
|
|
1749
|
-
|
|
1768
|
+
sub(ui.muted("↳ the agent produced no files"));
|
|
1750
1769
|
}
|
|
1751
1770
|
}
|
|
1752
1771
|
if (r.pushed) {
|
|
1753
|
-
|
|
1772
|
+
sub(ui.muted(`pushed${r.prCreated ? ` · PR created${r.prOutput ? `: ${r.prOutput}` : ""}` : ""}`));
|
|
1754
1773
|
}
|
|
1755
1774
|
if (r.publishError) {
|
|
1756
|
-
|
|
1775
|
+
sub(`${ui.c.warn}publish issue:${ui.c.reset} ${String(r.publishError).split("\n")[0]}`);
|
|
1757
1776
|
}
|
|
1758
1777
|
}
|
|
1759
1778
|
const pass = results.filter((r) => r.result === "pass").length;
|
|
@@ -1764,9 +1783,18 @@ function printReport(results, format) {
|
|
|
1764
1783
|
// used to produce N failures and N wasted agent invocations, which said
|
|
1765
1784
|
// nothing about the N-1 requirements that were never attempted.
|
|
1766
1785
|
const blockedNote = blocked > 0 ? ` · ${blocked} blocked` : "";
|
|
1767
|
-
process.stdout.write(`\n ${pass
|
|
1786
|
+
process.stdout.write(`\n ${ui.progress(pass, results.length, "passed")}` +
|
|
1787
|
+
ui.muted(` ${pass} passed · ${fail} failed · ${skip} skipped${blockedNote}`) +
|
|
1788
|
+
"\n");
|
|
1789
|
+
if (recorded) {
|
|
1790
|
+
process.stdout.write(` ${ui.muted(`Run recorded in ${recorded} — specgate harness report sums them up`)}\n`);
|
|
1791
|
+
}
|
|
1768
1792
|
if (pass > 0) {
|
|
1769
|
-
|
|
1793
|
+
const first = results.find((r) => r.result === "pass");
|
|
1794
|
+
process.stdout.write(ui.next(`git diff HEAD...${first.branch}`, "review and merge the harness/* branches you trust"));
|
|
1795
|
+
}
|
|
1796
|
+
else {
|
|
1797
|
+
process.stdout.write("\n");
|
|
1770
1798
|
}
|
|
1771
1799
|
}
|
|
1772
1800
|
/**
|
|
@@ -1839,7 +1867,7 @@ function runWorkers(runnable, byId, ctx, concurrency) {
|
|
|
1839
1867
|
continue;
|
|
1840
1868
|
}
|
|
1841
1869
|
const child = (0, node_child_process_1.spawn)(process.execPath, [WORKER_ENTRY, ...workerArgs(id, ctx)], {
|
|
1842
|
-
env: { ...process.env,
|
|
1870
|
+
env: { ...process.env, SPECGATE_HARNESS_WORKER: "1" },
|
|
1843
1871
|
});
|
|
1844
1872
|
let stdout = "";
|
|
1845
1873
|
let stderr = "";
|
|
@@ -2131,19 +2159,24 @@ class RunCommand extends command_1.BaseCommand {
|
|
|
2131
2159
|
}
|
|
2132
2160
|
}
|
|
2133
2161
|
if (pending.length === 0) {
|
|
2134
|
-
|
|
2162
|
+
if (jsonMode)
|
|
2163
|
+
info("No pending requirements. Nothing to do.");
|
|
2164
|
+
else
|
|
2165
|
+
process.stdout.write(ui.header("harness run") + ui.ok("No pending requirements. Nothing to do.") + "\n");
|
|
2135
2166
|
process.exit(0);
|
|
2136
2167
|
}
|
|
2137
2168
|
const hintByReq = new Map((plan.next_steps || []).map((s) => [s.requirement, s.hint]));
|
|
2138
2169
|
if (args.dryRun) {
|
|
2139
|
-
|
|
2170
|
+
process.stdout.write(ui.header("harness run", `dry run · ${pending.length} requirement(s) would be processed`));
|
|
2140
2171
|
for (const req of pending) {
|
|
2141
2172
|
const prompt = (0, prompt_1.buildPrompt)(req, projectDir, {
|
|
2142
2173
|
promptPrefix: settings.promptPrefix,
|
|
2143
2174
|
hint: hintByReq.get(req.requirement),
|
|
2144
2175
|
withPrecedents: settings.promptPrecedents === true,
|
|
2145
2176
|
});
|
|
2146
|
-
process.stdout.write(
|
|
2177
|
+
process.stdout.write("\n" +
|
|
2178
|
+
ui.section(`${req.requirement} · ${req.category} → branch harness/${req.requirement}`) +
|
|
2179
|
+
"\n");
|
|
2147
2180
|
process.stdout.write(prompt + "\n");
|
|
2148
2181
|
}
|
|
2149
2182
|
process.exit(0);
|
|
@@ -2162,12 +2195,17 @@ class RunCommand extends command_1.BaseCommand {
|
|
|
2162
2195
|
throw new Error(identity);
|
|
2163
2196
|
const baseRef = args.baseBranch || "HEAD";
|
|
2164
2197
|
const concurrencyNote = settings.concurrency > 1 ? `, up to ${settings.concurrency} at a time` : "";
|
|
2165
|
-
|
|
2198
|
+
if (jsonMode || process.env.SPECGATE_HARNESS_WORKER) {
|
|
2199
|
+
info(`Processing ${pending.length} requirement(s) from base ${baseRef}${concurrencyNote}.`);
|
|
2200
|
+
}
|
|
2201
|
+
else {
|
|
2202
|
+
process.stdout.write(ui.header("harness run", `${pending.length} requirement(s) from ${baseRef}${concurrencyNote}`));
|
|
2203
|
+
}
|
|
2166
2204
|
// One prune, in the parent, before anything is created. It used to run per
|
|
2167
2205
|
// requirement, which is harmless in series and a race in parallel:
|
|
2168
2206
|
// `git worktree prune` running while a sibling is inside
|
|
2169
2207
|
// `git worktree add` can remove the record of the worktree being created.
|
|
2170
|
-
if (!process.env.
|
|
2208
|
+
if (!process.env.SPECGATE_HARNESS_WORKER) {
|
|
2171
2209
|
git(projectDir, ["worktree", "prune"]);
|
|
2172
2210
|
}
|
|
2173
2211
|
const ctx = {
|
|
@@ -2195,7 +2233,7 @@ class RunCommand extends command_1.BaseCommand {
|
|
|
2195
2233
|
// slice of that run, and its own record would be a second copy of the
|
|
2196
2234
|
// same requirement — `harness report` reads every file in the directory,
|
|
2197
2235
|
// so duplicates land straight in "cost per delivered REQ".
|
|
2198
|
-
const recordPath = process.env.
|
|
2236
|
+
const recordPath = process.env.SPECGATE_HARNESS_WORKER
|
|
2199
2237
|
? null
|
|
2200
2238
|
: writeRunRecord(projectDir, {
|
|
2201
2239
|
schemaVersion: 1,
|
|
@@ -2212,10 +2250,7 @@ class RunCommand extends command_1.BaseCommand {
|
|
|
2212
2250
|
}),
|
|
2213
2251
|
results,
|
|
2214
2252
|
});
|
|
2215
|
-
printReport(results, args.format);
|
|
2216
|
-
if (recordPath && args.format !== "json") {
|
|
2217
|
-
info(`Run recorded in ${path.relative(projectDir, recordPath)} — \`specgate harness report\``);
|
|
2218
|
-
}
|
|
2253
|
+
printReport(results, args.format, recordPath ? path.relative(projectDir, recordPath) : undefined);
|
|
2219
2254
|
// A blocked requirement was never attempted, so it is not a pass — but it
|
|
2220
2255
|
// is also not evidence that anything is broken beyond the failure that
|
|
2221
2256
|
// caused it. It still fails the run, because work was left undone.
|