@jevitate/cli 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/dist/ai-cli.d.ts +3 -1
  2. package/dist/ai-cli.js +60 -16
  3. package/dist/ai-cli.js.map +1 -1
  4. package/dist/approval-provenance.d.ts +120 -0
  5. package/dist/approval-provenance.js +300 -0
  6. package/dist/approval-provenance.js.map +1 -0
  7. package/dist/author-journey-cli.js +11 -18
  8. package/dist/author-journey-cli.js.map +1 -1
  9. package/dist/bin.js +29012 -20685
  10. package/dist/build-info.generated.js +2 -2
  11. package/dist/builtin-analyzers.d.ts +7 -0
  12. package/dist/builtin-analyzers.js +19 -0
  13. package/dist/builtin-analyzers.js.map +1 -0
  14. package/dist/campaign-cli.d.ts +6 -0
  15. package/dist/campaign-cli.js +9 -4
  16. package/dist/campaign-cli.js.map +1 -1
  17. package/dist/catalog-analysis.d.ts +70 -0
  18. package/dist/catalog-analysis.js +507 -0
  19. package/dist/catalog-analysis.js.map +1 -0
  20. package/dist/catalog-api.d.ts +73 -0
  21. package/dist/catalog-api.js +97 -0
  22. package/dist/catalog-api.js.map +1 -0
  23. package/dist/catalog-cli.d.ts +12 -0
  24. package/dist/catalog-cli.js +224 -0
  25. package/dist/catalog-cli.js.map +1 -0
  26. package/dist/catalog-review.d.ts +29 -0
  27. package/dist/catalog-review.js +290 -0
  28. package/dist/catalog-review.js.map +1 -0
  29. package/dist/catalog.d.ts +133 -0
  30. package/dist/catalog.js +352 -0
  31. package/dist/catalog.js.map +1 -0
  32. package/dist/check-api.js +24 -2
  33. package/dist/check-api.js.map +1 -1
  34. package/dist/check-cli.d.ts +3 -0
  35. package/dist/check-cli.js +18 -4
  36. package/dist/check-cli.js.map +1 -1
  37. package/dist/check-execute.js +25 -9
  38. package/dist/check-execute.js.map +1 -1
  39. package/dist/check-plan.js +4 -1
  40. package/dist/check-plan.js.map +1 -1
  41. package/dist/check-suite.js +6 -3
  42. package/dist/check-suite.js.map +1 -1
  43. package/dist/check-types.d.ts +12 -1
  44. package/dist/check-types.js.map +1 -1
  45. package/dist/cli-output.js +86 -4
  46. package/dist/cli-output.js.map +1 -1
  47. package/dist/cli-shared.d.ts +22 -2
  48. package/dist/cli-shared.js +34 -5
  49. package/dist/cli-shared.js.map +1 -1
  50. package/dist/demo-aspect-api.d.ts +21 -5
  51. package/dist/demo-aspect-api.js +30 -1
  52. package/dist/demo-aspect-api.js.map +1 -1
  53. package/dist/demo-aspect-cli.js +64 -5
  54. package/dist/demo-aspect-cli.js.map +1 -1
  55. package/dist/environments.js +6 -1
  56. package/dist/environments.js.map +1 -1
  57. package/dist/exit-codes.js +4 -0
  58. package/dist/exit-codes.js.map +1 -1
  59. package/dist/explore-adversarial.d.ts +3 -1
  60. package/dist/explore-adversarial.js +3 -3
  61. package/dist/explore-adversarial.js.map +1 -1
  62. package/dist/explore-author.js +5 -2
  63. package/dist/explore-author.js.map +1 -1
  64. package/dist/explore-cli.js +162 -13
  65. package/dist/explore-cli.js.map +1 -1
  66. package/dist/explore-coverage.d.ts +6 -2
  67. package/dist/explore-coverage.js +5 -4
  68. package/dist/explore-coverage.js.map +1 -1
  69. package/dist/explore-feature.d.ts +3 -1
  70. package/dist/explore-feature.js +2 -2
  71. package/dist/explore-feature.js.map +1 -1
  72. package/dist/explore-goal.d.ts +37 -6
  73. package/dist/explore-goal.js +70 -52
  74. package/dist/explore-goal.js.map +1 -1
  75. package/dist/explore-shared.d.ts +12 -7
  76. package/dist/explore-shared.js +9 -1
  77. package/dist/explore-shared.js.map +1 -1
  78. package/dist/goal-run-flags.d.ts +2 -0
  79. package/dist/goal-run-flags.js +8 -1
  80. package/dist/goal-run-flags.js.map +1 -1
  81. package/dist/http-5xx-outcome.d.ts +8 -3
  82. package/dist/http-5xx-outcome.js +5 -15
  83. package/dist/http-5xx-outcome.js.map +1 -1
  84. package/dist/init-cli.d.ts +7 -0
  85. package/dist/init-cli.js +79 -9
  86. package/dist/init-cli.js.map +1 -1
  87. package/dist/init-codeowners.d.ts +39 -0
  88. package/dist/init-codeowners.js +91 -0
  89. package/dist/init-codeowners.js.map +1 -0
  90. package/dist/init-keys.d.ts +3 -1
  91. package/dist/init-keys.js +20 -8
  92. package/dist/init-keys.js.map +1 -1
  93. package/dist/init-skills.d.ts +85 -7
  94. package/dist/init-skills.js +303 -36
  95. package/dist/init-skills.js.map +1 -1
  96. package/dist/jev-advisor.d.ts +72 -0
  97. package/dist/jev-advisor.js +172 -0
  98. package/dist/jev-advisor.js.map +1 -0
  99. package/dist/journey-api.d.ts +104 -5
  100. package/dist/journey-api.js +165 -23
  101. package/dist/journey-api.js.map +1 -1
  102. package/dist/journey-cli.d.ts +1 -1
  103. package/dist/journey-cli.js +320 -13
  104. package/dist/journey-cli.js.map +1 -1
  105. package/dist/journey-demo-api.d.ts +7 -1
  106. package/dist/journey-demo-api.js +8 -3
  107. package/dist/journey-demo-api.js.map +1 -1
  108. package/dist/journey-demo-cli.js +3 -0
  109. package/dist/journey-demo-cli.js.map +1 -1
  110. package/dist/journey-lint-sarif.d.ts +19 -0
  111. package/dist/journey-lint-sarif.js +48 -0
  112. package/dist/journey-lint-sarif.js.map +1 -0
  113. package/dist/journey-network-checks.d.ts +45 -9
  114. package/dist/journey-network-checks.js +117 -30
  115. package/dist/journey-network-checks.js.map +1 -1
  116. package/dist/journey-prefix.d.ts +24 -15
  117. package/dist/journey-prefix.js +53 -7
  118. package/dist/journey-prefix.js.map +1 -1
  119. package/dist/journey-review-api.d.ts +19 -0
  120. package/dist/journey-review-api.js +46 -0
  121. package/dist/journey-review-api.js.map +1 -0
  122. package/dist/journey-review-store.d.ts +16 -0
  123. package/dist/journey-review-store.js +95 -0
  124. package/dist/journey-review-store.js.map +1 -0
  125. package/dist/journey-review.d.ts +47 -0
  126. package/dist/journey-review.js +499 -0
  127. package/dist/journey-review.js.map +1 -0
  128. package/dist/journey-verify.d.ts +61 -0
  129. package/dist/journey-verify.js +144 -0
  130. package/dist/journey-verify.js.map +1 -0
  131. package/dist/key-report.d.ts +20 -5
  132. package/dist/key-report.js +32 -9
  133. package/dist/key-report.js.map +1 -1
  134. package/dist/kill-signal.js +10 -2
  135. package/dist/kill-signal.js.map +1 -1
  136. package/dist/load-api.js +9 -3
  137. package/dist/load-api.js.map +1 -1
  138. package/dist/load-cli.js +4 -2
  139. package/dist/load-cli.js.map +1 -1
  140. package/dist/log-classes.d.ts +73 -0
  141. package/dist/log-classes.js +167 -0
  142. package/dist/log-classes.js.map +1 -0
  143. package/dist/log-correlation.d.ts +29 -10
  144. package/dist/log-correlation.js +44 -21
  145. package/dist/log-correlation.js.map +1 -1
  146. package/dist/login-cli.d.ts +15 -0
  147. package/dist/login-cli.js +116 -0
  148. package/dist/login-cli.js.map +1 -0
  149. package/dist/logs-cli.js +3 -1
  150. package/dist/logs-cli.js.map +1 -1
  151. package/dist/mcp-api.d.ts +1 -0
  152. package/dist/mcp-api.js +61 -12
  153. package/dist/mcp-api.js.map +1 -1
  154. package/dist/mcp-cli-runner.d.ts +2 -0
  155. package/dist/mcp-cli-runner.js +3 -1
  156. package/dist/mcp-cli-runner.js.map +1 -1
  157. package/dist/mcp-cli-tools.d.ts +6 -0
  158. package/dist/mcp-cli-tools.js +182 -23
  159. package/dist/mcp-cli-tools.js.map +1 -1
  160. package/dist/mission-cli.js +8 -4
  161. package/dist/mission-cli.js.map +1 -1
  162. package/dist/mission-journal.d.ts +4 -1
  163. package/dist/mission-journal.js +9 -3
  164. package/dist/mission-journal.js.map +1 -1
  165. package/dist/mission-queue-cli.js +21 -2
  166. package/dist/mission-queue-cli.js.map +1 -1
  167. package/dist/mission-queue-runner.d.ts +6 -0
  168. package/dist/mission-queue-runner.js +33 -3
  169. package/dist/mission-queue-runner.js.map +1 -1
  170. package/dist/multi-run-cli.d.ts +7 -1
  171. package/dist/multi-run-cli.js +10 -3
  172. package/dist/multi-run-cli.js.map +1 -1
  173. package/dist/multi-run.d.ts +38 -3
  174. package/dist/multi-run.js +115 -23
  175. package/dist/multi-run.js.map +1 -1
  176. package/dist/persona-login.d.ts +199 -0
  177. package/dist/persona-login.js +574 -0
  178. package/dist/persona-login.js.map +1 -0
  179. package/dist/pre-approval.d.ts +98 -0
  180. package/dist/pre-approval.js +175 -0
  181. package/dist/pre-approval.js.map +1 -0
  182. package/dist/program.js +10 -0
  183. package/dist/program.js.map +1 -1
  184. package/dist/project-dir.d.ts +2 -1
  185. package/dist/project-dir.js +3 -1
  186. package/dist/project-dir.js.map +1 -1
  187. package/dist/promotions.d.ts +15 -0
  188. package/dist/promotions.js +52 -0
  189. package/dist/promotions.js.map +1 -0
  190. package/dist/readiness.d.ts +29 -0
  191. package/dist/readiness.js +291 -0
  192. package/dist/readiness.js.map +1 -0
  193. package/dist/regression-cli.js +4 -2
  194. package/dist/regression-cli.js.map +1 -1
  195. package/dist/report-api.d.ts +24 -2
  196. package/dist/report-api.js +33 -5
  197. package/dist/report-api.js.map +1 -1
  198. package/dist/report-cli.js +8 -1
  199. package/dist/report-cli.js.map +1 -1
  200. package/dist/result-schema.d.ts +12 -0
  201. package/dist/result-schema.js +8 -0
  202. package/dist/result-schema.js.map +1 -1
  203. package/dist/run-index.d.ts +4 -2
  204. package/dist/run-index.js +3 -1
  205. package/dist/run-index.js.map +1 -1
  206. package/dist/run-key-preflight.d.ts +2 -1
  207. package/dist/run-key-preflight.js +3 -2
  208. package/dist/run-key-preflight.js.map +1 -1
  209. package/dist/run-metadata.d.ts +26 -0
  210. package/dist/run-metadata.js +41 -0
  211. package/dist/run-metadata.js.map +1 -0
  212. package/dist/run-tags-cli.d.ts +12 -0
  213. package/dist/run-tags-cli.js +35 -0
  214. package/dist/run-tags-cli.js.map +1 -0
  215. package/dist/self-heal-adapter.js +3 -1
  216. package/dist/self-heal-adapter.js.map +1 -1
  217. package/dist/site-cli.d.ts +1 -1
  218. package/dist/site-cli.js +24 -1
  219. package/dist/site-cli.js.map +1 -1
  220. package/dist/source-cli.js +4 -2
  221. package/dist/source-cli.js.map +1 -1
  222. package/dist/source-run-api.js +17 -7
  223. package/dist/source-run-api.js.map +1 -1
  224. package/dist/suite-explore-options.d.ts +14 -0
  225. package/dist/suite-explore-options.js +7 -0
  226. package/dist/suite-explore-options.js.map +1 -1
  227. package/dist/sweep-api.d.ts +266 -0
  228. package/dist/sweep-api.js +828 -0
  229. package/dist/sweep-api.js.map +1 -0
  230. package/dist/sweep-cli.d.ts +9 -0
  231. package/dist/sweep-cli.js +115 -0
  232. package/dist/sweep-cli.js.map +1 -0
  233. package/dist/target-config.d.ts +5 -2
  234. package/dist/target-config.js +15 -0
  235. package/dist/target-config.js.map +1 -1
  236. package/dist/usability-capture.js +6 -0
  237. package/dist/usability-capture.js.map +1 -1
  238. package/dist/ux-cli.js +3 -1
  239. package/dist/ux-cli.js.map +1 -1
  240. package/dist/ux-usability.d.ts +9 -3
  241. package/dist/ux-usability.js +6 -4
  242. package/dist/ux-usability.js.map +1 -1
  243. package/dist/verify-fix-cli.js +4 -2
  244. package/dist/verify-fix-cli.js.map +1 -1
  245. package/package.json +13 -13
  246. package/skills/jevitate-demo/SKILL.md +5 -2
  247. package/skills/jevitate-explore/SKILL.md +6 -2
  248. package/skills/jevitate-getting-started/SKILL.md +12 -0
  249. package/skills/jevitate-run-journey/SKILL.md +17 -4
  250. package/skills/jevitate-test-campaign/SKILL.md +26 -5
@@ -1 +1 @@
1
- {"version":3,"file":"http-5xx-outcome.js","sourceRoot":"","sources":["../src/http-5xx-outcome.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,oBAAoB,GAAkC,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;AAEzH,MAAM,UAAU,uBAAuB,CAAC,OAAyB,EAAE,OAAiC;IAClG,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC;AAC9F,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,eAAe,CAAC,OAAiC;IAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,IAAI,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;QACnC,CAAC;QACD,OAAO,GAAG,CAAC,CAAC,MAAM,IAAI,IAAI,MAAM,CAAC,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,iBAAiB,CAAC,OAAiC,EAAE,eAAwB;IAC3F,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACzB,MAAM,KAAK,GAAG,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;IAC7F,OAAO,eAAe,CAAC,CAAC,CAAC,GAAG,KAAK,6EAA6E,CAAC,CAAC,CAAC,KAAK,CAAC;AACzH,CAAC"}
1
+ {"version":3,"file":"http-5xx-outcome.js","sourceRoot":"","sources":["../src/http-5xx-outcome.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,uFAAuF;AACvF,MAAM,UAAU,eAAe,CAAC,OAAiC;IAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,IAAI,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;QACnC,CAAC;QACD,OAAO,GAAG,CAAC,CAAC,MAAM,IAAI,IAAI,MAAM,CAAC,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,iBAAiB,CAAC,OAAiC,EAAE,eAAwB;IAC3F,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACzB,MAAM,KAAK,GAAG,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;IAC7F,OAAO,eAAe,CAAC,CAAC,CAAC,GAAG,KAAK,6EAA6E,CAAC,CAAC,CAAC,KAAK,CAAC;AACzH,CAAC"}
@@ -1,4 +1,11 @@
1
1
  import { Command } from "commander";
2
+ import { type InstallReport, type UninstallReport } from "./init-skills.js";
2
3
  import { type CliDeps } from "./cli-shared.js";
3
4
  /** Registers `jevitate init` (API keys, skills/MCP wiring, the repo's .jevitate/). */
4
5
  export declare function registerInitCommands(program: Command, deps: CliDeps): void;
6
+ /**
7
+ * #431: the skill-install/uninstall actions a person must see — a file left alone because they
8
+ * edited it, or refused because its markers are broken (with the fix) — and, for uninstall, what
9
+ * was removed. `create`/`update`/`unchanged` stay in the count line above (and in --json).
10
+ */
11
+ export declare function skillReportLines(reports: readonly (InstallReport | UninstallReport)[]): string[];
package/dist/init-cli.js CHANGED
@@ -1,4 +1,4 @@
1
- import { envCredentialStore, FEATURE_KEYS } from "@jevitate/ai-core";
1
+ import { envCredentialStore, FEATURE_KEYS, featureReady, jevProviderOverride } from "@jevitate/ai-core";
2
2
  import { loadLocalCredentials } from "./credentials-file.js";
3
3
  import { ok, fail } from "./envelope.js";
4
4
  import { initProjectDir } from "./project-dir.js";
@@ -6,7 +6,9 @@ import { KeyCheckError, credentialInputs, enteredKeyCheck, realSecureIO } from "
6
6
  import { keySources, realVerifyFetch, shadowWarnings, verifyFeatureKeys } from "./key-report.js";
7
7
  import { collectAllMissingKeys } from "./init-keys.js";
8
8
  import { formatInitKeysHuman } from "./cli-output.js";
9
- import { detectRuntimes, resolveInstallTargetPaths, installSkills } from "./init-skills.js";
9
+ import { detectRuntimes, resolveInstallTargetPaths, installSkills, uninstallSkills } from "./init-skills.js";
10
+ import { currentEngineInfo } from "./engine.js";
11
+ import { CodeownersArgsError, installCodeowners, parseOwners } from "./init-codeowners.js";
10
12
  import { registerMcp, resolveMcpTargetPaths } from "./init-mcp.js";
11
13
  import { initNextSteps, environmentHint } from "./init-next-steps.js";
12
14
  import { loadManifest } from "@jevitate/skills";
@@ -27,14 +29,48 @@ export function registerInitCommands(program, deps) {
27
29
  .option("--force", "overwrite a user-modified installed skill file/block or MCP config entry")
28
30
  .option("--dry-run", "report planned skill-install/mcp-register actions without writing")
29
31
  .option("--skip-project", "skip creating the repo's .jevitate/ (journeys, regressions, baselines, logs)")
32
+ .option("--claude-md", "#431: also keep a marked jevitate block in the project's CLAUDE.md pointing at the installed skills (Claude Code only)")
33
+ .option("--codeowners <owners>", "#437: write/merge a marked CODEOWNERS block (.github/CODEOWNERS, or the repo's existing one) making .jevitate/journeys/, personas.json and jobs.json need these owners' review (\"@org/team @user\"); enable code-owner review in branch protection")
34
+ .option("--uninstall", "#431: remove the skill files and marked AGENTS.md/CLAUDE.md blocks jevitate installed (user-modified ones are skipped unless --force); keys, MCP registration and .jevitate/ are left alone")
30
35
  .action(async function () {
31
- const { json, skipKeys, skipSkills, skipMcp, skipProject, targets, force, dryRun, replaceKeys, verify } = this.opts();
36
+ const { json, skipKeys, skipSkills, skipMcp, skipProject, targets, force, dryRun, replaceKeys, verify, claudeMd, uninstall, codeowners } = this.opts();
32
37
  try {
38
+ // #431: --uninstall only removes what the skill installer wrote, with the same never-clobber
39
+ // rules; it never touches keys, MCP configs or the repo's .jevitate/.
40
+ if (uninstall === true) {
41
+ const runtimes = targets
42
+ ? targets.split(",").map((t) => t.trim()).filter((t) => t.length > 0)
43
+ : detectRuntimes(deps.init?.detection);
44
+ const paths = resolveInstallTargetPaths(deps.init?.detection);
45
+ const statePath = deps.init?.statePath ?? resolveDataDir(["skills-install-state.json"]);
46
+ const removed = await uninstallSkills(runtimes, loadManifest(), paths, statePath, {
47
+ ...(force === true ? { force: true } : {}),
48
+ ...(dryRun === true ? { dryRun: true } : {}),
49
+ ...(claudeMd === true ? { claudeMd: true } : {}),
50
+ });
51
+ if (json) {
52
+ emitJson(program, ok({ uninstalled: removed }));
53
+ }
54
+ else {
55
+ const out = program.configureOutput().writeOut;
56
+ out?.(dryRun === true ? "jevitate: dry run — nothing was removed\n" : "jevitate skills uninstalled\n");
57
+ for (const line of skillReportLines(removed))
58
+ out?.(`${line}\n`);
59
+ process.exitCode = 0;
60
+ }
61
+ return;
62
+ }
63
+ if (codeowners !== undefined)
64
+ parseOwners(codeowners); // refused (exit 64) before anything is written
33
65
  const data = { initialized: true };
34
66
  // The repo's own .jevitate/ (0.2.0 layout): Journeys, regressions and baselines live with the
35
67
  // app's code; logs stay local. Secrets and machine state stay in ~/.jevitate.
36
68
  if (!skipProject)
37
69
  data.project = initProjectDir(deps.init?.detection?.cwd?.() ?? process.cwd(), { ...(dryRun === true ? { dryRun: true } : {}) });
70
+ // #437: the enforcement layer for approvals — code-owner review of .jevitate/ (with branch protection on the forge).
71
+ if (codeowners !== undefined) {
72
+ data.codeowners = await installCodeowners(deps.init?.detection?.cwd?.() ?? process.cwd(), codeowners, { ...(dryRun === true ? { dryRun: true } : {}) });
73
+ }
38
74
  if (!skipKeys) {
39
75
  // SECURITY: reuses the existing, already-guardrailed credential
40
76
  // collection. The report holds only key NAMES (required/collected/missing),
@@ -51,8 +87,11 @@ export function registerInitCommands(program, deps) {
51
87
  const fetchFn = deps.ai?.verifyFetch ?? realVerifyFetch;
52
88
  // #291: each entered key is checked with its provider BEFORE it is stored.
53
89
  const gate = enteredKeyCheck(fetchFn);
90
+ // #429: JEVITATE_JEV_PROVIDER pins which key judgment needs (an unknown value fails init).
91
+ const jevProvider = jevProviderOverride(deps.ai?.env ?? process.env);
54
92
  const keys = await collectAllMissingKeys(store, io, {
55
93
  interactive,
94
+ ...(jevProvider === undefined ? {} : { jevProvider }),
56
95
  ...(replaceKeys === true ? { replace: true } : {}),
57
96
  ...(verify ? { check: gate.check } : {}),
58
97
  });
@@ -62,11 +101,11 @@ export function registerInitCommands(program, deps) {
62
101
  const nowStore = envCredentialStore(env, nowLocal);
63
102
  for (const feature of Object.keys(keys)) {
64
103
  const r = keys[feature];
65
- const sources = keySources(feature, env, verify ? nowLocal : { ...localConfig, ...Object.fromEntries(r.collected.map((k) => [k, "set"])) });
104
+ const sources = keySources(feature, env, verify ? nowLocal : { ...localConfig, ...Object.fromEntries(r.collected.map((k) => [k, "set"])) }, jevProvider);
66
105
  const warnings = shadowWarnings(r.collected, sources);
67
106
  r.sources = sources;
68
107
  if (verify)
69
- r.verification = await verifyFeatureKeys(feature, nowStore, fetchFn, gate.verdicts);
108
+ r.verification = await verifyFeatureKeys(feature, nowStore, fetchFn, gate.verdicts, jevProvider);
70
109
  if (warnings.length > 0)
71
110
  r.warnings = warnings;
72
111
  }
@@ -83,7 +122,12 @@ export function registerInitCommands(program, deps) {
83
122
  const paths = resolveInstallTargetPaths(deps.init?.detection);
84
123
  const statePath = deps.init?.statePath ?? resolveDataDir(["skills-install-state.json"]);
85
124
  const skills = loadManifest();
86
- data.skills = await installSkills(runtimes, skills, paths, statePath, { force, dryRun });
125
+ data.skills = await installSkills(runtimes, skills, paths, statePath, {
126
+ force,
127
+ dryRun,
128
+ jevitateVersion: currentEngineInfo().version,
129
+ ...(claudeMd === true ? { claudeMd: true } : {}),
130
+ });
87
131
  }
88
132
  if (!skipMcp) {
89
133
  // Register the `jevitate mcp` server for each detected/selected
@@ -108,7 +152,8 @@ export function registerInitCommands(program, deps) {
108
152
  ? Object.values(data.keys).every((r) => (r.missing ?? []).length === 0 && !(r.verification ?? []).some((v) => v.status === "invalid"))
109
153
  : (() => {
110
154
  const store = envCredentialStore(deps.ai?.env ?? process.env, deps.ai?.localConfig ?? loadLocalCredentials());
111
- return Object.keys(FEATURE_KEYS).every((f) => FEATURE_KEYS[f].every((k) => store.detect(k)));
155
+ const jevProvider = jevProviderOverride(deps.ai?.env ?? process.env);
156
+ return Object.keys(FEATURE_KEYS).every((f) => featureReady(f, store, jevProvider));
112
157
  })();
113
158
  const projectDir = data.project?.dir ?? null;
114
159
  data.nextSteps = initNextSteps({
@@ -131,8 +176,11 @@ export function registerInitCommands(program, deps) {
131
176
  // []` that reads as "missing" when every key was already set.
132
177
  if (data.keys)
133
178
  out?.(`${formatInitKeysHuman(data.keys)}\n`);
134
- if (data.skills)
179
+ if (data.skills) {
135
180
  out?.(`skills: ${data.skills.length} target/skill pairs ${dryRun === true ? "would be processed" : "processed"}\n`);
181
+ for (const line of skillReportLines(data.skills))
182
+ out?.(`${line}\n`);
183
+ }
136
184
  if (data.mcp)
137
185
  out?.(`mcp: ${data.mcp.length} harness config(s) ${dryRun === true ? "would be processed" : "processed"}\n`);
138
186
  const project = data.project;
@@ -141,6 +189,11 @@ export function registerInitCommands(program, deps) {
141
189
  ? `project: ${project.reason ?? "none"}\n`
142
190
  : `project: ${project.dir} (${project.created.length} ${dryRun === true ? "would create" : "created"})\n`);
143
191
  }
192
+ const owners = data.codeowners;
193
+ if (owners !== undefined) {
194
+ out?.(`codeowners: ${owners.path} (${dryRun === true && owners.action !== "unchanged" ? `would ${owners.action}` : owners.action}) — ${owners.owners.join(" ")}\n`);
195
+ out?.(` note: ${owners.note}\n`);
196
+ }
144
197
  out?.(`next steps${data.project?.dir == null ? "" : " (app URLs: .jevitate/environments.json)"}:\n`);
145
198
  for (const line of data.nextSteps)
146
199
  out?.(` ${line}\n`);
@@ -148,9 +201,26 @@ export function registerInitCommands(program, deps) {
148
201
  }
149
202
  }
150
203
  catch (err) {
151
- const code = err instanceof KeyCheckError ? err.code : "E_INIT";
204
+ const code = err instanceof KeyCheckError || err instanceof CodeownersArgsError ? err.code : "E_INIT";
152
205
  emitCommandResult(program, fail(code, String(err instanceof Error ? err.message : err)), { json: json === true, command: "init" });
153
206
  }
154
207
  });
155
208
  }
209
+ /**
210
+ * #431: the skill-install/uninstall actions a person must see — a file left alone because they
211
+ * edited it, or refused because its markers are broken (with the fix) — and, for uninstall, what
212
+ * was removed. `create`/`update`/`unchanged` stay in the count line above (and in --json).
213
+ */
214
+ export function skillReportLines(reports) {
215
+ const lines = [];
216
+ for (const r of reports) {
217
+ if (r.action === "skip-user-modified")
218
+ lines.push(` skipped ${r.path}: you edited it (re-run with --force to replace it)`);
219
+ else if (r.action === "refuse-malformed")
220
+ lines.push(` refused ${r.path}: ${r.reason ?? "its JEVITATE SKILLS markers are malformed"}`);
221
+ else if (r.action === "remove" || r.action === "force-remove")
222
+ lines.push(` removed ${r.path}`);
223
+ }
224
+ return lines;
225
+ }
156
226
  //# sourceMappingURL=init-cli.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init-cli.js","sourceRoot":"","sources":["../src/init-cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init-cli.js","sourceRoot":"","sources":["../src/init-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * #437 — `jevitate init --codeowners <owners>`: a marked CODEOWNERS block that makes the approval
3
+ * records (`.jevitate/journeys/`, `.jevitate/personas.json`, `.jevitate/jobs.json`) need a code
4
+ * owner's review. With branch protection requiring code-owner review on the forge, no approval
5
+ * change — a promoted Journey, an approved persona or job, a waiver — merges without a person.
6
+ * That is the enforcement layer; provenance and the TTY confirmation only detect and add friction.
7
+ *
8
+ * The block follows #431's marker rules (init-skills.ts `mergeMarkedBlock`): replaced in place on a
9
+ * re-run (idempotent), appended otherwise, refused when its markers are malformed.
10
+ */
11
+ export declare const CODEOWNERS_BLOCK_BEGIN = "# BEGIN JEVITATE CODEOWNERS v1";
12
+ export declare const CODEOWNERS_BLOCK_END = "# END JEVITATE CODEOWNERS v1";
13
+ /** Where GitHub and GitLab look for CODEOWNERS, in GitHub's order; a new file goes in the first. */
14
+ export declare const CODEOWNERS_LOCATIONS: readonly string[];
15
+ /** A bad `--codeowners` value, or no git repository to write it in. Exit 64. */
16
+ export declare class CodeownersArgsError extends Error {
17
+ readonly code = "E_INIT_CODEOWNERS_ARGS";
18
+ }
19
+ /** `--codeowners "@org/team @alice"` (spaces or commas) → the owners; refused when empty or malformed. */
20
+ export declare function parseOwners(value: string): string[];
21
+ /** The block's lines for a `.jevitate/` at `dataDir` (repo-relative, `/`-separated, anchored at the root). */
22
+ export declare function renderCodeownersBlock(owners: readonly string[], dataDir: string): string;
23
+ export interface CodeownersReport {
24
+ /** The CODEOWNERS file written (or that would be, with --dry-run). */
25
+ readonly path: string;
26
+ readonly action: "create" | "update" | "unchanged";
27
+ readonly owners: readonly string[];
28
+ /** Always set: CODEOWNERS only enforces with branch protection on the forge. */
29
+ readonly note: string;
30
+ }
31
+ export declare const BRANCH_PROTECTION_NOTE = "CODEOWNERS enforces nothing alone: enable branch protection on the default branch with \"Require a pull request\" and \"Require review from Code Owners\" (GitHub; GitLab: \"Code owner approval\" on protected branches), and run `jevitate check --require-approvals` in CI";
32
+ /**
33
+ * Writes or merges the block into the repository's CODEOWNERS (an existing one in `.github/`, the
34
+ * root, `docs/` or `.gitlab/`; else `.github/CODEOWNERS`). `cwd` must be inside a git repository;
35
+ * the `.jevitate/` it covers is the one `jevitate init` creates in `cwd`.
36
+ */
37
+ export declare function installCodeowners(cwd: string, ownersValue: string, opts?: {
38
+ readonly dryRun?: boolean;
39
+ }): Promise<CodeownersReport>;
@@ -0,0 +1,91 @@
1
+ import { existsSync } from "node:fs";
2
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import { dirname, join, relative, sep } from "node:path";
4
+ import { findGitRoot } from "./project-dir.js";
5
+ import { SkillsBlockMarkerError, mergeMarkedBlock } from "./init-skills.js";
6
+ /**
7
+ * #437 — `jevitate init --codeowners <owners>`: a marked CODEOWNERS block that makes the approval
8
+ * records (`.jevitate/journeys/`, `.jevitate/personas.json`, `.jevitate/jobs.json`) need a code
9
+ * owner's review. With branch protection requiring code-owner review on the forge, no approval
10
+ * change — a promoted Journey, an approved persona or job, a waiver — merges without a person.
11
+ * That is the enforcement layer; provenance and the TTY confirmation only detect and add friction.
12
+ *
13
+ * The block follows #431's marker rules (init-skills.ts `mergeMarkedBlock`): replaced in place on a
14
+ * re-run (idempotent), appended otherwise, refused when its markers are malformed.
15
+ */
16
+ export const CODEOWNERS_BLOCK_BEGIN = "# BEGIN JEVITATE CODEOWNERS v1";
17
+ export const CODEOWNERS_BLOCK_END = "# END JEVITATE CODEOWNERS v1";
18
+ const MARKERS = { begin: /# BEGIN JEVITATE CODEOWNERS v\d+[^\n]*/, end: /# END JEVITATE CODEOWNERS v\d+/, label: "JEVITATE CODEOWNERS" };
19
+ /** Where GitHub and GitLab look for CODEOWNERS, in GitHub's order; a new file goes in the first. */
20
+ export const CODEOWNERS_LOCATIONS = [join(".github", "CODEOWNERS"), "CODEOWNERS", join("docs", "CODEOWNERS"), join(".gitlab", "CODEOWNERS")];
21
+ /** A bad `--codeowners` value, or no git repository to write it in. Exit 64. */
22
+ export class CodeownersArgsError extends Error {
23
+ code = "E_INIT_CODEOWNERS_ARGS";
24
+ }
25
+ /** `@user`, `@org/team`, or an email — what a CODEOWNERS line takes. */
26
+ const OWNER_RE = /^(@[A-Za-z0-9](?:[A-Za-z0-9_.-]*[A-Za-z0-9])?(?:\/[A-Za-z0-9](?:[A-Za-z0-9_.-]*[A-Za-z0-9])?)?|[^\s@]+@[^\s@]+\.[^\s@]+)$/;
27
+ /** `--codeowners "@org/team @alice"` (spaces or commas) → the owners; refused when empty or malformed. */
28
+ export function parseOwners(value) {
29
+ const owners = value
30
+ .split(/[\s,]+/)
31
+ .map((o) => o.trim())
32
+ .filter((o) => o !== "");
33
+ if (owners.length === 0)
34
+ throw new CodeownersArgsError('--codeowners needs at least one owner: "@user", "@org/team" or an email');
35
+ for (const o of owners) {
36
+ if (!OWNER_RE.test(o))
37
+ throw new CodeownersArgsError(`--codeowners: '${o}' is not a code owner ("@user", "@org/team" or an email)`);
38
+ }
39
+ return [...new Set(owners)];
40
+ }
41
+ /** The block's lines for a `.jevitate/` at `dataDir` (repo-relative, `/`-separated, anchored at the root). */
42
+ export function renderCodeownersBlock(owners, dataDir) {
43
+ const base = dataDir === "" ? "/.jevitate" : `/${dataDir}/.jevitate`;
44
+ const who = owners.join(" ");
45
+ return [
46
+ CODEOWNERS_BLOCK_BEGIN,
47
+ "# jevitate approvals (#437): promoted Journeys, catalog personas and jobs, and their approval",
48
+ "# records need a code owner's review. Enable branch protection with \"Require review from Code",
49
+ "# Owners\" on the forge, or this block is advisory. Later rules in this file override these.",
50
+ `${base}/journeys/ ${who}`,
51
+ `${base}/personas.json ${who}`,
52
+ `${base}/jobs.json ${who}`,
53
+ CODEOWNERS_BLOCK_END,
54
+ ].join("\n");
55
+ }
56
+ export const BRANCH_PROTECTION_NOTE = 'CODEOWNERS enforces nothing alone: enable branch protection on the default branch with "Require a pull request" and "Require review from Code Owners" (GitHub; GitLab: "Code owner approval" on protected branches), and run `jevitate check --require-approvals` in CI';
57
+ /**
58
+ * Writes or merges the block into the repository's CODEOWNERS (an existing one in `.github/`, the
59
+ * root, `docs/` or `.gitlab/`; else `.github/CODEOWNERS`). `cwd` must be inside a git repository;
60
+ * the `.jevitate/` it covers is the one `jevitate init` creates in `cwd`.
61
+ */
62
+ export async function installCodeowners(cwd, ownersValue, opts = {}) {
63
+ const owners = parseOwners(ownersValue);
64
+ const root = findGitRoot(cwd);
65
+ if (root === null)
66
+ throw new CodeownersArgsError("--codeowners needs a git repository: run `jevitate init --codeowners` inside the repository whose .jevitate/ it covers");
67
+ const rel = relative(root, cwd).split(sep).filter((p) => p !== "").join("/");
68
+ if (rel.startsWith(".."))
69
+ throw new CodeownersArgsError(`--codeowners: ${cwd} is not inside ${root}`);
70
+ const existing = CODEOWNERS_LOCATIONS.map((l) => join(root, l)).find((p) => existsSync(p));
71
+ const path = existing ?? join(root, CODEOWNERS_LOCATIONS[0]);
72
+ const before = existing === undefined ? "" : await readFile(existing, "utf8");
73
+ let after;
74
+ try {
75
+ after = mergeMarkedBlock(before, renderCodeownersBlock(owners, rel), MARKERS);
76
+ }
77
+ catch (err) {
78
+ if (err instanceof SkillsBlockMarkerError)
79
+ throw new CodeownersArgsError(`${path}: ${err.reason}`);
80
+ throw err;
81
+ }
82
+ if (!after.endsWith("\n"))
83
+ after += "\n";
84
+ const action = existing === undefined ? "create" : after === before ? "unchanged" : "update";
85
+ if (opts.dryRun !== true && action !== "unchanged") {
86
+ await mkdir(dirname(path), { recursive: true });
87
+ await writeFile(path, after, "utf8");
88
+ }
89
+ return { path, action, owners, note: BRANCH_PROTECTION_NOTE };
90
+ }
91
+ //# sourceMappingURL=init-codeowners.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-codeowners.js","sourceRoot":"","sources":["../src/init-codeowners.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { type CredentialStore, type SecureKeyIO, type Feature, type CredentialKey } from "@jevitate/ai-core";
1
+ import { type CredentialStore, type SecureKeyIO, type Feature, type CredentialKey, type JevProvider } from "@jevitate/ai-core";
2
2
  import type { KeySourceReport, KeyVerificationReport } from "./key-report.js";
3
3
  export interface FeatureKeyReport {
4
4
  required: CredentialKey[];
@@ -31,6 +31,8 @@ export interface CollectAllMissingKeysOptions {
31
31
  replace?: boolean;
32
32
  /** #291: checks each entered value before it is persisted (throws to refuse it). */
33
33
  check?: (key: CredentialKey, value: string) => Promise<void>;
34
+ /** #429: the Jev provider override (`JEVITATE_JEV_PROVIDER`) — which key judgment needs. */
35
+ jevProvider?: JevProvider;
34
36
  }
35
37
  /**
36
38
  * Thin orchestration over the existing, already-guardrailed `collectMissingKeys`
package/dist/init-keys.js CHANGED
@@ -1,4 +1,4 @@
1
- import { collectKeys, FEATURE_KEYS, } from "@jevitate/ai-core";
1
+ import { collectKeys, featureKeys, } from "@jevitate/ai-core";
2
2
  const FEATURES = ["generation", "judgment"];
3
3
  /**
4
4
  * Thin orchestration over the existing, already-guardrailed `collectMissingKeys`
@@ -10,20 +10,32 @@ const FEATURES = ["generation", "judgment"];
10
10
  export async function collectAllMissingKeys(store, io, opts = {}) {
11
11
  const report = {};
12
12
  const interactive = opts.interactive ?? true;
13
+ // #429: a key entered for an earlier feature counts as configured for a later one — the OpenRouter
14
+ // key just entered for generation also satisfies judgment (Jev through OpenRouter), so it is not
15
+ // asked for a TypeSafe key too.
16
+ const entered = new Set();
17
+ const view = { detect: (k) => entered.has(k) || store.detect(k), read: (k) => store.read(k) };
13
18
  for (const feature of FEATURES) {
14
- const required = [...FEATURE_KEYS[feature]];
19
+ const required = featureKeys(feature, view, opts.jevProvider);
15
20
  if (interactive) {
16
- const collected = await collectKeys(feature, store, io, {
17
- ...(opts.replace === true ? { replace: true } : {}),
18
- ...(opts.check === undefined ? {} : { check: opts.check }),
19
- });
20
- report[feature] = { required, collected };
21
+ // `--replace-keys`: a key already re-entered for an earlier feature is not asked for twice.
22
+ const alreadyEntered = opts.replace === true && required.every((k) => entered.has(k));
23
+ const collected = alreadyEntered
24
+ ? []
25
+ : await collectKeys(feature, view, io, {
26
+ ...(opts.replace === true ? { replace: true } : {}),
27
+ ...(opts.check === undefined ? {} : { check: opts.check }),
28
+ ...(opts.jevProvider === undefined ? {} : { jevProvider: opts.jevProvider }),
29
+ });
30
+ for (const k of collected)
31
+ entered.add(k);
32
+ report[feature] = { required: featureKeys(feature, view, opts.jevProvider), collected };
21
33
  }
22
34
  else {
23
35
  // Never prompt: report what's still missing instead of hanging on a closed stdin. `missing`
24
36
  // is omitted (not an empty array) when nothing is missing, so a fully-configured non-TTY
25
37
  // run reads identically to the interactive path's `{ required, collected: [] }`.
26
- const missing = required.filter((k) => !store.detect(k));
38
+ const missing = required.filter((k) => !view.detect(k));
27
39
  report[feature] = { required, collected: [], ...(missing.length > 0 ? { missing } : {}) };
28
40
  }
29
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"init-keys.js","sourceRoot":"","sources":["../src/init-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,YAAY,GAKb,MAAM,mBAAmB,CAAC;AAsB3B,MAAM,QAAQ,GAAc,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;AAiBvD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAsB,EACtB,EAAe,EACf,OAAqC,EAAE;IAEvC,MAAM,MAAM,GAAG,EAAyB,CAAC;IACzC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;IAC7C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5C,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;gBACtD,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnD,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;aAC3D,CAAC,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,4FAA4F;YAC5F,yFAAyF;YACzF,iFAAiF;YACjF,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5F,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"init-keys.js","sourceRoot":"","sources":["../src/init-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,WAAW,GAMZ,MAAM,mBAAmB,CAAC;AAsB3B,MAAM,QAAQ,GAAc,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;AAmBvD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAsB,EACtB,EAAe,EACf,OAAqC,EAAE;IAEvC,MAAM,MAAM,GAAG,EAAyB,CAAC;IACzC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;IAC7C,mGAAmG;IACnG,iGAAiG;IACjG,gCAAgC;IAChC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAiB,CAAC;IACzC,MAAM,IAAI,GAAoB,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/G,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9D,IAAI,WAAW,EAAE,CAAC;YAChB,4FAA4F;YAC5F,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACtF,MAAM,SAAS,GAAG,cAAc;gBAC9B,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,MAAM,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;oBACnC,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACnD,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;oBAC1D,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;iBAC7E,CAAC,CAAC;YACP,KAAK,MAAM,CAAC,IAAI,SAAS;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC;QAC1F,CAAC;aAAM,CAAC;YACN,4FAA4F;YAC5F,yFAAyF;YACzF,iFAAiF;YACjF,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5F,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -20,9 +20,10 @@ export interface InstallTargetPaths {
20
20
  cursorRulesDir: string;
21
21
  genericAgentsFile: string;
22
22
  genericSkillsDir: string;
23
+ claudeMdFile: string;
23
24
  }
24
25
  export declare function resolveInstallTargetPaths(deps?: DetectionDeps): InstallTargetPaths;
25
- export type InstallAction = "create" | "update" | "unchanged" | "skip-user-modified" | "force-update";
26
+ export type InstallAction = "create" | "update" | "unchanged" | "skip-user-modified" | "force-update" | "refuse-malformed";
26
27
  /**
27
28
  * Decides what to do with one whole-file target. Never writes. A target whose
28
29
  * current on-disk hash does not match the hash `init` last recorded (or was
@@ -35,11 +36,46 @@ export declare function planFileInstall(targetPath: string, newContent: string,
35
36
  export declare function applyFileInstall(targetPath: string, content: string, action: InstallAction): Promise<void>;
36
37
  export declare const SKILLS_BLOCK_BEGIN = "<!-- BEGIN JEVITATE SKILLS v1 -->";
37
38
  export declare const SKILLS_BLOCK_END = "<!-- END JEVITATE SKILLS v1 -->";
39
+ /** Matches a BEGIN marker of ANY version, plus any trailing attributes (#431). */
40
+ export declare const SKILLS_BLOCK_BEGIN_RE: RegExp;
41
+ /** Matches an END marker of ANY version (#431). */
42
+ export declare const SKILLS_BLOCK_END_RE: RegExp;
43
+ /** Raised when a file's marker pair is malformed (missing, duplicated, or misordered). */
44
+ export declare class SkillsBlockMarkerError extends Error {
45
+ readonly reason: string;
46
+ constructor(reason: string);
47
+ }
48
+ export type SkillsBlockLocation = {
49
+ kind: "none";
50
+ } | {
51
+ kind: "block";
52
+ start: number;
53
+ end: number;
54
+ } | {
55
+ kind: "malformed";
56
+ reason: string;
57
+ };
58
+ /** #437: a marked block's BEGIN/END markers (any version) and its name in fix-it messages. */
59
+ export interface BlockMarkers {
60
+ readonly begin: RegExp;
61
+ readonly end: RegExp;
62
+ /** e.g. `JEVITATE SKILLS`. */
63
+ readonly label: string;
64
+ }
65
+ /**
66
+ * Locates the Jevitate skills block in `content`, version-agnostically (#431).
67
+ * `none` when no marker is present; `malformed` (with a fix-it reason) when the
68
+ * markers are missing, duplicated, or misordered; otherwise `block` with the
69
+ * BEGIN-line-start..END-marker-end span.
70
+ */
71
+ export declare function findSkillsBlock(content: string): SkillsBlockLocation;
38
72
  type BlockSkill = Pick<ResolvedSkill, "id" | "name" | "description" | "body">;
39
73
  export interface RenderBlockOptions {
40
74
  mode: "inline" | "reference";
41
75
  /** Required for reference mode: where the Claude-Code copies live. */
42
76
  claudeSkillsDir?: string;
77
+ /** When set, the BEGIN marker carries a `jevitate@<version>` stamp (#431). */
78
+ jevitateVersion?: string;
43
79
  }
44
80
  /**
45
81
  * Renders the marked block that Codex/generic `AGENTS.md` carry. In `inline`
@@ -49,21 +85,40 @@ export interface RenderBlockOptions {
49
85
  */
50
86
  export declare function renderSkillsBlock(skills: BlockSkill[], opts: RenderBlockOptions): string;
51
87
  /**
52
- * Splices `newBlock` (marker-wrapped) into `existing`. If markers are present,
53
- * only the marked region is replaced; everything before the opening marker and
88
+ * Splices `newBlock` (marker-wrapped) into `existing`. Any existing block (of
89
+ * ANY version) is replaced in place; everything before the opening marker and
54
90
  * after the closing marker is preserved byte-for-byte. Otherwise the block is
55
- * appended after a blank-line separator. Idempotent on repeat with the same block.
91
+ * appended after a blank-line separator. Idempotent on repeat with the same
92
+ * block. Throws `SkillsBlockMarkerError` when the target's markers are
93
+ * malformed (#431).
56
94
  */
57
95
  export declare function mergeBlock(existing: string, newBlock: string): string;
58
- /** sha256 of just the block's inner text (between the markers), or undefined
59
- * when no block is present — so user edits OUTSIDE the block never register as
60
- * a modification and edits INSIDE it do. */
96
+ /**
97
+ * #437: `mergeBlock` for any marked block (`BlockMarkers`) — e.g. the CODEOWNERS block of
98
+ * `jevitate init --codeowners`. Same rules: replaced in place, else appended; idempotent; throws
99
+ * `SkillsBlockMarkerError` on malformed markers.
100
+ */
101
+ export declare function mergeMarkedBlock(existing: string, newBlock: string, markers: BlockMarkers): string;
102
+ /** sha256 of just the block's inner text (between the marker lines) — so the
103
+ * `jevitate@<version>` stamp in the BEGIN line never counts as a user
104
+ * modification, while edits INSIDE the block do. `undefined` when no block is
105
+ * present; throws `SkillsBlockMarkerError` when the markers are malformed. */
61
106
  export declare function extractBlockHash(content: string): string | undefined;
107
+ /**
108
+ * Decides what to do with one marked-block target. Never writes and never
109
+ * throws: a malformed marker pair is reported as `refuse-malformed` so the
110
+ * skill installer leaves that file untouched and proceeds with the others (#431).
111
+ */
112
+ export declare function planBlockInstall(targetPath: string, newBlock: string, lastInstalledHash: string | undefined, opts?: {
113
+ force?: boolean;
114
+ }): Promise<InstallAction>;
62
115
  export interface InstallReport {
63
116
  target: RuntimeId;
64
117
  skillId: string;
65
118
  path: string;
66
119
  action: InstallAction;
120
+ /** Populated for `refuse-malformed`: the human fix-it reason (#431). */
121
+ reason?: string;
67
122
  }
68
123
  /**
69
124
  * Detect/plan/install the six skills into every runtime passed in (the caller
@@ -76,5 +131,28 @@ export interface InstallReport {
76
131
  export declare function installSkills(runtimes: RuntimeId[], skills: ResolvedSkill[], paths: InstallTargetPaths, statePath: string, opts?: {
77
132
  force?: boolean;
78
133
  dryRun?: boolean;
134
+ jevitateVersion?: string;
135
+ claudeMd?: boolean;
79
136
  }): Promise<InstallReport[]>;
137
+ export interface UninstallReport {
138
+ target: RuntimeId;
139
+ skillId: string;
140
+ path: string;
141
+ action: "remove" | "absent" | "skip-user-modified" | "force-remove" | "refuse-malformed";
142
+ /** Populated for `refuse-malformed`: the human fix-it reason (#431). */
143
+ reason?: string;
144
+ }
145
+ /**
146
+ * Removes everything `installSkills` wrote, with the same never-clobber safety:
147
+ * a whole file or block whose current hash differs from the recorded state is
148
+ * reported `skip-user-modified` (or `force-remove` with `force`) rather than
149
+ * deleted. Malformed markers are reported `refuse-malformed` and left alone.
150
+ * `dryRun` reports the plan and writes nothing. Corresponding state entries are
151
+ * dropped for removed/absent targets.
152
+ */
153
+ export declare function uninstallSkills(runtimes: RuntimeId[], skills: ResolvedSkill[], paths: InstallTargetPaths, statePath: string, opts?: {
154
+ force?: boolean;
155
+ dryRun?: boolean;
156
+ claudeMd?: boolean;
157
+ }): Promise<UninstallReport[]>;
80
158
  export {};