agentera 3.0.0-dev.0 → 3.0.0-dev.10

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 (522) hide show
  1. package/README.md +40 -6
  2. package/bundle/.agentera-npx-bundle.json +1 -1
  3. package/bundle/extract-corpus-parity.json +23 -0
  4. package/bundle/references/adapters/cursor.md +10 -9
  5. package/bundle/references/adapters/opencode.md +26 -26
  6. package/bundle/references/adapters/package-registry.yaml +0 -1
  7. package/bundle/references/adapters/package-surface-characterization.md +1 -2
  8. package/bundle/references/adapters/runtime-adapter-characterization.md +1 -1
  9. package/bundle/references/adapters/runtime-adapter-registry.yaml +16 -10
  10. package/bundle/references/adapters/runtime-feature-parity.md +2 -2
  11. package/bundle/references/analysis/benchmark.md +1 -1
  12. package/bundle/references/analysis/startup-measurement-contract.yaml +18 -18
  13. package/bundle/references/artifacts/artifact-registry-interface-model.yaml +4 -3
  14. package/bundle/references/cli/agent-ready-state-contract.yaml +26 -23
  15. package/bundle/references/cli/app-lifecycle-vocabulary.yaml +16 -8
  16. package/bundle/references/cli/audience-namespace-cli-migration.yaml +40 -26
  17. package/bundle/references/cli/bundle-skill-vocabulary.yaml +2 -30
  18. package/bundle/references/cli/capability-instruction-contract.yaml +98 -57
  19. package/bundle/references/cli/capability-instruction-structure.md +144 -0
  20. package/bundle/references/cli/capability-tool-classification.yaml +12 -12
  21. package/bundle/references/cli/coexistence-probe.yaml +13 -0
  22. package/bundle/references/cli/parity-expected-actual-template.md +30 -0
  23. package/bundle/references/cli/routing-execution-vocabulary.yaml +12 -12
  24. package/bundle/references/cli/routing-model.md +94 -0
  25. package/bundle/references/cli/single-name-protocol.yaml +42 -0
  26. package/bundle/references/cli/trigger-schema-enrichment.md +136 -0
  27. package/bundle/references/cli/update-channels.yaml +68 -5
  28. package/bundle/references/cli/upgrade-repair-wording.md +45 -0
  29. package/bundle/references/cli/v3-handoff-manifest.schema.yaml +98 -0
  30. package/bundle/references/cli/vocabulary-index.yaml +20 -15
  31. package/bundle/references/cli/vocabulary.md +346 -326
  32. package/bundle/references/meta/documentation-inventory.md +9 -3
  33. package/bundle/registry.json +14 -14
  34. package/bundle/skills/agentera/.claude-plugin/plugin.json +13 -13
  35. package/bundle/skills/agentera/SKILL.md +99 -413
  36. package/bundle/skills/agentera/agents/audit.toml +6 -0
  37. package/bundle/skills/agentera/agents/build.toml +6 -0
  38. package/bundle/skills/agentera/agents/design.toml +6 -0
  39. package/bundle/skills/agentera/agents/discuss.toml +6 -0
  40. package/bundle/skills/agentera/agents/document.toml +6 -0
  41. package/bundle/skills/agentera/agents/optimize.toml +6 -0
  42. package/bundle/skills/agentera/agents/orchestrate.toml +6 -0
  43. package/bundle/skills/agentera/agents/plan.toml +6 -0
  44. package/bundle/skills/agentera/agents/profile.toml +6 -0
  45. package/bundle/skills/agentera/agents/research.toml +6 -0
  46. package/bundle/skills/agentera/agents/status.toml +6 -0
  47. package/bundle/skills/agentera/agents/vision.toml +6 -0
  48. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/artifacts.yaml +10 -10
  49. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/triggers.yaml +15 -6
  50. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/validation.yaml +9 -9
  51. package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/artifacts.yaml +11 -11
  52. package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/triggers.yaml +13 -3
  53. package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/validation.yaml +7 -7
  54. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/artifacts.yaml +6 -6
  55. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/triggers.yaml +15 -3
  56. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/validation.yaml +5 -5
  57. package/bundle/skills/agentera/capabilities/{resonera → discuss}/schemas/artifacts.yaml +6 -6
  58. package/bundle/skills/agentera/capabilities/{resonera → discuss}/schemas/triggers.yaml +11 -3
  59. package/bundle/skills/agentera/capabilities/{resonera → discuss}/schemas/validation.yaml +4 -4
  60. package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/artifacts.yaml +10 -10
  61. package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/triggers.yaml +14 -3
  62. package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/validation.yaml +8 -8
  63. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/artifacts.yaml +8 -8
  64. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/triggers.yaml +11 -3
  65. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/validation.yaml +7 -7
  66. package/bundle/skills/agentera/capabilities/{orkestrera → orchestrate}/schemas/artifacts.yaml +10 -10
  67. package/bundle/skills/agentera/capabilities/{orkestrera → orchestrate}/schemas/triggers.yaml +16 -3
  68. package/bundle/skills/agentera/capabilities/{orkestrera → orchestrate}/schemas/validation.yaml +36 -23
  69. package/bundle/skills/agentera/capabilities/{planera → plan}/schemas/artifacts.yaml +8 -8
  70. package/bundle/skills/agentera/capabilities/{planera → plan}/schemas/exit.yaml +2 -2
  71. package/bundle/skills/agentera/capabilities/{planera → plan}/schemas/triggers.yaml +15 -3
  72. package/bundle/skills/agentera/capabilities/{planera → plan}/schemas/validation.yaml +3 -3
  73. package/bundle/skills/agentera/capabilities/{profilera → profile}/schemas/artifacts.yaml +2 -2
  74. package/bundle/skills/agentera/capabilities/{profilera → profile}/schemas/exit.yaml +2 -1
  75. package/bundle/skills/agentera/capabilities/{profilera → profile}/schemas/triggers.yaml +7 -3
  76. package/bundle/skills/agentera/capabilities/{profilera → profile}/schemas/validation.yaml +2 -2
  77. package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/artifacts.yaml +5 -5
  78. package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/triggers.yaml +9 -3
  79. package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/validation.yaml +2 -2
  80. package/bundle/skills/agentera/capabilities/{hej → status}/schemas/artifacts.yaml +14 -11
  81. package/bundle/skills/agentera/capabilities/{hej → status}/schemas/triggers.yaml +12 -8
  82. package/bundle/skills/agentera/capabilities/{hej → status}/schemas/validation.yaml +5 -5
  83. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/artifacts.yaml +8 -8
  84. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/triggers.yaml +17 -3
  85. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/validation.yaml +14 -16
  86. package/bundle/skills/agentera/capability_schema_contract.yaml +201 -38
  87. package/bundle/skills/agentera/protocol.yaml +29 -29
  88. package/bundle/skills/agentera/references/contract.md +329 -320
  89. package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +4 -4
  90. package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +10 -10
  91. package/bundle/skills/agentera/schemas/artifacts/design.yaml +4 -4
  92. package/bundle/skills/agentera/schemas/artifacts/docs.yaml +8 -7
  93. package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +5 -5
  94. package/bundle/skills/agentera/schemas/artifacts/health.yaml +5 -5
  95. package/bundle/skills/agentera/schemas/artifacts/objective.yaml +4 -4
  96. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +5 -5
  97. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +20 -41
  98. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +43 -24
  99. package/bundle/skills/agentera/schemas/artifacts/vision.yaml +3 -3
  100. package/dist/analytics/extractCorpus/cli.js +149 -0
  101. package/dist/analytics/extractCorpus/cli.js.map +1 -0
  102. package/dist/analytics/extractCorpus/copilotSessions.js +273 -0
  103. package/dist/analytics/extractCorpus/copilotSessions.js.map +1 -0
  104. package/dist/analytics/extractCorpus/core.js +364 -0
  105. package/dist/analytics/extractCorpus/core.js.map +1 -0
  106. package/dist/analytics/extractCorpus/corpus.js +145 -0
  107. package/dist/analytics/extractCorpus/corpus.js.map +1 -0
  108. package/dist/analytics/extractCorpus/coverageAudit.js +261 -0
  109. package/dist/analytics/extractCorpus/coverageAudit.js.map +1 -0
  110. package/dist/analytics/extractCorpus/cursorSessions.js +423 -0
  111. package/dist/analytics/extractCorpus/cursorSessions.js.map +1 -0
  112. package/dist/analytics/extractCorpus/extractCorpusParity.js +105 -0
  113. package/dist/analytics/extractCorpus/extractCorpusParity.js.map +1 -0
  114. package/dist/analytics/extractCorpus/filesystemSources.js +122 -0
  115. package/dist/analytics/extractCorpus/filesystemSources.js.map +1 -0
  116. package/dist/analytics/extractCorpus/index.js +12 -0
  117. package/dist/analytics/extractCorpus/index.js.map +1 -0
  118. package/dist/analytics/extractCorpus/jsonlSessions.js +185 -0
  119. package/dist/analytics/extractCorpus/jsonlSessions.js.map +1 -0
  120. package/dist/analytics/extractCorpus/sqliteCaps.js +44 -0
  121. package/dist/analytics/extractCorpus/sqliteCaps.js.map +1 -0
  122. package/dist/analytics/extractCorpus/sqliteSessions.js +368 -0
  123. package/dist/analytics/extractCorpus/sqliteSessions.js.map +1 -0
  124. package/dist/analytics/extractCorpus.js +2 -1790
  125. package/dist/analytics/extractCorpus.js.map +1 -1
  126. package/dist/analytics/usageStats.js +42 -20
  127. package/dist/analytics/usageStats.js.map +1 -1
  128. package/dist/capabilities/audit/instructions.js +6 -0
  129. package/dist/capabilities/audit/instructions.js.map +1 -0
  130. package/dist/capabilities/build/instructions.js +6 -0
  131. package/dist/capabilities/build/instructions.js.map +1 -0
  132. package/dist/capabilities/design/instructions.js +5 -0
  133. package/dist/capabilities/design/instructions.js.map +1 -0
  134. package/dist/capabilities/discuss/instructions.js +6 -0
  135. package/dist/capabilities/discuss/instructions.js.map +1 -0
  136. package/dist/capabilities/document/instructions.js +6 -0
  137. package/dist/capabilities/document/instructions.js.map +1 -0
  138. package/dist/capabilities/index.js +38 -0
  139. package/dist/capabilities/index.js.map +1 -0
  140. package/dist/capabilities/optimize/instructions.js +6 -0
  141. package/dist/capabilities/optimize/instructions.js.map +1 -0
  142. package/dist/capabilities/orchestrate/instructions.js +6 -0
  143. package/dist/capabilities/orchestrate/instructions.js.map +1 -0
  144. package/dist/capabilities/plan/instructions.js +6 -0
  145. package/dist/capabilities/plan/instructions.js.map +1 -0
  146. package/dist/capabilities/profile/instructions.js +6 -0
  147. package/dist/capabilities/profile/instructions.js.map +1 -0
  148. package/dist/capabilities/research/instructions.js +6 -0
  149. package/dist/capabilities/research/instructions.js.map +1 -0
  150. package/dist/capabilities/status/instructions.js +5 -0
  151. package/dist/capabilities/status/instructions.js.map +1 -0
  152. package/dist/capabilities/vision/instructions.js +9 -0
  153. package/dist/capabilities/vision/instructions.js.map +1 -0
  154. package/dist/cli/appContext.js +16 -17
  155. package/dist/cli/appContext.js.map +1 -1
  156. package/dist/cli/capabilityContext/benchmark.js +564 -0
  157. package/dist/cli/capabilityContext/benchmark.js.map +1 -0
  158. package/dist/cli/capabilityContext/bespoke.js +36 -0
  159. package/dist/cli/capabilityContext/bespoke.js.map +1 -0
  160. package/dist/cli/capabilityContext/build.js +177 -0
  161. package/dist/cli/capabilityContext/build.js.map +1 -0
  162. package/dist/cli/capabilityContext/closeout.js +230 -0
  163. package/dist/cli/capabilityContext/closeout.js.map +1 -0
  164. package/dist/cli/capabilityContext/contract.js +188 -0
  165. package/dist/cli/capabilityContext/contract.js.map +1 -0
  166. package/dist/cli/capabilityContext/evidence.js +456 -0
  167. package/dist/cli/capabilityContext/evidence.js.map +1 -0
  168. package/dist/cli/capabilityContext/index.js +4 -0
  169. package/dist/cli/capabilityContext/index.js.map +1 -0
  170. package/dist/cli/capabilityContext/orchestration.js +107 -0
  171. package/dist/cli/capabilityContext/orchestration.js.map +1 -0
  172. package/dist/cli/capabilityContext/planState.js +271 -0
  173. package/dist/cli/capabilityContext/planState.js.map +1 -0
  174. package/dist/cli/capabilityContext/progress.js +103 -0
  175. package/dist/cli/capabilityContext/progress.js.map +1 -0
  176. package/dist/cli/capabilityContext/shared.js +94 -0
  177. package/dist/cli/capabilityContext/shared.js.map +1 -0
  178. package/dist/cli/capabilityContext/slim.js +108 -0
  179. package/dist/cli/capabilityContext/slim.js.map +1 -0
  180. package/dist/cli/capabilityContext/startup.js +213 -0
  181. package/dist/cli/capabilityContext/startup.js.map +1 -0
  182. package/dist/cli/capabilityContext/types.js +40 -0
  183. package/dist/cli/capabilityContext/types.js.map +1 -0
  184. package/dist/cli/capabilityContext.js +1 -2420
  185. package/dist/cli/capabilityContext.js.map +1 -1
  186. package/dist/cli/commands/appHome.js +23 -0
  187. package/dist/cli/commands/appHome.js.map +1 -0
  188. package/dist/cli/commands/capability.js +3 -10
  189. package/dist/cli/commands/capability.js.map +1 -1
  190. package/dist/cli/commands/compact.js +1 -1
  191. package/dist/cli/commands/compact.js.map +1 -1
  192. package/dist/cli/commands/doctor.js +53 -95
  193. package/dist/cli/commands/doctor.js.map +1 -1
  194. package/dist/cli/commands/lint.js +4 -36
  195. package/dist/cli/commands/lint.js.map +1 -1
  196. package/dist/cli/commands/prime/bundleStatus.js +185 -0
  197. package/dist/cli/commands/prime/bundleStatus.js.map +1 -0
  198. package/dist/cli/commands/prime/collectOrientationState.js +156 -0
  199. package/dist/cli/commands/prime/collectOrientationState.js.map +1 -0
  200. package/dist/cli/commands/prime/orientationOutput.js +210 -0
  201. package/dist/cli/commands/prime/orientationOutput.js.map +1 -0
  202. package/dist/cli/commands/prime/types.js +2 -0
  203. package/dist/cli/commands/prime/types.js.map +1 -0
  204. package/dist/cli/commands/prime/v1Migration.js +39 -0
  205. package/dist/cli/commands/prime/v1Migration.js.map +1 -0
  206. package/dist/cli/commands/prime.js +11 -487
  207. package/dist/cli/commands/prime.js.map +1 -1
  208. package/dist/cli/commands/query.js +5 -2
  209. package/dist/cli/commands/query.js.map +1 -1
  210. package/dist/cli/commands/report.js +32 -11
  211. package/dist/cli/commands/report.js.map +1 -1
  212. package/dist/cli/commands/schema.js +26 -22
  213. package/dist/cli/commands/schema.js.map +1 -1
  214. package/dist/cli/commands/state/decisions.js +403 -0
  215. package/dist/cli/commands/state/decisions.js.map +1 -0
  216. package/dist/cli/commands/state/docs.js +97 -0
  217. package/dist/cli/commands/state/docs.js.map +1 -0
  218. package/dist/cli/commands/state/experiments.js +68 -0
  219. package/dist/cli/commands/state/experiments.js.map +1 -0
  220. package/dist/cli/commands/state/health.js +116 -0
  221. package/dist/cli/commands/state/health.js.map +1 -0
  222. package/dist/cli/commands/state/index.js +51 -0
  223. package/dist/cli/commands/state/index.js.map +1 -0
  224. package/dist/cli/commands/state/objective.js +69 -0
  225. package/dist/cli/commands/state/objective.js.map +1 -0
  226. package/dist/cli/commands/state/plan.js +173 -0
  227. package/dist/cli/commands/state/plan.js.map +1 -0
  228. package/dist/cli/commands/state/progress.js +47 -0
  229. package/dist/cli/commands/state/progress.js.map +1 -0
  230. package/dist/cli/commands/state/shared.js +15 -0
  231. package/dist/cli/commands/state/shared.js.map +1 -0
  232. package/dist/cli/commands/state/todo.js +121 -0
  233. package/dist/cli/commands/state/todo.js.map +1 -0
  234. package/dist/cli/commands/upgrade.js +63 -2
  235. package/dist/cli/commands/upgrade.js.map +1 -1
  236. package/dist/cli/commands/upgradeVerify.js +81 -0
  237. package/dist/cli/commands/upgradeVerify.js.map +1 -0
  238. package/dist/cli/commands/validate.js +56 -96
  239. package/dist/cli/commands/validate.js.map +1 -1
  240. package/dist/cli/commands/verify.js +7 -1
  241. package/dist/cli/commands/verify.js.map +1 -1
  242. package/dist/cli/contracts/bundleStatus.js +2 -0
  243. package/dist/cli/contracts/bundleStatus.js.map +1 -0
  244. package/dist/cli/contracts/orientationState.js +2 -0
  245. package/dist/cli/contracts/orientationState.js.map +1 -0
  246. package/dist/cli/dispatch/argvParser.js +33 -0
  247. package/dist/cli/dispatch/argvParser.js.map +1 -0
  248. package/dist/cli/dispatch/check.js +328 -0
  249. package/dist/cli/dispatch/check.js.map +1 -0
  250. package/dist/cli/dispatch/commands.js +27 -0
  251. package/dist/cli/dispatch/commands.js.map +1 -0
  252. package/dist/cli/dispatch/index.js +182 -0
  253. package/dist/cli/dispatch/index.js.map +1 -0
  254. package/dist/cli/dispatch/lifecycle.js +603 -0
  255. package/dist/cli/dispatch/lifecycle.js.map +1 -0
  256. package/dist/cli/dispatch/prime.js +104 -0
  257. package/dist/cli/dispatch/prime.js.map +1 -0
  258. package/dist/cli/dispatch/shared.js +64 -0
  259. package/dist/cli/dispatch/shared.js.map +1 -0
  260. package/dist/cli/dispatch/state.js +144 -0
  261. package/dist/cli/dispatch/state.js.map +1 -0
  262. package/dist/cli/dispatch.js +1 -961
  263. package/dist/cli/dispatch.js.map +1 -1
  264. package/dist/cli/errors.js +53 -0
  265. package/dist/cli/errors.js.map +1 -0
  266. package/dist/cli/help.js +236 -0
  267. package/dist/cli/help.js.map +1 -0
  268. package/dist/cli/orientation/attention.js +65 -0
  269. package/dist/cli/orientation/attention.js.map +1 -0
  270. package/dist/cli/orientation/corpusCoverage.js +71 -0
  271. package/dist/cli/orientation/corpusCoverage.js.map +1 -0
  272. package/dist/cli/orientation.js +138 -84
  273. package/dist/cli/orientation.js.map +1 -1
  274. package/dist/cli/prime-blob.js +1 -1
  275. package/dist/cli/startupCompletenessContract.js +56 -0
  276. package/dist/cli/startupCompletenessContract.js.map +1 -0
  277. package/dist/cli/stateQuery.js +16 -2
  278. package/dist/cli/stateQuery.js.map +1 -1
  279. package/dist/cli/todoMarkdown.js +33 -0
  280. package/dist/cli/todoMarkdown.js.map +1 -0
  281. package/dist/cli/todoSeverity.js +19 -0
  282. package/dist/cli/todoSeverity.js.map +1 -0
  283. package/dist/core/envPaths.js +21 -0
  284. package/dist/core/envPaths.js.map +1 -0
  285. package/dist/core/jsonValue.js +6 -0
  286. package/dist/core/jsonValue.js.map +1 -0
  287. package/dist/core/pyjson.js +67 -2
  288. package/dist/core/pyjson.js.map +1 -1
  289. package/dist/eval/evalSkills.js +17 -12
  290. package/dist/eval/evalSkills.js.map +1 -1
  291. package/dist/eval/semanticEval.js +43 -19
  292. package/dist/eval/semanticEval.js.map +1 -1
  293. package/dist/eval/semanticFixtures.js +16 -4
  294. package/dist/eval/semanticFixtures.js.map +1 -1
  295. package/dist/hooks/common.js +8 -25
  296. package/dist/hooks/common.js.map +1 -1
  297. package/dist/hooks/compaction/apply.js +269 -0
  298. package/dist/hooks/compaction/apply.js.map +1 -0
  299. package/dist/hooks/compaction/dryRun.js +183 -0
  300. package/dist/hooks/compaction/dryRun.js.map +1 -0
  301. package/dist/hooks/compaction/index.js +23 -0
  302. package/dist/hooks/compaction/index.js.map +1 -0
  303. package/dist/hooks/compaction/parse.js +258 -0
  304. package/dist/hooks/compaction/parse.js.map +1 -0
  305. package/dist/hooks/compaction/retention.js +199 -0
  306. package/dist/hooks/compaction/retention.js.map +1 -0
  307. package/dist/hooks/compaction/status.js +241 -0
  308. package/dist/hooks/compaction/status.js.map +1 -0
  309. package/dist/hooks/compaction/types.js +6 -0
  310. package/dist/hooks/compaction/types.js.map +1 -0
  311. package/dist/hooks/cursorPreToolUse.js +1 -1
  312. package/dist/hooks/cursorPreToolUse.js.map +1 -1
  313. package/dist/hooks/cursorSessionStart.js +10 -2
  314. package/dist/hooks/cursorSessionStart.js.map +1 -1
  315. package/dist/hooks/sessionStart.js +18 -11
  316. package/dist/hooks/sessionStart.js.map +1 -1
  317. package/dist/hooks/sessionStop.js +6 -12
  318. package/dist/hooks/sessionStop.js.map +1 -1
  319. package/dist/hooks/validateArtifact/agentFacing.js +10 -0
  320. package/dist/hooks/validateArtifact/agentFacing.js.map +1 -0
  321. package/dist/hooks/validateArtifact/index.js +151 -0
  322. package/dist/hooks/validateArtifact/index.js.map +1 -0
  323. package/dist/hooks/validateArtifact/markdown.js +146 -0
  324. package/dist/hooks/validateArtifact/markdown.js.map +1 -0
  325. package/dist/hooks/validateArtifact/runtime.js +86 -0
  326. package/dist/hooks/validateArtifact/runtime.js.map +1 -0
  327. package/dist/hooks/validateArtifact/schema.js +459 -0
  328. package/dist/hooks/validateArtifact/schema.js.map +1 -0
  329. package/dist/hooks/validateArtifact/traversal.js +106 -0
  330. package/dist/hooks/validateArtifact/traversal.js.map +1 -0
  331. package/dist/hooks/validateArtifact/violations.js +105 -0
  332. package/dist/hooks/validateArtifact/violations.js.map +1 -0
  333. package/dist/migrate/v2HandoffManifest.js +451 -0
  334. package/dist/migrate/v2HandoffManifest.js.map +1 -0
  335. package/dist/registries/artifactProtocolIds.js +77 -0
  336. package/dist/registries/artifactProtocolIds.js.map +1 -0
  337. package/dist/registries/artifactRegistry.js +23 -9
  338. package/dist/registries/artifactRegistry.js.map +1 -1
  339. package/dist/registries/capabilityContract.js +156 -12
  340. package/dist/registries/capabilityContract.js.map +1 -1
  341. package/dist/registries/evaluatorHandoffContract.js +171 -0
  342. package/dist/registries/evaluatorHandoffContract.js.map +1 -0
  343. package/dist/registries/packageRegistry.js +4 -3
  344. package/dist/registries/packageRegistry.js.map +1 -1
  345. package/dist/registries/runtimeAdapterRegistry.js +5 -4
  346. package/dist/registries/runtimeAdapterRegistry.js.map +1 -1
  347. package/dist/registries/triggerLoader.js +211 -0
  348. package/dist/registries/triggerLoader.js.map +1 -0
  349. package/dist/release/releaseMetadata.js +235 -0
  350. package/dist/release/releaseMetadata.js.map +1 -0
  351. package/dist/setup/codex/agents.js +96 -0
  352. package/dist/setup/codex/agents.js.map +1 -0
  353. package/dist/setup/codex/cli.js +161 -0
  354. package/dist/setup/codex/cli.js.map +1 -0
  355. package/dist/setup/codex/configToml.js +639 -0
  356. package/dist/setup/codex/configToml.js.map +1 -0
  357. package/dist/setup/codex/constants.js +29 -0
  358. package/dist/setup/codex/constants.js.map +1 -0
  359. package/dist/setup/codex/installRoot.js +64 -0
  360. package/dist/setup/codex/installRoot.js.map +1 -0
  361. package/dist/setup/codex/state.js +270 -0
  362. package/dist/setup/codex/state.js.map +1 -0
  363. package/dist/setup/codex.js +11 -1051
  364. package/dist/setup/codex.js.map +1 -1
  365. package/dist/setup/cursor.js +6 -4
  366. package/dist/setup/cursor.js.map +1 -1
  367. package/dist/setup/cursorSurfaces.js +67 -0
  368. package/dist/setup/cursorSurfaces.js.map +1 -0
  369. package/dist/setup/doctor/core.js +296 -0
  370. package/dist/setup/doctor/core.js.map +1 -0
  371. package/dist/setup/doctor/diagnostics.js +240 -0
  372. package/dist/setup/doctor/diagnostics.js.map +1 -0
  373. package/dist/setup/doctor/opencode.js +301 -0
  374. package/dist/setup/doctor/opencode.js.map +1 -0
  375. package/dist/setup/doctor/report.js +425 -0
  376. package/dist/setup/doctor/report.js.map +1 -0
  377. package/dist/setup/doctor.js +9 -1268
  378. package/dist/setup/doctor.js.map +1 -1
  379. package/dist/setup/opencode.js +13 -0
  380. package/dist/setup/opencode.js.map +1 -0
  381. package/dist/setup/opencodeConstants.js +2 -0
  382. package/dist/setup/opencodeConstants.js.map +1 -0
  383. package/dist/setup/smokeChecks.js +111 -0
  384. package/dist/setup/smokeChecks.js.map +1 -0
  385. package/dist/state/installRoot.js +64 -24
  386. package/dist/state/installRoot.js.map +1 -1
  387. package/dist/state/startupAnalysis/benchmark.js +371 -0
  388. package/dist/state/startupAnalysis/benchmark.js.map +1 -0
  389. package/dist/state/startupAnalysis/contract.js +126 -0
  390. package/dist/state/startupAnalysis/contract.js.map +1 -0
  391. package/dist/state/startupAnalysis/helpers.js +287 -0
  392. package/dist/state/startupAnalysis/helpers.js.map +1 -0
  393. package/dist/state/startupAnalysis/index.js +7 -0
  394. package/dist/state/startupAnalysis/index.js.map +1 -0
  395. package/dist/state/startupAnalysis/metrics.js +341 -0
  396. package/dist/state/startupAnalysis/metrics.js.map +1 -0
  397. package/dist/state/startupAnalysis/records.js +199 -0
  398. package/dist/state/startupAnalysis/records.js.map +1 -0
  399. package/dist/state/startupAnalysis/report.js +112 -0
  400. package/dist/state/startupAnalysis/report.js.map +1 -0
  401. package/dist/state/startupAnalysis/threshold.js +500 -0
  402. package/dist/state/startupAnalysis/threshold.js.map +1 -0
  403. package/dist/state/startupAnalysis.js +2 -1952
  404. package/dist/state/startupAnalysis.js.map +1 -1
  405. package/dist/upgrade/appContentRefresh.js +367 -0
  406. package/dist/upgrade/appContentRefresh.js.map +1 -0
  407. package/dist/upgrade/appModel.js +11 -6
  408. package/dist/upgrade/appModel.js.map +1 -1
  409. package/dist/upgrade/atomicWriter.js +23 -0
  410. package/dist/upgrade/atomicWriter.js.map +1 -0
  411. package/dist/upgrade/bundleEvidence.js +34 -0
  412. package/dist/upgrade/bundleEvidence.js.map +1 -0
  413. package/dist/upgrade/channels.js +48 -15
  414. package/dist/upgrade/channels.js.map +1 -1
  415. package/dist/upgrade/coexistenceProbe.js +105 -0
  416. package/dist/upgrade/coexistenceProbe.js.map +1 -0
  417. package/dist/upgrade/compatibility.js +26 -24
  418. package/dist/upgrade/compatibility.js.map +1 -1
  419. package/dist/upgrade/doctor.js +194 -191
  420. package/dist/upgrade/doctor.js.map +1 -1
  421. package/dist/upgrade/doctorClassifier.js +188 -0
  422. package/dist/upgrade/doctorClassifier.js.map +1 -0
  423. package/dist/upgrade/installedHooksRetirement.js +190 -0
  424. package/dist/upgrade/installedHooksRetirement.js.map +1 -0
  425. package/dist/upgrade/legacyAgentCleanup.js +183 -0
  426. package/dist/upgrade/legacyAgentCleanup.js.map +1 -0
  427. package/dist/upgrade/migrateArtifactsV1ToV2.js +568 -0
  428. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +1 -0
  429. package/dist/upgrade/migrateArtifactsV2ToV3.js +118 -229
  430. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +1 -1
  431. package/dist/upgrade/nextMajorDoctor.js +156 -0
  432. package/dist/upgrade/nextMajorDoctor.js.map +1 -0
  433. package/dist/upgrade/npxPlatformStatus.js +23 -0
  434. package/dist/upgrade/npxPlatformStatus.js.map +1 -0
  435. package/dist/upgrade/projectIntegration.js +233 -0
  436. package/dist/upgrade/projectIntegration.js.map +1 -0
  437. package/dist/upgrade/projectIntegrationDecision.js +42 -0
  438. package/dist/upgrade/projectIntegrationDecision.js.map +1 -0
  439. package/dist/upgrade/runtimeMigration.js +744 -0
  440. package/dist/upgrade/runtimeMigration.js.map +1 -0
  441. package/dist/upgrade/upgradeCommands.js +6 -6
  442. package/dist/upgrade/upgradeCommands.js.map +1 -1
  443. package/dist/upgrade/upgradeLock.js +54 -0
  444. package/dist/upgrade/upgradeLock.js.map +1 -0
  445. package/dist/upgrade/upgradeOrchestrator.js +59 -57
  446. package/dist/upgrade/upgradeOrchestrator.js.map +1 -1
  447. package/dist/upgrade/upgradeSnapshot.js +93 -0
  448. package/dist/upgrade/upgradeSnapshot.js.map +1 -0
  449. package/dist/upgrade/v3CapabilitySurface.js +15 -0
  450. package/dist/upgrade/v3CapabilitySurface.js.map +1 -0
  451. package/dist/upgrade/versionResolution.js +187 -0
  452. package/dist/upgrade/versionResolution.js.map +1 -0
  453. package/dist/validate/appHomeContract.js +4 -4
  454. package/dist/validate/appHomeContract.js.map +1 -1
  455. package/dist/validate/capability.js +135 -14
  456. package/dist/validate/capability.js.map +1 -1
  457. package/dist/validate/crossCapability.js +1 -1
  458. package/dist/validate/crossCapability.js.map +1 -1
  459. package/dist/validate/lifecycleAdapters/legacyPythonParity.js +93 -0
  460. package/dist/validate/lifecycleAdapters/legacyPythonParity.js.map +1 -0
  461. package/dist/validate/lifecycleAdapters/nodeFormChecks.js +488 -0
  462. package/dist/validate/lifecycleAdapters/nodeFormChecks.js.map +1 -0
  463. package/dist/validate/lifecycleAdapters/shared.js +198 -0
  464. package/dist/validate/lifecycleAdapters/shared.js.map +1 -0
  465. package/dist/validate/lifecycleAdapters.js +13 -723
  466. package/dist/validate/lifecycleAdapters.js.map +1 -1
  467. package/dist/validate/selfAudit.js +62 -20
  468. package/dist/validate/selfAudit.js.map +1 -1
  469. package/dist/validate/vocabularyAuthority.js +303 -0
  470. package/dist/validate/vocabularyAuthority.js.map +1 -0
  471. package/package.json +29 -26
  472. package/bundle/references/v1-section-mapping.md +0 -47
  473. package/bundle/skills/agentera/agents/dokumentera.toml +0 -6
  474. package/bundle/skills/agentera/agents/hej.toml +0 -6
  475. package/bundle/skills/agentera/agents/inspektera.toml +0 -6
  476. package/bundle/skills/agentera/agents/inspirera.toml +0 -6
  477. package/bundle/skills/agentera/agents/optimera.toml +0 -6
  478. package/bundle/skills/agentera/agents/orkestrera.toml +0 -6
  479. package/bundle/skills/agentera/agents/planera.toml +0 -6
  480. package/bundle/skills/agentera/agents/profilera.toml +0 -6
  481. package/bundle/skills/agentera/agents/realisera.toml +0 -6
  482. package/bundle/skills/agentera/agents/resonera.toml +0 -6
  483. package/bundle/skills/agentera/agents/visionera.toml +0 -6
  484. package/bundle/skills/agentera/agents/visualisera.toml +0 -6
  485. package/bundle/skills/agentera/capabilities/dokumentera/instructions.md +0 -428
  486. package/bundle/skills/agentera/capabilities/hej/instructions.md +0 -331
  487. package/bundle/skills/agentera/capabilities/inspektera/instructions.md +0 -514
  488. package/bundle/skills/agentera/capabilities/inspirera/instructions.md +0 -280
  489. package/bundle/skills/agentera/capabilities/optimera/instructions.md +0 -437
  490. package/bundle/skills/agentera/capabilities/orkestrera/instructions.md +0 -433
  491. package/bundle/skills/agentera/capabilities/planera/instructions.md +0 -368
  492. package/bundle/skills/agentera/capabilities/profilera/instructions.md +0 -419
  493. package/bundle/skills/agentera/capabilities/realisera/instructions.md +0 -403
  494. package/bundle/skills/agentera/capabilities/resonera/instructions.md +0 -329
  495. package/bundle/skills/agentera/capabilities/visionera/instructions.md +0 -309
  496. package/bundle/skills/agentera/capabilities/visualisera/instructions.md +0 -400
  497. package/bundle/skills/hej/.claude-plugin/plugin.json +0 -6
  498. package/bundle/skills/hej/SKILL.md +0 -69
  499. package/bundle/skills/hej/agents/hej.toml +0 -11
  500. package/bundle/skills/hej/agents/openai.yaml +0 -8
  501. package/dist/cli/commands/backfill.js +0 -84
  502. package/dist/cli/commands/backfill.js.map +0 -1
  503. package/dist/cli/commands/state.js +0 -1012
  504. package/dist/cli/commands/state.js.map +0 -1
  505. package/dist/core/git.js +0 -43
  506. package/dist/core/git.js.map +0 -1
  507. package/dist/hooks/compaction.js +0 -935
  508. package/dist/hooks/compaction.js.map +0 -1
  509. package/dist/hooks/validateArtifact.js +0 -933
  510. package/dist/hooks/validateArtifact.js.map +0 -1
  511. package/dist/state/progressCommit.js +0 -289
  512. package/dist/state/progressCommit.js.map +0 -1
  513. /package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/exit.yaml +0 -0
  514. /package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/exit.yaml +0 -0
  515. /package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/exit.yaml +0 -0
  516. /package/bundle/skills/agentera/capabilities/{resonera → discuss}/schemas/exit.yaml +0 -0
  517. /package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/exit.yaml +0 -0
  518. /package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/exit.yaml +0 -0
  519. /package/bundle/skills/agentera/capabilities/{orkestrera → orchestrate}/schemas/exit.yaml +0 -0
  520. /package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/exit.yaml +0 -0
  521. /package/bundle/skills/agentera/capabilities/{hej → status}/schemas/exit.yaml +0 -0
  522. /package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/exit.yaml +0 -0
@@ -0,0 +1,744 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { isFile, pathExists, resolvePath } from "../core/paths.js";
5
+ import { resolveSourceRoot } from "../core/sourceRoot.js";
6
+ import { loadRegistry } from "../registries/runtimeAdapterRegistry.js";
7
+ import { codexCopiedHooksAreAgenteraOnly, codexPluginHooksEnabled, retireCodexCopiedHookTrust, } from "../setup/codex.js";
8
+ import { hasManagedMarker, opencodeConfigDir, } from "../setup/opencode.js";
9
+ import { OPENCODE_SKILL_NAMES } from "../setup/opencodeConstants.js";
10
+ import { resolveUpdateChannel } from "./channels.js";
11
+ import { writeFileAtomic } from "./atomicWriter.js";
12
+ import { applyInstalledHooksRetirementItems, planInstalledHooksRetirementItems, textReferencesV2InstalledHooks, } from "./installedHooksRetirement.js";
13
+ import { projectUsesV3CapabilityInstructionModules } from "./v3CapabilitySurface.js";
14
+ const PYTHON_MANAGED_PATTERNS = [
15
+ /hooks\/validate_artifact\.py/,
16
+ /hooks\/cursor_session_start\.py/,
17
+ /hooks\/cursor_pre_tool_use\.py/,
18
+ /hooks\/cursor_session_stop\.py/,
19
+ /hooks\/session_start\.py/,
20
+ /hooks\/session_stop\.py/,
21
+ /\buv run\b/,
22
+ /\buvx\b/,
23
+ /scripts\/agentera/,
24
+ /\/app\/scripts\/agentera/,
25
+ /cursor_session_start\.py/,
26
+ /cursor_pre_tool_use\.py/,
27
+ /cursor_session_stop\.py/,
28
+ ];
29
+ export function projectHasProjectLevelRuntimeHooks(project) {
30
+ const root = resolvePath(project);
31
+ const candidates = [
32
+ path.join(root, ".cursor", "hooks.json"),
33
+ path.join(root, ".codex", "config.toml"),
34
+ path.join(root, ".codex", "hooks", "codex-hooks.json"),
35
+ path.join(root, ".github", "hooks"),
36
+ ];
37
+ return candidates.some((candidate) => isFile(candidate) || pathExists(candidate));
38
+ }
39
+ const OPENCODE_COMMAND_NAMES = ["agentera"];
40
+ const CURSOR_AGENT_MARKER = "<!-- agentera: managed -->";
41
+ export function resolveNpxHookCommands(ctx) {
42
+ const env = ctx.env ?? process.env;
43
+ const home = ctx.home ?? env.HOME ?? os.homedir();
44
+ const sourceRoot = ctx.sourceRoot ?? resolveSourceRoot(env);
45
+ const channel = resolveUpdateChannel({
46
+ channel: ctx.channel ?? null,
47
+ env,
48
+ home,
49
+ sourceRoot,
50
+ });
51
+ const cliEntrypoint = channel.updateCommand.trim();
52
+ return {
53
+ cliEntrypoint,
54
+ validate: `${cliEntrypoint} hook validate-artifact`,
55
+ cursorSessionStart: `${cliEntrypoint} hook cursor-session-start`,
56
+ cursorSessionStop: `${cliEntrypoint} hook session-stop`,
57
+ cursorPreTool: `${cliEntrypoint} hook cursor-pre-tool-use`,
58
+ };
59
+ }
60
+ export function textUsesPythonManagedEntrypoint(text) {
61
+ if (/AGENTERA_HOME\s*=/.test(text)) {
62
+ return true;
63
+ }
64
+ return PYTHON_MANAGED_PATTERNS.some((pattern) => pattern.test(text));
65
+ }
66
+ const V3_NPX_ENTRYPOINT = /\bnpx\s+-y\s+agentera\b/;
67
+ export function textUsesV3NpmEntrypoint(text) {
68
+ return V3_NPX_ENTRYPOINT.test(text);
69
+ }
70
+ export function rewireRuntimeText(text, runtime, commands) {
71
+ let next = text;
72
+ next = next.replace(/uv run\s+\\?"?\$\{AGENTERA_HOME\}\/hooks\/validate_artifact\.py\\?"?/g, commands.validate);
73
+ next = next.replace(/uv run\s+\\?"?\$\{AGENTERA_HOME\}\/app\/hooks\/validate_artifact\.py\\?"?/g, commands.validate);
74
+ next = next.replace(/uv run\s+\\?"?\$\{PLUGIN_ROOT\}\/hooks\/validate_artifact\.py\\?"?/g, commands.validate);
75
+ next = next.replace(/uv run\s+hooks\/validate_artifact\.py/g, commands.validate);
76
+ if (next.includes("validate_artifact.py")) {
77
+ next = next.replace(/["']?[^"'\n]*hooks\/validate_artifact\.py[^"'\n]*["']?/g, `"${commands.validate}"`);
78
+ }
79
+ next = next.replace(/["']?[^"'\n]*cursor_session_start\.py[^"'\n]*["']?/g, `"${commands.cursorSessionStart}"`);
80
+ next = next.replace(/["']?[^"'\n]*cursor_pre_tool_use\.py[^"'\n]*["']?/g, `"${commands.cursorPreTool}"`);
81
+ next = next.replace(/["']?[^"'\n]*cursor_session_stop\.py[^"'\n]*["']?/g, `"${commands.cursorSessionStop}"`);
82
+ next = next.replace(/["']?[^"'\n]*\/app\/scripts\/agentera[^"'\n]*["']?/g, `"${commands.cliEntrypoint}"`);
83
+ next = next.replace(/["']?[^"'\n]*scripts\/agentera[^"'\n]*["']?/g, `"${commands.cliEntrypoint}"`);
84
+ next = next.replace(/npx -y agentera hook /g, `${commands.cliEntrypoint} hook `);
85
+ next = next.replace(/npx -y agentera@latest hook /g, `${commands.cliEntrypoint} hook `);
86
+ if (runtime === "codex") {
87
+ next = next.replace(/AGENTERA_HOME\s*=\s*"[^"]*"/g, "");
88
+ next = next.replace(/AGENTERA_HOME\s*=\s*'[^']*'/g, "");
89
+ next = next.replace(/set\s*=\s*\{\s*,/g, "set = {");
90
+ next = next.replace(/,\s*,/g, ",");
91
+ next = next.replace(/,\s*\}/g, " }");
92
+ next = next.replace(/set\s*=\s*\{\s*\}/g, "set = { }");
93
+ }
94
+ return next;
95
+ }
96
+ function needsChannelNpxRewire(text, cliEntrypoint) {
97
+ if (/npx -y agentera hook /.test(text) && !text.includes(cliEntrypoint)) {
98
+ return true;
99
+ }
100
+ if (/npx -y agentera@latest hook /.test(text) && !text.includes(cliEntrypoint)) {
101
+ return true;
102
+ }
103
+ return false;
104
+ }
105
+ function pushRewireItem(items, runtime, filePath, commands) {
106
+ const text = fs.readFileSync(filePath, "utf8");
107
+ const needsBare = needsChannelNpxRewire(text, commands.cliEntrypoint);
108
+ if (!textUsesPythonManagedEntrypoint(text) && !textReferencesV2InstalledHooks(text) && !needsBare) {
109
+ if (textUsesV3NpmEntrypoint(text)) {
110
+ items.push({
111
+ status: "noop",
112
+ action: "rewire-runtime",
113
+ runtime,
114
+ source: filePath,
115
+ message: "runtime config already references npm self-contained entrypoint",
116
+ });
117
+ }
118
+ // If the file has no Agentera content at all (no v2 Python, no v3 npm),
119
+ // it is not Agentera-managed. Do not push a blocked item — just return.
120
+ return;
121
+ }
122
+ const newText = rewireRuntimeText(text, runtime, commands);
123
+ const status = newText === text ? "blocked" : "pending";
124
+ items.push({
125
+ status,
126
+ action: "rewire-runtime",
127
+ runtime,
128
+ source: filePath,
129
+ target: filePath,
130
+ newText,
131
+ message: status === "pending"
132
+ ? "will rewire runtime config from Python managed app-home to npm self-contained entrypoint"
133
+ : "runtime config uses Python managed paths but could not be rewritten safely",
134
+ });
135
+ }
136
+ function hasCursorManagedAgentMarker(text) {
137
+ return text.includes(CURSOR_AGENT_MARKER);
138
+ }
139
+ function copyIfChanged(source, target) {
140
+ if (!isFile(source)) {
141
+ return false;
142
+ }
143
+ if (isFile(target)) {
144
+ const before = fs.readFileSync(source);
145
+ const after = fs.readFileSync(target);
146
+ if (before.equals(after)) {
147
+ return false;
148
+ }
149
+ }
150
+ fs.mkdirSync(path.dirname(target), { recursive: true });
151
+ const sourceBytes = fs.readFileSync(source);
152
+ writeFileAtomic(target, sourceBytes);
153
+ return true;
154
+ }
155
+ function planCodexItems(items, home, project, commands, force) {
156
+ for (const root of [project, home]) {
157
+ const hooksPath = path.join(root, ".codex", "hooks", "codex-hooks.json");
158
+ const configPath = path.join(root, ".codex", "config.toml");
159
+ if (isFile(hooksPath)) {
160
+ pushRewireItem(items, "codex", hooksPath, commands);
161
+ }
162
+ if (isFile(configPath)) {
163
+ pushRewireItem(items, "codex", configPath, commands);
164
+ const configText = fs.readFileSync(configPath, "utf8");
165
+ const pluginHooks = codexPluginHooksEnabled(configText);
166
+ if (pluginHooks && isFile(hooksPath)) {
167
+ let hooksText;
168
+ try {
169
+ hooksText = fs.readFileSync(hooksPath, "utf8");
170
+ }
171
+ catch {
172
+ hooksText = "";
173
+ }
174
+ if (codexCopiedHooksAreAgenteraOnly(hooksText)) {
175
+ items.push({
176
+ status: "pending",
177
+ action: "retire-hooks",
178
+ runtime: "codex",
179
+ source: hooksPath,
180
+ target: configPath,
181
+ message: "will remove Agentera-owned copied Codex hooks because plugin hooks are enabled",
182
+ });
183
+ }
184
+ else if (hooksText.includes("validate_artifact") || hooksText.includes("hook validate-artifact")) {
185
+ items.push({
186
+ status: force ? "pending" : "blocked",
187
+ action: "retire-hooks",
188
+ runtime: "codex",
189
+ source: hooksPath,
190
+ target: configPath,
191
+ message: "plugin hooks are enabled, but copied hook target needs manual review before retirement",
192
+ });
193
+ }
194
+ }
195
+ }
196
+ }
197
+ }
198
+ function planCursorItems(items, home, project, sourceRoot, commands) {
199
+ for (const hooksPath of [
200
+ path.join(project, ".cursor", "hooks.json"),
201
+ path.join(home, ".cursor", "hooks.json"),
202
+ ]) {
203
+ if (isFile(hooksPath)) {
204
+ pushRewireItem(items, "cursor", hooksPath, commands);
205
+ }
206
+ }
207
+ const agentsSource = path.join(sourceRoot, ".cursor", "agents");
208
+ const pluginSource = path.join(sourceRoot, ".cursor-plugin", "plugin.json");
209
+ for (const root of [project]) {
210
+ const agentsDir = path.join(root, ".cursor", "agents");
211
+ if (isFile(pluginSource) && root === project) {
212
+ const pluginTarget = path.join(root, ".cursor-plugin", "plugin.json");
213
+ if (!isFile(pluginTarget)) {
214
+ items.push({
215
+ status: "pending",
216
+ action: "copy-plugin",
217
+ runtime: "cursor",
218
+ source: pluginSource,
219
+ target: pluginTarget,
220
+ message: "will copy managed Cursor plugin manifest",
221
+ });
222
+ }
223
+ else if (!fs.readFileSync(pluginSource).equals(fs.readFileSync(pluginTarget))) {
224
+ items.push({
225
+ status: "pending",
226
+ action: "copy-plugin",
227
+ runtime: "cursor",
228
+ source: pluginSource,
229
+ target: pluginTarget,
230
+ message: "will refresh managed Cursor plugin manifest",
231
+ });
232
+ }
233
+ }
234
+ const skipInTreeCursorAgents = root === project && projectUsesV3CapabilityInstructionModules(project);
235
+ if (skipInTreeCursorAgents) {
236
+ items.push({
237
+ status: "noop",
238
+ action: "copy-agent",
239
+ runtime: "cursor",
240
+ target: agentsDir,
241
+ message: "v3 capability instruction modules present; in-tree .cursor/agents/ uses prime --context and is not overwritten",
242
+ });
243
+ }
244
+ else if (pathExists(agentsSource)) {
245
+ const CURSOR_MANAGED_AGENT = "agentera.md";
246
+ const src = path.join(agentsSource, CURSOR_MANAGED_AGENT);
247
+ if (isFile(src)) {
248
+ const dst = path.join(agentsDir, CURSOR_MANAGED_AGENT);
249
+ if (!isFile(dst)) {
250
+ items.push({
251
+ status: "pending",
252
+ action: "copy-agent",
253
+ runtime: "cursor",
254
+ source: src,
255
+ target: dst,
256
+ message: "will copy managed Cursor Agentera agent",
257
+ });
258
+ }
259
+ else {
260
+ const dstText = fs.readFileSync(dst, "utf8");
261
+ const srcText = fs.readFileSync(src, "utf8");
262
+ if (hasCursorManagedAgentMarker(dstText) && dstText !== srcText) {
263
+ items.push({
264
+ status: "pending",
265
+ action: "copy-agent",
266
+ runtime: "cursor",
267
+ source: src,
268
+ target: dst,
269
+ message: "will refresh stale managed Cursor Agentera agent",
270
+ });
271
+ }
272
+ }
273
+ }
274
+ }
275
+ }
276
+ }
277
+ function planOpencodeItems(items, home, sourceRoot, env, commands) {
278
+ const configDir = opencodeConfigDir(home, env);
279
+ const pluginSource = path.join(sourceRoot, ".opencode", "plugins", "agentera.js");
280
+ const pluginTarget = path.join(configDir, "plugins", "agentera.js");
281
+ if (isFile(pluginSource)) {
282
+ const targetContent = isFile(pluginTarget) ? fs.readFileSync(pluginTarget, "utf8") : "";
283
+ const sourceContent = fs.readFileSync(pluginSource, "utf8");
284
+ const needsCopy = !isFile(pluginTarget) ||
285
+ (targetContent !== sourceContent &&
286
+ (textUsesPythonManagedEntrypoint(targetContent) ||
287
+ needsChannelNpxRewire(targetContent, commands.cliEntrypoint)));
288
+ items.push({
289
+ status: needsCopy ? "pending" : "noop",
290
+ action: "copy-plugin",
291
+ runtime: "opencode",
292
+ source: pluginSource,
293
+ target: pluginTarget,
294
+ message: needsCopy
295
+ ? "will copy current Agentera OpenCode plugin to native plugin path"
296
+ : "OpenCode plugin already current at native plugin path",
297
+ });
298
+ }
299
+ const commandsSourceDir = path.join(sourceRoot, ".opencode", "commands");
300
+ const commandsTargetDir = path.join(configDir, "commands");
301
+ for (const name of OPENCODE_COMMAND_NAMES) {
302
+ const src = path.join(commandsSourceDir, `${name}.md`);
303
+ const dst = path.join(commandsTargetDir, `${name}.md`);
304
+ if (isFile(src)) {
305
+ const needsCopy = !isFile(dst) || (hasManagedMarker(fs.readFileSync(dst, "utf8")) && !fs.readFileSync(src).equals(fs.readFileSync(dst)));
306
+ items.push({
307
+ status: needsCopy ? "pending" : "noop",
308
+ action: "copy-command",
309
+ runtime: "opencode",
310
+ source: src,
311
+ target: dst,
312
+ message: needsCopy ? "will sync managed OpenCode command" : "OpenCode managed command already current",
313
+ });
314
+ }
315
+ }
316
+ const agentsSourceDir = path.join(sourceRoot, ".opencode", "agents");
317
+ const agentsTargetDir = path.join(configDir, "agents");
318
+ const OPENCODE_MANAGED_AGENT = "agentera.md";
319
+ if (pathExists(agentsSourceDir)) {
320
+ const src = path.join(agentsSourceDir, OPENCODE_MANAGED_AGENT);
321
+ if (isFile(src)) {
322
+ const dst = path.join(agentsTargetDir, OPENCODE_MANAGED_AGENT);
323
+ const needsCopy = !isFile(dst) || !fs.readFileSync(src).equals(fs.readFileSync(dst));
324
+ items.push({
325
+ status: needsCopy ? "pending" : "noop",
326
+ action: "copy-agent",
327
+ runtime: "opencode",
328
+ source: src,
329
+ target: dst,
330
+ message: needsCopy ? "will copy managed OpenCode Agentera agent" : "OpenCode Agentera agent already current",
331
+ });
332
+ }
333
+ }
334
+ const skillsSourceRoot = path.join(sourceRoot, "skills");
335
+ // D78: ~/.agents/skills is the canonical agent-compatible root (opencode loads
336
+ // from both ~/.config/opencode/skills and ~/.agents/skills and requires skill
337
+ // names unique across locations — opencode.ai/docs/skills). Maintain the link
338
+ // here; the legacy ~/.config/opencode/skills entry is retired below.
339
+ const skillsTargetDir = path.join(home, ".agents", "skills");
340
+ for (const name of OPENCODE_SKILL_NAMES) {
341
+ const src = path.join(skillsSourceRoot, name);
342
+ const dst = path.join(skillsTargetDir, name);
343
+ if (!isFile(path.join(src, "SKILL.md"))) {
344
+ continue;
345
+ }
346
+ if (!pathExists(dst)) {
347
+ items.push({
348
+ status: "pending",
349
+ action: "link-skill",
350
+ runtime: "opencode",
351
+ source: src,
352
+ target: dst,
353
+ message: "will create OpenCode skill link",
354
+ });
355
+ continue;
356
+ }
357
+ try {
358
+ const linkTarget = fs.readlinkSync(dst);
359
+ if (!linkTarget.includes("agentera") && path.basename(linkTarget) !== name) {
360
+ items.push({
361
+ status: "blocked",
362
+ action: "link-skill",
363
+ runtime: "opencode",
364
+ source: src,
365
+ target: dst,
366
+ message: "OpenCode skill path is user-owned; manual review required",
367
+ });
368
+ }
369
+ else if (path.resolve(path.dirname(dst), linkTarget) !== path.resolve(src)) {
370
+ items.push({
371
+ status: "pending",
372
+ action: "link-skill",
373
+ runtime: "opencode",
374
+ source: src,
375
+ target: dst,
376
+ message: "will update stale Agentera-managed OpenCode skill link",
377
+ });
378
+ }
379
+ }
380
+ catch {
381
+ items.push({
382
+ status: "pending",
383
+ action: "link-skill",
384
+ runtime: "opencode",
385
+ source: src,
386
+ target: dst,
387
+ message: "will replace non-symlink OpenCode skill path with managed link",
388
+ });
389
+ }
390
+ }
391
+ // D78: retire the legacy opencode-specific skill symlinks now that
392
+ // ~/.agents/skills is canonical. The opencode doc requires skill names
393
+ // unique across its discovery locations; a skill present in both
394
+ // ~/.config/opencode/skills and ~/.agents/skills is the duplicate-name error
395
+ // that let a stale copy load.
396
+ const legacySkillsDir = path.join(configDir, "skills");
397
+ if (pathExists(legacySkillsDir) && fs.statSync(legacySkillsDir).isDirectory()) {
398
+ for (const name of OPENCODE_SKILL_NAMES) {
399
+ const legacy = path.join(legacySkillsDir, name);
400
+ let linkTarget = null;
401
+ try {
402
+ linkTarget = fs.readlinkSync(legacy);
403
+ }
404
+ catch {
405
+ linkTarget = null;
406
+ }
407
+ if (linkTarget !== null) {
408
+ if (linkTarget.toLowerCase().includes("agentera") || path.basename(linkTarget) === name) {
409
+ items.push({
410
+ status: "pending",
411
+ action: "remove-stale-skill",
412
+ runtime: "opencode",
413
+ source: legacy,
414
+ message: `will retire duplicate OpenCode skill symlink ${name} (agent-compatible root ~/.agents/skills is canonical; D78)`,
415
+ });
416
+ }
417
+ else {
418
+ items.push({
419
+ status: "blocked",
420
+ action: "remove-stale-skill",
421
+ runtime: "opencode",
422
+ source: legacy,
423
+ message: `legacy OpenCode skill symlink ${name} targets a non-agentera path; manual review required`,
424
+ });
425
+ }
426
+ }
427
+ else if (pathExists(legacy)) {
428
+ try {
429
+ const dirEntries = fs.readdirSync(legacy);
430
+ if (dirEntries.length === 0) {
431
+ items.push({
432
+ status: "pending",
433
+ action: "remove-stale-skill",
434
+ runtime: "opencode",
435
+ source: legacy,
436
+ message: `will retire empty legacy OpenCode skill directory ${name} (agent-compatible root ~/.agents/skills is canonical; D78)`,
437
+ });
438
+ }
439
+ else {
440
+ items.push({
441
+ status: "blocked",
442
+ action: "remove-stale-skill",
443
+ runtime: "opencode",
444
+ source: legacy,
445
+ message: `legacy OpenCode skill path ${name} is a non-empty real directory (entries: ${dirEntries.length}); manual review required (D78 retires agentera-managed symlinks and empty dirs only)`,
446
+ });
447
+ }
448
+ }
449
+ catch {
450
+ items.push({
451
+ status: "blocked",
452
+ action: "remove-stale-skill",
453
+ runtime: "opencode",
454
+ source: legacy,
455
+ message: `legacy OpenCode skill path ${name} could not be inspected; manual review required`,
456
+ });
457
+ }
458
+ }
459
+ }
460
+ }
461
+ }
462
+ export function planStaleCommandCleanupItems(ctx, items) {
463
+ const env = ctx.env ?? process.env;
464
+ const home = resolvePath(ctx.home);
465
+ const commandsDir = path.join(opencodeConfigDir(home, env), "commands");
466
+ if (!pathExists(commandsDir) || !fs.statSync(commandsDir).isDirectory()) {
467
+ return;
468
+ }
469
+ const currentNames = new Set(OPENCODE_COMMAND_NAMES);
470
+ for (const entry of fs.readdirSync(commandsDir)) {
471
+ if (!entry.endsWith(".md")) {
472
+ continue;
473
+ }
474
+ const filePath = path.join(commandsDir, entry);
475
+ if (!isFile(filePath)) {
476
+ continue;
477
+ }
478
+ const body = fs.readFileSync(filePath, "utf8");
479
+ if (!hasManagedMarker(body)) {
480
+ continue;
481
+ }
482
+ const name = entry.slice(0, -3);
483
+ if (currentNames.has(name)) {
484
+ continue;
485
+ }
486
+ items.push({
487
+ status: "pending",
488
+ action: "remove-stale-command",
489
+ runtime: "opencode",
490
+ source: filePath,
491
+ message: `will remove stale managed command ${path.basename(filePath)}`,
492
+ });
493
+ }
494
+ }
495
+ export function planStaleSkillCleanupItems(ctx, items) {
496
+ const env = ctx.env ?? process.env;
497
+ const home = resolvePath(ctx.home);
498
+ const skillsDir = path.join(opencodeConfigDir(home, env), "skills");
499
+ if (!pathExists(skillsDir) || !fs.statSync(skillsDir).isDirectory()) {
500
+ return;
501
+ }
502
+ const requiredNames = new Set(OPENCODE_SKILL_NAMES);
503
+ for (const entry of fs.readdirSync(skillsDir, { withFileTypes: true })) {
504
+ if (!entry.isSymbolicLink()) {
505
+ continue;
506
+ }
507
+ const linkPath = path.join(skillsDir, entry.name);
508
+ let linkTarget;
509
+ try {
510
+ linkTarget = fs.readlinkSync(linkPath);
511
+ }
512
+ catch {
513
+ continue;
514
+ }
515
+ if (!linkTarget.toLowerCase().includes("agentera")) {
516
+ continue;
517
+ }
518
+ if (requiredNames.has(entry.name)) {
519
+ continue;
520
+ }
521
+ items.push({
522
+ status: "pending",
523
+ action: "remove-stale-skill",
524
+ runtime: "opencode",
525
+ source: linkPath,
526
+ message: `will remove stale Agentera skill symlink ${entry.name}`,
527
+ });
528
+ }
529
+ }
530
+ function walkJsonHookFiles(dir) {
531
+ if (!pathExists(dir)) {
532
+ return [];
533
+ }
534
+ const out = [];
535
+ const walk = (current) => {
536
+ for (const entry of fs.readdirSync(current)) {
537
+ const full = path.join(current, entry);
538
+ const st = fs.statSync(full);
539
+ if (st.isDirectory()) {
540
+ walk(full);
541
+ }
542
+ else if (entry.endsWith(".json")) {
543
+ out.push(full);
544
+ }
545
+ }
546
+ };
547
+ walk(dir);
548
+ return out;
549
+ }
550
+ function planCopilotItems(items, project, commands) {
551
+ const hooksDir = path.join(project, ".github", "hooks");
552
+ for (const hookFile of walkJsonHookFiles(hooksDir)) {
553
+ pushRewireItem(items, "copilot", hookFile, commands);
554
+ }
555
+ if (!items.some((item) => item.runtime === "copilot")) {
556
+ items.push({
557
+ status: "noop",
558
+ action: "configure",
559
+ runtime: "copilot",
560
+ message: "Copilot uses per-invocation AGENTERA_HOME; Agentera does not write shell startup files",
561
+ });
562
+ }
563
+ }
564
+ function planEnvRuntimeNoops(items, runtime, message) {
565
+ if (!items.some((item) => item.runtime === runtime)) {
566
+ items.push({ status: "noop", action: "configure", runtime, message });
567
+ }
568
+ }
569
+ export function planRuntimeMigrationItems(ctx) {
570
+ if (!ctx.env) {
571
+ throw new Error("MigrationContext.env is required for runtime migration planning; pass sandboxMigrationEnv(home, sourceRoot) in tests or an explicit env in callers.");
572
+ }
573
+ const home = resolvePath(ctx.home);
574
+ const project = resolvePath(ctx.project);
575
+ const env = ctx.env;
576
+ const sourceRoot = resolvePath(ctx.sourceRoot ?? resolveSourceRoot(env));
577
+ const commands = resolveNpxHookCommands({ ...ctx, home, env, sourceRoot });
578
+ const items = [];
579
+ planCodexItems(items, home, project, commands, ctx.force);
580
+ planCursorItems(items, home, project, sourceRoot, commands);
581
+ planOpencodeItems(items, home, sourceRoot, env, commands);
582
+ planStaleCommandCleanupItems(ctx, items);
583
+ planStaleSkillCleanupItems(ctx, items);
584
+ planCopilotItems(items, project, commands);
585
+ const hookRetirement = planInstalledHooksRetirementItems(ctx).filter((item) => item.status === "pending");
586
+ if (hookRetirement.length > 0 && items.some((item) => item.action === "rewire-runtime" && item.status === "pending")) {
587
+ items.push(...hookRetirement);
588
+ }
589
+ planEnvRuntimeNoops(items, "claude", "Claude Code plugin installs expose the app home without local config writes; use --update-packages to refresh marketplace surfaces");
590
+ planEnvRuntimeNoops(items, "cursor-agent", "Cursor Agent CLI inherits workspace Cursor hooks; no separate managed install surface");
591
+ void loadRegistry();
592
+ return items;
593
+ }
594
+ export function applyRuntimeMigrationItem(item, commands) {
595
+ if (item.status !== "pending") {
596
+ return;
597
+ }
598
+ try {
599
+ switch (item.action) {
600
+ case "rewire-runtime": {
601
+ if (!item.target || item.newText === undefined) {
602
+ item.status = "failed";
603
+ item.message = "rewire-runtime missing target or newText";
604
+ return;
605
+ }
606
+ writeFileAtomic(item.target, item.newText, "utf8");
607
+ item.status = "applied";
608
+ item.message = "runtime config rewired to npm self-contained entrypoint";
609
+ break;
610
+ }
611
+ case "copy-plugin":
612
+ case "copy-agent":
613
+ case "copy-command": {
614
+ if (!item.source || !item.target) {
615
+ item.status = "failed";
616
+ item.message = `${item.action} missing source or target`;
617
+ return;
618
+ }
619
+ copyIfChanged(item.source, item.target);
620
+ item.status = "applied";
621
+ item.message = `applied ${item.action}`;
622
+ break;
623
+ }
624
+ case "link-skill": {
625
+ if (!item.source || !item.target) {
626
+ item.status = "failed";
627
+ item.message = "link-skill missing source or target";
628
+ return;
629
+ }
630
+ if (!pathExists(item.source)) {
631
+ item.status = "failed";
632
+ item.message = `link-skill source disappeared between plan and apply: ${item.source}`;
633
+ return;
634
+ }
635
+ fs.mkdirSync(path.dirname(item.target), { recursive: true });
636
+ // lstat (not stat): stat follows symlinks and ENOENTs on dangling links; rmSync then fails.
637
+ let targetStat = null;
638
+ try {
639
+ targetStat = fs.lstatSync(item.target);
640
+ }
641
+ catch {
642
+ /* target absent */
643
+ }
644
+ if (targetStat) {
645
+ if (targetStat.isSymbolicLink()) {
646
+ fs.unlinkSync(item.target);
647
+ }
648
+ else {
649
+ fs.rmSync(item.target, { recursive: true, force: true });
650
+ }
651
+ }
652
+ fs.symlinkSync(item.source, item.target);
653
+ item.status = "applied";
654
+ item.message = "OpenCode skill link created";
655
+ break;
656
+ }
657
+ case "retire-hooks": {
658
+ if (!item.source) {
659
+ item.status = "failed";
660
+ item.message = "retire-hooks missing source";
661
+ return;
662
+ }
663
+ if (isFile(item.source)) {
664
+ fs.rmSync(item.source, { force: true });
665
+ }
666
+ if (item.target && isFile(item.target)) {
667
+ const configText = fs.readFileSync(item.target, "utf8");
668
+ const next = retireCodexCopiedHookTrust(configText, item.source);
669
+ writeFileAtomic(item.target, next, "utf8");
670
+ }
671
+ item.status = "applied";
672
+ item.message = "retired Agentera-owned copied Codex hooks";
673
+ break;
674
+ }
675
+ case "remove-stale-command": {
676
+ if (!item.source) {
677
+ item.status = "failed";
678
+ item.message = "remove-stale-command missing source";
679
+ return;
680
+ }
681
+ if (isFile(item.source)) {
682
+ fs.rmSync(item.source, { force: true });
683
+ item.status = "applied";
684
+ item.message = `removed stale managed command ${path.basename(item.source)}`;
685
+ }
686
+ else {
687
+ item.status = "noop";
688
+ item.message = `stale command already absent at ${item.source}`;
689
+ }
690
+ break;
691
+ }
692
+ case "remove-stale-skill": {
693
+ if (!item.source) {
694
+ item.status = "failed";
695
+ item.message = "remove-stale-skill missing source";
696
+ return;
697
+ }
698
+ try {
699
+ const stat = fs.lstatSync(item.source);
700
+ if (stat.isSymbolicLink()) {
701
+ fs.unlinkSync(item.source);
702
+ item.status = "applied";
703
+ item.message = `removed stale skill symlink ${path.basename(item.source)}`;
704
+ }
705
+ else if (stat.isDirectory()) {
706
+ const entries = fs.readdirSync(item.source);
707
+ if (entries.length === 0) {
708
+ fs.rmdirSync(item.source);
709
+ item.status = "applied";
710
+ item.message = `removed empty skill directory ${path.basename(item.source)}`;
711
+ }
712
+ else {
713
+ item.status = "blocked";
714
+ item.message = `skill directory ${path.basename(item.source)} is non-empty (entries: ${entries.length}); manual review required`;
715
+ }
716
+ }
717
+ else {
718
+ item.status = "noop";
719
+ item.message = "skill path is not a symlink or directory; skipped";
720
+ }
721
+ }
722
+ catch {
723
+ item.status = "noop";
724
+ item.message = "stale skill already absent";
725
+ }
726
+ break;
727
+ }
728
+ default:
729
+ break;
730
+ }
731
+ }
732
+ catch (exc) {
733
+ item.status = "failed";
734
+ item.message = `${item.action} failed: ${exc.message}`;
735
+ }
736
+ }
737
+ export function applyRuntimeMigrationItems(items, ctx) {
738
+ const commands = resolveNpxHookCommands(ctx);
739
+ for (const item of items) {
740
+ applyRuntimeMigrationItem(item, commands);
741
+ }
742
+ applyInstalledHooksRetirementItems(items, ctx);
743
+ }
744
+ //# sourceMappingURL=runtimeMigration.js.map