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.
Files changed (192) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/extensions/infinity-harness/index.js +3614 -0
  3. package/dist/extensions/infinity-harness/index.js.map +1 -0
  4. package/dist/src/approval.js +154 -0
  5. package/dist/src/approval.js.map +1 -0
  6. package/dist/src/core/brief.js +309 -0
  7. package/dist/src/core/brief.js.map +1 -0
  8. package/dist/src/core/config.js +539 -0
  9. package/dist/src/core/config.js.map +1 -0
  10. package/dist/src/core/exec.js +106 -0
  11. package/dist/src/core/exec.js.map +1 -0
  12. package/dist/src/core/featureList.js +365 -0
  13. package/dist/src/core/featureList.js.map +1 -0
  14. package/dist/src/core/fsx.js +123 -0
  15. package/dist/src/core/fsx.js.map +1 -0
  16. package/dist/src/core/gates.js +490 -0
  17. package/dist/src/core/gates.js.map +1 -0
  18. package/dist/src/core/init.js +480 -0
  19. package/dist/src/core/init.js.map +1 -0
  20. package/dist/src/core/lock.js +183 -0
  21. package/dist/src/core/lock.js.map +1 -0
  22. package/dist/src/core/modelRouter.js +185 -0
  23. package/dist/src/core/modelRouter.js.map +1 -0
  24. package/dist/src/core/paths.js +129 -0
  25. package/dist/src/core/paths.js.map +1 -0
  26. package/dist/src/core/phases.js +254 -0
  27. package/dist/src/core/phases.js.map +1 -0
  28. package/dist/src/core/plan.js +15 -0
  29. package/dist/src/core/plan.js.map +1 -0
  30. package/dist/src/core/runState.js +126 -0
  31. package/dist/src/core/runState.js.map +1 -0
  32. package/dist/src/core/settings.js +877 -0
  33. package/dist/src/core/settings.js.map +1 -0
  34. package/dist/src/core/skills.js +319 -0
  35. package/dist/src/core/skills.js.map +1 -0
  36. package/dist/src/core/skillsAudit.js +194 -0
  37. package/dist/src/core/skillsAudit.js.map +1 -0
  38. package/dist/src/core/types.js +77 -0
  39. package/dist/src/core/types.js.map +1 -0
  40. package/dist/src/daemon/budget.js +85 -0
  41. package/dist/src/daemon/budget.js.map +1 -0
  42. package/dist/src/daemon/guard.js +122 -0
  43. package/dist/src/daemon/guard.js.map +1 -0
  44. package/dist/src/daemon/index.js +461 -0
  45. package/dist/src/daemon/index.js.map +1 -0
  46. package/dist/src/daemon/isolation.js +84 -0
  47. package/dist/src/daemon/isolation.js.map +1 -0
  48. package/dist/src/daemon/preflight.js +131 -0
  49. package/dist/src/daemon/preflight.js.map +1 -0
  50. package/dist/src/daemon/server.js +174 -0
  51. package/dist/src/daemon/server.js.map +1 -0
  52. package/dist/src/daemon/supervisorState.js +42 -0
  53. package/dist/src/daemon/supervisorState.js.map +1 -0
  54. package/dist/src/daemon/worker.js +239 -0
  55. package/dist/src/daemon/worker.js.map +1 -0
  56. package/dist/src/daemon/worktree.js +102 -0
  57. package/dist/src/daemon/worktree.js.map +1 -0
  58. package/dist/src/escalate.js +312 -0
  59. package/dist/src/escalate.js.map +1 -0
  60. package/dist/src/exec/piWorker.js +630 -0
  61. package/dist/src/exec/piWorker.js.map +1 -0
  62. package/dist/src/goal.js +317 -0
  63. package/dist/src/goal.js.map +1 -0
  64. package/dist/src/goalLoop.js +374 -0
  65. package/dist/src/goalLoop.js.map +1 -0
  66. package/dist/src/goalSpec.js +397 -0
  67. package/dist/src/goalSpec.js.map +1 -0
  68. package/dist/src/goalState.js +255 -0
  69. package/dist/src/goalState.js.map +1 -0
  70. package/dist/src/handoff.js +205 -0
  71. package/dist/src/handoff.js.map +1 -0
  72. package/dist/src/intake.js +203 -0
  73. package/dist/src/intake.js.map +1 -0
  74. package/dist/src/loop.js +592 -0
  75. package/dist/src/loop.js.map +1 -0
  76. package/dist/src/modelRouter.js +216 -0
  77. package/dist/src/modelRouter.js.map +1 -0
  78. package/dist/src/remote.js +246 -0
  79. package/dist/src/remote.js.map +1 -0
  80. package/dist/src/replan.js +262 -0
  81. package/dist/src/replan.js.map +1 -0
  82. package/dist/src/review.js +54 -0
  83. package/dist/src/review.js.map +1 -0
  84. package/dist/src/rework.js +241 -0
  85. package/dist/src/rework.js.map +1 -0
  86. package/dist/src/runState.js +4 -0
  87. package/dist/src/runState.js.map +1 -0
  88. package/dist/src/scheduler.js +270 -0
  89. package/dist/src/scheduler.js.map +1 -0
  90. package/dist/src/supervisor.js +787 -0
  91. package/dist/src/supervisor.js.map +1 -0
  92. package/dist/src/taskList.js +430 -0
  93. package/dist/src/taskList.js.map +1 -0
  94. package/dist/src/ui/config.js +268 -0
  95. package/dist/src/ui/config.js.map +1 -0
  96. package/dist/src/ui/dashboard.js +1288 -0
  97. package/dist/src/ui/dashboard.js.map +1 -0
  98. package/dist/src/ui/display.js +229 -0
  99. package/dist/src/ui/display.js.map +1 -0
  100. package/dist/src/ui/planTree.js +219 -0
  101. package/dist/src/ui/planTree.js.map +1 -0
  102. package/dist/src/ui/theme.js +298 -0
  103. package/dist/src/ui/theme.js.map +1 -0
  104. package/dist/src/ui/viewState.js +65 -0
  105. package/dist/src/ui/viewState.js.map +1 -0
  106. package/dist/src/ui/widget.js +721 -0
  107. package/dist/src/ui/widget.js.map +1 -0
  108. package/dist/src/ui/wizard.js +540 -0
  109. package/dist/src/ui/wizard.js.map +1 -0
  110. package/dist/src/unstuck.js +210 -0
  111. package/dist/src/unstuck.js.map +1 -0
  112. package/dist/src/worker.js +267 -0
  113. package/dist/src/worker.js.map +1 -0
  114. package/dist/src/workflow.js +250 -0
  115. package/dist/src/workflow.js.map +1 -0
  116. package/dist/tests/approval.test.js +144 -0
  117. package/dist/tests/approval.test.js.map +1 -0
  118. package/dist/tests/brief.test.js +271 -0
  119. package/dist/tests/brief.test.js.map +1 -0
  120. package/dist/tests/config.test.js +320 -0
  121. package/dist/tests/config.test.js.map +1 -0
  122. package/dist/tests/dashboard.test.js +277 -0
  123. package/dist/tests/dashboard.test.js.map +1 -0
  124. package/dist/tests/display.test.js +229 -0
  125. package/dist/tests/display.test.js.map +1 -0
  126. package/dist/tests/escalate.test.js +272 -0
  127. package/dist/tests/escalate.test.js.map +1 -0
  128. package/dist/tests/featureList.test.js +429 -0
  129. package/dist/tests/featureList.test.js.map +1 -0
  130. package/dist/tests/gates.test.js +333 -0
  131. package/dist/tests/gates.test.js.map +1 -0
  132. package/dist/tests/goal.test.js +229 -0
  133. package/dist/tests/goal.test.js.map +1 -0
  134. package/dist/tests/goalLoop.test.js +170 -0
  135. package/dist/tests/goalLoop.test.js.map +1 -0
  136. package/dist/tests/goalSpec.test.js +146 -0
  137. package/dist/tests/goalSpec.test.js.map +1 -0
  138. package/dist/tests/goalState.test.js +202 -0
  139. package/dist/tests/goalState.test.js.map +1 -0
  140. package/dist/tests/handoff.test.js +127 -0
  141. package/dist/tests/handoff.test.js.map +1 -0
  142. package/dist/tests/init.test.js +264 -0
  143. package/dist/tests/init.test.js.map +1 -0
  144. package/dist/tests/intake.test.js +288 -0
  145. package/dist/tests/intake.test.js.map +1 -0
  146. package/dist/tests/loop.test.js +453 -0
  147. package/dist/tests/loop.test.js.map +1 -0
  148. package/dist/tests/modelRouter.test.js +131 -0
  149. package/dist/tests/modelRouter.test.js.map +1 -0
  150. package/dist/tests/phases.test.js +244 -0
  151. package/dist/tests/phases.test.js.map +1 -0
  152. package/dist/tests/planTree.test.js +190 -0
  153. package/dist/tests/planTree.test.js.map +1 -0
  154. package/dist/tests/remote.test.js +380 -0
  155. package/dist/tests/remote.test.js.map +1 -0
  156. package/dist/tests/replan.test.js +113 -0
  157. package/dist/tests/replan.test.js.map +1 -0
  158. package/dist/tests/review.test.js +77 -0
  159. package/dist/tests/review.test.js.map +1 -0
  160. package/dist/tests/rework.test.js +109 -0
  161. package/dist/tests/rework.test.js.map +1 -0
  162. package/dist/tests/routing-live.test.js +121 -0
  163. package/dist/tests/routing-live.test.js.map +1 -0
  164. package/dist/tests/runState.test.js +73 -0
  165. package/dist/tests/runState.test.js.map +1 -0
  166. package/dist/tests/settings.test.js +311 -0
  167. package/dist/tests/settings.test.js.map +1 -0
  168. package/dist/tests/skills.test.js +387 -0
  169. package/dist/tests/skills.test.js.map +1 -0
  170. package/dist/tests/supervisor.test.js +437 -0
  171. package/dist/tests/supervisor.test.js.map +1 -0
  172. package/dist/tests/surface.test.js +203 -0
  173. package/dist/tests/surface.test.js.map +1 -0
  174. package/dist/tests/taskList.test.js +376 -0
  175. package/dist/tests/taskList.test.js.map +1 -0
  176. package/dist/tests/theme.test.js +149 -0
  177. package/dist/tests/theme.test.js.map +1 -0
  178. package/dist/tests/unstuck.test.js +268 -0
  179. package/dist/tests/unstuck.test.js.map +1 -0
  180. package/dist/tests/widget.test.js +424 -0
  181. package/dist/tests/widget.test.js.map +1 -0
  182. package/dist/tests/worker.test.js +306 -0
  183. package/dist/tests/worker.test.js.map +1 -0
  184. package/dist/tests/workflow.test.js +187 -0
  185. package/dist/tests/workflow.test.js.map +1 -0
  186. package/extensions/infinity-harness/index.ts +39 -12
  187. package/package.json +5 -2
  188. package/src/core/modelRouter.ts +23 -1
  189. package/src/daemon/index.ts +3 -3
  190. package/src/daemon/worker.ts +28 -5
  191. package/src/ui/config.ts +25 -1
  192. package/src/ui/wizard.ts +10 -5
@@ -0,0 +1,387 @@
1
+ /**
2
+ * The skills we ship must load cleanly in pi.
3
+ *
4
+ * This file exists because they didn't. A `README.md` sitting beside the
5
+ * skills made real pi print, on every single start:
6
+ *
7
+ * [Skill conflicts]
8
+ * ~\.pi\agent\npm\node_modules\infinity-harness\harness\skills\README.md
9
+ * description is required
10
+ *
11
+ * Nothing in the build noticed, because nothing in the build had an opinion
12
+ * about the contents of a documentation directory. Now it does.
13
+ */
14
+ import assert from "node:assert/strict";
15
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
16
+ import { tmpdir } from "node:os";
17
+ import { dirname, join, resolve } from "node:path";
18
+ import { fileURLToPath } from "node:url";
19
+ import { MAX_DESCRIPTION_LENGTH, MAX_NAME_LENGTH, auditSkillsDir, formatAudit, nameProblems, } from "../src/core/skillsAudit.js";
20
+ import { readJson } from "../src/core/fsx.js";
21
+ import { SKILL_KINDS, loadSkills, matchSkills } from "../src/core/skills.js";
22
+ import { buildBrief, renderBrief } from "../src/core/brief.js";
23
+ const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
24
+ function tmpSkills(files) {
25
+ const dir = mkdtempSync(join(tmpdir(), "pi-skills-"));
26
+ for (const [name, body] of Object.entries(files)) {
27
+ const full = join(dir, name);
28
+ mkdirSync(dirname(full), { recursive: true });
29
+ writeFileSync(full, body, "utf-8");
30
+ }
31
+ return dir;
32
+ }
33
+ function skill(name, description, extra = "kind: process") {
34
+ return `---\nname: ${name}\ndescription: ${description}\n${extra}\n---\n\n# ${name}\n`;
35
+ }
36
+ // ── the real thing ─────────────────────────────────────────────────────────
37
+ // The regression guard. If this fails, pi will print a conflict block on
38
+ // every start for whoever installs the package next.
39
+ {
40
+ const dir = join(repoRoot, "harness", "skills");
41
+ const audit = auditSkillsDir(dir);
42
+ assert.equal(audit.problems.length, 0, `harness/skills would make pi complain:\n${formatAudit(audit, repoRoot)}`);
43
+ assert.equal(audit.skills.length, 29, "every shipped skill is accounted for");
44
+ console.log(`✓ all ${audit.skills.length} shipped skills load cleanly in pi`);
45
+ }
46
+ // Every directory the package declares as a skills source must exist and be
47
+ // clean — declaring one we don't ship is its own kind of broken.
48
+ {
49
+ const pkg = readJson(join(repoRoot, "package.json"));
50
+ assert.ok(pkg, "package.json is readable");
51
+ const declared = pkg.pi?.skills ?? [];
52
+ assert.ok(declared.length > 0, "package.json declares at least one skills directory");
53
+ for (const entry of declared) {
54
+ const dir = resolve(repoRoot, entry);
55
+ const audit = auditSkillsDir(dir);
56
+ assert.ok(audit.skills.length > 0, `${entry} ships no skills`);
57
+ assert.equal(audit.problems.length, 0, `${entry}:\n${formatAudit(audit, repoRoot)}`);
58
+ // ...and it has to actually reach npm.
59
+ const packed = (pkg.files ?? []).some((f) => entry.replace(/^\.\//, "").startsWith(f.replace(/\/$/, "")));
60
+ assert.ok(packed, `${entry} is declared to pi but not listed in package.json "files"`);
61
+ }
62
+ console.log("✓ every declared skills directory exists, is clean, and is published");
63
+ }
64
+ // ── the exact failure that started this ────────────────────────────────────
65
+ {
66
+ const dir = tmpSkills({
67
+ "tdd.md": skill("tdd", "Red to green loop"),
68
+ "README.md": "# Craft Skills\n\nHow to do the work well.\n",
69
+ });
70
+ const audit = auditSkillsDir(dir);
71
+ assert.equal(audit.skills.length, 1, "the README is not a skill");
72
+ assert.equal(audit.problems.length, 1);
73
+ assert.match(audit.problems[0].message, /no frontmatter block/);
74
+ assert.match(audit.problems[0].file, /README\.md$/);
75
+ rmSync(dir, { recursive: true, force: true });
76
+ console.log("✓ a README beside the skills is reported, not ignored");
77
+ }
78
+ // A file with frontmatter but no description is pi's literal wording.
79
+ {
80
+ const dir = tmpSkills({ "a.md": "---\nname: a\nkind: process\ntags: [x]\n---\n\nbody\n" });
81
+ const audit = auditSkillsDir(dir);
82
+ assert.deepEqual(audit.problems.map((p) => p.message), ["description is required"]);
83
+ assert.equal(audit.skills.length, 0, "a skill with no description does not load");
84
+ rmSync(dir, { recursive: true, force: true });
85
+ }
86
+ // An empty or whitespace description is the same failure.
87
+ {
88
+ const dir = tmpSkills({ "a.md": "---\nname: a\nkind: process\ndescription: ' '\n---\n" });
89
+ const audit = auditSkillsDir(dir);
90
+ assert.deepEqual(audit.problems.map((p) => p.message), ["description is required"]);
91
+ rmSync(dir, { recursive: true, force: true });
92
+ console.log("✓ a missing or blank description fails the audit");
93
+ }
94
+ // ── the BOM, again ─────────────────────────────────────────────────────────
95
+ // pi checks `content.startsWith("---")` on the raw string, so three invisible
96
+ // bytes from a Windows editor hide the whole header.
97
+ {
98
+ const dir = tmpSkills({ "a.md": `${skill("a", "fine otherwise")}` });
99
+ const audit = auditSkillsDir(dir);
100
+ assert.equal(audit.skills.length, 0);
101
+ assert.match(audit.problems[0].message, /BOM/);
102
+ rmSync(dir, { recursive: true, force: true });
103
+ console.log("✓ a UTF-8 BOM is caught with a message that names the cause");
104
+ }
105
+ // ── names ──────────────────────────────────────────────────────────────────
106
+ {
107
+ assert.deepEqual(nameProblems("tdd"), []);
108
+ assert.deepEqual(nameProblems("http-apis"), []);
109
+ assert.deepEqual(nameProblems("a1-b2"), []);
110
+ assert.match(nameProblems("TDD")[0], /invalid characters/);
111
+ assert.match(nameProblems("has space")[0], /invalid characters/);
112
+ assert.match(nameProblems("under_score")[0], /invalid characters/);
113
+ assert.match(nameProblems("-lead")[0], /start or end with a hyphen/);
114
+ assert.match(nameProblems("trail-")[0], /start or end with a hyphen/);
115
+ assert.match(nameProblems("double--hyphen")[0], /consecutive hyphens/);
116
+ assert.match(nameProblems("x".repeat(MAX_NAME_LENGTH + 1))[0], /exceeds 64/);
117
+ assert.deepEqual(nameProblems("x".repeat(MAX_NAME_LENGTH)), [], "the limit itself is allowed");
118
+ console.log("✓ name rules match pi's validateName");
119
+ }
120
+ {
121
+ const dir = tmpSkills({ "Bad_Name.md": skill("Bad_Name", "d") });
122
+ const messages = auditSkillsDir(dir).problems.map((p) => p.message);
123
+ assert.ok(messages.some((m) => /invalid characters/.test(m)));
124
+ rmSync(dir, { recursive: true, force: true });
125
+ }
126
+ // pi falls back to the *parent directory* name when frontmatter omits one,
127
+ // which in a flat directory means every unnamed file claims the same name.
128
+ {
129
+ const dir = tmpSkills({ "a.md": "---\nkind: process\ndescription: no name here\n---\n" });
130
+ const messages = auditSkillsDir(dir).problems.map((p) => p.message);
131
+ assert.ok(messages.some((m) => /name is required/.test(m)), messages.join("; "));
132
+ rmSync(dir, { recursive: true, force: true });
133
+ }
134
+ {
135
+ const dir = tmpSkills({ "a.md": skill("b", "name does not match the file") });
136
+ const messages = auditSkillsDir(dir).problems.map((p) => p.message);
137
+ assert.ok(messages.some((m) => /does not match filename/.test(m)), messages.join("; "));
138
+ rmSync(dir, { recursive: true, force: true });
139
+ console.log("✓ a name that disagrees with its filename is reported");
140
+ }
141
+ // ── kind ──────────────────────────────────────────────────────────────────
142
+ // The brief routes on it: a `process` skill is offered for its whole phase, a
143
+ // `domain` one only when the task shares its vocabulary. Guess wrong by
144
+ // omission and the skill quietly stops being suggested.
145
+ {
146
+ const missing = tmpSkills({ "a.md": "---\nname: a\ndescription: d\n---\n" });
147
+ assert.ok(auditSkillsDir(missing).problems.some((p) => /kind is required/.test(p.message)));
148
+ rmSync(missing, { recursive: true, force: true });
149
+ const wrong = tmpSkills({ "a.md": skill("a", "d", "kind: craft") });
150
+ assert.ok(auditSkillsDir(wrong).problems.some((p) => /unknown kind "craft"/.test(p.message)));
151
+ rmSync(wrong, { recursive: true, force: true });
152
+ for (const k of SKILL_KINDS) {
153
+ const dir = tmpSkills({ "a.md": skill("a", "d", `kind: ${k}`) });
154
+ assert.equal(auditSkillsDir(dir).problems.length, 0, `kind: ${k} is legal`);
155
+ rmSync(dir, { recursive: true, force: true });
156
+ }
157
+ console.log("✓ every skill declares a kind the brief knows how to route");
158
+ }
159
+ // A phase name that isn't a phase means the skill is never offered, silently.
160
+ {
161
+ const dir = tmpSkills({ "a.md": skill("a", "d", "kind: process\nphases: [verfiy]") });
162
+ assert.ok(auditSkillsDir(dir).problems.some((p) => /unknown phase "verfiy"/.test(p.message)));
163
+ rmSync(dir, { recursive: true, force: true });
164
+ const ok = tmpSkills({ "a.md": skill("a", "d", "kind: process\nphases: [build, verify]") });
165
+ assert.equal(auditSkillsDir(ok).problems.length, 0);
166
+ rmSync(ok, { recursive: true, force: true });
167
+ console.log("✓ a mistyped phase name is caught");
168
+ }
169
+ // ── duplicates ─────────────────────────────────────────────────────────────
170
+ // Two files claiming one name is the quiet failure: pi keys skills by name, so
171
+ // one of them simply does not exist and nothing says so.
172
+ {
173
+ const dir = tmpSkills({
174
+ "tdd.md": skill("tdd", "first"),
175
+ "nested/SKILL.md": "---\nname: tdd\nkind: process\ndescription: second\n---\n",
176
+ });
177
+ const audit = auditSkillsDir(dir);
178
+ assert.equal(audit.skills.length, 2);
179
+ assert.equal(audit.problems.length, 1);
180
+ assert.match(audit.problems[0].message, /duplicate skill name "tdd"/);
181
+ rmSync(dir, { recursive: true, force: true });
182
+ console.log("✓ two skills claiming one name is reported");
183
+ }
184
+ // ── discovery matches pi's ─────────────────────────────────────────────────
185
+ {
186
+ const dir = tmpSkills({
187
+ "a.md": skill("a", "root file"),
188
+ "notes.txt": "not markdown",
189
+ ".hidden.md": "---\n---\n",
190
+ "sub/SKILL.md": "---\nname: sub\nkind: process\ndescription: a skill root\n---\n",
191
+ "sub/ignored.md": "no frontmatter, but pi never looks inside a skill root",
192
+ "plain/nested.md": "no frontmatter, and pi only looks for SKILL.md down here",
193
+ });
194
+ const audit = auditSkillsDir(dir);
195
+ assert.deepEqual(audit.skills.map((s) => s.name).sort(), ["a", "sub"]);
196
+ assert.equal(audit.problems.length, 0, formatAudit(audit, dir));
197
+ rmSync(dir, { recursive: true, force: true });
198
+ console.log("✓ discovery matches pi's: root .md files, SKILL.md roots, nothing else");
199
+ }
200
+ // A directory that isn't there is not an error — pi treats it as "no skills".
201
+ {
202
+ const audit = auditSkillsDir(join(tmpdir(), "infinity-harness-does-not-exist"));
203
+ assert.deepEqual(audit, { skills: [], problems: [] });
204
+ }
205
+ // ── description length ─────────────────────────────────────────────────────
206
+ {
207
+ const ok = tmpSkills({ "a.md": skill("a", "x".repeat(MAX_DESCRIPTION_LENGTH)) });
208
+ assert.equal(auditSkillsDir(ok).problems.length, 0, "the limit itself is allowed");
209
+ rmSync(ok, { recursive: true, force: true });
210
+ const over = tmpSkills({ "a.md": skill("a", "x".repeat(MAX_DESCRIPTION_LENGTH + 1)) });
211
+ const audit = auditSkillsDir(over);
212
+ assert.match(audit.problems[0].message, /description exceeds 1024/);
213
+ assert.equal(audit.skills.length, 1, "an over-long description still loads, it just warns");
214
+ rmSync(over, { recursive: true, force: true });
215
+ console.log("✓ description length is bounded the way pi bounds it");
216
+ }
217
+ // ── frontmatter we refuse to guess at ──────────────────────────────────────
218
+ // Anything a hand-rolled reader and a real YAML parser could read differently
219
+ // is reported rather than assumed.
220
+ {
221
+ const dir = tmpSkills({ "a.md": "---\nname: a\nkind: process\ndescription: |\n a block scalar\n---\n" });
222
+ assert.match(auditSkillsDir(dir).problems[0].message, /plain single-line value/);
223
+ rmSync(dir, { recursive: true, force: true });
224
+ const unclosed = tmpSkills({ "a.md": "---\nname: a\nkind: process\ndescription: d\n" });
225
+ assert.match(auditSkillsDir(unclosed).problems[0].message, /never closed/);
226
+ rmSync(unclosed, { recursive: true, force: true });
227
+ console.log("✓ frontmatter that can't be read unambiguously is a problem, not a guess");
228
+ }
229
+ // Quoted values survive, and a trailing comment does not become part of one.
230
+ {
231
+ const dir = tmpSkills({
232
+ "a.md": `---\nname: "a"\nkind: process\ndescription: 'Quoted, with: a colon'\n---\n`,
233
+ "b.md": "---\nname: b\nkind: process\ndescription: plain value # trailing comment\n---\n",
234
+ });
235
+ const audit = auditSkillsDir(dir);
236
+ assert.equal(audit.problems.length, 0, formatAudit(audit, dir));
237
+ assert.equal(audit.skills.find((s) => s.name === "a")?.description, "Quoted, with: a colon");
238
+ assert.equal(audit.skills.find((s) => s.name === "b")?.description, "plain value");
239
+ rmSync(dir, { recursive: true, force: true });
240
+ console.log("✓ quoted values and trailing comments are read the way YAML reads them");
241
+ }
242
+ // ── matching ───────────────────────────────────────────────────────────────
243
+ // What the brief actually does with all of this.
244
+ {
245
+ const skills = loadSkills();
246
+ assert.ok(skills.length >= 25, "the packaged skills load from the package, not the project");
247
+ assert.ok(skills.every((s) => SKILL_KINDS.includes(s.kind)), "every loaded skill has a routable kind");
248
+ assert.ok(skills.some((s) => s.name === "tdd" && s.kind === "process"));
249
+ assert.ok(skills.some((s) => s.name === "databases" && s.kind === "domain"));
250
+ console.log(`✓ ${skills.length} skills load from the package itself`);
251
+ }
252
+ // A process skill belongs to its phase whatever the task says.
253
+ {
254
+ const skills = loadSkills();
255
+ const names = matchSkills(skills, { phase: "build", text: "do the thing" }).map((m) => m.skill.name);
256
+ assert.ok(names.includes("tdd"), `expected tdd for a bare BUILD task, got ${names.join(", ")}`);
257
+ }
258
+ // A domain skill does not. Nobody in BUILD needs the database skill because
259
+ // they are in BUILD.
260
+ {
261
+ const skills = loadSkills();
262
+ const names = matchSkills(skills, { phase: "build", text: "do the thing", limit: 10 }).map((m) => m.skill.name);
263
+ for (const domain of ["databases", "auth-security", "http-apis", "frontend-ui"]) {
264
+ assert.ok(!names.includes(domain), `${domain} should not surface on vocabulary it never matched`);
265
+ }
266
+ console.log("✓ phase alone surfaces process skills and only process skills");
267
+ }
268
+ // ...but vocabulary brings it straight to the top.
269
+ {
270
+ const skills = loadSkills();
271
+ const top = matchSkills(skills, {
272
+ phase: "build",
273
+ text: "migrate the postgres schema and add an index for the slow query",
274
+ })[0];
275
+ assert.equal(top?.skill.name, "databases");
276
+ assert.match(top.why, /build phase/);
277
+ assert.match(top.why, /"postgres"/);
278
+ console.log("✓ vocabulary outranks the phase when the task is specific");
279
+ }
280
+ // A phase a skill leads with beats one it merely also serves: diagnosing-bugs
281
+ // is `[verify, build]`, so it must not outrank tdd on a silent BUILD task.
282
+ {
283
+ const skills = loadSkills();
284
+ const ranked = matchSkills(skills, { phase: "build", text: "implement it", limit: 10 }).map((m) => m.skill.name);
285
+ assert.ok(ranked.indexOf("tdd") < ranked.indexOf("diagnosing-bugs"), `tdd should lead BUILD: ${ranked.join(", ")}`);
286
+ console.log("✓ where a phase sits in a skill's list decides how strongly it counts");
287
+ }
288
+ // A tag matches its own plural — "two workers" is about the `worker` tag.
289
+ {
290
+ const skills = loadSkills();
291
+ const names = matchSkills(skills, {
292
+ phase: "build",
293
+ text: "spawn two workers and join the queues",
294
+ limit: 10,
295
+ }).map((m) => m.skill.name);
296
+ assert.ok(names.includes("concurrency-async"), names.join(", "));
297
+ console.log("✓ tags match their own plurals");
298
+ }
299
+ // A domain skill has to be pulled in by the task's own vocabulary. One
300
+ // incidental word is not vocabulary: "ship the payments rewrite behind a flag"
301
+ // must not summon the CLI-design skill because `flags` is on its tag list.
302
+ {
303
+ const skills = loadSkills();
304
+ const names = matchSkills(skills, {
305
+ phase: "build",
306
+ text: "serialise plan writes so two workers cannot race on the lock \n Checkout flow \n Ship the payments rewrite behind a flag",
307
+ limit: 10,
308
+ }).map((m) => m.skill.name);
309
+ assert.ok(names.includes("concurrency-async"), names.join(", "));
310
+ assert.ok(!names.includes("cli-design"), `one word summoned a whole domain skill: ${names.join(", ")}`);
311
+ console.log("✓ a domain skill needs real vocabulary, not one incidental word");
312
+ }
313
+ // One incidental tag hit is not a recommendation.
314
+ {
315
+ const skills = loadSkills();
316
+ const names = matchSkills(skills, { text: "resolve the merge conflict in package-lock.json" }).map((m) => m.skill.name);
317
+ assert.ok(names.includes("resolving-merge-conflicts"));
318
+ assert.ok(!names.includes("http-apis"), 'the "json" in a filename is not an HTTP task');
319
+ console.log("✓ a single incidental tag hit does not earn a recommendation");
320
+ }
321
+ // Meta skills wait to be asked for. Every one of them is tagged `meta`, so
322
+ // counting that tag like any other would surface all four constantly.
323
+ {
324
+ const skills = loadSkills();
325
+ const bare = matchSkills(skills, { phase: "build", text: "meta", limit: 10 }).map((m) => m.skill.name);
326
+ for (const m of ["writing-skills", "building-tools", "capability-acquisition"]) {
327
+ assert.ok(!bare.includes(m), `${m} surfaced on the meta tag alone`);
328
+ }
329
+ const asked = matchSkills(skills, {
330
+ phase: "build",
331
+ text: "write a script to reset the fixtures, and make it executable",
332
+ limit: 10,
333
+ }).map((m) => m.skill.name);
334
+ assert.ok(asked.includes("building-tools"), asked.join(", "));
335
+ console.log("✓ meta skills surface when asked for, not by default");
336
+ }
337
+ // The same state always produces the same brief.
338
+ {
339
+ const skills = loadSkills();
340
+ const once = matchSkills(skills, { phase: "verify", text: "the suite is flaky on CI" });
341
+ const twice = matchSkills([...skills].reverse(), { phase: "verify", text: "the suite is flaky on CI" });
342
+ assert.deepEqual(once.map((m) => m.skill.name), twice.map((m) => m.skill.name), "ranking must not depend on directory order");
343
+ console.log("✓ ranking is deterministic regardless of load order");
344
+ }
345
+ // No phase, no text, no matches — and no crash.
346
+ {
347
+ assert.deepEqual(matchSkills(loadSkills(), {}), []);
348
+ assert.deepEqual(matchSkills([], { phase: "build", text: "x" }), []);
349
+ assert.deepEqual(matchSkills(loadSkills(), { phase: "build", text: "x", limit: 0 }), []);
350
+ assert.deepEqual(loadSkills(join(tmpdir(), "infinity-harness-nope")), []);
351
+ }
352
+ // The brief carries them, and renders them.
353
+ {
354
+ const dir = mkdtempSync(join(tmpdir(), "pi-brief-skills-"));
355
+ mkdirSync(join(dir, "harness", "features"), { recursive: true });
356
+ writeFileSync(join(dir, "harness", "config.json"), JSON.stringify({ currentPhase: "build", phases: { enabled: ["build"] } }));
357
+ writeFileSync(join(dir, "harness", "features", "feature-list.json"), JSON.stringify({
358
+ revision: 1,
359
+ features: [
360
+ {
361
+ id: "feature-001",
362
+ name: "Plan store",
363
+ status: "in_progress",
364
+ criteria: ["writes are atomic"],
365
+ tasks: [
366
+ {
367
+ id: 1,
368
+ description: "serialise plan writes so two concurrent workers cannot race on the lock",
369
+ status: "pending",
370
+ },
371
+ ],
372
+ },
373
+ ],
374
+ }));
375
+ const brief = await buildBrief(dir);
376
+ assert.ok(brief.skills.length > 0, "the brief names skills for the work in hand");
377
+ assert.equal(brief.skills[0].name, "concurrency-async");
378
+ assert.ok(brief.skills[0].description.length > 0);
379
+ const text = renderBrief(brief);
380
+ assert.match(text, /SKILLS/);
381
+ assert.match(text, /concurrency-async/);
382
+ assert.ok(text.indexOf("SKILLS") < text.indexOf("THE LOOP"), "skills come before the instructions that tell you to start");
383
+ rmSync(dir, { recursive: true, force: true });
384
+ console.log("✓ the brief names the skill that matches the task, as the docs claim");
385
+ }
386
+ console.log("skills.test.ts ✓");
387
+ //# sourceMappingURL=skills.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.test.js","sourceRoot":"","sources":["../../tests/skills.test.ts"],"names":[],"mappings":"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"}