agents-inc 0.170.1 → 0.170.2

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 (163) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/{chunk-BMRUNMPV.js → chunk-2YA4DDRM.js} +35 -35
  3. package/dist/chunk-2YA4DDRM.js.map +1 -0
  4. package/dist/{chunk-44TE3RKH.js → chunk-3ED3KHHD.js} +5 -4
  5. package/dist/chunk-3ED3KHHD.js.map +1 -0
  6. package/dist/{chunk-3G7X2WKI.js → chunk-5BNX73OU.js} +18 -38
  7. package/dist/chunk-5BNX73OU.js.map +1 -0
  8. package/dist/{chunk-7RDMTR64.js → chunk-66AEVERM.js} +785 -256
  9. package/dist/chunk-66AEVERM.js.map +1 -0
  10. package/dist/{chunk-PJWGTNOX.js → chunk-7C3PFRBU.js} +144 -186
  11. package/dist/chunk-7C3PFRBU.js.map +1 -0
  12. package/dist/{chunk-52HDHJ7I.js → chunk-AUNRHWH4.js} +32 -21
  13. package/dist/chunk-AUNRHWH4.js.map +1 -0
  14. package/dist/{chunk-KOLDW6SF.js → chunk-BBDGYJHX.js} +2 -2
  15. package/dist/chunk-BBDGYJHX.js.map +1 -0
  16. package/dist/{chunk-SZYQISA2.js → chunk-ELV5WDS3.js} +43 -29
  17. package/dist/chunk-ELV5WDS3.js.map +1 -0
  18. package/dist/{chunk-MQ6CGZNJ.js → chunk-GAKVZNTX.js} +1879 -2019
  19. package/dist/chunk-GAKVZNTX.js.map +1 -0
  20. package/dist/chunk-GEMW5RQ2.js +1169 -0
  21. package/dist/chunk-GEMW5RQ2.js.map +1 -0
  22. package/dist/{chunk-NQW25DCF.js → chunk-GHHJYNAN.js} +1 -7
  23. package/dist/chunk-GHHJYNAN.js.map +1 -0
  24. package/dist/{chunk-WTWMGH2C.js → chunk-HACRR422.js} +2 -2
  25. package/dist/chunk-HACRR422.js.map +1 -0
  26. package/dist/{chunk-F2BHT5C4.js → chunk-IWY5IR4F.js} +129 -151
  27. package/dist/chunk-IWY5IR4F.js.map +1 -0
  28. package/dist/{chunk-JFLVEFFP.js → chunk-KIK5EZYD.js} +1 -1
  29. package/dist/chunk-KIK5EZYD.js.map +1 -0
  30. package/dist/{chunk-USVBYQSQ.js → chunk-O4LN3HFI.js} +16 -6
  31. package/dist/chunk-O4LN3HFI.js.map +1 -0
  32. package/dist/{chunk-RIPSGNLU.js → chunk-OCAVW6N5.js} +3 -3
  33. package/dist/chunk-OCAVW6N5.js.map +1 -0
  34. package/dist/{chunk-4AAOOAIN.js → chunk-P6CYS4JK.js} +2 -2
  35. package/dist/chunk-P6CYS4JK.js.map +1 -0
  36. package/dist/chunk-PLFANHRZ.js +35 -0
  37. package/dist/chunk-PLFANHRZ.js.map +1 -0
  38. package/dist/{chunk-6ZRH5RHC.js → chunk-PMUZR4XO.js} +4 -4
  39. package/dist/chunk-PMUZR4XO.js.map +1 -0
  40. package/dist/{chunk-F5EBEATU.js → chunk-PSUTNOQ2.js} +34 -46
  41. package/dist/chunk-PSUTNOQ2.js.map +1 -0
  42. package/dist/chunk-RIK45Q4I.js +103 -0
  43. package/dist/chunk-RIK45Q4I.js.map +1 -0
  44. package/dist/{chunk-HED2DAXZ.js → chunk-THO7LO5B.js} +5 -5
  45. package/dist/chunk-THO7LO5B.js.map +1 -0
  46. package/dist/{chunk-OYJQUA3D.js → chunk-YGDWHDOY.js} +31 -13
  47. package/dist/chunk-YGDWHDOY.js.map +1 -0
  48. package/dist/{chunk-NCWDK6L7.js → chunk-YXKTY5WM.js} +254 -379
  49. package/dist/chunk-YXKTY5WM.js.map +1 -0
  50. package/dist/{chunk-NEZ4OAOL.js → chunk-ZEGM3MVR.js} +3 -5
  51. package/dist/chunk-ZEGM3MVR.js.map +1 -0
  52. package/dist/commands/build/marketplace.js +46 -46
  53. package/dist/commands/build/marketplace.js.map +1 -1
  54. package/dist/commands/build/plugins.js +25 -28
  55. package/dist/commands/build/plugins.js.map +1 -1
  56. package/dist/commands/compile.js +87 -178
  57. package/dist/commands/compile.js.map +1 -1
  58. package/dist/commands/doctor.js +510 -360
  59. package/dist/commands/doctor.js.map +1 -1
  60. package/dist/commands/edit.js +451 -357
  61. package/dist/commands/edit.js.map +1 -1
  62. package/dist/commands/eject.js +144 -125
  63. package/dist/commands/eject.js.map +1 -1
  64. package/dist/commands/init.js +20 -27
  65. package/dist/commands/list.js +39 -55
  66. package/dist/commands/list.js.map +1 -1
  67. package/dist/commands/new/marketplace.js +6 -11
  68. package/dist/commands/new/marketplace.js.map +1 -1
  69. package/dist/commands/search.js +35 -32
  70. package/dist/commands/search.js.map +1 -1
  71. package/dist/commands/share.js +17 -77
  72. package/dist/commands/share.js.map +1 -1
  73. package/dist/commands/uninstall.js +159 -222
  74. package/dist/commands/uninstall.js.map +1 -1
  75. package/dist/commands/update.js +9 -32
  76. package/dist/commands/update.js.map +1 -1
  77. package/dist/components/common/prompt-confirm.js +2 -2
  78. package/dist/components/common/removal-plan-confirm.js +2 -2
  79. package/dist/components/common/scroll-affordance.js +2 -2
  80. package/dist/components/common/select-list.js +2 -2
  81. package/dist/components/common/skill-agent-summary.js +4 -4
  82. package/dist/components/common/spinner.js +2 -4
  83. package/dist/components/common/summary-panel.js +5 -5
  84. package/dist/components/common/summary-panel.js.map +1 -1
  85. package/dist/config-exports.js +7 -3
  86. package/dist/config-exports.js.map +1 -1
  87. package/dist/hooks/init.js +18 -19
  88. package/dist/hooks/init.js.map +1 -1
  89. package/dist/index.js.map +1 -1
  90. package/dist/load-agent-defs-6QUUMGHK.js +14 -0
  91. package/dist/recompile-project-agents-I33KQJFB.js +65 -0
  92. package/dist/recompile-project-agents-I33KQJFB.js.map +1 -0
  93. package/dist/{source-loader-C5SQXZXI.js → source-loader-TTJVW2ER.js} +5 -5
  94. package/dist/src/agents/developer/ai-developer/playbook.md +2 -5
  95. package/dist/src/agents/developer/api-developer/playbook.md +2 -5
  96. package/dist/src/agents/developer/cli-developer/playbook.md +2 -5
  97. package/dist/src/agents/developer/web-developer/playbook.md +2 -5
  98. package/dist/src/agents/meta/agent-summoner/output.md +2 -2
  99. package/dist/src/agents/meta/agent-summoner/playbook.md +1 -13
  100. package/dist/src/agents/meta/codex-keeper/critical-requirements.md +2 -5
  101. package/dist/src/agents/meta/convention-keeper/critical-requirements.md +2 -4
  102. package/dist/src/agents/tester/ai-tester/critical-requirements.md +1 -2
  103. package/dist/src/agents/tester/ai-tester/playbook.md +2 -0
  104. package/dist/src/agents/tester/api-tester/critical-requirements.md +1 -2
  105. package/dist/src/agents/tester/api-tester/playbook.md +2 -0
  106. package/dist/src/agents/tester/cli-tester/critical-requirements.md +1 -2
  107. package/dist/src/agents/tester/cli-tester/playbook.md +2 -0
  108. package/dist/src/agents/tester/web-tester/critical-requirements.md +1 -2
  109. package/dist/src/agents/tester/web-tester/playbook.md +2 -0
  110. package/package.json +9 -8
  111. package/src/agents/developer/ai-developer/playbook.md +2 -5
  112. package/src/agents/developer/api-developer/playbook.md +2 -5
  113. package/src/agents/developer/cli-developer/playbook.md +2 -5
  114. package/src/agents/developer/web-developer/playbook.md +2 -5
  115. package/src/agents/meta/agent-summoner/output.md +2 -2
  116. package/src/agents/meta/agent-summoner/playbook.md +1 -13
  117. package/src/agents/meta/codex-keeper/critical-requirements.md +2 -5
  118. package/src/agents/meta/convention-keeper/critical-requirements.md +2 -4
  119. package/src/agents/tester/ai-tester/critical-requirements.md +1 -2
  120. package/src/agents/tester/ai-tester/playbook.md +2 -0
  121. package/src/agents/tester/api-tester/critical-requirements.md +1 -2
  122. package/src/agents/tester/api-tester/playbook.md +2 -0
  123. package/src/agents/tester/cli-tester/critical-requirements.md +1 -2
  124. package/src/agents/tester/cli-tester/playbook.md +2 -0
  125. package/src/agents/tester/web-tester/critical-requirements.md +1 -2
  126. package/src/agents/tester/web-tester/playbook.md +2 -0
  127. package/src/schemas/project-config.schema.json +0 -3
  128. package/src/schemas/project-source-config.schema.json +0 -6
  129. package/dist/chunk-3G7X2WKI.js.map +0 -1
  130. package/dist/chunk-44TE3RKH.js.map +0 -1
  131. package/dist/chunk-4AAOOAIN.js.map +0 -1
  132. package/dist/chunk-52HDHJ7I.js.map +0 -1
  133. package/dist/chunk-6HNXYYVF.js +0 -373
  134. package/dist/chunk-6HNXYYVF.js.map +0 -1
  135. package/dist/chunk-6ZRH5RHC.js.map +0 -1
  136. package/dist/chunk-7RDMTR64.js.map +0 -1
  137. package/dist/chunk-BMRUNMPV.js.map +0 -1
  138. package/dist/chunk-CLPUWOSA.js +0 -46
  139. package/dist/chunk-CLPUWOSA.js.map +0 -1
  140. package/dist/chunk-F2BHT5C4.js.map +0 -1
  141. package/dist/chunk-F5EBEATU.js.map +0 -1
  142. package/dist/chunk-HED2DAXZ.js.map +0 -1
  143. package/dist/chunk-JFLVEFFP.js.map +0 -1
  144. package/dist/chunk-KOLDW6SF.js.map +0 -1
  145. package/dist/chunk-MQ6CGZNJ.js.map +0 -1
  146. package/dist/chunk-NCWDK6L7.js.map +0 -1
  147. package/dist/chunk-NEZ4OAOL.js.map +0 -1
  148. package/dist/chunk-NIHUOWE4.js +0 -106
  149. package/dist/chunk-NIHUOWE4.js.map +0 -1
  150. package/dist/chunk-NQW25DCF.js.map +0 -1
  151. package/dist/chunk-OYJQUA3D.js.map +0 -1
  152. package/dist/chunk-PJWGTNOX.js.map +0 -1
  153. package/dist/chunk-RIPSGNLU.js.map +0 -1
  154. package/dist/chunk-SZYQISA2.js.map +0 -1
  155. package/dist/chunk-USVBYQSQ.js.map +0 -1
  156. package/dist/chunk-V3KTSP3Q.js +0 -940
  157. package/dist/chunk-V3KTSP3Q.js.map +0 -1
  158. package/dist/chunk-WTWMGH2C.js.map +0 -1
  159. package/dist/load-agent-defs-YMDWBFDP.js +0 -14
  160. package/dist/recompile-project-agents-SZ76WNTW.js +0 -18
  161. package/dist/source-loader-C5SQXZXI.js.map +0 -1
  162. /package/dist/{load-agent-defs-YMDWBFDP.js.map → load-agent-defs-6QUUMGHK.js.map} +0 -0
  163. /package/dist/{recompile-project-agents-SZ76WNTW.js.map → source-loader-TTJVW2ER.js.map} +0 -0
@@ -1,33 +1,32 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runDashboardFlow
4
- } from "../chunk-NCWDK6L7.js";
5
- import "../chunk-44TE3RKH.js";
6
- import "../chunk-6HNXYYVF.js";
7
- import "../chunk-OYJQUA3D.js";
8
- import "../chunk-4AAOOAIN.js";
4
+ } from "../chunk-YXKTY5WM.js";
5
+ import "../chunk-3ED3KHHD.js";
6
+ import "../chunk-PLFANHRZ.js";
7
+ import "../chunk-YGDWHDOY.js";
8
+ import "../chunk-P6CYS4JK.js";
9
9
  import "../chunk-OZXAJNLA.js";
10
- import "../chunk-F5EBEATU.js";
11
- import "../chunk-7RDMTR64.js";
12
- import "../chunk-F2BHT5C4.js";
13
- import "../chunk-HED2DAXZ.js";
14
- import "../chunk-3G7X2WKI.js";
15
- import "../chunk-BMRUNMPV.js";
16
- import "../chunk-JFLVEFFP.js";
17
- import "../chunk-RIPSGNLU.js";
10
+ import "../chunk-PSUTNOQ2.js";
11
+ import "../chunk-66AEVERM.js";
12
+ import "../chunk-IWY5IR4F.js";
13
+ import "../chunk-THO7LO5B.js";
14
+ import "../chunk-5BNX73OU.js";
15
+ import "../chunk-2YA4DDRM.js";
16
+ import "../chunk-KIK5EZYD.js";
17
+ import "../chunk-OCAVW6N5.js";
18
18
  import {
19
19
  EXIT_CODES
20
- } from "../chunk-V3KTSP3Q.js";
21
- import "../chunk-CLPUWOSA.js";
20
+ } from "../chunk-GEMW5RQ2.js";
22
21
  import {
23
22
  findConfigLoadFailures,
24
23
  installationConfigsUnreadable,
25
24
  retiredSourceFolderIn,
26
25
  retiredSourceFolderUnsupported
27
- } from "../chunk-MQ6CGZNJ.js";
28
- import "../chunk-52HDHJ7I.js";
29
- import "../chunk-PJWGTNOX.js";
30
- import "../chunk-NQW25DCF.js";
26
+ } from "../chunk-GAKVZNTX.js";
27
+ import "../chunk-AUNRHWH4.js";
28
+ import "../chunk-7C3PFRBU.js";
29
+ import "../chunk-GHHJYNAN.js";
31
30
 
32
31
  // src/cli/hooks/init.ts
33
32
  import os from "os";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/hooks/init.ts"],"sourcesContent":["import os from \"os\";\n\nimport { flush, type Hook } from \"@oclif/core\";\nimport { runDashboardFlow } from \"../commands/init.js\";\nimport { findConfigLoadFailures } from \"../lib/configuration/project-config.js\";\nimport { retiredSourceFolderIn } from \"../lib/installation/install-layout.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport {\n installationConfigsUnreadable,\n retiredSourceFolderUnsupported,\n} from \"../utils/messages.js\";\n\nconst hook: Hook<\"init\"> = async function (options) {\n sayTheRetiredSourceFolderIsUnsupported(process.cwd());\n\n // No command: the dashboard, over the project's installation or else the global one\n if (options.id === undefined) {\n const projectDir = process.cwd();\n // Left to the dashboard, the load error was swallowed by oclif's hook runner and the run\n // printed the root help, as though nothing were installed.\n const unreadable = await findConfigLoadFailures(projectDir);\n if (unreadable.length > 0) {\n this.error(installationConfigsUnreadable(unreadable), { exit: EXIT_CODES.ERROR });\n }\n\n const dashboard = await runDashboardFlow(projectDir, options.config);\n if (dashboard === \"cancelled\") this.error(\"Cancelled\", { exit: EXIT_CODES.CANCELLED });\n if (dashboard === \"shown\") await endRun(EXIT_CODES.SUCCESS);\n }\n};\n\n/**\n * One bare line, once per run, while the project or HOME holds the retired source folder.\n *\n * Here because every command passes through this hook exactly once, before it runs — so the line\n * is said once however many scopes hold the folder, and by every command alike. It is a notice\n * and nothing more: the run goes on exactly as it would without the folder, which no command\n * reads or writes. On stderr, so a command whose output is piped somewhere is not changed by it.\n */\nfunction sayTheRetiredSourceFolderIsUnsupported(cwd: string): void {\n const replacement = retiredSourceFolderIn([cwd, os.homedir()]);\n if (replacement === null) return;\n process.stderr.write(`${retiredSourceFolderUnsupported(replacement)}\\n`);\n}\n\n/**\n * Ends the run here, once the dashboard is done with it.\n *\n * `this.exit(0)` cannot: oclif swallows an exit 0 thrown from a hook and carries on with the run\n * the hook interrupted — and a run with no command is a request for the root help, so the full help\n * listing printed under every dashboard that was left with Escape or a chosen command. A non-zero\n * exit is not swallowed, which is why Ctrl+C's `this.error` already ended the run. This is the\n * ending oclif's own error handler gives a command's `this.exit()`, with the output flushed first.\n */\nasync function endRun(code: number): Promise<never> {\n await flush();\n process.exit(code);\n}\n\nexport default hook;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ;AAEf,SAAS,aAAwB;AAUjC,IAAM,OAAqB,eAAgB,SAAS;AAClD,yCAAuC,QAAQ,IAAI,CAAC;AAGpD,MAAI,QAAQ,OAAO,QAAW;AAC5B,UAAM,aAAa,QAAQ,IAAI;AAG/B,UAAM,aAAa,MAAM,uBAAuB,UAAU;AAC1D,QAAI,WAAW,SAAS,GAAG;AACzB,WAAK,MAAM,8BAA8B,UAAU,GAAG,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,IAClF;AAEA,UAAM,YAAY,MAAM,iBAAiB,YAAY,QAAQ,MAAM;AACnE,QAAI,cAAc,YAAa,MAAK,MAAM,aAAa,EAAE,MAAM,WAAW,UAAU,CAAC;AACrF,QAAI,cAAc,QAAS,OAAM,OAAO,WAAW,OAAO;AAAA,EAC5D;AACF;AAUA,SAAS,uCAAuC,KAAmB;AACjE,QAAM,cAAc,sBAAsB,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC;AAC7D,MAAI,gBAAgB,KAAM;AAC1B,UAAQ,OAAO,MAAM,GAAG,+BAA+B,WAAW,CAAC;AAAA,CAAI;AACzE;AAWA,eAAe,OAAO,MAA8B;AAClD,QAAM,MAAM;AACZ,UAAQ,KAAK,IAAI;AACnB;AAEA,IAAO,eAAQ;","names":[]}
1
+ {"version":3,"sources":["../../src/cli/hooks/init.ts"],"sourcesContent":["import os from \"os\";\n\nimport { flush, type Hook } from \"@oclif/core\";\nimport { runDashboardFlow } from \"../commands/init.js\";\nimport { findConfigLoadFailures } from \"../lib/configuration/project-config.js\";\nimport { retiredSourceFolderIn } from \"../lib/installation/install-layout.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport {\n installationConfigsUnreadable,\n retiredSourceFolderUnsupported,\n} from \"../utils/messages.js\";\n\nconst hook: Hook<\"init\"> = async function (options) {\n sayTheRetiredSourceFolderIsUnsupported(process.cwd());\n\n // No command: the dashboard.\n if (options.id === undefined) {\n const projectDir = process.cwd();\n // Checked here: oclif's hook runner swallows a load error thrown inside the dashboard.\n const unreadable = await findConfigLoadFailures(projectDir);\n if (unreadable.length > 0) {\n this.error(installationConfigsUnreadable(unreadable), { exit: EXIT_CODES.ERROR });\n }\n\n const dashboard = await runDashboardFlow(projectDir, options.config);\n if (dashboard === \"cancelled\") this.error(\"Cancelled\", { exit: EXIT_CODES.CANCELLED });\n if (dashboard === \"shown\") await endRun(EXIT_CODES.SUCCESS);\n }\n};\n\n/** Notice only, once per run; stderr so piped output is unchanged. */\nfunction sayTheRetiredSourceFolderIsUnsupported(cwd: string): void {\n const replacement = retiredSourceFolderIn([cwd, os.homedir()]);\n if (replacement === null) return;\n process.stderr.write(`${retiredSourceFolderUnsupported(replacement)}\\n`);\n}\n\n/** Not `this.exit(0)`: oclif swallows an exit 0 from a hook and goes on to print the root help. */\nasync function endRun(code: number): Promise<never> {\n await flush();\n process.exit(code);\n}\n\nexport default hook;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ;AAEf,SAAS,aAAwB;AAUjC,IAAM,OAAqB,eAAgB,SAAS;AAClD,yCAAuC,QAAQ,IAAI,CAAC;AAGpD,MAAI,QAAQ,OAAO,QAAW;AAC5B,UAAM,aAAa,QAAQ,IAAI;AAE/B,UAAM,aAAa,MAAM,uBAAuB,UAAU;AAC1D,QAAI,WAAW,SAAS,GAAG;AACzB,WAAK,MAAM,8BAA8B,UAAU,GAAG,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,IAClF;AAEA,UAAM,YAAY,MAAM,iBAAiB,YAAY,QAAQ,MAAM;AACnE,QAAI,cAAc,YAAa,MAAK,MAAM,aAAa,EAAE,MAAM,WAAW,UAAU,CAAC;AACrF,QAAI,cAAc,QAAS,OAAM,OAAO,WAAW,OAAO;AAAA,EAC5D;AACF;AAGA,SAAS,uCAAuC,KAAmB;AACjE,QAAM,cAAc,sBAAsB,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC;AAC7D,MAAI,gBAAgB,KAAM;AAC1B,UAAQ,OAAO,MAAM,GAAG,+BAA+B,WAAW,CAAC;AAAA,CAAI;AACzE;AAGA,eAAe,OAAO,MAA8B;AAClD,QAAM,MAAM;AACZ,UAAQ,KAAK,IAAI;AACnB;AAEA,IAAO,eAAQ;","names":[]}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/index.ts"],"sourcesContent":["import { run, flush, Errors } from \"@oclif/core\";\n\nrun(undefined, import.meta.url)\n .then(() => flush())\n // oclif's handler takes an `Error`, and a rejection reason is `unknown` — a\n // throw of a non-Error would otherwise reach it and fail inside the handler,\n // losing the message it was carrying.\n .catch((error: unknown) =>\n Errors.handle(error instanceof Error ? error : new Error(String(error))),\n );\n"],"mappings":";;;AAAA,SAAS,KAAK,OAAO,cAAc;AAEnC,IAAI,QAAW,YAAY,GAAG,EAC3B,KAAK,MAAM,MAAM,CAAC,EAIlB;AAAA,EAAM,CAAC,UACN,OAAO,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AACzE;","names":[]}
1
+ {"version":3,"sources":["../src/cli/index.ts"],"sourcesContent":["import { run, flush, Errors } from \"@oclif/core\";\n\nrun(undefined, import.meta.url)\n .then(() => flush())\n // Errors.handle needs an Error; a non-Error rejection would fail inside it.\n .catch((error: unknown) =>\n Errors.handle(error instanceof Error ? error : new Error(String(error))),\n );\n"],"mappings":";;;AAAA,SAAS,KAAK,OAAO,cAAc;AAEnC,IAAI,QAAW,YAAY,GAAG,EAC3B,KAAK,MAAM,MAAM,CAAC,EAElB;AAAA,EAAM,CAAC,UACN,OAAO,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AACzE;","names":[]}
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ loadAgentDefs
4
+ } from "./chunk-THO7LO5B.js";
5
+ import "./chunk-5BNX73OU.js";
6
+ import "./chunk-2YA4DDRM.js";
7
+ import "./chunk-GAKVZNTX.js";
8
+ import "./chunk-AUNRHWH4.js";
9
+ import "./chunk-7C3PFRBU.js";
10
+ import "./chunk-GHHJYNAN.js";
11
+ export {
12
+ loadAgentDefs
13
+ };
14
+ //# sourceMappingURL=load-agent-defs-6QUUMGHK.js.map
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ compileAgents,
4
+ discoverInstalledSkills,
5
+ withCatalogueSeatedFor
6
+ } from "./chunk-IWY5IR4F.js";
7
+ import {
8
+ loadAgentDefs
9
+ } from "./chunk-THO7LO5B.js";
10
+ import "./chunk-5BNX73OU.js";
11
+ import "./chunk-2YA4DDRM.js";
12
+ import {
13
+ getErrorMessage,
14
+ resolveInstallPaths
15
+ } from "./chunk-GAKVZNTX.js";
16
+ import "./chunk-AUNRHWH4.js";
17
+ import "./chunk-7C3PFRBU.js";
18
+ import "./chunk-GHHJYNAN.js";
19
+
20
+ // src/cli/lib/operations/project/recompile-project-agents.ts
21
+ async function recompileRegisteredProjectAgents(projectDir) {
22
+ return withCatalogueSeatedFor(projectDir, async () => {
23
+ const { allSkills } = await discoverInstalledSkills(projectDir);
24
+ const { sourcePath } = await loadAgentDefs();
25
+ return compileAgents({
26
+ projectDir,
27
+ sourcePath,
28
+ skills: allSkills,
29
+ scopeFilter: "project",
30
+ outputDir: resolveInstallPaths(projectDir, "project").agentsDir
31
+ });
32
+ });
33
+ }
34
+ async function recompilePropagatedProjectAgents(projectDirs, pairsRewritten) {
35
+ const outcomes = [];
36
+ for (const dir of projectDirs) {
37
+ outcomes.push(await recompileOutcomeFor(dir, pairsRewritten));
38
+ }
39
+ return summarizeRecompiles(outcomes);
40
+ }
41
+ async function recompileOutcomeFor(dir, pairsRewritten) {
42
+ try {
43
+ const result = await recompileRegisteredProjectAgents(dir);
44
+ if (result.failed.length > 0) return { kind: "failed", warnings: result.warnings };
45
+ const changed = result.rewritten.length > 0 || pairsRewritten.has(dir);
46
+ return { kind: changed ? "rewritten" : "unchanged" };
47
+ } catch (error) {
48
+ return {
49
+ kind: "failed",
50
+ warnings: [`Could not recompile agents in ${dir}: ${getErrorMessage(error)}`]
51
+ };
52
+ }
53
+ }
54
+ function summarizeRecompiles(outcomes) {
55
+ return {
56
+ rewrittenCount: outcomes.filter((outcome) => outcome.kind === "rewritten").length,
57
+ unchangedCount: outcomes.filter((outcome) => outcome.kind === "unchanged").length,
58
+ failedCount: outcomes.filter((outcome) => outcome.kind === "failed").length,
59
+ warnings: outcomes.flatMap((outcome) => outcome.kind === "failed" ? outcome.warnings : [])
60
+ };
61
+ }
62
+ export {
63
+ recompilePropagatedProjectAgents
64
+ };
65
+ //# sourceMappingURL=recompile-project-agents-I33KQJFB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/lib/operations/project/recompile-project-agents.ts"],"sourcesContent":["import { compileAgents, type CompilationResult } from \"./compile-agents.js\";\nimport { loadAgentDefs } from \"./load-agent-defs.js\";\nimport { discoverInstalledSkills } from \"../skills/index.js\";\nimport { resolveInstallPaths } from \"../../installation/index.js\";\nimport { withCatalogueSeatedFor } from \"../../loading/catalogue-seat.js\";\nimport { getErrorMessage } from \"../../../utils/errors.js\";\n\n/**\n * Project scope only: the triggering command already recompiled the global agents. Skills and\n * catalogue are resolved from this project; without explicit `skills`, `recompileAgents` would\n * see plugin skills only.\n */\nasync function recompileRegisteredProjectAgents(projectDir: string): Promise<CompilationResult> {\n return withCatalogueSeatedFor(projectDir, async () => {\n const { allSkills } = await discoverInstalledSkills(projectDir);\n const { sourcePath } = await loadAgentDefs();\n\n return compileAgents({\n projectDir,\n sourcePath,\n skills: allSkills,\n scopeFilter: \"project\",\n outputDir: resolveInstallPaths(projectDir, \"project\").agentsDir,\n });\n });\n}\n\nexport type PropagatedRecompileSummary = {\n /** Projects whose config pair or compiled sub-agents changed. */\n rewrittenCount: number;\n /** Projects visited where neither did. */\n unchangedCount: number;\n failedCount: number;\n warnings: string[];\n};\n\n/**\n * One project's failure must not stop the rest; sequential so warnings keep a stable order.\n * `pairsRewritten` names the projects whose config pair the fan-out changed.\n */\nexport async function recompilePropagatedProjectAgents(\n projectDirs: string[],\n pairsRewritten: ReadonlySet<string>,\n): Promise<PropagatedRecompileSummary> {\n const outcomes: ProjectRecompileOutcome[] = [];\n for (const dir of projectDirs) {\n outcomes.push(await recompileOutcomeFor(dir, pairsRewritten));\n }\n return summarizeRecompiles(outcomes);\n}\n\ntype ProjectRecompileOutcome =\n { kind: \"rewritten\" } | { kind: \"unchanged\" } | { kind: \"failed\"; warnings: string[] };\n\nasync function recompileOutcomeFor(\n dir: string,\n pairsRewritten: ReadonlySet<string>,\n): Promise<ProjectRecompileOutcome> {\n try {\n const result = await recompileRegisteredProjectAgents(dir);\n if (result.failed.length > 0) return { kind: \"failed\", warnings: result.warnings };\n\n const changed = result.rewritten.length > 0 || pairsRewritten.has(dir);\n return { kind: changed ? \"rewritten\" : \"unchanged\" };\n } catch (error) {\n return {\n kind: \"failed\",\n warnings: [`Could not recompile agents in ${dir}: ${getErrorMessage(error)}`],\n };\n }\n}\n\nfunction summarizeRecompiles(outcomes: ProjectRecompileOutcome[]): PropagatedRecompileSummary {\n return {\n rewrittenCount: outcomes.filter((outcome) => outcome.kind === \"rewritten\").length,\n unchangedCount: outcomes.filter((outcome) => outcome.kind === \"unchanged\").length,\n failedCount: outcomes.filter((outcome) => outcome.kind === \"failed\").length,\n warnings: outcomes.flatMap((outcome) => (outcome.kind === \"failed\" ? outcome.warnings : [])),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAYA,eAAe,iCAAiC,YAAgD;AAC9F,SAAO,uBAAuB,YAAY,YAAY;AACpD,UAAM,EAAE,UAAU,IAAI,MAAM,wBAAwB,UAAU;AAC9D,UAAM,EAAE,WAAW,IAAI,MAAM,cAAc;AAE3C,WAAO,cAAc;AAAA,MACnB;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,WAAW,oBAAoB,YAAY,SAAS,EAAE;AAAA,IACxD,CAAC;AAAA,EACH,CAAC;AACH;AAeA,eAAsB,iCACpB,aACA,gBACqC;AACrC,QAAM,WAAsC,CAAC;AAC7C,aAAW,OAAO,aAAa;AAC7B,aAAS,KAAK,MAAM,oBAAoB,KAAK,cAAc,CAAC;AAAA,EAC9D;AACA,SAAO,oBAAoB,QAAQ;AACrC;AAKA,eAAe,oBACb,KACA,gBACkC;AAClC,MAAI;AACF,UAAM,SAAS,MAAM,iCAAiC,GAAG;AACzD,QAAI,OAAO,OAAO,SAAS,EAAG,QAAO,EAAE,MAAM,UAAU,UAAU,OAAO,SAAS;AAEjF,UAAM,UAAU,OAAO,UAAU,SAAS,KAAK,eAAe,IAAI,GAAG;AACrE,WAAO,EAAE,MAAM,UAAU,cAAc,YAAY;AAAA,EACrD,SAAS,OAAO;AACd,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,CAAC,iCAAiC,GAAG,KAAK,gBAAgB,KAAK,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,UAAiE;AAC5F,SAAO;AAAA,IACL,gBAAgB,SAAS,OAAO,CAAC,YAAY,QAAQ,SAAS,WAAW,EAAE;AAAA,IAC3E,gBAAgB,SAAS,OAAO,CAAC,YAAY,QAAQ,SAAS,WAAW,EAAE;AAAA,IAC3E,aAAa,SAAS,OAAO,CAAC,YAAY,QAAQ,SAAS,QAAQ,EAAE;AAAA,IACrE,UAAU,SAAS,QAAQ,CAAC,YAAa,QAAQ,SAAS,WAAW,QAAQ,WAAW,CAAC,CAAE;AAAA,EAC7F;AACF;","names":[]}
@@ -5,10 +5,10 @@ import {
5
5
  loadMarketplaceMatrix,
6
6
  loadSkillsMatrixFromSource,
7
7
  mergeLocalSkillsIntoMatrix
8
- } from "./chunk-MQ6CGZNJ.js";
9
- import "./chunk-52HDHJ7I.js";
10
- import "./chunk-PJWGTNOX.js";
11
- import "./chunk-NQW25DCF.js";
8
+ } from "./chunk-GAKVZNTX.js";
9
+ import "./chunk-AUNRHWH4.js";
10
+ import "./chunk-7C3PFRBU.js";
11
+ import "./chunk-GHHJYNAN.js";
12
12
  export {
13
13
  MarketplaceManifestRequiredError,
14
14
  convertStackToResolvedStack,
@@ -16,4 +16,4 @@ export {
16
16
  loadSkillsMatrixFromSource,
17
17
  mergeLocalSkillsIntoMatrix
18
18
  };
19
- //# sourceMappingURL=source-loader-C5SQXZXI.js.map
19
+ //# sourceMappingURL=source-loader-TTJVW2ER.js.map
@@ -59,11 +59,8 @@ spec names. Before calling the step done, check the pipeline against this list:
59
59
  then the tests `ai-tester` wrote for this feature. Mock the model API rather than calling it — a test
60
60
  that hits a live model is non-deterministic and costs money per run. Cover malformed output: empty,
61
61
  truncated, and valid JSON of the wrong shape. Cover the token-limit boundary and the retry path with
62
- simulated failures. Run the project's linter, and put a real request through the pipeline where a
63
- mocked test cannot tell you whether the prompt actually works.
64
-
65
- **Your stop hook runs the project's typecheck and nothing else.** Lint and tests are
66
- deliberately outside it, so a clean stop says the code compiles — never that it works.
62
+ simulated failures. Run the project's typecheck and linter, and put a real request through the
63
+ pipeline where a mocked test cannot tell you whether the prompt actually works.
67
64
 
68
65
  **Step 5 — Verify.** Take the success criteria one at a time: state the criterion, mark it PASS or
69
66
  FAIL, and give the evidence — the test name, the command, or what you observed. Fix and re-verify
@@ -54,11 +54,8 @@ spec names. Before calling the step done, check the endpoint against this list:
54
54
 
55
55
  **Step 4 — Test, lint, and call it.** Run the existing tests to confirm nothing broke, then the
56
56
  tests `api-tester` wrote for this feature. A test that passes without exercising the requirement
57
- covers nothing, so check what each one actually asserts. Run the project's linter, and send a real
58
- request to the endpoint where a test cannot reach what a caller would get.
59
-
60
- **Your stop hook runs the project's typecheck and nothing else.** Lint and tests are
61
- deliberately outside it, so a clean stop says the code compiles — never that it works.
57
+ covers nothing, so check what each one actually asserts. Run the project's typecheck and linter, and
58
+ send a real request to the endpoint where a test cannot reach what a caller would get.
62
59
 
63
60
  **Step 5 — Verify.** Take the success criteria one at a time: state the criterion, mark it PASS or
64
61
  FAIL, and give the evidence — the test name, the request you made, or what you observed. Fix and
@@ -55,11 +55,8 @@ spec names. Before calling the step done, check the command against this list:
55
55
 
56
56
  **Step 4 — Test, lint, and run the command.** Run the existing tests to confirm nothing broke,
57
57
  then the tests `cli-tester` wrote for this feature, and check that the cancellation paths are among
58
- them. Run the project's linter, and drive the command yourself — including Ctrl+C — where a test
59
- cannot reach what a user would see.
60
-
61
- **Your stop hook runs the project's typecheck and nothing else.** Lint and tests are
62
- deliberately outside it, so a clean stop says the code compiles — never that it works.
58
+ them. Run the project's typecheck and linter, and drive the command yourself — including Ctrl+C —
59
+ where a test cannot reach what a user would see.
63
60
 
64
61
  **Step 5 — Verify.** Take the success criteria one at a time: state the criterion, mark it PASS or
65
62
  FAIL, and give the evidence — the test name, the command, or what you observed. Fix and re-verify
@@ -45,11 +45,8 @@ spec names.
45
45
 
46
46
  **Step 4 — Test, lint, and see it run.** Run the existing tests to confirm nothing broke, then the
47
47
  tests `web-tester` wrote for this feature. A test that passes without exercising the requirement
48
- covers nothing, so check what each one actually asserts. Run the project's linter, and exercise the
49
- feature yourself where a test cannot reach what a user would see.
50
-
51
- **Your stop hook runs the project's typecheck and nothing else.** Lint and tests are
52
- deliberately outside it, so a clean stop says the code compiles — never that it works.
48
+ covers nothing, so check what each one actually asserts. Run the project's typecheck and linter, and
49
+ exercise the feature yourself where a test cannot reach what a user would see.
53
50
 
54
51
  **Step 5 — Verify.** Take the success criteria one at a time: state the criterion, mark it PASS or
55
52
  FAIL, and give the evidence — the test name, the command, or what you observed. Fix and re-verify
@@ -13,8 +13,8 @@ Report the directory, then each file's content, then the config entry, then the
13
13
  `tools` are required; every other key is optional, whatever its position in the file. Two of the
14
14
  optional ones carry a default and therefore appear in every compiled agent whatever the metadata
15
15
  says — `model` falls back to `inherit` and `permissionMode` to `default`.
16
- `effort`, `disallowedTools`, `isolation` and `experimental` reach the frontmatter only when set. `hooks` reaches it either from `metadata.yaml` or as the
17
- completion gate — the playbook's frontmatter decisions say which and when.
16
+ `effort`, `disallowedTools`, `isolation`, `experimental` and `hooks` reach the frontmatter only
17
+ when set.
18
18
 
19
19
  ```yaml
20
20
  # yaml-language-server: $schema=https://raw.githubusercontent.com/agents-inc/agents-inc/main/packages/cli/src/schemas/agent.schema.json
@@ -103,7 +103,7 @@ follows: `<domain_scope>` in `identity.md`, `<self_correction_triggers>` in
103
103
  The compiled file, in order:
104
104
 
105
105
  ```
106
- frontmatter metadata.yaml, plus the Skill grant and the completion gate
106
+ frontmatter metadata.yaml, plus the Skill grant
107
107
  provenance marker an HTML comment the compile step stamps
108
108
  # Title the title from metadata.yaml
109
109
  <role> identity.md
@@ -226,18 +226,6 @@ because this repository does not use worktrees. Leave it off unless the project
226
226
  for has asked for it — a researcher in particular wants the working tree itself, since the tree is
227
227
  what the question is about.
228
228
 
229
- **The completion gate arrives on its own.** Every agent holding `Write` or `Edit` gets a `Stop`
230
- hook — logged by Claude Code as `SubagentStop` — that runs the project's typecheck
231
- before the agent may stop; a failing
232
- check comes back as the compiler's own output, so the agent iterates on it instead of reporting
233
- done, and the hook exits quietly in a project that declares no such scripts. This is what stands in
234
- place of a sentence asking an agent to check its own work. Declaring `hooks:` in `metadata.yaml` merges
235
- with the gate rather than displacing it: a stop hook of your own — `Stop` or `SubagentStop`, which
236
- Claude Code treats as one event for a sub-agent — replaces the emitted gate, and every other event is
237
- added beside it. So a `PostToolUse` formatter costs an agent nothing, and an agent meaning to own its
238
- completion checks declares `Stop` specifically. It has to declare an actual hook to do so:
239
- `declaresOwnGate` tests for a non-empty array, so `Stop: []` states nothing and the gate stands.
240
-
241
229
  </frontmatter_decisions>
242
230
 
243
231
  ---
@@ -3,11 +3,8 @@ document is a claim about source, and agents act on it without checking. Glob an
3
3
  claim about what a file contains comes from reading it.
4
4
 
5
5
  **Verify the finished document against the tree yourself, because no check does it for you.**
6
- The completion gate that runs when you stop is the project's `typecheck` script and nothing else —
7
- it never opens a markdown file, and it exits quietly in a project that declares no such script. A
8
- reference document whose every path has rotted stops the agent green. Resolve each path and symbol
9
- you wrote, confirm each pattern claim still has the instance you cited, and re-derive each count,
10
- before you report.
6
+ Resolve each path and symbol you wrote, confirm each pattern claim still has the instance you cited,
7
+ and re-derive each count, before you report.
11
8
 
12
9
  **Cite a path and a symbol, never a line number.** A symbol survives every edit above it and is
13
10
  greppable; a line number rots on the next unrelated insertion, silently, while still reading as
@@ -12,10 +12,8 @@ proposal that describes a change leaves the wording to whoever applies it, and t
12
12
  approved rule turns into a different one.
13
13
 
14
14
  **Confirm the target file and section exist before you propose an edit, and read the rule back in
15
- place after you apply one.** No check does this for you: the completion gate that runs when you stop
16
- is the project's `typecheck` script and nothing else — it never opens a markdown file, and it exits
17
- quietly in a project that declares no such script. A rule that read correctly in the proposal can
18
- contradict the one above it once it lands, and a proposal naming a section that no longer exists
15
+ place after you apply one.** No check does this for you. A rule that read correctly in the proposal
16
+ can contradict the one above it once it lands, and a proposal naming a section that no longer exists
19
17
  cannot be applied at all.
20
18
 
21
19
  **Mark a processed finding resolved in its own file, at its own path** — `status: resolved` plus a
@@ -34,8 +34,7 @@ pass threshold.** An eval in the blocking suite fails for reasons no one can rep
34
34
  **Watch each test fail for the right reason before the implementation exists, then pass after it.**
35
35
  A test that has never failed has not been shown to test anything.
36
36
 
37
- **Run the suite and report its actual output before claiming completion.** The completion gate runs
38
- the project's typecheck and nothing else, so whether the tests pass is yours to establish.
37
+ **Run the suite and report its actual output before claiming completion.**
39
38
 
40
39
  <self_correction_triggers>
41
40
 
@@ -144,6 +144,8 @@ the code does rather than what the feature owes.
144
144
  2. Run with a randomized test order if the runner supports it
145
145
  3. Confirm no test leaks timers, streams, or unclosed handles
146
146
  4. Confirm the eval suite is excluded from the default run
147
+ 5. Run the project's typecheck once the implementation exists, and fix every error it reports in a
148
+ test file — a runner that strips types runs a test file the compiler rejects
147
149
 
148
150
  **ITERATE: Fix causes, not symptoms**
149
151
  1. Flaky test? Find the nondeterminism (clock, ordering, shared fixture, live call) and remove it
@@ -24,8 +24,7 @@ somewhere else entirely, which is where the debugging time goes.
24
24
  data-integrity bugs — a handler that returns 201 and persists nothing passes an
25
25
  HTTP-only assertion.
26
26
 
27
- **Run the suite and report its actual output before claiming completion.** The completion gate runs
28
- the project's typecheck and nothing else, so whether the tests pass is yours to establish.
27
+ **Run the suite and report its actual output before claiming completion.**
29
28
 
30
29
  **Record a finding the way this project's conventions direct** when you fix an anti-pattern or
31
30
  discover a missing standard, so the next agent inherits it rather than rediscovering it.
@@ -63,6 +63,8 @@ nothing to do with the endpoint under test.
63
63
  2. Verify tests fail for expected reasons (not setup errors)
64
64
  3. Check tests pass after implementation exists
65
65
  4. Confirm database cleanup prevents test pollution
66
+ 5. Run the project's typecheck once the implementation exists, and fix every error it reports in a
67
+ test file — a runner that strips types runs a test file the compiler rejects
66
68
 
67
69
  **ITERATE: Fix and Improve**
68
70
  1. If tests are flaky, check for shared database state
@@ -26,8 +26,7 @@ removed rather than deprecated.
26
26
  A test that passes immediately has not been shown to test anything.
27
27
 
28
28
  **Run the suite with the project's own test command — the `test` script in its `package.json` — and
29
- report the actual output before claiming completion.** The completion gate runs the project's
30
- typecheck and nothing else, so whether the tests pass is yours to establish.
29
+ report the actual output before claiming completion.**
31
30
 
32
31
  <self_correction_triggers>
33
32
 
@@ -60,6 +60,8 @@ file for a reason none of them names.
60
60
  2. Verify tests fail for expected reasons (not syntax errors)
61
61
  3. Check tests pass after implementation exists
62
62
  4. Confirm cleanup prevents memory leaks
63
+ 5. Run the project's typecheck once the implementation exists, and fix every error it reports in a
64
+ test file — a runner that strips types runs a test file the compiler rejects
63
65
 
64
66
  **ITERATE: Fix and Improve**
65
67
  1. If tests are flaky, find what they race — an unfired effect, a missing unmount, a shared store —
@@ -17,8 +17,7 @@ drifts from it.
17
17
  **Mock the boundaries — APIs, databases, external services — so no test reaches a real one.** A
18
18
  suite that talks to a live service fails for reasons that have nothing to do with the code.
19
19
 
20
- **Run the suite and report its actual output before claiming completion.** The completion gate runs
21
- the project's typecheck and nothing else, so whether the tests pass is yours to establish.
20
+ **Run the suite and report its actual output before claiming completion.**
22
21
 
23
22
  <self_correction_triggers>
24
23
 
@@ -54,6 +54,8 @@ result.
54
54
  1. web-developer cleans up the implementation without changing behavior
55
55
  2. Re-run the suite - it must still pass, unedited
56
56
  3. A test that reddens on a behavior-preserving refactor was testing implementation; fix that test
57
+ 4. Run the project's typecheck, and fix every error it reports in a test file - a runner that strips
58
+ types runs a test file the compiler rejects
57
59
 
58
60
  **Hand Off to Developer:**
59
61
  - Provide complete test file
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "agents-inc",
3
- "version": "0.170.1",
3
+ "version": "0.170.2",
4
4
  "description": "CLI for managing Agents Inc. skills, stacks, and agents for Claude Code",
5
- "//generate": "The write path for all four generators, in dependency order: generate:types reads the skills marketplace and writes src/cli/types/generated/, then generate:schemas copies SKILL_SLUGS and CATEGORIES out of it into metadata.schema.json's enums, then generate:matrix vendors the same directory into packages/matrix, then generate:compile vendors this package's own src/agents/ partials and templates into packages/compile. A marketplace change drifts the first three, and .github/workflows/regenerate-catalog.yml runs those three step by step; generate:compile is not on that chain, because an agent-partial edit drifts it and a marketplace change does not. It replaces the write path only: the :check variants stay separate because CI deliberately runs different subsets of them in different jobs.",
6
- "//no-shared-vitest-config": "A three-project suite — unit, integration and commands, each with its own include and the retry that separates them — behind one root config that also carries vitest.setup.ts, disableConsoleIntercept for @oclif/test and ink-testing-library, and its own timeouts. @workspace/vitest-config is a single-project node config that turns globals off, which this suite needs on, so merging it in would contradict as much as it contributed. e2e/vitest.config.ts stands under the same decision. Read by scripts/check-shared-vitest-config.ts in packages/cli.",
7
- "//test:smoke": "The second half of e2e/vitest.config.ts, which is now two named projects over one tree: `test:e2e` runs `*.e2e.test.ts` and this runs `*.smoke.test.ts`. Before this pair existed no command ran the smoke files at all — the old single `include` excluded them, vitest has no `--include` flag, and reaching them took a hand-written config nobody had. They sat outside every gate for months and rotted exactly as you would expect: a marketplace fixture the Claude CLI has always rejected sat under a spec named 'should add a marketplace from a local directory source' that had never once added one. It DOES run in CI, and deliberately, and what it proves there now has TWO halves that must not be conflated. The Claude probes are `describe.skipIf(!claudeAvailable)` and the runner has no `claude`, so nothing they assert is coverage of the Claude CLI and must not be reported as such — for that, run them on a machine that has the binary. What a skipped run still proves is that the files collect, import and resolve their helpers, which is the whole of what rotted. The Codex probe does NOT skip: `e2e/smoke/codex-lane.smoke.test.ts` runs the pinned @openai/codex devDependency for real on every runner, so its assertions are coverage. `grep -L 'describe.skipIf' e2e/smoke/*.smoke.test.ts` is which files are which — a bare `skipIf` does not separate them, because codex-lane's docblock says in prose that it carries none.",
5
+ "//generate": "Runs all four generators in dependency order; the :check variants stay separate because CI runs different subsets.",
6
+ "//no-shared-vitest-config": "A three-project suite with globals on and its own setup and timeouts; the shared single-project, globals-off config would contradict it.",
7
+ "//test:smoke": "Runs e2e *.smoke.test.ts; the Claude probes skip without the binary, the Codex probe runs for real.",
8
8
  "type": "module",
9
9
  "main": "dist/index.js",
10
10
  "exports": {
@@ -44,7 +44,7 @@
44
44
  "prompt-engineering",
45
45
  "ai-tools"
46
46
  ],
47
- "//sideEffects": "compile-seat.ts is imported bare to seat @workspace/compile's warnings; with plain false, esbuild drops that import and every warning the compile package raises goes nowhere.",
47
+ "//sideEffects": "compile-seat.ts is imported bare for its side effect, which plain false would let esbuild drop.",
48
48
  "sideEffects": [
49
49
  "./src/cli/lib/compile-seat.ts"
50
50
  ],
@@ -76,7 +76,7 @@
76
76
  "dev": "tsup --watch",
77
77
  "agentsinc": "node dist/index.js",
78
78
  "agentsinc:dev": "bun src/cli/index.ts",
79
- "//test": "No `pretest` hook, deliberately, and removing it fixed a real defect. turbo.json already orders `build` before `test` and `test:e2e` via dependsOn, so an npm pre-hook is a SECOND build — and turbo runs those tasks concurrently, so `turbo run test test:e2e` fired three tsup builds and two of them raced on one dist/. tsup builds with clean:true, so the loser died with `ENOENT ... unlink dist/chunk-*.js` out of pretest:e2e; measured 2026-08-23 at 3 tsup invocations per invocation, now 1. That race aborted a push with no legible error, four hundred lines up in interleaved output. Running vitest directly is unaffected and stays a refusal rather than a rebuild: assertDistIsFresh in src/cli/lib/testing/dist-staleness.ts names a stale or absent dist and says to run `bun run build` — which is the posture that file argues for, since a direct `vitest run` should stay fast and stay something you asked for. A SECOND thing the two suites share, and it is not the dist/ one: each keeps a fixture at a FIXED os.tmpdir() path — the E2E source tree, and the unit suite's checkout of the default marketplace — because globalSetup runs in vitest's own process while the specs run in forked workers, so neither side can be handed the location and both compute it. A fixed path belongs to the machine and not to the run, so the rule it costs is that a fixture is written by the runner that owns it and by nothing else. shared-source.test.ts broke that for months: collected by the `unit` project, it rebuilt and removed the E2E fixture on the real path in six specs and an afterEach, and both suites stayed green while it deleted the tree the E2E specs read. src/cli/lib/__tests__/shared-fixture-writers.test.ts holds the rule against a walk of the tree, and src/cli/lib/__tests__/helpers/shared-source.ts states it in full.",
79
+ "//test": "No pretest hook: turbo already builds before test, and a second build races tsup on dist/.",
80
80
  "test": "vitest run",
81
81
  "test:e2e": "vitest --config e2e/vitest.config.ts --run --project e2e",
82
82
  "test:smoke": "vitest --config e2e/vitest.config.ts --run --project smoke",
@@ -122,7 +122,6 @@
122
122
  "fast-glob": "^3.3.0",
123
123
  "fs-extra": "^11.2.0",
124
124
  "giget": "^1.2.0",
125
- "gray-matter": "^4.0.3",
126
125
  "ink": "^7",
127
126
  "jiti": "2.4.2",
128
127
  "liquidjs": "^10.24.0",
@@ -131,7 +130,7 @@
131
130
  "yaml": "^2.9.0",
132
131
  "zod": "^4.4.3"
133
132
  },
134
- "//devDependencies": "@workspace/matrix, @workspace/compile and @workspace/api are private and never installed by a consumer, so all three are devDependencies and tsup bundles them (see `noExternal`). matrix is the one home of the seed wire contract, which src/cli/lib/seed/ used to hand-vendor; compile is the one home of the config-pair and compiled-agent renderers, which the editor's output preview draws with; api is the one home of the typed client both front doors reach the worker through, which src/cli/lib/seed/fetch-seed.ts used to hand-write a fetch for. api pulls `hono/client` in with it, and `hono` is deliberately NOT a dependency here: tsup externalises exactly what `dependencies` names, so leaving it out is what inlines it into the bundle rather than adding a runtime install to a CLI that makes one GET. The cost of that was measured before it was accepted — `find dist -name '*.js' -not -name '*.map' | xargs du -cb | tail -1` is the number. @workspace/api-mocks and msw are a different case and are named in neither `noExternal` nor this rule: nothing under src/cli/ imports them, so they reach no bundle at all — they are the one description of the worker this suite's network mocks are resolved from, and the editor's suites read the same one.",
133
+ "//devDependencies": "The private @workspace packages are devDependencies so tsup bundles them (see noExternal); hono is omitted from dependencies so it is inlined too.",
135
134
  "devDependencies": {
136
135
  "@eslint/js": "^10",
137
136
  "@lydell/node-pty": "^1.2.0-beta.3",
@@ -148,6 +147,8 @@
148
147
  "@workspace/matrix": "workspace:*",
149
148
  "@workspace/typescript-config": "workspace:*",
150
149
  "@xterm/headless": "^6.0.0",
150
+ "ansis": "^3.17.0",
151
+ "esbuild": "^0.28.1",
151
152
  "eslint": "^10",
152
153
  "eslint-config-prettier": "^10",
153
154
  "eslint-plugin-react-hooks": "^7.1.1",
@@ -59,11 +59,8 @@ spec names. Before calling the step done, check the pipeline against this list:
59
59
  then the tests `ai-tester` wrote for this feature. Mock the model API rather than calling it — a test
60
60
  that hits a live model is non-deterministic and costs money per run. Cover malformed output: empty,
61
61
  truncated, and valid JSON of the wrong shape. Cover the token-limit boundary and the retry path with
62
- simulated failures. Run the project's linter, and put a real request through the pipeline where a
63
- mocked test cannot tell you whether the prompt actually works.
64
-
65
- **Your stop hook runs the project's typecheck and nothing else.** Lint and tests are
66
- deliberately outside it, so a clean stop says the code compiles — never that it works.
62
+ simulated failures. Run the project's typecheck and linter, and put a real request through the
63
+ pipeline where a mocked test cannot tell you whether the prompt actually works.
67
64
 
68
65
  **Step 5 — Verify.** Take the success criteria one at a time: state the criterion, mark it PASS or
69
66
  FAIL, and give the evidence — the test name, the command, or what you observed. Fix and re-verify
@@ -54,11 +54,8 @@ spec names. Before calling the step done, check the endpoint against this list:
54
54
 
55
55
  **Step 4 — Test, lint, and call it.** Run the existing tests to confirm nothing broke, then the
56
56
  tests `api-tester` wrote for this feature. A test that passes without exercising the requirement
57
- covers nothing, so check what each one actually asserts. Run the project's linter, and send a real
58
- request to the endpoint where a test cannot reach what a caller would get.
59
-
60
- **Your stop hook runs the project's typecheck and nothing else.** Lint and tests are
61
- deliberately outside it, so a clean stop says the code compiles — never that it works.
57
+ covers nothing, so check what each one actually asserts. Run the project's typecheck and linter, and
58
+ send a real request to the endpoint where a test cannot reach what a caller would get.
62
59
 
63
60
  **Step 5 — Verify.** Take the success criteria one at a time: state the criterion, mark it PASS or
64
61
  FAIL, and give the evidence — the test name, the request you made, or what you observed. Fix and
@@ -55,11 +55,8 @@ spec names. Before calling the step done, check the command against this list:
55
55
 
56
56
  **Step 4 — Test, lint, and run the command.** Run the existing tests to confirm nothing broke,
57
57
  then the tests `cli-tester` wrote for this feature, and check that the cancellation paths are among
58
- them. Run the project's linter, and drive the command yourself — including Ctrl+C — where a test
59
- cannot reach what a user would see.
60
-
61
- **Your stop hook runs the project's typecheck and nothing else.** Lint and tests are
62
- deliberately outside it, so a clean stop says the code compiles — never that it works.
58
+ them. Run the project's typecheck and linter, and drive the command yourself — including Ctrl+C —
59
+ where a test cannot reach what a user would see.
63
60
 
64
61
  **Step 5 — Verify.** Take the success criteria one at a time: state the criterion, mark it PASS or
65
62
  FAIL, and give the evidence — the test name, the command, or what you observed. Fix and re-verify
@@ -45,11 +45,8 @@ spec names.
45
45
 
46
46
  **Step 4 — Test, lint, and see it run.** Run the existing tests to confirm nothing broke, then the
47
47
  tests `web-tester` wrote for this feature. A test that passes without exercising the requirement
48
- covers nothing, so check what each one actually asserts. Run the project's linter, and exercise the
49
- feature yourself where a test cannot reach what a user would see.
50
-
51
- **Your stop hook runs the project's typecheck and nothing else.** Lint and tests are
52
- deliberately outside it, so a clean stop says the code compiles — never that it works.
48
+ covers nothing, so check what each one actually asserts. Run the project's typecheck and linter, and
49
+ exercise the feature yourself where a test cannot reach what a user would see.
53
50
 
54
51
  **Step 5 — Verify.** Take the success criteria one at a time: state the criterion, mark it PASS or
55
52
  FAIL, and give the evidence — the test name, the command, or what you observed. Fix and re-verify
@@ -13,8 +13,8 @@ Report the directory, then each file's content, then the config entry, then the
13
13
  `tools` are required; every other key is optional, whatever its position in the file. Two of the
14
14
  optional ones carry a default and therefore appear in every compiled agent whatever the metadata
15
15
  says — `model` falls back to `inherit` and `permissionMode` to `default`.
16
- `effort`, `disallowedTools`, `isolation` and `experimental` reach the frontmatter only when set. `hooks` reaches it either from `metadata.yaml` or as the
17
- completion gate — the playbook's frontmatter decisions say which and when.
16
+ `effort`, `disallowedTools`, `isolation`, `experimental` and `hooks` reach the frontmatter only
17
+ when set.
18
18
 
19
19
  ```yaml
20
20
  # yaml-language-server: $schema=https://raw.githubusercontent.com/agents-inc/agents-inc/main/packages/cli/src/schemas/agent.schema.json
@@ -103,7 +103,7 @@ follows: `<domain_scope>` in `identity.md`, `<self_correction_triggers>` in
103
103
  The compiled file, in order:
104
104
 
105
105
  ```
106
- frontmatter metadata.yaml, plus the Skill grant and the completion gate
106
+ frontmatter metadata.yaml, plus the Skill grant
107
107
  provenance marker an HTML comment the compile step stamps
108
108
  # Title the title from metadata.yaml
109
109
  <role> identity.md
@@ -226,18 +226,6 @@ because this repository does not use worktrees. Leave it off unless the project
226
226
  for has asked for it — a researcher in particular wants the working tree itself, since the tree is
227
227
  what the question is about.
228
228
 
229
- **The completion gate arrives on its own.** Every agent holding `Write` or `Edit` gets a `Stop`
230
- hook — logged by Claude Code as `SubagentStop` — that runs the project's typecheck
231
- before the agent may stop; a failing
232
- check comes back as the compiler's own output, so the agent iterates on it instead of reporting
233
- done, and the hook exits quietly in a project that declares no such scripts. This is what stands in
234
- place of a sentence asking an agent to check its own work. Declaring `hooks:` in `metadata.yaml` merges
235
- with the gate rather than displacing it: a stop hook of your own — `Stop` or `SubagentStop`, which
236
- Claude Code treats as one event for a sub-agent — replaces the emitted gate, and every other event is
237
- added beside it. So a `PostToolUse` formatter costs an agent nothing, and an agent meaning to own its
238
- completion checks declares `Stop` specifically. It has to declare an actual hook to do so:
239
- `declaresOwnGate` tests for a non-empty array, so `Stop: []` states nothing and the gate stands.
240
-
241
229
  </frontmatter_decisions>
242
230
 
243
231
  ---
@@ -3,11 +3,8 @@ document is a claim about source, and agents act on it without checking. Glob an
3
3
  claim about what a file contains comes from reading it.
4
4
 
5
5
  **Verify the finished document against the tree yourself, because no check does it for you.**
6
- The completion gate that runs when you stop is the project's `typecheck` script and nothing else —
7
- it never opens a markdown file, and it exits quietly in a project that declares no such script. A
8
- reference document whose every path has rotted stops the agent green. Resolve each path and symbol
9
- you wrote, confirm each pattern claim still has the instance you cited, and re-derive each count,
10
- before you report.
6
+ Resolve each path and symbol you wrote, confirm each pattern claim still has the instance you cited,
7
+ and re-derive each count, before you report.
11
8
 
12
9
  **Cite a path and a symbol, never a line number.** A symbol survives every edit above it and is
13
10
  greppable; a line number rots on the next unrelated insertion, silently, while still reading as