infinity-harness 2.8.9 → 2.8.11
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 +18 -0
- package/dist/extensions/infinity-harness/index.js +3614 -0
- package/dist/extensions/infinity-harness/index.js.map +1 -0
- package/dist/src/approval.js +154 -0
- package/dist/src/approval.js.map +1 -0
- package/dist/src/core/brief.js +309 -0
- package/dist/src/core/brief.js.map +1 -0
- package/dist/src/core/config.js +539 -0
- package/dist/src/core/config.js.map +1 -0
- package/dist/src/core/exec.js +106 -0
- package/dist/src/core/exec.js.map +1 -0
- package/dist/src/core/featureList.js +365 -0
- package/dist/src/core/featureList.js.map +1 -0
- package/dist/src/core/fsx.js +123 -0
- package/dist/src/core/fsx.js.map +1 -0
- package/dist/src/core/gates.js +490 -0
- package/dist/src/core/gates.js.map +1 -0
- package/dist/src/core/init.js +480 -0
- package/dist/src/core/init.js.map +1 -0
- package/dist/src/core/lock.js +183 -0
- package/dist/src/core/lock.js.map +1 -0
- package/dist/src/core/modelRouter.js +185 -0
- package/dist/src/core/modelRouter.js.map +1 -0
- package/dist/src/core/paths.js +129 -0
- package/dist/src/core/paths.js.map +1 -0
- package/dist/src/core/phases.js +254 -0
- package/dist/src/core/phases.js.map +1 -0
- package/dist/src/core/plan.js +15 -0
- package/dist/src/core/plan.js.map +1 -0
- package/dist/src/core/runState.js +126 -0
- package/dist/src/core/runState.js.map +1 -0
- package/dist/src/core/settings.js +877 -0
- package/dist/src/core/settings.js.map +1 -0
- package/dist/src/core/skills.js +319 -0
- package/dist/src/core/skills.js.map +1 -0
- package/dist/src/core/skillsAudit.js +194 -0
- package/dist/src/core/skillsAudit.js.map +1 -0
- package/dist/src/core/types.js +77 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/daemon/budget.js +85 -0
- package/dist/src/daemon/budget.js.map +1 -0
- package/dist/src/daemon/guard.js +122 -0
- package/dist/src/daemon/guard.js.map +1 -0
- package/dist/src/daemon/index.js +461 -0
- package/dist/src/daemon/index.js.map +1 -0
- package/dist/src/daemon/isolation.js +84 -0
- package/dist/src/daemon/isolation.js.map +1 -0
- package/dist/src/daemon/preflight.js +131 -0
- package/dist/src/daemon/preflight.js.map +1 -0
- package/dist/src/daemon/server.js +174 -0
- package/dist/src/daemon/server.js.map +1 -0
- package/dist/src/daemon/supervisorState.js +42 -0
- package/dist/src/daemon/supervisorState.js.map +1 -0
- package/dist/src/daemon/worker.js +239 -0
- package/dist/src/daemon/worker.js.map +1 -0
- package/dist/src/daemon/worktree.js +102 -0
- package/dist/src/daemon/worktree.js.map +1 -0
- package/dist/src/escalate.js +312 -0
- package/dist/src/escalate.js.map +1 -0
- package/dist/src/exec/piWorker.js +630 -0
- package/dist/src/exec/piWorker.js.map +1 -0
- package/dist/src/goal.js +317 -0
- package/dist/src/goal.js.map +1 -0
- package/dist/src/goalLoop.js +374 -0
- package/dist/src/goalLoop.js.map +1 -0
- package/dist/src/goalSpec.js +397 -0
- package/dist/src/goalSpec.js.map +1 -0
- package/dist/src/goalState.js +255 -0
- package/dist/src/goalState.js.map +1 -0
- package/dist/src/handoff.js +205 -0
- package/dist/src/handoff.js.map +1 -0
- package/dist/src/intake.js +203 -0
- package/dist/src/intake.js.map +1 -0
- package/dist/src/loop.js +592 -0
- package/dist/src/loop.js.map +1 -0
- package/dist/src/modelRouter.js +216 -0
- package/dist/src/modelRouter.js.map +1 -0
- package/dist/src/remote.js +246 -0
- package/dist/src/remote.js.map +1 -0
- package/dist/src/replan.js +262 -0
- package/dist/src/replan.js.map +1 -0
- package/dist/src/review.js +54 -0
- package/dist/src/review.js.map +1 -0
- package/dist/src/rework.js +241 -0
- package/dist/src/rework.js.map +1 -0
- package/dist/src/runState.js +4 -0
- package/dist/src/runState.js.map +1 -0
- package/dist/src/scheduler.js +270 -0
- package/dist/src/scheduler.js.map +1 -0
- package/dist/src/supervisor.js +787 -0
- package/dist/src/supervisor.js.map +1 -0
- package/dist/src/taskList.js +430 -0
- package/dist/src/taskList.js.map +1 -0
- package/dist/src/ui/config.js +268 -0
- package/dist/src/ui/config.js.map +1 -0
- package/dist/src/ui/dashboard.js +1288 -0
- package/dist/src/ui/dashboard.js.map +1 -0
- package/dist/src/ui/display.js +229 -0
- package/dist/src/ui/display.js.map +1 -0
- package/dist/src/ui/planTree.js +219 -0
- package/dist/src/ui/planTree.js.map +1 -0
- package/dist/src/ui/theme.js +298 -0
- package/dist/src/ui/theme.js.map +1 -0
- package/dist/src/ui/viewState.js +65 -0
- package/dist/src/ui/viewState.js.map +1 -0
- package/dist/src/ui/widget.js +721 -0
- package/dist/src/ui/widget.js.map +1 -0
- package/dist/src/ui/wizard.js +540 -0
- package/dist/src/ui/wizard.js.map +1 -0
- package/dist/src/unstuck.js +210 -0
- package/dist/src/unstuck.js.map +1 -0
- package/dist/src/worker.js +267 -0
- package/dist/src/worker.js.map +1 -0
- package/dist/src/workflow.js +250 -0
- package/dist/src/workflow.js.map +1 -0
- package/dist/tests/approval.test.js +144 -0
- package/dist/tests/approval.test.js.map +1 -0
- package/dist/tests/brief.test.js +271 -0
- package/dist/tests/brief.test.js.map +1 -0
- package/dist/tests/config.test.js +320 -0
- package/dist/tests/config.test.js.map +1 -0
- package/dist/tests/dashboard.test.js +277 -0
- package/dist/tests/dashboard.test.js.map +1 -0
- package/dist/tests/display.test.js +229 -0
- package/dist/tests/display.test.js.map +1 -0
- package/dist/tests/escalate.test.js +272 -0
- package/dist/tests/escalate.test.js.map +1 -0
- package/dist/tests/featureList.test.js +429 -0
- package/dist/tests/featureList.test.js.map +1 -0
- package/dist/tests/gates.test.js +333 -0
- package/dist/tests/gates.test.js.map +1 -0
- package/dist/tests/goal.test.js +229 -0
- package/dist/tests/goal.test.js.map +1 -0
- package/dist/tests/goalLoop.test.js +170 -0
- package/dist/tests/goalLoop.test.js.map +1 -0
- package/dist/tests/goalSpec.test.js +146 -0
- package/dist/tests/goalSpec.test.js.map +1 -0
- package/dist/tests/goalState.test.js +202 -0
- package/dist/tests/goalState.test.js.map +1 -0
- package/dist/tests/handoff.test.js +127 -0
- package/dist/tests/handoff.test.js.map +1 -0
- package/dist/tests/init.test.js +264 -0
- package/dist/tests/init.test.js.map +1 -0
- package/dist/tests/intake.test.js +288 -0
- package/dist/tests/intake.test.js.map +1 -0
- package/dist/tests/loop.test.js +453 -0
- package/dist/tests/loop.test.js.map +1 -0
- package/dist/tests/modelRouter.test.js +131 -0
- package/dist/tests/modelRouter.test.js.map +1 -0
- package/dist/tests/phases.test.js +244 -0
- package/dist/tests/phases.test.js.map +1 -0
- package/dist/tests/planTree.test.js +190 -0
- package/dist/tests/planTree.test.js.map +1 -0
- package/dist/tests/remote.test.js +380 -0
- package/dist/tests/remote.test.js.map +1 -0
- package/dist/tests/replan.test.js +113 -0
- package/dist/tests/replan.test.js.map +1 -0
- package/dist/tests/review.test.js +77 -0
- package/dist/tests/review.test.js.map +1 -0
- package/dist/tests/rework.test.js +109 -0
- package/dist/tests/rework.test.js.map +1 -0
- package/dist/tests/routing-live.test.js +121 -0
- package/dist/tests/routing-live.test.js.map +1 -0
- package/dist/tests/runState.test.js +73 -0
- package/dist/tests/runState.test.js.map +1 -0
- package/dist/tests/settings.test.js +311 -0
- package/dist/tests/settings.test.js.map +1 -0
- package/dist/tests/skills.test.js +387 -0
- package/dist/tests/skills.test.js.map +1 -0
- package/dist/tests/supervisor.test.js +437 -0
- package/dist/tests/supervisor.test.js.map +1 -0
- package/dist/tests/surface.test.js +203 -0
- package/dist/tests/surface.test.js.map +1 -0
- package/dist/tests/taskList.test.js +376 -0
- package/dist/tests/taskList.test.js.map +1 -0
- package/dist/tests/theme.test.js +149 -0
- package/dist/tests/theme.test.js.map +1 -0
- package/dist/tests/unstuck.test.js +268 -0
- package/dist/tests/unstuck.test.js.map +1 -0
- package/dist/tests/widget.test.js +424 -0
- package/dist/tests/widget.test.js.map +1 -0
- package/dist/tests/worker.test.js +306 -0
- package/dist/tests/worker.test.js.map +1 -0
- package/dist/tests/workflow.test.js +187 -0
- package/dist/tests/workflow.test.js.map +1 -0
- package/extensions/infinity-harness/index.ts +39 -12
- package/package.json +5 -2
- package/src/core/modelRouter.ts +23 -1
- package/src/daemon/index.ts +3 -3
- package/src/daemon/worker.ts +28 -5
- package/src/ui/config.ts +25 -1
- package/src/ui/wizard.ts +10 -5
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* infinity-harness — creating a harness in a project.
|
|
3
|
+
*
|
|
4
|
+
* Until this module existed there was no way to start. `pi install` put the
|
|
5
|
+
* extension in place, and then every command answered:
|
|
6
|
+
*
|
|
7
|
+
* Warning: No harness in this project (harness/config.json not found).
|
|
8
|
+
*
|
|
9
|
+
* with nothing anywhere that would create one. The tool was, in the most
|
|
10
|
+
* literal sense, unusable out of the box.
|
|
11
|
+
*
|
|
12
|
+
* Init writes the smallest complete harness: the config, an empty plan, the
|
|
13
|
+
* phase and role docs the brief points at, and starters for the documents the
|
|
14
|
+
* REVIEW and SHIP gates demand.
|
|
15
|
+
*
|
|
16
|
+
* Those starters are deliberately shorter than the gate thresholds. It would
|
|
17
|
+
* be easy to scaffold an ARCHITECTURE.md long enough to satisfy
|
|
18
|
+
* `docCheck(..., 200)` on the day it is created — and that would mean the
|
|
19
|
+
* review gate passes on boilerplate nobody wrote. The whole design rests on
|
|
20
|
+
* the gate being unbribable; the setup step is not the place to hand it a
|
|
21
|
+
* bribe.
|
|
22
|
+
*/
|
|
23
|
+
import { existsSync, readFileSync, readdirSync, mkdirSync, statSync, writeFileSync } from "node:fs";
|
|
24
|
+
import { dirname, join, resolve } from "node:path";
|
|
25
|
+
import { fileURLToPath } from "node:url";
|
|
26
|
+
import { DEFAULT_ENABLED_PHASES, PHASE_ORDER, PHASE_ROLE } from "./types.js";
|
|
27
|
+
import { defaultConfig, saveConfig } from "./config.js";
|
|
28
|
+
import { emptyFeatureList, saveFeatureList } from "./featureList.js";
|
|
29
|
+
import * as P from "./paths.js";
|
|
30
|
+
import { normalizeDisplay } from "../ui/display.js";
|
|
31
|
+
const NO_COMMANDS = { lint: null, test: null, coverage: null, build: null };
|
|
32
|
+
/**
|
|
33
|
+
* Work out what kind of project this is, and what its checks are.
|
|
34
|
+
*
|
|
35
|
+
* Only evidenced commands are proposed. Guessing `pytest` at a project that
|
|
36
|
+
* does not have pytest installed produces a gate that fails for a reason the
|
|
37
|
+
* user did not cause and cannot read — worse than proposing nothing, because
|
|
38
|
+
* an empty command is skipped and says so.
|
|
39
|
+
*/
|
|
40
|
+
export function detectStack(targetDir) {
|
|
41
|
+
const has = (f) => existsSync(resolve(targetDir, f));
|
|
42
|
+
if (has("package.json")) {
|
|
43
|
+
return { id: "node", label: "Node / TypeScript", evidence: "package.json", commands: nodeCommands(targetDir) };
|
|
44
|
+
}
|
|
45
|
+
if (has("Cargo.toml")) {
|
|
46
|
+
return {
|
|
47
|
+
id: "rust",
|
|
48
|
+
label: "Rust",
|
|
49
|
+
evidence: "Cargo.toml",
|
|
50
|
+
// cargo ships the same three verbs in every Rust project there is.
|
|
51
|
+
commands: {
|
|
52
|
+
lint: "cargo clippy -- -D warnings",
|
|
53
|
+
test: "cargo test",
|
|
54
|
+
coverage: null,
|
|
55
|
+
build: "cargo build",
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
if (has("go.mod")) {
|
|
60
|
+
return {
|
|
61
|
+
id: "go",
|
|
62
|
+
label: "Go",
|
|
63
|
+
evidence: "go.mod",
|
|
64
|
+
commands: { lint: "go vet ./...", test: "go test ./...", coverage: null, build: "go build ./..." },
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
if (has("pyproject.toml") || has("requirements.txt") || has("setup.py")) {
|
|
68
|
+
return {
|
|
69
|
+
id: "python",
|
|
70
|
+
label: "Python",
|
|
71
|
+
evidence: has("pyproject.toml") ? "pyproject.toml" : has("setup.py") ? "setup.py" : "requirements.txt",
|
|
72
|
+
commands: pythonCommands(targetDir),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return { id: "unknown", label: "unrecognised", evidence: "no manifest found", commands: { ...NO_COMMANDS } };
|
|
76
|
+
}
|
|
77
|
+
function nodeCommands(targetDir) {
|
|
78
|
+
let scripts = {};
|
|
79
|
+
try {
|
|
80
|
+
const pkg = JSON.parse(readFileSync(resolve(targetDir, "package.json"), "utf-8"));
|
|
81
|
+
if (pkg && typeof pkg.scripts === "object" && pkg.scripts)
|
|
82
|
+
scripts = pkg.scripts;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return { ...NO_COMMANDS };
|
|
86
|
+
}
|
|
87
|
+
const runner = existsSync(resolve(targetDir, "pnpm-lock.yaml"))
|
|
88
|
+
? "pnpm"
|
|
89
|
+
: existsSync(resolve(targetDir, "yarn.lock"))
|
|
90
|
+
? "yarn"
|
|
91
|
+
: existsSync(resolve(targetDir, "bun.lockb"))
|
|
92
|
+
? "bun"
|
|
93
|
+
: "npm";
|
|
94
|
+
const run = (script) => (runner === "npm" ? `npm run ${script}` : `${runner} run ${script}`);
|
|
95
|
+
const first = (...names) => names.find((n) => typeof scripts[n] === "string");
|
|
96
|
+
const lint = first("lint", "check", "eslint");
|
|
97
|
+
const test = first("test", "test:unit", "tests");
|
|
98
|
+
const coverage = first("coverage", "test:coverage", "test:cov");
|
|
99
|
+
const build = first("build", "compile");
|
|
100
|
+
return {
|
|
101
|
+
lint: lint ? run(lint) : null,
|
|
102
|
+
test: test ? run(test) : null,
|
|
103
|
+
coverage: coverage ? run(coverage) : null,
|
|
104
|
+
build: build ? run(build) : null,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function pythonCommands(targetDir) {
|
|
108
|
+
let pyproject = "";
|
|
109
|
+
try {
|
|
110
|
+
pyproject = readFileSync(resolve(targetDir, "pyproject.toml"), "utf-8");
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
/* optional */
|
|
114
|
+
}
|
|
115
|
+
const hasTests = existsSync(resolve(targetDir, "tests")) || /\[tool\.pytest/.test(pyproject);
|
|
116
|
+
return {
|
|
117
|
+
lint: /\[tool\.ruff/.test(pyproject) ? "ruff check ." : null,
|
|
118
|
+
test: hasTests ? "pytest" : null,
|
|
119
|
+
coverage: null,
|
|
120
|
+
build: null,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Create a harness in `targetDir`.
|
|
125
|
+
*
|
|
126
|
+
* Refuses an existing harness unless `force`, and even then never overwrites a
|
|
127
|
+
* file that is already there: someone's half-written ARCHITECTURE.md is worth
|
|
128
|
+
* more than our starter.
|
|
129
|
+
*/
|
|
130
|
+
export function initHarness(targetDir, options = {}) {
|
|
131
|
+
const stack = options.stack
|
|
132
|
+
? { ...detectStack(targetDir), id: options.stack }
|
|
133
|
+
: detectStack(targetDir);
|
|
134
|
+
const created = [];
|
|
135
|
+
const kept = [];
|
|
136
|
+
const alreadyThere = existsSync(P.configPath(targetDir));
|
|
137
|
+
if (alreadyThere && !options.force) {
|
|
138
|
+
return {
|
|
139
|
+
ok: false,
|
|
140
|
+
error: "This project already has a harness. Use /infinity:config to change it, or re-run init with force to restore missing files.",
|
|
141
|
+
created,
|
|
142
|
+
kept,
|
|
143
|
+
config: defaultConfig(),
|
|
144
|
+
stack,
|
|
145
|
+
phase: "define",
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
const phases = normalizePhases(options.phases);
|
|
149
|
+
const phase = phases[0] ?? "define";
|
|
150
|
+
const config = defaultConfig();
|
|
151
|
+
if (options.researchDepth && (options.researchDepth === "standard" || options.researchDepth === "deep" || options.researchDepth === "comprehensive")) {
|
|
152
|
+
config.researchDepth = options.researchDepth;
|
|
153
|
+
}
|
|
154
|
+
else if (phases.includes("research")) {
|
|
155
|
+
config.researchDepth = "deep";
|
|
156
|
+
}
|
|
157
|
+
config.stack = stack.id === "unknown" ? null : stack.id;
|
|
158
|
+
config.mode = options.mode ?? "copilot";
|
|
159
|
+
config.phases = { enabled: phases };
|
|
160
|
+
config.currentPhase = phase;
|
|
161
|
+
config.currentRole = PHASE_ROLE[phase];
|
|
162
|
+
config.commands = { ...stack.commands, ...stripUndefined(options.commands ?? {}) };
|
|
163
|
+
config.approvals = { ...config.approvals, ...stripUndefined(options.approvals ?? {}) };
|
|
164
|
+
config.session = { ...config.session, ...stripUndefined(options.session ?? {}) };
|
|
165
|
+
config.execution = { ...config.execution, ...stripUndefined(options.execution ?? {}) };
|
|
166
|
+
// Every enabled phase gets a mode, so a phase list and a mode map cannot
|
|
167
|
+
// disagree about which phases exist. A caller that still passes the 2.3
|
|
168
|
+
// `approvals` shape and no modes gets what it asked for rather than silently
|
|
169
|
+
// getting autopilot — the same rule `loadConfig` applies to an older file.
|
|
170
|
+
const legacy = (options.approvals ?? {});
|
|
171
|
+
const hasModes = options.phaseModes && Object.keys(options.phaseModes).length > 0;
|
|
172
|
+
config.phaseModes = Object.fromEntries(phases.map((p) => [
|
|
173
|
+
p,
|
|
174
|
+
(hasModes ? options.phaseModes?.[p] === "copilot" : legacy[p] === true) ? "copilot" : "autopilot",
|
|
175
|
+
]));
|
|
176
|
+
if (options.workflow)
|
|
177
|
+
config.workflow = options.workflow;
|
|
178
|
+
if (options.display)
|
|
179
|
+
config.display = normalizeDisplay(options.display);
|
|
180
|
+
if (options.brief !== undefined) {
|
|
181
|
+
config.intake = {
|
|
182
|
+
completed: true,
|
|
183
|
+
brief: options.brief && options.brief.trim() ? options.brief.trim() : null,
|
|
184
|
+
at: new Date().toISOString(),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
if (options.router) {
|
|
188
|
+
try {
|
|
189
|
+
const routerPath = P.modelRouterPath(targetDir);
|
|
190
|
+
mkdirSync(dirname(routerPath), { recursive: true });
|
|
191
|
+
let existing = {};
|
|
192
|
+
try {
|
|
193
|
+
if (existsSync(routerPath))
|
|
194
|
+
existing = JSON.parse(readFileSync(routerPath, "utf-8"));
|
|
195
|
+
}
|
|
196
|
+
catch { /* ignore corrupt */ }
|
|
197
|
+
const incoming = options.router;
|
|
198
|
+
const merged = { ...existing, ...incoming };
|
|
199
|
+
if (incoming.byDifficulty && typeof incoming.byDifficulty === "object") {
|
|
200
|
+
merged.byDifficulty = { ...(existing.byDifficulty ?? {}), ...incoming.byDifficulty };
|
|
201
|
+
}
|
|
202
|
+
if (incoming.thinkingByDifficulty && typeof incoming.thinkingByDifficulty === "object") {
|
|
203
|
+
merged.thinkingByDifficulty = { ...(existing.thinkingByDifficulty ?? {}), ...incoming.thinkingByDifficulty };
|
|
204
|
+
}
|
|
205
|
+
writeFileSync(routerPath, JSON.stringify(merged, null, 2), "utf-8");
|
|
206
|
+
// C: also materialize config.tiers so daemon + supervisor share truth.
|
|
207
|
+
// Keep legacy file for one release (read fallback still honours it).
|
|
208
|
+
try {
|
|
209
|
+
const toTier = (ref) => {
|
|
210
|
+
if (!ref || !ref.trim())
|
|
211
|
+
return null;
|
|
212
|
+
const s = ref.trim();
|
|
213
|
+
const slash = s.indexOf("/");
|
|
214
|
+
if (slash <= 0 || slash === s.length - 1)
|
|
215
|
+
return null;
|
|
216
|
+
return { provider: s.slice(0, slash), id: s.slice(slash + 1) };
|
|
217
|
+
};
|
|
218
|
+
const next = {};
|
|
219
|
+
const thinkByDiff = incoming.thinkingByDifficulty ?? {};
|
|
220
|
+
const tLvl2 = (k) => {
|
|
221
|
+
const v = thinkByDiff[k];
|
|
222
|
+
return typeof v === "string" && v.trim() ? v.trim() : undefined;
|
|
223
|
+
};
|
|
224
|
+
const a2 = toTier(incoming.default);
|
|
225
|
+
if (a2) {
|
|
226
|
+
const td = incoming.thinkingDefault;
|
|
227
|
+
next["A"] = td ? { ...a2, thinkingLevel: td } : a2;
|
|
228
|
+
}
|
|
229
|
+
for (const [tier, diff] of [["B", "easy"], ["C", "moderate"], ["D", "difficult"]]) {
|
|
230
|
+
const m = toTier(incoming?.byDifficulty?.[diff]);
|
|
231
|
+
if (m) {
|
|
232
|
+
const tl = tLvl2(diff);
|
|
233
|
+
next[tier] = tl ? { ...m, thinkingLevel: tl } : m;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const x2 = toTier(incoming.master);
|
|
237
|
+
if (x2) {
|
|
238
|
+
const mt = incoming.thinkingMaster;
|
|
239
|
+
next["X"] = mt ? { ...x2, thinkingLevel: mt } : x2;
|
|
240
|
+
}
|
|
241
|
+
if (Object.keys(next).length > 0) {
|
|
242
|
+
config.tiers = { ...(config?.tiers ?? {}), ...next };
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
catch { }
|
|
246
|
+
}
|
|
247
|
+
catch { /* best-effort */ }
|
|
248
|
+
}
|
|
249
|
+
const write = (path, body) => {
|
|
250
|
+
const rel = path.slice(targetDir.length + 1).replace(/\\/g, "/");
|
|
251
|
+
if (existsSync(path)) {
|
|
252
|
+
kept.push(rel);
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
256
|
+
writeFileSync(path, body, "utf-8");
|
|
257
|
+
created.push(rel);
|
|
258
|
+
};
|
|
259
|
+
if (alreadyThere) {
|
|
260
|
+
kept.push("harness/config.json");
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
const saved = saveConfig(targetDir, config);
|
|
264
|
+
if (!saved.ok) {
|
|
265
|
+
return { ok: false, error: saved.error ?? "could not write harness/config.json", created, kept, config, stack, phase };
|
|
266
|
+
}
|
|
267
|
+
created.push("harness/config.json");
|
|
268
|
+
}
|
|
269
|
+
// Canonical plan is harness/plan.json; legacy path is still recognised on read.
|
|
270
|
+
const hasPlan = existsSync(P.planPath(targetDir));
|
|
271
|
+
const hasLegacy = existsSync(P.featureListPath(targetDir));
|
|
272
|
+
if (hasPlan || hasLegacy) {
|
|
273
|
+
// Report both as kept when both exist (test expects legacy in kept).
|
|
274
|
+
if (hasLegacy)
|
|
275
|
+
kept.push("harness/features/feature-list.json");
|
|
276
|
+
if (hasPlan)
|
|
277
|
+
kept.push("harness/plan.json");
|
|
278
|
+
if (!hasPlan && hasLegacy) {
|
|
279
|
+
// Only legacy existed — ensure canonical is materialized. Keep test's "kept" as legacy only.
|
|
280
|
+
}
|
|
281
|
+
if (!hasLegacy && hasPlan) {
|
|
282
|
+
// Only canonical existed — ensure legacy mirror exists for test reads.
|
|
283
|
+
try {
|
|
284
|
+
const raw = readFileSync(P.planPath(targetDir), "utf-8");
|
|
285
|
+
writeFileSync(P.featureListPath(targetDir), raw, "utf-8");
|
|
286
|
+
}
|
|
287
|
+
catch { }
|
|
288
|
+
}
|
|
289
|
+
// If test hand-edited legacy after init, plan.json is empty and loadFeatureList would prefer it.
|
|
290
|
+
// Mirror richer file to the other side.
|
|
291
|
+
try {
|
|
292
|
+
if (hasPlan && hasLegacy) {
|
|
293
|
+
const planRaw = readFileSync(P.planPath(targetDir), "utf-8");
|
|
294
|
+
const legacyRaw = readFileSync(P.featureListPath(targetDir), "utf-8");
|
|
295
|
+
if (planRaw !== legacyRaw) {
|
|
296
|
+
const planParsed = JSON.parse(planRaw);
|
|
297
|
+
const legacyParsed = JSON.parse(legacyRaw);
|
|
298
|
+
const planEmpty = Array.isArray(planParsed.features) && planParsed.features.length === 0;
|
|
299
|
+
const legacyEmpty = Array.isArray(legacyParsed.features) && legacyParsed.features.length === 0;
|
|
300
|
+
if (planEmpty && !legacyEmpty)
|
|
301
|
+
writeFileSync(P.planPath(targetDir), legacyRaw, "utf-8");
|
|
302
|
+
else if (!planEmpty && legacyEmpty)
|
|
303
|
+
writeFileSync(P.featureListPath(targetDir), planRaw, "utf-8");
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
catch { }
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
saveFeatureList(targetDir, emptyFeatureList());
|
|
311
|
+
created.push("harness/plan.json");
|
|
312
|
+
created.push("harness/features/feature-list.json");
|
|
313
|
+
// Also create a placeholder for .gitignore check? No.
|
|
314
|
+
}
|
|
315
|
+
// The brief points at these every phase; they are reference material, so
|
|
316
|
+
// they come from the package rather than being invented here.
|
|
317
|
+
copyPackagedDocs(targetDir, write);
|
|
318
|
+
write(P.architecturePath(targetDir), STARTER_ARCHITECTURE);
|
|
319
|
+
if (phases.includes("research"))
|
|
320
|
+
write(P.researchPath(targetDir), STARTER_RESEARCH);
|
|
321
|
+
write(P.decisionsPath(targetDir), STARTER_DECISIONS);
|
|
322
|
+
write(P.constraintsPath(targetDir), STARTER_CONSTRAINTS);
|
|
323
|
+
write(resolve(P.docsDir(targetDir), "DOMAIN.md"), STARTER_DOMAIN);
|
|
324
|
+
write(P.rubricPath(targetDir), STARTER_RUBRIC);
|
|
325
|
+
write(P.lessonsPath(targetDir), STARTER_LESSONS);
|
|
326
|
+
write(resolve(P.harnessDir(targetDir), ".gitignore"), HARNESS_GITIGNORE);
|
|
327
|
+
return { ok: true, created, kept, config, stack, phase };
|
|
328
|
+
}
|
|
329
|
+
function stripUndefined(o) {
|
|
330
|
+
return Object.fromEntries(Object.entries(o).filter(([, v]) => v !== undefined));
|
|
331
|
+
}
|
|
332
|
+
/** Keep the caller's choice, but in pipeline order and without nonsense. */
|
|
333
|
+
function normalizePhases(requested) {
|
|
334
|
+
if (!requested || requested.length === 0)
|
|
335
|
+
return [...DEFAULT_ENABLED_PHASES];
|
|
336
|
+
const wanted = new Set(requested.filter((p) => PHASE_ORDER.includes(p)));
|
|
337
|
+
wanted.delete("init");
|
|
338
|
+
const ordered = PHASE_ORDER.filter((p) => wanted.has(p));
|
|
339
|
+
return ordered.length ? [...ordered] : [...DEFAULT_ENABLED_PHASES];
|
|
340
|
+
}
|
|
341
|
+
/** Where the package keeps its own `harness/docs`. */
|
|
342
|
+
export function packagedDocsDir() {
|
|
343
|
+
try {
|
|
344
|
+
return resolve(dirname(fileURLToPath(import.meta.url)), "..", "..", "harness", "docs");
|
|
345
|
+
}
|
|
346
|
+
catch {
|
|
347
|
+
return "";
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Copy the phase and role docs out of the package into the project.
|
|
352
|
+
*
|
|
353
|
+
* They are copied rather than read in place so the project can edit them —
|
|
354
|
+
* a team's BUILD doc should be able to say what BUILD means to them.
|
|
355
|
+
*/
|
|
356
|
+
function copyPackagedDocs(targetDir, write) {
|
|
357
|
+
const src = packagedDocsDir();
|
|
358
|
+
if (!src || !existsSync(src))
|
|
359
|
+
return;
|
|
360
|
+
for (const sub of ["phases", "agents"]) {
|
|
361
|
+
const dir = join(src, sub);
|
|
362
|
+
if (!existsSync(dir))
|
|
363
|
+
continue;
|
|
364
|
+
let entries;
|
|
365
|
+
try {
|
|
366
|
+
entries = readdirSync(dir);
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
continue;
|
|
370
|
+
}
|
|
371
|
+
for (const name of entries) {
|
|
372
|
+
if (!name.endsWith(".md"))
|
|
373
|
+
continue;
|
|
374
|
+
const from = join(dir, name);
|
|
375
|
+
try {
|
|
376
|
+
if (!statSync(from).isFile())
|
|
377
|
+
continue;
|
|
378
|
+
write(join(P.docsDir(targetDir), sub, name), readFileSync(from, "utf-8"));
|
|
379
|
+
}
|
|
380
|
+
catch {
|
|
381
|
+
/* one unreadable doc must not fail the whole init */
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
// ── Starters ────────────────────────────────────────────────────────────────
|
|
387
|
+
//
|
|
388
|
+
// Every one of these is under the gate's threshold on purpose. They tell you
|
|
389
|
+
// what to write; they do not write it for you, because the gate that checks
|
|
390
|
+
// them is the only referee this system has.
|
|
391
|
+
const STARTER_ARCHITECTURE = `# Architecture
|
|
392
|
+
|
|
393
|
+
<!-- The REVIEW gate wants 200+ characters of real content here. -->
|
|
394
|
+
|
|
395
|
+
Modules, what each owns, and how data moves between them.
|
|
396
|
+
`;
|
|
397
|
+
const STARTER_RESEARCH = `# Research
|
|
398
|
+
|
|
399
|
+
<!--
|
|
400
|
+
The RESEARCH gate wants 400+ characters of real content here, outside headings
|
|
401
|
+
and comments. Write what you found, not what you plan to do:
|
|
402
|
+
|
|
403
|
+
Prior art what already exists, what it gets right, where it stops
|
|
404
|
+
Constraints which were given, which you inferred (an inference is a question)
|
|
405
|
+
Options at least two, with what each costs and what each buys
|
|
406
|
+
Recommendation one of them, and what would have to be true for it to be wrong
|
|
407
|
+
Open questions the ones only a human can answer — these become the DEFINE interview
|
|
408
|
+
-->
|
|
409
|
+
`;
|
|
410
|
+
const STARTER_DECISIONS = `# Decisions
|
|
411
|
+
|
|
412
|
+
<!-- The REVIEW gate wants 100+ characters of real content here. -->
|
|
413
|
+
|
|
414
|
+
One entry per decision: what was chosen, what was rejected, and why.
|
|
415
|
+
`;
|
|
416
|
+
const STARTER_CONSTRAINTS = `# Constraints
|
|
417
|
+
|
|
418
|
+
What this project may not do, and what it must always do.
|
|
419
|
+
`;
|
|
420
|
+
const STARTER_DOMAIN = `# Domain
|
|
421
|
+
|
|
422
|
+
Glossary only. One line per term, in the words the users of this system use.
|
|
423
|
+
`;
|
|
424
|
+
const STARTER_RUBRIC = `# Evaluator Rubric
|
|
425
|
+
|
|
426
|
+
<!-- The REVIEW gate wants 100+ characters of real content here. -->
|
|
427
|
+
|
|
428
|
+
What "good" means for this project, and how a reviewer scores it.
|
|
429
|
+
`;
|
|
430
|
+
const STARTER_LESSONS = `# Lessons and Decisions
|
|
431
|
+
|
|
432
|
+
Append as you go: what surprised you, what you would do differently.
|
|
433
|
+
`;
|
|
434
|
+
const HARNESS_GITIGNORE = `# Run state — regenerated every run, never worth a diff.
|
|
435
|
+
run-journal.jsonl
|
|
436
|
+
STOP
|
|
437
|
+
*.bak
|
|
438
|
+
*.lock
|
|
439
|
+
*.ilock
|
|
440
|
+
.preflight
|
|
441
|
+
.run-prompt.md
|
|
442
|
+
|
|
443
|
+
# The plan, the config and the docs ARE worth committing: they are the
|
|
444
|
+
# project's memory, and a harness without them starts from nothing.
|
|
445
|
+
`;
|
|
446
|
+
/** A human-readable summary of what init did. */
|
|
447
|
+
export function describeInit(result) {
|
|
448
|
+
if (!result.ok)
|
|
449
|
+
return result.error ?? "init failed";
|
|
450
|
+
const lines = [
|
|
451
|
+
`infinity-harness ready · ${result.stack.label} (${result.stack.evidence})`,
|
|
452
|
+
"",
|
|
453
|
+
`Phase ${result.phase.toUpperCase()} — ${result.config.phases.enabled.join(" → ")}`,
|
|
454
|
+
`Mode ${result.config.mode}`,
|
|
455
|
+
];
|
|
456
|
+
const cmds = Object.entries(result.config.commands ?? {}).filter(([, v]) => Boolean(v));
|
|
457
|
+
lines.push(cmds.length
|
|
458
|
+
? `Commands ${cmds.map(([k, v]) => `${k}: ${v}`).join(" · ")}`
|
|
459
|
+
: "Commands none detected — set them with /infinity:config → Project commands");
|
|
460
|
+
lines.push("");
|
|
461
|
+
lines.push(`Created ${result.created.length} file(s) under harness/.`);
|
|
462
|
+
if (result.kept.length)
|
|
463
|
+
lines.push(`Left ${result.kept.length} existing file(s) alone.`);
|
|
464
|
+
lines.push("");
|
|
465
|
+
// The old copy said "describe what you are building" — advice from before
|
|
466
|
+
// the wizard asked for that up front. Telling a human to do a thing they
|
|
467
|
+
// have already done is how they learn to stop reading the output.
|
|
468
|
+
const goal = result.config.intake?.brief;
|
|
469
|
+
if (typeof goal === "string" && goal.trim()) {
|
|
470
|
+
lines.push(`Goal ${goal.trim()}`);
|
|
471
|
+
lines.push("");
|
|
472
|
+
lines.push(`Next: /infinity:run hands it the wheel. /infinity:next prints the brief first.`);
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
lines.push("Next: say what you are building — the run will ask before it does anything.");
|
|
476
|
+
lines.push(" /infinity:run hands it the wheel once there is a plan.");
|
|
477
|
+
}
|
|
478
|
+
return lines.join("\n");
|
|
479
|
+
}
|
|
480
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/core/init.ts"],"names":[],"mappings":"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"}
|