agentera 3.0.0-dev.6 → 3.0.0-dev.69

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 (696) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +118 -22
  3. package/bundle/CHANGELOG.md +1361 -0
  4. package/bundle/DESIGN.md +229 -0
  5. package/bundle/LICENSE +201 -0
  6. package/bundle/README.md +143 -0
  7. package/bundle/UPGRADE.md +252 -0
  8. package/bundle/extract-corpus-parity.json +21 -0
  9. package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
  10. package/bundle/references/adapters/package-publication.json +488 -0
  11. package/bundle/references/adapters/package-registry.yaml +435 -188
  12. package/bundle/references/adapters/package-surface-characterization.md +66 -34
  13. package/bundle/references/adapters/runtime-lifecycle-adapters.yaml +74 -0
  14. package/bundle/references/adapters/runtime-lifecycle-authority.yaml +62 -0
  15. package/bundle/references/adapters/runtime-lifecycle-operation-contract.yaml +84 -0
  16. package/bundle/references/adapters/runtime-retired-resources.yaml +333 -0
  17. package/bundle/references/analysis/evidence-tier-authority.yaml +518 -0
  18. package/bundle/references/analysis/verification-policy.yaml +266 -0
  19. package/bundle/references/artifacts/artifact-registry-interface-model.yaml +20 -10
  20. package/bundle/references/artifacts/glossary-entry-contract.yaml +1254 -0
  21. package/bundle/references/artifacts/state-storage-authority.yaml +3061 -0
  22. package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
  23. package/bundle/references/cli/app-lifecycle-vocabulary.yaml +7 -8
  24. package/bundle/references/cli/capability-instruction-contract.yaml +11 -14
  25. package/bundle/references/cli/hybrid-route-contract.yaml +438 -0
  26. package/bundle/references/cli/routing-model.md +155 -0
  27. package/bundle/references/cli/trigger-schema-enrichment.md +147 -0
  28. package/bundle/references/cli/update-channels.yaml +19 -2
  29. package/bundle/references/cli/vocabulary-index.yaml +20 -17
  30. package/bundle/references/cli/vocabulary.md +325 -362
  31. package/bundle/references/meta/retained-reference-authority.yaml +151 -0
  32. package/bundle/registry.json +13 -13
  33. package/bundle/skills/agentera/SKILL.md +226 -422
  34. package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +84 -0
  35. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/exit.yaml +2 -2
  36. package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +25 -0
  37. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/validation.yaml +37 -18
  38. package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +103 -0
  39. package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/exit.yaml +8 -6
  40. package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +27 -0
  41. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +184 -0
  42. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/artifacts.yaml +12 -12
  43. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/exit.yaml +5 -5
  44. package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +16 -0
  45. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/validation.yaml +7 -7
  46. package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +51 -0
  47. package/bundle/skills/agentera/capabilities/{resonera → discuss}/schemas/exit.yaml +2 -2
  48. package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +20 -0
  49. package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +144 -0
  50. package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +80 -0
  51. package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +16 -0
  52. package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/validation.yaml +18 -18
  53. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/artifacts.yaml +18 -18
  54. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/exit.yaml +2 -2
  55. package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +16 -0
  56. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/validation.yaml +9 -9
  57. package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +76 -0
  58. package/bundle/skills/agentera/capabilities/{orkestrera → orchestrate}/schemas/exit.yaml +9 -7
  59. package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +23 -0
  60. package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +121 -0
  61. package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +66 -0
  62. package/bundle/skills/agentera/capabilities/{planera → plan}/schemas/exit.yaml +2 -2
  63. package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +23 -0
  64. package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +121 -0
  65. package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +23 -0
  66. package/bundle/skills/agentera/capabilities/{profilera → profile}/schemas/exit.yaml +6 -5
  67. package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +20 -0
  68. package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +115 -0
  69. package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +24 -0
  70. package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +16 -0
  71. package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/validation.yaml +2 -2
  72. package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +73 -0
  73. package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +22 -0
  74. package/bundle/skills/agentera/capabilities/{hej → status}/schemas/validation.yaml +5 -5
  75. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/artifacts.yaml +16 -16
  76. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/exit.yaml +7 -6
  77. package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +23 -0
  78. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/validation.yaml +18 -20
  79. package/bundle/skills/agentera/capability_schema_contract.yaml +178 -34
  80. package/bundle/skills/agentera/protocol.yaml +31 -31
  81. package/bundle/skills/agentera/route-phrases.yaml +81 -0
  82. package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +5 -4
  83. package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +39 -21
  84. package/bundle/skills/agentera/schemas/artifacts/design.yaml +5 -4
  85. package/bundle/skills/agentera/schemas/artifacts/docs.yaml +15 -19
  86. package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +145 -14
  87. package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +82 -0
  88. package/bundle/skills/agentera/schemas/artifacts/health.yaml +58 -21
  89. package/bundle/skills/agentera/schemas/artifacts/objective.yaml +22 -8
  90. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +461 -36
  91. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +133 -20
  92. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +342 -42
  93. package/bundle/skills/agentera/schemas/artifacts/vision.yaml +3 -3
  94. package/dist/analytics/extractCorpus/cli.js +101 -12
  95. package/dist/analytics/extractCorpus/copilotSessions.js +53 -9
  96. package/dist/analytics/extractCorpus/core.js +59 -24
  97. package/dist/analytics/extractCorpus/corpus.js +58 -23
  98. package/dist/analytics/extractCorpus/coverageAudit.js +260 -0
  99. package/dist/analytics/extractCorpus/cursorSessions.js +12 -7
  100. package/dist/analytics/extractCorpus/evidenceTiers.js +603 -0
  101. package/dist/analytics/extractCorpus/extractCorpusParity.js +105 -0
  102. package/dist/analytics/extractCorpus/filesystemSources.js +1 -5
  103. package/dist/analytics/extractCorpus/index.js +6 -1
  104. package/dist/analytics/extractCorpus/jsonlSessions.js +24 -5
  105. package/dist/analytics/extractCorpus/sqliteCaps.js +43 -0
  106. package/dist/analytics/extractCorpus/sqliteSessions.js +98 -6
  107. package/dist/analytics/extractCorpus/tierReader.js +108 -0
  108. package/dist/analytics/extractCorpus.js +0 -1
  109. package/dist/analytics/glossaryAdviceResolution.js +166 -0
  110. package/dist/analytics/glossaryInputAcquisition.js +319 -0
  111. package/dist/analytics/personalGlossaryAdmission.js +133 -0
  112. package/dist/analytics/personalGlossaryProfile.js +219 -0
  113. package/dist/analytics/profileSignals.js +211 -0
  114. package/dist/analytics/usageStats.js +169 -42
  115. package/dist/audit/terminologyDrift.js +281 -0
  116. package/dist/bin/agentera.js +3 -2
  117. package/dist/capabilities/audit/instructions.js +16 -0
  118. package/dist/capabilities/build/instructions.js +59 -0
  119. package/dist/capabilities/design/instructions.js +4 -0
  120. package/dist/capabilities/discuss/instructions.js +29 -0
  121. package/dist/capabilities/document/instructions.js +11 -0
  122. package/dist/capabilities/index.js +29 -27
  123. package/dist/capabilities/optimize/instructions.js +14 -0
  124. package/dist/capabilities/orchestrate/instructions.js +42 -0
  125. package/dist/capabilities/plan/instructions.js +33 -0
  126. package/dist/capabilities/profile/instructions.js +70 -0
  127. package/dist/capabilities/research/instructions.js +5 -0
  128. package/dist/capabilities/status/instructions.js +15 -0
  129. package/dist/capabilities/status/startupInstructions.js +34 -0
  130. package/dist/capabilities/vision/instructions.js +4 -0
  131. package/dist/cli/appContext.js +30 -24
  132. package/dist/cli/argvalidate.js +0 -1
  133. package/dist/cli/capabilityContext/benchmark.js +25 -17
  134. package/dist/cli/capabilityContext/bespoke.js +31 -12
  135. package/dist/cli/capabilityContext/build.js +251 -0
  136. package/dist/cli/capabilityContext/closeout.js +33 -30
  137. package/dist/cli/capabilityContext/contract.js +39 -46
  138. package/dist/cli/capabilityContext/evidence.js +90 -73
  139. package/dist/cli/capabilityContext/index.js +1 -2
  140. package/dist/cli/capabilityContext/orchestration.js +45 -21
  141. package/dist/cli/capabilityContext/planState.js +93 -100
  142. package/dist/cli/capabilityContext/progress.js +60 -14
  143. package/dist/cli/capabilityContext/projectVerification.js +409 -0
  144. package/dist/cli/capabilityContext/shared.js +9 -20
  145. package/dist/cli/capabilityContext/slim.js +56 -10
  146. package/dist/cli/capabilityContext/startup.js +57 -115
  147. package/dist/cli/capabilityContext/startupAggregation.js +68 -0
  148. package/dist/cli/capabilityContext/types.js +37 -24
  149. package/dist/cli/capabilityContext.js +1 -2
  150. package/dist/cli/commands/appHome.js +22 -0
  151. package/dist/cli/commands/capability.js +4 -4
  152. package/dist/cli/commands/compact.js +163 -13
  153. package/dist/cli/commands/doctor.js +122 -114
  154. package/dist/cli/commands/durability.js +81 -0
  155. package/dist/cli/commands/glossaryAdvice.js +138 -0
  156. package/dist/cli/commands/lint.js +22 -8
  157. package/dist/cli/commands/personalGlossary.js +176 -0
  158. package/dist/cli/commands/prime/briefOrientation.js +746 -0
  159. package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
  160. package/dist/cli/commands/prime/bundleStatus.js +190 -0
  161. package/dist/cli/commands/prime/collectEntityOrientation.js +326 -0
  162. package/dist/cli/commands/prime/collectOrientationState.js +219 -0
  163. package/dist/cli/commands/prime/orientationOutput.js +421 -0
  164. package/dist/cli/commands/prime/types.js +1 -0
  165. package/dist/cli/commands/prime/v1Migration.js +38 -0
  166. package/dist/cli/commands/prime.js +80 -558
  167. package/dist/cli/commands/profileGrounding.js +55 -0
  168. package/dist/cli/commands/query.js +77 -52
  169. package/dist/cli/commands/report.js +88 -26
  170. package/dist/cli/commands/route.js +142 -0
  171. package/dist/cli/commands/schema.js +266 -142
  172. package/dist/cli/commands/state/decisions.js +51 -61
  173. package/dist/cli/commands/state/docs.js +63 -86
  174. package/dist/cli/commands/state/experimentRecords.js +151 -0
  175. package/dist/cli/commands/state/experiments.js +11 -64
  176. package/dist/cli/commands/state/get.js +129 -0
  177. package/dist/cli/commands/state/health.js +11 -111
  178. package/dist/cli/commands/state/index.js +6 -41
  179. package/dist/cli/commands/state/list.js +194 -0
  180. package/dist/cli/commands/state/objective.js +21 -64
  181. package/dist/cli/commands/state/plan.js +11 -169
  182. package/dist/cli/commands/state/planTasks.js +154 -0
  183. package/dist/cli/commands/state/plans.js +154 -0
  184. package/dist/cli/commands/state/progress.js +11 -45
  185. package/dist/cli/commands/state/shared.js +0 -1
  186. package/dist/cli/commands/state/todo.js +29 -108
  187. package/dist/cli/commands/state/write.js +433 -0
  188. package/dist/cli/commands/upgrade.js +146 -5
  189. package/dist/cli/commands/upgradeVerify.js +118 -0
  190. package/dist/cli/commands/validate.js +246 -211
  191. package/dist/cli/commands/verify.js +24 -9
  192. package/dist/cli/contracts/bundleStatus.js +1 -0
  193. package/dist/cli/contracts/orientationState.js +1 -0
  194. package/dist/cli/dispatch/argvParser.js +32 -0
  195. package/dist/cli/dispatch/check.js +94 -50
  196. package/dist/cli/dispatch/commands.js +27 -0
  197. package/dist/cli/dispatch/index.js +82 -52
  198. package/dist/cli/dispatch/lifecycle.js +268 -108
  199. package/dist/cli/dispatch/prime.js +68 -29
  200. package/dist/cli/dispatch/projections.js +17 -0
  201. package/dist/cli/dispatch/shared.js +1 -2
  202. package/dist/cli/dispatch/state.js +68 -77
  203. package/dist/cli/dispatch.js +0 -1
  204. package/dist/cli/errors.js +16 -17
  205. package/dist/cli/help.js +395 -41
  206. package/dist/cli/migrationRequired.js +122 -0
  207. package/dist/cli/orientation/attention.js +61 -0
  208. package/dist/cli/orientation/corpusCoverage.js +102 -0
  209. package/dist/cli/orientation.js +438 -170
  210. package/dist/cli/planArtifacts.js +350 -0
  211. package/dist/cli/planEvidence.js +157 -0
  212. package/dist/cli/planLifecycleState.js +36 -0
  213. package/dist/cli/planTaskIndex.js +11 -0
  214. package/dist/cli/preCutoverCommand.js +32 -0
  215. package/dist/cli/prime-blob.js +71 -3
  216. package/dist/cli/profileAcquisition.js +167 -0
  217. package/dist/cli/startupCompletenessContract.js +59 -0
  218. package/dist/cli/stateQuery.js +56 -14
  219. package/dist/cli/structured.js +0 -1
  220. package/dist/cli/todoMarkdown.js +25 -12
  221. package/dist/cli/todoReadinessSelection.js +192 -0
  222. package/dist/cli/todoSeverity.js +18 -0
  223. package/dist/core/atomicWriter.js +20 -0
  224. package/dist/core/developmentChannel.js +1 -0
  225. package/dist/core/developmentInvocation.js +374 -0
  226. package/dist/core/difflib.js +0 -1
  227. package/dist/core/envPaths.js +20 -0
  228. package/dist/core/jsonValue.js +5 -0
  229. package/dist/core/paths.js +0 -1
  230. package/dist/core/pyjson.js +67 -3
  231. package/dist/core/shell.js +4 -0
  232. package/dist/core/skillIdentity.js +23 -0
  233. package/dist/core/sourceRoot.js +9 -12
  234. package/dist/core/text.js +10 -0
  235. package/dist/core/toml.js +0 -1
  236. package/dist/core/yaml.js +8 -1
  237. package/dist/eval/evalSkills.js +30 -26
  238. package/dist/eval/hybridRouteEvaluation.js +155 -0
  239. package/dist/eval/semanticEval.js +43 -20
  240. package/dist/eval/semanticFixtures.js +16 -5
  241. package/dist/hooks/common.js +3 -56
  242. package/dist/hooks/compaction/apply.js +252 -50
  243. package/dist/hooks/compaction/dryRun.js +7 -4
  244. package/dist/hooks/compaction/index.js +5 -6
  245. package/dist/hooks/compaction/parse.js +201 -5
  246. package/dist/hooks/compaction/retention.js +30 -25
  247. package/dist/hooks/compaction/status.js +149 -32
  248. package/dist/hooks/compaction/types.js +0 -1
  249. package/dist/hooks/validateArtifact/agentFacing.js +0 -1
  250. package/dist/hooks/validateArtifact/index.js +7 -64
  251. package/dist/hooks/validateArtifact/markdown.js +57 -7
  252. package/dist/hooks/validateArtifact/schema.js +110 -19
  253. package/dist/hooks/validateArtifact/traversal.js +13 -11
  254. package/dist/hooks/validateArtifact/violations.js +7 -5
  255. package/dist/migrate/v2HandoffManifest.js +127 -8
  256. package/dist/registries/activationContract.js +2 -0
  257. package/dist/registries/activationTuples.js +108 -0
  258. package/dist/registries/artifactProtocolIds.js +2 -1
  259. package/dist/registries/artifactRegistry.js +224 -63
  260. package/dist/registries/artifactSchemaProjection.js +45 -0
  261. package/dist/registries/capabilityContract.js +129 -2
  262. package/dist/registries/evaluatorHandoffContract.js +2 -3
  263. package/dist/registries/evidenceTierContract.js +371 -0
  264. package/dist/registries/glossaryAdviceContract.js +79 -0
  265. package/dist/registries/glossaryCaveatContract.js +67 -0
  266. package/dist/registries/glossaryConsumerContractValidation.js +787 -0
  267. package/dist/registries/glossaryEntryContract.js +757 -0
  268. package/dist/registries/glossaryTermIdentity.js +17 -0
  269. package/dist/registries/glossaryTermOccurrence.js +20 -0
  270. package/dist/registries/hybridRoute.js +274 -0
  271. package/dist/registries/hybridRouteReceipt.js +221 -0
  272. package/dist/registries/packagePublication.js +273 -0
  273. package/dist/registries/packageRegistry.js +187 -211
  274. package/dist/registries/todoReadinessContract.js +448 -0
  275. package/dist/registries/triggerLoader.js +174 -0
  276. package/dist/registries/verbosityBudgetContract.js +205 -0
  277. package/dist/release/releaseMetadata.js +156 -6
  278. package/dist/runtime/lifecycleAdapterContract.js +457 -0
  279. package/dist/runtime/lifecycleAdapters.js +777 -0
  280. package/dist/runtime/lifecycleAuthority.js +453 -0
  281. package/dist/runtime/lifecycleOperationContract.js +123 -0
  282. package/dist/runtime/lifecycleOperations.js +634 -0
  283. package/dist/runtime/lifecycleOwnershipJournal.js +622 -0
  284. package/dist/runtime/lifecyclePublication.js +415 -0
  285. package/dist/runtime/lifecycleSnapshot.js +438 -0
  286. package/dist/runtime/nativeResourceCleanup.js +502 -0
  287. package/dist/setup/opencode.js +20 -13
  288. package/dist/setup/opencodeConstants.js +1 -0
  289. package/dist/setup/sharedSkill.js +45 -0
  290. package/dist/setup/smokeChecks.js +21 -82
  291. package/dist/state/archiveDiscovery.js +580 -0
  292. package/dist/state/archivePublication.js +225 -0
  293. package/dist/state/archiveRecovery.js +237 -0
  294. package/dist/state/archiveReplay.js +53 -0
  295. package/dist/state/canonicalMigrationRecord.js +36 -0
  296. package/dist/state/changelog.js +221 -0
  297. package/dist/state/decisionEntities.js +367 -0
  298. package/dist/state/decisionLegacyValidation.js +215 -0
  299. package/dist/state/decisionMigrationProvenance.js +199 -0
  300. package/dist/state/decisionOverlay.js +254 -0
  301. package/dist/state/decisionRevision.js +256 -0
  302. package/dist/state/decisionRevisionMigration.js +89 -0
  303. package/dist/state/directRetrieval.js +323 -0
  304. package/dist/state/durability.js +324 -0
  305. package/dist/state/entityCutover.js +459 -0
  306. package/dist/state/entityCutoverGit.js +127 -0
  307. package/dist/state/entityGlossaryAuthority.js +13 -0
  308. package/dist/state/entityListProjection.js +187 -0
  309. package/dist/state/entityListRuntimeRegistry.js +85 -0
  310. package/dist/state/entityMigrationCausality.js +97 -0
  311. package/dist/state/entityMigrationIdentity.js +5 -0
  312. package/dist/state/entityMigrationPreview.js +840 -0
  313. package/dist/state/entityMigrationTodo.js +133 -0
  314. package/dist/state/entityPublicationContext.js +859 -0
  315. package/dist/state/entityRetrievalHelp.js +506 -0
  316. package/dist/state/entityStorage.js +899 -0
  317. package/dist/state/exactReplacementRecovery.js +18 -0
  318. package/dist/state/experimentArchive.js +63 -0
  319. package/dist/state/experimentIdentity.js +202 -0
  320. package/dist/state/healthEntities.js +262 -0
  321. package/dist/state/healthEntityValidation.js +18 -0
  322. package/dist/state/healthRepair.js +69 -0
  323. package/dist/state/installRoot.js +64 -25
  324. package/dist/state/legacyEntityCutoverEvidence.js +65 -0
  325. package/dist/state/legacyIdentity.js +47 -0
  326. package/dist/state/legacySummaryRecord.js +6 -0
  327. package/dist/state/listAccounting.js +54 -0
  328. package/dist/state/listClassification.js +17 -0
  329. package/dist/state/listCursor.js +42 -0
  330. package/dist/state/listRetrieval.js +781 -0
  331. package/dist/state/migrationSourceBinding.js +30 -0
  332. package/dist/state/objectiveExperimentEntities.js +322 -0
  333. package/dist/state/planEntities.js +1027 -0
  334. package/dist/state/planIdentity.js +47 -0
  335. package/dist/state/planLineageValidation.js +52 -0
  336. package/dist/state/planReplacementTransaction.js +475 -0
  337. package/dist/state/planRetrieval.js +313 -0
  338. package/dist/state/planTaskRetrieval.js +294 -0
  339. package/dist/state/progressEntities.js +512 -0
  340. package/dist/state/progressGlossaryCaveat.js +168 -0
  341. package/dist/state/progressPublicationOrder.js +19 -0
  342. package/dist/state/progressWritePolicy.js +33 -0
  343. package/dist/state/projectRoot.js +62 -0
  344. package/dist/state/projectionPolicy.js +190 -0
  345. package/dist/state/retrievalAuthority.js +156 -0
  346. package/dist/state/safeProjectFile.js +155 -0
  347. package/dist/state/startupAnalysis/benchmark.js +92 -27
  348. package/dist/state/startupAnalysis/contract.js +48 -10
  349. package/dist/state/startupAnalysis/helpers.js +27 -73
  350. package/dist/state/startupAnalysis/index.js +0 -1
  351. package/dist/state/startupAnalysis/metrics.js +25 -19
  352. package/dist/state/startupAnalysis/records.js +13 -10
  353. package/dist/state/startupAnalysis/report.js +26 -38
  354. package/dist/state/startupAnalysis/threshold.js +19 -7
  355. package/dist/state/startupAnalysis.js +0 -1
  356. package/dist/state/startupProjection.js +499 -0
  357. package/dist/state/stateMode.js +222 -0
  358. package/dist/state/stateStorageAuthority.js +47 -0
  359. package/dist/state/summaryEntityRead.js +25 -0
  360. package/dist/state/summaryMigrationProvenance.js +66 -0
  361. package/dist/state/summarySourceRowAuthority.js +36 -0
  362. package/dist/state/todoActivationSafety.js +58 -0
  363. package/dist/state/todoDocsEntities.js +1124 -0
  364. package/dist/state/todoDocsEntityValidation.js +158 -0
  365. package/dist/state/todoMarkdownProjection.js +51 -0
  366. package/dist/state/todoReconciliationActivation.js +182 -0
  367. package/dist/state/todoReconciliationInspection.js +171 -0
  368. package/dist/state/todoReconciliationRepair.js +318 -0
  369. package/dist/state/todoReconciliationTransaction.js +595 -0
  370. package/dist/state/write/assign.js +20 -0
  371. package/dist/state/write/candidateMutation.js +269 -0
  372. package/dist/state/write/errors.js +11 -0
  373. package/dist/state/write/experimentPublication.js +192 -0
  374. package/dist/state/write/explain.js +377 -0
  375. package/dist/state/write/fields.js +61 -0
  376. package/dist/state/write/glossaryPublication.js +263 -0
  377. package/dist/state/write/grammar.js +285 -0
  378. package/dist/state/write/helpers.js +29 -0
  379. package/dist/state/write/index.js +12 -0
  380. package/dist/state/write/input.js +391 -0
  381. package/dist/state/write/lock.js +837 -0
  382. package/dist/state/write/mutation.js +234 -0
  383. package/dist/state/write/operations.js +170 -0
  384. package/dist/state/write/planEvaluation.js +128 -0
  385. package/dist/state/write/planPublication.js +179 -0
  386. package/dist/state/write/runtimeOperations.js +146 -0
  387. package/dist/state/write/serialize.js +1 -0
  388. package/dist/state/write/transaction.js +57 -0
  389. package/dist/state/write/validate.js +7 -0
  390. package/dist/upgrade/appContentRefresh.js +383 -0
  391. package/dist/upgrade/appModel.js +8 -7
  392. package/dist/upgrade/atomicWriter.js +1 -0
  393. package/dist/upgrade/bundleEvidence.js +33 -0
  394. package/dist/upgrade/channels.js +12 -8
  395. package/dist/upgrade/compatibility.js +56 -21
  396. package/dist/upgrade/doctor.js +165 -199
  397. package/dist/upgrade/doctorClassifier.js +187 -0
  398. package/dist/upgrade/installedHooksRetirement.js +196 -0
  399. package/dist/upgrade/legacyAgentCleanup.js +282 -0
  400. package/dist/upgrade/lifecycleUpgrade.js +113 -0
  401. package/dist/upgrade/migrateArtifactsV2ToV3.js +375 -79
  402. package/dist/upgrade/migrationPublication.js +122 -0
  403. package/dist/upgrade/nextMajorDoctor.js +29 -10
  404. package/dist/upgrade/npxPlatformStatus.js +22 -0
  405. package/dist/upgrade/projectIntegration.js +145 -189
  406. package/dist/upgrade/projectIntegrationDecision.js +50 -0
  407. package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
  408. package/dist/upgrade/runtimeMigration.js +272 -373
  409. package/dist/upgrade/upgradeCommands.js +14 -1
  410. package/dist/upgrade/upgradeLock.js +85 -0
  411. package/dist/upgrade/upgradeOrchestrator.js +263 -59
  412. package/dist/upgrade/v3CapabilitySurface.js +2 -3
  413. package/dist/upgrade/versionResolution.js +2 -3
  414. package/dist/validate/activationArtifactEvidence.js +852 -0
  415. package/dist/validate/activationArtifactEvidenceTypes.js +12 -0
  416. package/dist/validate/activationConjunction.js +816 -0
  417. package/dist/validate/activationEvidenceManifest.js +531 -0
  418. package/dist/validate/activationPackageSemantics.js +29 -0
  419. package/dist/validate/appHomeContract.js +2 -8
  420. package/dist/validate/bootstrapAuthority.js +44 -0
  421. package/dist/validate/capability.js +133 -12
  422. package/dist/validate/crossCapability.js +15 -10
  423. package/dist/validate/retainedReferenceAuthority.js +879 -0
  424. package/dist/validate/selfAudit.js +39 -45
  425. package/dist/validate/v1LegacyCruft.js +131 -0
  426. package/dist/validate/vocabularyAuthority.js +18 -13
  427. package/package.json +60 -29
  428. package/bundle/references/adapters/cursor.md +0 -213
  429. package/bundle/references/adapters/opencode.md +0 -530
  430. package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
  431. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
  432. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  433. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -548
  434. package/bundle/references/adapters/runtime-feature-parity.md +0 -189
  435. package/bundle/references/analysis/benchmark.md +0 -267
  436. package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
  437. package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
  438. package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -369
  439. package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -250
  440. package/bundle/references/cli/capability-tool-classification.yaml +0 -53
  441. package/bundle/references/cli/coexistence-probe.yaml +0 -9
  442. package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
  443. package/bundle/references/cli/single-name-protocol.yaml +0 -42
  444. package/bundle/references/cli/upgrade-repair-wording.md +0 -31
  445. package/bundle/references/cli/v3-handoff-manifest.schema.yaml +0 -98
  446. package/bundle/references/meta/documentation-inventory.md +0 -49
  447. package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
  448. package/bundle/skills/agentera/agents/dokumentera.toml +0 -6
  449. package/bundle/skills/agentera/agents/hej.toml +0 -6
  450. package/bundle/skills/agentera/agents/inspektera.toml +0 -6
  451. package/bundle/skills/agentera/agents/inspirera.toml +0 -6
  452. package/bundle/skills/agentera/agents/optimera.toml +0 -6
  453. package/bundle/skills/agentera/agents/orkestrera.toml +0 -6
  454. package/bundle/skills/agentera/agents/planera.toml +0 -6
  455. package/bundle/skills/agentera/agents/profilera.toml +0 -6
  456. package/bundle/skills/agentera/agents/realisera.toml +0 -6
  457. package/bundle/skills/agentera/agents/resonera.toml +0 -6
  458. package/bundle/skills/agentera/agents/visionera.toml +0 -6
  459. package/bundle/skills/agentera/agents/visualisera.toml +0 -6
  460. package/bundle/skills/agentera/capabilities/dokumentera/schemas/artifacts.yaml +0 -73
  461. package/bundle/skills/agentera/capabilities/dokumentera/schemas/triggers.yaml +0 -35
  462. package/bundle/skills/agentera/capabilities/hej/schemas/artifacts.yaml +0 -69
  463. package/bundle/skills/agentera/capabilities/hej/schemas/triggers.yaml +0 -58
  464. package/bundle/skills/agentera/capabilities/inspektera/schemas/artifacts.yaml +0 -76
  465. package/bundle/skills/agentera/capabilities/inspektera/schemas/triggers.yaml +0 -38
  466. package/bundle/skills/agentera/capabilities/inspirera/schemas/artifacts.yaml +0 -24
  467. package/bundle/skills/agentera/capabilities/inspirera/schemas/triggers.yaml +0 -34
  468. package/bundle/skills/agentera/capabilities/optimera/schemas/triggers.yaml +0 -39
  469. package/bundle/skills/agentera/capabilities/orkestrera/schemas/artifacts.yaml +0 -64
  470. package/bundle/skills/agentera/capabilities/orkestrera/schemas/triggers.yaml +0 -42
  471. package/bundle/skills/agentera/capabilities/orkestrera/schemas/validation.yaml +0 -120
  472. package/bundle/skills/agentera/capabilities/planera/schemas/artifacts.yaml +0 -62
  473. package/bundle/skills/agentera/capabilities/planera/schemas/triggers.yaml +0 -34
  474. package/bundle/skills/agentera/capabilities/planera/schemas/validation.yaml +0 -61
  475. package/bundle/skills/agentera/capabilities/profilera/schemas/artifacts.yaml +0 -18
  476. package/bundle/skills/agentera/capabilities/profilera/schemas/triggers.yaml +0 -45
  477. package/bundle/skills/agentera/capabilities/profilera/schemas/validation.yaml +0 -57
  478. package/bundle/skills/agentera/capabilities/realisera/schemas/artifacts.yaml +0 -80
  479. package/bundle/skills/agentera/capabilities/realisera/schemas/triggers.yaml +0 -39
  480. package/bundle/skills/agentera/capabilities/realisera/schemas/validation.yaml +0 -110
  481. package/bundle/skills/agentera/capabilities/resonera/schemas/artifacts.yaml +0 -47
  482. package/bundle/skills/agentera/capabilities/resonera/schemas/triggers.yaml +0 -46
  483. package/bundle/skills/agentera/capabilities/resonera/schemas/validation.yaml +0 -77
  484. package/bundle/skills/agentera/capabilities/visionera/schemas/triggers.yaml +0 -41
  485. package/bundle/skills/agentera/capabilities/visualisera/schemas/triggers.yaml +0 -33
  486. package/bundle/skills/agentera/references/contract.md +0 -1039
  487. package/dist/analytics/extractCorpus/cli.js.map +0 -1
  488. package/dist/analytics/extractCorpus/copilotSessions.js.map +0 -1
  489. package/dist/analytics/extractCorpus/core.js.map +0 -1
  490. package/dist/analytics/extractCorpus/corpus.js.map +0 -1
  491. package/dist/analytics/extractCorpus/cursorSessions.js.map +0 -1
  492. package/dist/analytics/extractCorpus/filesystemSources.js.map +0 -1
  493. package/dist/analytics/extractCorpus/index.js.map +0 -1
  494. package/dist/analytics/extractCorpus/jsonlSessions.js.map +0 -1
  495. package/dist/analytics/extractCorpus/sqliteSessions.js.map +0 -1
  496. package/dist/analytics/extractCorpus.js.map +0 -1
  497. package/dist/analytics/usageStats.js.map +0 -1
  498. package/dist/bin/agentera.js.map +0 -1
  499. package/dist/capabilities/dokumentera/instructions.js +0 -6
  500. package/dist/capabilities/dokumentera/instructions.js.map +0 -1
  501. package/dist/capabilities/hej/instructions.js +0 -6
  502. package/dist/capabilities/hej/instructions.js.map +0 -1
  503. package/dist/capabilities/index.js.map +0 -1
  504. package/dist/capabilities/inspektera/instructions.js +0 -6
  505. package/dist/capabilities/inspektera/instructions.js.map +0 -1
  506. package/dist/capabilities/inspirera/instructions.js +0 -6
  507. package/dist/capabilities/inspirera/instructions.js.map +0 -1
  508. package/dist/capabilities/optimera/instructions.js +0 -6
  509. package/dist/capabilities/optimera/instructions.js.map +0 -1
  510. package/dist/capabilities/orkestrera/instructions.js +0 -6
  511. package/dist/capabilities/orkestrera/instructions.js.map +0 -1
  512. package/dist/capabilities/planera/instructions.js +0 -6
  513. package/dist/capabilities/planera/instructions.js.map +0 -1
  514. package/dist/capabilities/profilera/instructions.js +0 -6
  515. package/dist/capabilities/profilera/instructions.js.map +0 -1
  516. package/dist/capabilities/realisera/instructions.js +0 -6
  517. package/dist/capabilities/realisera/instructions.js.map +0 -1
  518. package/dist/capabilities/resonera/instructions.js +0 -6
  519. package/dist/capabilities/resonera/instructions.js.map +0 -1
  520. package/dist/capabilities/visionera/instructions.js +0 -6
  521. package/dist/capabilities/visionera/instructions.js.map +0 -1
  522. package/dist/capabilities/visualisera/instructions.js +0 -6
  523. package/dist/capabilities/visualisera/instructions.js.map +0 -1
  524. package/dist/cli/appContext.js.map +0 -1
  525. package/dist/cli/argvalidate.js.map +0 -1
  526. package/dist/cli/capabilityContext/benchmark.js.map +0 -1
  527. package/dist/cli/capabilityContext/bespoke.js.map +0 -1
  528. package/dist/cli/capabilityContext/closeout.js.map +0 -1
  529. package/dist/cli/capabilityContext/contract.js.map +0 -1
  530. package/dist/cli/capabilityContext/evidence.js.map +0 -1
  531. package/dist/cli/capabilityContext/index.js.map +0 -1
  532. package/dist/cli/capabilityContext/orchestration.js.map +0 -1
  533. package/dist/cli/capabilityContext/planState.js.map +0 -1
  534. package/dist/cli/capabilityContext/progress.js.map +0 -1
  535. package/dist/cli/capabilityContext/realisera.js +0 -174
  536. package/dist/cli/capabilityContext/realisera.js.map +0 -1
  537. package/dist/cli/capabilityContext/shared.js.map +0 -1
  538. package/dist/cli/capabilityContext/slim.js.map +0 -1
  539. package/dist/cli/capabilityContext/startup.js.map +0 -1
  540. package/dist/cli/capabilityContext/types.js.map +0 -1
  541. package/dist/cli/capabilityContext.js.map +0 -1
  542. package/dist/cli/commands/backfill.js +0 -84
  543. package/dist/cli/commands/backfill.js.map +0 -1
  544. package/dist/cli/commands/capability.js.map +0 -1
  545. package/dist/cli/commands/compact.js.map +0 -1
  546. package/dist/cli/commands/doctor.js.map +0 -1
  547. package/dist/cli/commands/lint.js.map +0 -1
  548. package/dist/cli/commands/prime.js.map +0 -1
  549. package/dist/cli/commands/query.js.map +0 -1
  550. package/dist/cli/commands/report.js.map +0 -1
  551. package/dist/cli/commands/schema.js.map +0 -1
  552. package/dist/cli/commands/state/decisions.js.map +0 -1
  553. package/dist/cli/commands/state/docs.js.map +0 -1
  554. package/dist/cli/commands/state/experiments.js.map +0 -1
  555. package/dist/cli/commands/state/health.js.map +0 -1
  556. package/dist/cli/commands/state/index.js.map +0 -1
  557. package/dist/cli/commands/state/objective.js.map +0 -1
  558. package/dist/cli/commands/state/plan.js.map +0 -1
  559. package/dist/cli/commands/state/progress.js.map +0 -1
  560. package/dist/cli/commands/state/shared.js.map +0 -1
  561. package/dist/cli/commands/state/todo.js.map +0 -1
  562. package/dist/cli/commands/state.js +0 -1023
  563. package/dist/cli/commands/state.js.map +0 -1
  564. package/dist/cli/commands/upgrade.js.map +0 -1
  565. package/dist/cli/commands/validate.js.map +0 -1
  566. package/dist/cli/commands/verify.js.map +0 -1
  567. package/dist/cli/dispatch/check.js.map +0 -1
  568. package/dist/cli/dispatch/index.js.map +0 -1
  569. package/dist/cli/dispatch/lifecycle.js.map +0 -1
  570. package/dist/cli/dispatch/prime.js.map +0 -1
  571. package/dist/cli/dispatch/shared.js.map +0 -1
  572. package/dist/cli/dispatch/state.js.map +0 -1
  573. package/dist/cli/dispatch.js.map +0 -1
  574. package/dist/cli/errors.js.map +0 -1
  575. package/dist/cli/help.js.map +0 -1
  576. package/dist/cli/orientation.js.map +0 -1
  577. package/dist/cli/prime-blob.js.map +0 -1
  578. package/dist/cli/stateQuery.js.map +0 -1
  579. package/dist/cli/structured.js.map +0 -1
  580. package/dist/cli/todoMarkdown.js.map +0 -1
  581. package/dist/core/difflib.js.map +0 -1
  582. package/dist/core/git.js +0 -43
  583. package/dist/core/git.js.map +0 -1
  584. package/dist/core/paths.js.map +0 -1
  585. package/dist/core/pyjson.js.map +0 -1
  586. package/dist/core/sourceRoot.js.map +0 -1
  587. package/dist/core/toml.js.map +0 -1
  588. package/dist/core/yaml.js.map +0 -1
  589. package/dist/eval/evalSkills.js.map +0 -1
  590. package/dist/eval/semanticEval.js.map +0 -1
  591. package/dist/eval/semanticFixtures.js.map +0 -1
  592. package/dist/hooks/common.js.map +0 -1
  593. package/dist/hooks/compaction/apply.js.map +0 -1
  594. package/dist/hooks/compaction/dryRun.js.map +0 -1
  595. package/dist/hooks/compaction/index.js.map +0 -1
  596. package/dist/hooks/compaction/parse.js.map +0 -1
  597. package/dist/hooks/compaction/retention.js.map +0 -1
  598. package/dist/hooks/compaction/status.js.map +0 -1
  599. package/dist/hooks/compaction/types.js.map +0 -1
  600. package/dist/hooks/compaction.js +0 -935
  601. package/dist/hooks/compaction.js.map +0 -1
  602. package/dist/hooks/cursorPreToolUse.js +0 -19
  603. package/dist/hooks/cursorPreToolUse.js.map +0 -1
  604. package/dist/hooks/cursorSessionStart.js +0 -71
  605. package/dist/hooks/cursorSessionStart.js.map +0 -1
  606. package/dist/hooks/sessionStart.js +0 -209
  607. package/dist/hooks/sessionStart.js.map +0 -1
  608. package/dist/hooks/sessionStop.js +0 -203
  609. package/dist/hooks/sessionStop.js.map +0 -1
  610. package/dist/hooks/validateArtifact/agentFacing.js.map +0 -1
  611. package/dist/hooks/validateArtifact/index.js.map +0 -1
  612. package/dist/hooks/validateArtifact/markdown.js.map +0 -1
  613. package/dist/hooks/validateArtifact/runtime.js +0 -83
  614. package/dist/hooks/validateArtifact/runtime.js.map +0 -1
  615. package/dist/hooks/validateArtifact/schema.js.map +0 -1
  616. package/dist/hooks/validateArtifact/traversal.js.map +0 -1
  617. package/dist/hooks/validateArtifact/violations.js.map +0 -1
  618. package/dist/hooks/validateArtifact.js +0 -924
  619. package/dist/hooks/validateArtifact.js.map +0 -1
  620. package/dist/migrate/v2HandoffManifest.js.map +0 -1
  621. package/dist/registries/artifactProtocolIds.js.map +0 -1
  622. package/dist/registries/artifactRegistry.js.map +0 -1
  623. package/dist/registries/capabilityContract.js.map +0 -1
  624. package/dist/registries/evaluatorHandoffContract.js.map +0 -1
  625. package/dist/registries/packageRegistry.js.map +0 -1
  626. package/dist/registries/runtimeAdapterRegistry.js +0 -315
  627. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  628. package/dist/release/releaseMetadata.js.map +0 -1
  629. package/dist/setup/codex/agents.js +0 -96
  630. package/dist/setup/codex/agents.js.map +0 -1
  631. package/dist/setup/codex/cli.js +0 -161
  632. package/dist/setup/codex/cli.js.map +0 -1
  633. package/dist/setup/codex/configToml.js +0 -644
  634. package/dist/setup/codex/configToml.js.map +0 -1
  635. package/dist/setup/codex/constants.js +0 -29
  636. package/dist/setup/codex/constants.js.map +0 -1
  637. package/dist/setup/codex/installRoot.js +0 -64
  638. package/dist/setup/codex/installRoot.js.map +0 -1
  639. package/dist/setup/codex/state.js +0 -270
  640. package/dist/setup/codex/state.js.map +0 -1
  641. package/dist/setup/codex.js +0 -12
  642. package/dist/setup/codex.js.map +0 -1
  643. package/dist/setup/copilot.js +0 -227
  644. package/dist/setup/copilot.js.map +0 -1
  645. package/dist/setup/cursor.js +0 -127
  646. package/dist/setup/cursor.js.map +0 -1
  647. package/dist/setup/doctor/core.js +0 -300
  648. package/dist/setup/doctor/core.js.map +0 -1
  649. package/dist/setup/doctor/diagnostics.js +0 -247
  650. package/dist/setup/doctor/diagnostics.js.map +0 -1
  651. package/dist/setup/doctor/opencode.js +0 -281
  652. package/dist/setup/doctor/opencode.js.map +0 -1
  653. package/dist/setup/doctor/report.js +0 -474
  654. package/dist/setup/doctor/report.js.map +0 -1
  655. package/dist/setup/doctor.js +0 -10
  656. package/dist/setup/doctor.js.map +0 -1
  657. package/dist/setup/opencode.js.map +0 -1
  658. package/dist/setup/smokeChecks.js.map +0 -1
  659. package/dist/state/installRoot.js.map +0 -1
  660. package/dist/state/progressCommit.js +0 -289
  661. package/dist/state/progressCommit.js.map +0 -1
  662. package/dist/state/startupAnalysis/benchmark.js.map +0 -1
  663. package/dist/state/startupAnalysis/contract.js.map +0 -1
  664. package/dist/state/startupAnalysis/helpers.js.map +0 -1
  665. package/dist/state/startupAnalysis/index.js.map +0 -1
  666. package/dist/state/startupAnalysis/metrics.js.map +0 -1
  667. package/dist/state/startupAnalysis/records.js.map +0 -1
  668. package/dist/state/startupAnalysis/report.js.map +0 -1
  669. package/dist/state/startupAnalysis/threshold.js.map +0 -1
  670. package/dist/state/startupAnalysis.js.map +0 -1
  671. package/dist/upgrade/appModel.js.map +0 -1
  672. package/dist/upgrade/channels.js.map +0 -1
  673. package/dist/upgrade/coexistenceProbe.js +0 -83
  674. package/dist/upgrade/coexistenceProbe.js.map +0 -1
  675. package/dist/upgrade/compatibility.js.map +0 -1
  676. package/dist/upgrade/doctor.js.map +0 -1
  677. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -570
  678. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  679. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
  680. package/dist/upgrade/nextMajorDoctor.js.map +0 -1
  681. package/dist/upgrade/projectIntegration.js.map +0 -1
  682. package/dist/upgrade/runtimeMigration.js.map +0 -1
  683. package/dist/upgrade/upgradeCommands.js.map +0 -1
  684. package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
  685. package/dist/upgrade/v3CapabilitySurface.js.map +0 -1
  686. package/dist/upgrade/versionResolution.js.map +0 -1
  687. package/dist/validate/appHomeContract.js.map +0 -1
  688. package/dist/validate/capability.js.map +0 -1
  689. package/dist/validate/crossCapability.js.map +0 -1
  690. package/dist/validate/lifecycleAdapters.js +0 -772
  691. package/dist/validate/lifecycleAdapters.js.map +0 -1
  692. package/dist/validate/selfAudit.js.map +0 -1
  693. package/dist/validate/vocabularyAuthority.js.map +0 -1
  694. /package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/exit.yaml +0 -0
  695. /package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/exit.yaml +0 -0
  696. /package/bundle/skills/agentera/capabilities/{hej → status}/schemas/exit.yaml +0 -0
@@ -1,15 +1,18 @@
1
1
  import fs from "node:fs";
2
- import os from "node:os";
3
2
  import path from "node:path";
3
+ import { createHash } from "node:crypto";
4
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, opencodeCommandTemplate, opencodeConfigDir, } from "../setup/opencode.js";
9
- import { resolveUpdateChannel } from "./channels.js";
10
- import { projectUsesV3CapabilityInstructionModules } from "./v3CapabilitySurface.js";
5
+ import { hasManagedMarker, opencodeConfigDir, } from "../setup/opencode.js";
6
+ import { OPENCODE_SKILL_NAMES } from "../setup/opencodeConstants.js";
7
+ import { doctorRoots } from "./appModel.js";
8
+ import { bindMigrationResource, removeBoundMigrationResource, verifyBoundMigrationResource, } from "./migrationPublication.js";
11
9
  const PYTHON_MANAGED_PATTERNS = [
12
10
  /hooks\/validate_artifact\.py/,
11
+ /hooks\/cursor_session_start\.py/,
12
+ /hooks\/cursor_pre_tool_use\.py/,
13
+ /hooks\/cursor_session_stop\.py/,
14
+ /hooks\/session_start\.py/,
15
+ /hooks\/session_stop\.py/,
13
16
  /\buv run\b/,
14
17
  /\buvx\b/,
15
18
  /scripts\/agentera/,
@@ -18,14 +21,6 @@ const PYTHON_MANAGED_PATTERNS = [
18
21
  /cursor_pre_tool_use\.py/,
19
22
  /cursor_session_stop\.py/,
20
23
  ];
21
- const RUNTIME_MIGRATION_ACTIONS = new Set([
22
- "rewire-runtime",
23
- "retire-hooks",
24
- "copy-plugin",
25
- "copy-agent",
26
- "copy-command",
27
- "link-skill",
28
- ]);
29
24
  export function projectHasProjectLevelRuntimeHooks(project) {
30
25
  const root = resolvePath(project);
31
26
  const candidates = [
@@ -37,344 +32,234 @@ export function projectHasProjectLevelRuntimeHooks(project) {
37
32
  return candidates.some((candidate) => isFile(candidate) || pathExists(candidate));
38
33
  }
39
34
  const OPENCODE_COMMAND_NAMES = ["agentera"];
40
- const OPENCODE_SKILL_NAMES = ["agentera", "hej"];
41
- const CURSOR_AGENT_MARKER = "<!-- agentera: managed -->";
42
- export function resolveNpxHookCommands(ctx) {
43
- const env = ctx.env ?? process.env;
44
- const home = ctx.home ?? env.HOME ?? os.homedir();
45
- const sourceRoot = ctx.sourceRoot ?? resolveSourceRoot(env);
46
- const channel = resolveUpdateChannel({
47
- channel: ctx.channel ?? null,
48
- env,
49
- home,
50
- sourceRoot,
51
- });
52
- const cliEntrypoint = channel.updateCommand.trim();
53
- return {
54
- cliEntrypoint,
55
- validate: `${cliEntrypoint} hook validate-artifact`,
56
- cursorSessionStart: `${cliEntrypoint} hook cursor-session-start`,
57
- cursorSessionStop: `${cliEntrypoint} hook session-stop`,
58
- cursorPreTool: `${cliEntrypoint} hook cursor-pre-tool-use`,
59
- };
60
- }
61
35
  export function textUsesPythonManagedEntrypoint(text) {
62
36
  if (/AGENTERA_HOME\s*=/.test(text)) {
63
37
  return true;
64
38
  }
65
39
  return PYTHON_MANAGED_PATTERNS.some((pattern) => pattern.test(text));
66
40
  }
67
- export function rewireRuntimeText(text, runtime, commands) {
68
- let next = text;
69
- next = next.replace(/uv run\s+\\?"?\$\{AGENTERA_HOME\}\/hooks\/validate_artifact\.py\\?"?/g, commands.validate);
70
- next = next.replace(/uv run\s+\\?"?\$\{PLUGIN_ROOT\}\/hooks\/validate_artifact\.py\\?"?/g, commands.validate);
71
- if (next.includes("validate_artifact.py")) {
72
- next = next.replace(/["']?[^"'\n]*hooks\/validate_artifact\.py[^"'\n]*["']?/g, `"${commands.validate}"`);
41
+ const RETIRED_NPX_HOOK = /\bnpx\s+-y\s+agentera(?:@(?:next|latest))?\s+hook\s+/;
42
+ const V2_AGENTERA_HOOK = /(?:\buv(?:x|\s+run)\b[^"'\n]*(?:\$\{(?:AGENTERA_HOME|PLUGIN_ROOT)\}|hooks\/)\/[^"'\n]*\.py|\$\{AGENTERA_HOME\}\/(?:app\/scripts|(?:app\/)?hooks)\/[^"'\n]*\.py)/;
43
+ function retiredHookCommands(value, commands = []) {
44
+ if (Array.isArray(value)) {
45
+ for (const entry of value)
46
+ retiredHookCommands(entry, commands);
73
47
  }
74
- next = next.replace(/["']?[^"'\n]*cursor_session_start\.py[^"'\n]*["']?/g, `"${commands.cursorSessionStart}"`);
75
- next = next.replace(/["']?[^"'\n]*cursor_pre_tool_use\.py[^"'\n]*["']?/g, `"${commands.cursorPreTool}"`);
76
- next = next.replace(/["']?[^"'\n]*cursor_session_stop\.py[^"'\n]*["']?/g, `"${commands.cursorSessionStop}"`);
77
- next = next.replace(/["']?[^"'\n]*\/app\/scripts\/agentera[^"'\n]*["']?/g, `"${commands.cliEntrypoint}"`);
78
- next = next.replace(/["']?[^"'\n]*scripts\/agentera[^"'\n]*["']?/g, `"${commands.cliEntrypoint}"`);
79
- next = next.replace(/npx -y agentera hook /g, `${commands.cliEntrypoint} hook `);
80
- next = next.replace(/npx -y agentera@latest hook /g, `${commands.cliEntrypoint} hook `);
81
- if (runtime === "codex") {
82
- next = next.replace(/AGENTERA_HOME\s*=\s*"[^"]*"/g, "");
83
- next = next.replace(/AGENTERA_HOME\s*=\s*'[^']*'/g, "");
84
- next = next.replace(/set\s*=\s*\{\s*,/g, "set = {");
85
- next = next.replace(/,\s*,/g, ",");
86
- next = next.replace(/,\s*\}/g, " }");
87
- next = next.replace(/set\s*=\s*\{\s*\}/g, "set = { }");
48
+ else if (value !== null && typeof value === "object") {
49
+ for (const [key, entry] of Object.entries(value)) {
50
+ if (key === "command" && typeof entry === "string")
51
+ commands.push(entry);
52
+ else
53
+ retiredHookCommands(entry, commands);
54
+ }
88
55
  }
89
- return next;
56
+ return commands;
90
57
  }
91
- function needsChannelNpxRewire(text, cliEntrypoint) {
92
- if (/npx -y agentera hook /.test(text) && !text.includes(cliEntrypoint)) {
93
- return true;
58
+ function isRetiredAgenteraHookCommand(command) {
59
+ return V2_AGENTERA_HOOK.test(command) || RETIRED_NPX_HOOK.test(command);
60
+ }
61
+ /**
62
+ * Native hook files have no durable per-entry ownership record. Remove only a
63
+ * file whose every command is a retired Agentera invocation; mixed files are
64
+ * preserved for the owner to review rather than surgically rewritten.
65
+ */
66
+ export function wholeResourceProvesV2HookOwnership(text) {
67
+ let document;
68
+ try {
69
+ document = JSON.parse(text);
94
70
  }
95
- if (/npx -y agentera@latest hook /.test(text) && !text.includes(cliEntrypoint)) {
96
- return true;
71
+ catch {
72
+ return false;
97
73
  }
98
- return false;
74
+ const commands = retiredHookCommands(document);
75
+ return commands.length > 0 && commands.every(isRetiredAgenteraHookCommand);
99
76
  }
100
- function pushRewireItem(items, runtime, filePath, commands) {
77
+ function textContainsRetiredAgenteraHook(text) {
78
+ return textUsesPythonManagedEntrypoint(text) || RETIRED_NPX_HOOK.test(text);
79
+ }
80
+ function pushRetireHookItem(items, runtime, filePath, allowedRoot) {
101
81
  const text = fs.readFileSync(filePath, "utf8");
102
- const needsBare = needsChannelNpxRewire(text, commands.cliEntrypoint);
103
- if (!textUsesPythonManagedEntrypoint(text) && !needsBare) {
104
- if (text.includes(commands.cliEntrypoint)) {
105
- items.push({
106
- status: "noop",
107
- action: "rewire-runtime",
108
- runtime,
109
- source: filePath,
110
- message: "runtime config already references npm self-contained entrypoint",
111
- });
112
- }
82
+ if (!textContainsRetiredAgenteraHook(text)) {
113
83
  return;
114
84
  }
115
- const newText = rewireRuntimeText(text, runtime, commands);
116
- const status = newText === text ? "blocked" : "pending";
117
- items.push({
118
- status,
119
- action: "rewire-runtime",
85
+ const item = {
86
+ status: wholeResourceProvesV2HookOwnership(text) ? "pending" : "blocked",
87
+ action: "retire-hooks",
120
88
  runtime,
121
89
  source: filePath,
122
- target: filePath,
123
- newText,
124
- message: status === "pending"
125
- ? "will rewire runtime config from Python managed app-home to npm self-contained entrypoint"
126
- : "runtime config uses Python managed paths but could not be rewritten safely",
127
- });
128
- }
129
- function hasCursorManagedAgentMarker(text) {
130
- return text.includes(CURSOR_AGENT_MARKER);
131
- }
132
- function copyIfChanged(source, target) {
133
- if (!isFile(source)) {
134
- return false;
90
+ message: wholeResourceProvesV2HookOwnership(text)
91
+ ? "will remove whole-resource-proven retired Agentera hook"
92
+ : "retired Agentera hook preserved: complete resource ownership is unproven; review and remove it manually",
93
+ };
94
+ if (item.status === "blocked") {
95
+ items.push(item);
96
+ return;
135
97
  }
136
- if (isFile(target)) {
137
- const before = fs.readFileSync(source);
138
- const after = fs.readFileSync(target);
139
- if (before.equals(after)) {
140
- return false;
141
- }
98
+ const evidenceError = bindMigrationResource(item, "source", filePath, [allowedRoot], "file");
99
+ if (evidenceError) {
100
+ item.status = "blocked";
101
+ item.message = `retired Agentera hook preserved: ${evidenceError}; review the unsafe path manually`;
142
102
  }
143
- fs.mkdirSync(path.dirname(target), { recursive: true });
144
- fs.copyFileSync(source, target);
145
- return true;
103
+ items.push(item);
146
104
  }
147
- function planCodexItems(items, home, commands, force) {
148
- const hooksPath = path.join(home, ".codex", "hooks", "codex-hooks.json");
149
- const configPath = path.join(home, ".codex", "config.toml");
150
- if (isFile(hooksPath)) {
151
- pushRewireItem(items, "codex", hooksPath, commands);
152
- }
153
- if (isFile(configPath)) {
154
- pushRewireItem(items, "codex", configPath, commands);
155
- let configText = fs.readFileSync(configPath, "utf8");
105
+ function planCodexItems(items, home, project) {
106
+ for (const root of [project, home]) {
107
+ const hooksPath = path.join(root, ".codex", "hooks", "codex-hooks.json");
156
108
  if (isFile(hooksPath)) {
157
- configText = fs.readFileSync(configPath, "utf8");
158
- }
159
- const pluginHooks = codexPluginHooksEnabled(configText);
160
- if (pluginHooks && isFile(hooksPath)) {
161
- let hooksText;
162
- try {
163
- hooksText = fs.readFileSync(hooksPath, "utf8");
164
- }
165
- catch {
166
- hooksText = "";
167
- }
168
- if (codexCopiedHooksAreAgenteraOnly(hooksText)) {
169
- items.push({
170
- status: "pending",
171
- action: "retire-hooks",
172
- runtime: "codex",
173
- source: hooksPath,
174
- target: configPath,
175
- message: "will remove Agentera-owned copied Codex hooks because plugin hooks are enabled",
176
- });
177
- }
178
- else if (hooksText.includes("validate_artifact") || hooksText.includes("hook validate-artifact")) {
179
- items.push({
180
- status: force ? "pending" : "blocked",
181
- action: "retire-hooks",
182
- runtime: "codex",
183
- source: hooksPath,
184
- target: configPath,
185
- message: "plugin hooks are enabled, but copied hook target needs manual review before retirement",
186
- });
187
- }
109
+ pushRetireHookItem(items, "codex", hooksPath, root);
188
110
  }
189
111
  }
190
112
  }
191
- function planCursorItems(items, home, project, sourceRoot, commands) {
192
- for (const hooksPath of [
193
- path.join(project, ".cursor", "hooks.json"),
194
- path.join(home, ".cursor", "hooks.json"),
113
+ function planCursorItems(items, home, project) {
114
+ for (const [root, hooksPath] of [
115
+ [project, path.join(project, ".cursor", "hooks.json")],
116
+ [home, path.join(home, ".cursor", "hooks.json")],
195
117
  ]) {
196
118
  if (isFile(hooksPath)) {
197
- pushRewireItem(items, "cursor", hooksPath, commands);
119
+ pushRetireHookItem(items, "cursor", hooksPath, root);
198
120
  }
199
121
  }
200
- const agentsSource = path.join(sourceRoot, ".cursor", "agents");
201
- const pluginSource = path.join(sourceRoot, ".cursor-plugin", "plugin.json");
202
- for (const root of [project]) {
203
- const agentsDir = path.join(root, ".cursor", "agents");
204
- if (isFile(pluginSource) && root === project) {
205
- const pluginTarget = path.join(root, ".cursor-plugin", "plugin.json");
206
- if (!isFile(pluginTarget)) {
207
- items.push({
208
- status: "pending",
209
- action: "copy-plugin",
210
- runtime: "cursor",
211
- source: pluginSource,
212
- target: pluginTarget,
213
- message: "will copy managed Cursor plugin manifest",
214
- });
215
- }
216
- else if (!fs.readFileSync(pluginSource).equals(fs.readFileSync(pluginTarget))) {
217
- items.push({
218
- status: "pending",
219
- action: "copy-plugin",
220
- runtime: "cursor",
221
- source: pluginSource,
222
- target: pluginTarget,
223
- message: "will refresh managed Cursor plugin manifest",
224
- });
225
- }
122
+ }
123
+ function symlinkOwnership(linkPath, managedSkillsRoot) {
124
+ let stat;
125
+ let target;
126
+ try {
127
+ stat = fs.lstatSync(linkPath);
128
+ if (!stat.isSymbolicLink())
129
+ return null;
130
+ target = fs.readlinkSync(linkPath);
131
+ }
132
+ catch {
133
+ return null;
134
+ }
135
+ const resolvedTarget = path.resolve(path.dirname(linkPath), target);
136
+ const relative = path.relative(managedSkillsRoot, resolvedTarget);
137
+ if (relative === "" || relative.startsWith("..") || path.isAbsolute(relative))
138
+ return null;
139
+ return {
140
+ kind: "managed-app-symlink",
141
+ identity: `${stat.dev}:${stat.ino}`,
142
+ fingerprint: `sha256:${createHash("sha256").update(target).digest("hex")}`,
143
+ root: managedSkillsRoot,
144
+ };
145
+ }
146
+ export function planStaleCommandCleanupItems(ctx, items) {
147
+ const env = ctx.env ?? process.env;
148
+ const home = resolvePath(ctx.home);
149
+ const commandsDir = path.join(opencodeConfigDir(home, env), "commands");
150
+ if (!pathExists(commandsDir) || !fs.statSync(commandsDir).isDirectory()) {
151
+ return;
152
+ }
153
+ const currentNames = new Set(OPENCODE_COMMAND_NAMES);
154
+ for (const entry of fs.readdirSync(commandsDir)) {
155
+ if (!entry.endsWith(".md")) {
156
+ continue;
226
157
  }
227
- const skipInTreeCursorAgents = root === project && projectUsesV3CapabilityInstructionModules(project);
228
- if (skipInTreeCursorAgents) {
229
- items.push({
230
- status: "skipped",
231
- action: "copy-agent",
232
- runtime: "cursor",
233
- target: agentsDir,
234
- message: "v3 capability instruction modules present; in-tree .cursor/agents/ uses prime --context and is not overwritten",
235
- });
158
+ const filePath = path.join(commandsDir, entry);
159
+ if (!isFile(filePath)) {
160
+ continue;
236
161
  }
237
- else if (pathExists(agentsSource)) {
238
- for (const entry of fs.readdirSync(agentsSource)) {
239
- if (!entry.endsWith(".md"))
240
- continue;
241
- const src = path.join(agentsSource, entry);
242
- const dst = path.join(agentsDir, entry);
243
- if (!isFile(dst)) {
244
- items.push({
245
- status: "pending",
246
- action: "copy-agent",
247
- runtime: "cursor",
248
- source: src,
249
- target: dst,
250
- message: "will copy managed Cursor capability agent",
251
- });
252
- continue;
253
- }
254
- const dstText = fs.readFileSync(dst, "utf8");
255
- const srcText = fs.readFileSync(src, "utf8");
256
- if (hasCursorManagedAgentMarker(dstText) && dstText !== srcText) {
257
- items.push({
258
- status: "pending",
259
- action: "copy-agent",
260
- runtime: "cursor",
261
- source: src,
262
- target: dst,
263
- message: "will refresh stale managed Cursor capability agent",
264
- });
265
- }
266
- }
162
+ const body = fs.readFileSync(filePath, "utf8");
163
+ if (!hasManagedMarker(body)) {
164
+ continue;
267
165
  }
166
+ const name = entry.slice(0, -3);
167
+ if (currentNames.has(name)) {
168
+ continue;
169
+ }
170
+ const item = {
171
+ status: "pending",
172
+ action: "remove-stale-command",
173
+ runtime: "opencode",
174
+ source: filePath,
175
+ message: `will remove stale managed command ${path.basename(filePath)}`,
176
+ };
177
+ const evidenceError = bindMigrationResource(item, "source", filePath, [home], "file");
178
+ if (evidenceError) {
179
+ item.status = "blocked";
180
+ item.message = `stale command preserved: ${evidenceError}; review the unsafe path manually`;
181
+ }
182
+ items.push(item);
268
183
  }
269
184
  }
270
- function planOpencodeItems(items, home, sourceRoot, env, commands) {
271
- const configDir = opencodeConfigDir(home, env);
272
- const pluginSource = path.join(sourceRoot, ".opencode", "plugins", "agentera.js");
273
- const pluginTarget = path.join(configDir, "plugins", "agentera.js");
274
- if (isFile(pluginSource)) {
275
- const needsCopy = !isFile(pluginTarget) ||
276
- textUsesPythonManagedEntrypoint(fs.readFileSync(pluginTarget, "utf8")) ||
277
- needsChannelNpxRewire(fs.readFileSync(pluginTarget, "utf8"), commands.cliEntrypoint);
185
+ export function planStaleSkillCleanupItems(ctx, items) {
186
+ const env = ctx.env ?? process.env;
187
+ const home = resolvePath(ctx.home);
188
+ const skillsDir = path.join(opencodeConfigDir(home, env), "skills");
189
+ let skillsDirectory;
190
+ try {
191
+ skillsDirectory = fs.lstatSync(skillsDir);
192
+ }
193
+ catch {
194
+ return;
195
+ }
196
+ if (!skillsDirectory.isDirectory()) {
278
197
  items.push({
279
- status: needsCopy ? "pending" : "noop",
280
- action: "copy-plugin",
198
+ status: "blocked",
199
+ action: "remove-stale-skill",
281
200
  runtime: "opencode",
282
- source: pluginSource,
283
- target: pluginTarget,
284
- message: needsCopy
285
- ? "will copy current Agentera OpenCode plugin to native plugin path"
286
- : "OpenCode plugin already current at native plugin path",
201
+ source: skillsDir,
202
+ message: `preserved ${skillsDir}: the legacy skills path is not a real directory; replace the unsafe path or review it manually`,
287
203
  });
204
+ return;
288
205
  }
289
- const commandsSourceDir = path.join(sourceRoot, ".opencode", "commands");
290
- const commandsTargetDir = path.join(configDir, "commands");
291
- for (const name of OPENCODE_COMMAND_NAMES) {
292
- const src = path.join(commandsSourceDir, `${name}.md`);
293
- const expected = opencodeCommandTemplate(name);
294
- const dst = path.join(commandsTargetDir, `${name}.md`);
295
- if (isFile(src)) {
296
- const needsCopy = !isFile(dst) || (hasManagedMarker(fs.readFileSync(dst, "utf8")) && fs.readFileSync(dst, "utf8") !== expected);
297
- items.push({
298
- status: needsCopy ? "pending" : "noop",
299
- action: "copy-command",
300
- runtime: "opencode",
301
- source: src,
302
- target: dst,
303
- message: needsCopy ? "will sync managed OpenCode command" : "OpenCode managed command already current",
304
- });
305
- }
306
- }
307
- const agentsSourceDir = path.join(sourceRoot, ".opencode", "agents");
308
- const agentsTargetDir = path.join(configDir, "agents");
309
- if (pathExists(agentsSourceDir)) {
310
- for (const entry of fs.readdirSync(agentsSourceDir)) {
311
- if (!entry.endsWith(".md"))
312
- continue;
313
- const src = path.join(agentsSourceDir, entry);
314
- const dst = path.join(agentsTargetDir, entry);
315
- const needsCopy = !isFile(dst) || !fs.readFileSync(src).equals(fs.readFileSync(dst));
316
- items.push({
317
- status: needsCopy ? "pending" : "noop",
318
- action: "copy-agent",
319
- runtime: "opencode",
320
- source: src,
321
- target: dst,
322
- message: needsCopy ? "will copy managed OpenCode capability agent" : "OpenCode agent already current",
323
- });
324
- }
325
- }
326
- const skillsSourceRoot = path.join(sourceRoot, "skills");
327
- const skillsTargetDir = path.join(configDir, "skills");
328
- for (const name of OPENCODE_SKILL_NAMES) {
329
- const src = path.join(skillsSourceRoot, name);
330
- const dst = path.join(skillsTargetDir, name);
331
- if (!isFile(path.join(src, "SKILL.md"))) {
206
+ const requiredNames = new Set(OPENCODE_SKILL_NAMES);
207
+ const managedSkillsRoot = path.join(doctorRoots(resolvePath(ctx.appHome)).activeBundleRoot, "skills");
208
+ for (const entry of fs.readdirSync(skillsDir, { withFileTypes: true })) {
209
+ const linkPath = path.join(skillsDir, entry.name);
210
+ if (!entry.isSymbolicLink()) {
211
+ if (requiredNames.has(entry.name)) {
212
+ items.push({
213
+ status: "blocked",
214
+ action: "remove-stale-skill",
215
+ runtime: "opencode",
216
+ source: linkPath,
217
+ message: `preserved ${linkPath}: name and directory shape do not prove Agentera ownership; review and remove it manually if appropriate`,
218
+ });
219
+ }
332
220
  continue;
333
221
  }
334
- if (!pathExists(dst)) {
222
+ let linkTarget;
223
+ try {
224
+ linkTarget = fs.readlinkSync(linkPath);
225
+ }
226
+ catch {
335
227
  items.push({
336
- status: "pending",
337
- action: "link-skill",
228
+ status: "blocked",
229
+ action: "remove-stale-skill",
338
230
  runtime: "opencode",
339
- source: src,
340
- target: dst,
341
- message: "will create OpenCode skill link",
231
+ source: linkPath,
232
+ message: `preserved ${linkPath}: the symlink target could not be inspected; review the unsafe resource manually`,
342
233
  });
343
234
  continue;
344
235
  }
345
- try {
346
- const linkTarget = fs.readlinkSync(dst);
347
- if (!linkTarget.includes("agentera") && path.basename(linkTarget) !== name) {
236
+ const ownership = symlinkOwnership(linkPath, managedSkillsRoot);
237
+ if (!ownership) {
238
+ if (requiredNames.has(entry.name) || linkTarget.toLowerCase().includes("agentera")) {
348
239
  items.push({
349
240
  status: "blocked",
350
- action: "link-skill",
351
- runtime: "opencode",
352
- source: src,
353
- target: dst,
354
- message: "OpenCode skill path is user-owned; manual review required",
355
- });
356
- }
357
- else if (path.resolve(path.dirname(dst), linkTarget) !== path.resolve(src)) {
358
- items.push({
359
- status: "pending",
360
- action: "link-skill",
241
+ action: "remove-stale-skill",
361
242
  runtime: "opencode",
362
- source: src,
363
- target: dst,
364
- message: "will update stale Agentera-managed OpenCode skill link",
243
+ source: linkPath,
244
+ message: `preserved ${linkPath}: skill name or target text does not prove Agentera ownership; confirm ownership and remove it manually if appropriate`,
365
245
  });
366
246
  }
247
+ continue;
367
248
  }
368
- catch {
369
- items.push({
370
- status: "pending",
371
- action: "link-skill",
372
- runtime: "opencode",
373
- source: src,
374
- target: dst,
375
- message: "will replace non-symlink OpenCode skill path with managed link",
376
- });
249
+ const item = {
250
+ status: "pending",
251
+ action: "remove-stale-skill",
252
+ runtime: "opencode",
253
+ source: linkPath,
254
+ ownership,
255
+ message: `will remove v2 app-owned OpenCode skill symlink ${entry.name}`,
256
+ };
257
+ const evidenceError = bindMigrationResource(item, "source", linkPath, [home], "symlink");
258
+ if (evidenceError) {
259
+ item.status = "blocked";
260
+ item.message = `legacy skill preserved: ${evidenceError}; review the unsafe path manually`;
377
261
  }
262
+ items.push(item);
378
263
  }
379
264
  }
380
265
  function walkJsonHookFiles(dir) {
@@ -397,10 +282,10 @@ function walkJsonHookFiles(dir) {
397
282
  walk(dir);
398
283
  return out;
399
284
  }
400
- function planCopilotItems(items, project, commands) {
285
+ function planCopilotItems(items, project) {
401
286
  const hooksDir = path.join(project, ".github", "hooks");
402
287
  for (const hookFile of walkJsonHookFiles(hooksDir)) {
403
- pushRewireItem(items, "copilot", hookFile, commands);
288
+ pushRetireHookItem(items, "copilot", hookFile, project);
404
289
  }
405
290
  if (!items.some((item) => item.runtime === "copilot")) {
406
291
  items.push({
@@ -411,11 +296,6 @@ function planCopilotItems(items, project, commands) {
411
296
  });
412
297
  }
413
298
  }
414
- function planEnvRuntimeNoops(items, runtime, message) {
415
- if (!items.some((item) => item.runtime === runtime)) {
416
- items.push({ status: "noop", action: "configure", runtime, message });
417
- }
418
- }
419
299
  export function planRuntimeMigrationItems(ctx) {
420
300
  if (!ctx.env) {
421
301
  throw new Error("MigrationContext.env is required for runtime migration planning; pass sandboxMigrationEnv(home, sourceRoot) in tests or an explicit env in callers.");
@@ -423,107 +303,126 @@ export function planRuntimeMigrationItems(ctx) {
423
303
  const home = resolvePath(ctx.home);
424
304
  const project = resolvePath(ctx.project);
425
305
  const env = ctx.env;
426
- const sourceRoot = resolvePath(ctx.sourceRoot ?? resolveSourceRoot(env));
427
- const commands = resolveNpxHookCommands({ ...ctx, home, env, sourceRoot });
428
306
  const items = [];
429
- planCodexItems(items, home, commands, ctx.force);
430
- planCursorItems(items, home, project, sourceRoot, commands);
431
- planOpencodeItems(items, home, sourceRoot, env, commands);
432
- planCopilotItems(items, project, commands);
433
- planEnvRuntimeNoops(items, "claude", "Claude Code plugin installs expose the app home without local config writes; use --update-packages to refresh marketplace surfaces");
434
- planEnvRuntimeNoops(items, "cursor-agent", "Cursor Agent CLI inherits workspace Cursor hooks; no separate managed install surface");
435
- void loadRegistry();
307
+ planCodexItems(items, home, project);
308
+ planCursorItems(items, home, project);
309
+ planStaleCommandCleanupItems(ctx, items);
310
+ planStaleSkillCleanupItems(ctx, items);
311
+ planCopilotItems(items, project);
436
312
  return items;
437
313
  }
438
- export function applyRuntimeMigrationItem(item, commands) {
314
+ const RUNTIME_MIGRATION_ACTIONS = new Set([
315
+ "retire-hooks",
316
+ "remove-stale-command",
317
+ "remove-stale-skill",
318
+ ]);
319
+ function isRuntimeMigrationAction(action) {
320
+ return RUNTIME_MIGRATION_ACTIONS.has(action);
321
+ }
322
+ export function applyRuntimeMigrationItem(item) {
439
323
  if (item.status !== "pending") {
440
324
  return;
441
325
  }
442
326
  try {
443
327
  switch (item.action) {
444
- case "rewire-runtime": {
445
- if (!item.target || item.newText === undefined) {
328
+ case "retire-hooks": {
329
+ if (!item.source) {
446
330
  item.status = "failed";
447
- item.message = "rewire-runtime missing target or newText";
331
+ item.message = "retire-hooks missing source";
448
332
  return;
449
333
  }
450
- fs.writeFileSync(item.target, item.newText, "utf8");
334
+ verifyBoundMigrationResource(item, "source");
335
+ removeBoundMigrationResource(item, "source");
451
336
  item.status = "applied";
452
- item.message = "runtime config rewired to npm self-contained entrypoint";
337
+ item.message = "retired whole-resource-proven Agentera hook";
453
338
  break;
454
339
  }
455
- case "copy-plugin":
456
- case "copy-agent":
457
- case "copy-command": {
458
- if (!item.source || !item.target) {
340
+ case "remove-stale-command": {
341
+ if (!item.source) {
459
342
  item.status = "failed";
460
- item.message = `${item.action} missing source or target`;
343
+ item.message = "remove-stale-command missing source";
461
344
  return;
462
345
  }
463
- copyIfChanged(item.source, item.target);
464
- item.status = "applied";
465
- item.message = `applied ${item.action}`;
346
+ if (!pathExists(item.source)) {
347
+ item.status = "noop";
348
+ item.message = `stale command already absent at ${item.source}`;
349
+ }
350
+ else {
351
+ removeBoundMigrationResource(item, "source");
352
+ item.status = "applied";
353
+ item.message = `removed stale managed command ${path.basename(item.source)}`;
354
+ }
466
355
  break;
467
356
  }
468
- case "link-skill": {
469
- if (!item.source || !item.target) {
357
+ case "remove-stale-skill": {
358
+ if (!item.source) {
470
359
  item.status = "failed";
471
- item.message = "link-skill missing source or target";
360
+ item.message = "remove-stale-skill missing source";
472
361
  return;
473
362
  }
474
- fs.mkdirSync(path.dirname(item.target), { recursive: true });
475
- // lstat (not stat): stat follows symlinks and ENOENTs on dangling links; rmSync then fails.
476
- let targetStat = null;
477
363
  try {
478
- targetStat = fs.lstatSync(item.target);
479
- }
480
- catch {
481
- /* target absent */
482
- }
483
- if (targetStat) {
484
- if (targetStat.isSymbolicLink()) {
485
- fs.unlinkSync(item.target);
364
+ const stat = fs.lstatSync(item.source);
365
+ if (stat.isSymbolicLink()) {
366
+ const target = fs.readlinkSync(item.source);
367
+ const identity = `${stat.dev}:${stat.ino}`;
368
+ const fingerprint = `sha256:${createHash("sha256").update(target).digest("hex")}`;
369
+ const resolvedTarget = path.resolve(path.dirname(item.source), target);
370
+ const relative = item.ownership?.root
371
+ ? path.relative(item.ownership.root, resolvedTarget)
372
+ : "..";
373
+ if (item.ownership?.kind !== "managed-app-symlink"
374
+ || item.ownership.identity !== identity
375
+ || item.ownership.fingerprint !== fingerprint
376
+ || relative === ""
377
+ || relative.startsWith("..")
378
+ || path.isAbsolute(relative)) {
379
+ item.status = "blocked";
380
+ item.message = `preserved ${item.source}: authoritative symlink ownership changed or is missing; rerun migration and review the resource`;
381
+ break;
382
+ }
383
+ removeBoundMigrationResource(item, "source");
384
+ item.status = "applied";
385
+ item.message = `removed stale skill symlink ${path.basename(item.source)}`;
486
386
  }
487
387
  else {
488
- fs.rmSync(item.target, { recursive: true, force: true });
388
+ item.status = "blocked";
389
+ item.message = `preserved ${item.source}: only a fingerprinted v2 app-owned symlink is eligible; review it manually`;
489
390
  }
490
391
  }
491
- fs.symlinkSync(item.source, item.target);
492
- item.status = "applied";
493
- item.message = "OpenCode skill link created";
494
- break;
495
- }
496
- case "retire-hooks": {
497
- if (!item.source) {
498
- item.status = "failed";
499
- item.message = "retire-hooks missing source";
500
- return;
501
- }
502
- if (isFile(item.source)) {
503
- fs.rmSync(item.source, { force: true });
504
- }
505
- if (item.target && isFile(item.target)) {
506
- const configText = fs.readFileSync(item.target, "utf8");
507
- const next = retireCodexCopiedHookTrust(configText, item.source);
508
- fs.writeFileSync(item.target, next, "utf8");
392
+ catch (error) {
393
+ if (error.code === "ENOENT") {
394
+ item.status = "noop";
395
+ item.message = "stale skill already absent";
396
+ }
397
+ else {
398
+ item.status = "failed";
399
+ item.message = `remove-stale-skill failed: ${error.message}`;
400
+ }
509
401
  }
510
- item.status = "applied";
511
- item.message = "retired Agentera-owned copied Codex hooks";
512
402
  break;
513
403
  }
514
404
  default:
405
+ item.status = "failed";
406
+ item.message = `unsupported runtime migration action: ${item.action}`;
515
407
  break;
516
408
  }
517
409
  }
518
410
  catch (exc) {
519
- item.status = "failed";
520
- item.message = `${item.action} failed: ${exc.message}`;
411
+ item.status = "blocked";
412
+ item.message = `${item.action} preserved the resource: ${exc.message}; rerun migration and review it manually`;
521
413
  }
522
414
  }
523
- export function applyRuntimeMigrationItems(items, ctx) {
524
- const commands = resolveNpxHookCommands(ctx);
415
+ export function applyRuntimeMigrationItems(items, _ctx) {
525
416
  for (const item of items) {
526
- applyRuntimeMigrationItem(item, commands);
417
+ if (item.status !== "pending") {
418
+ continue;
419
+ }
420
+ if (isRuntimeMigrationAction(item.action)) {
421
+ applyRuntimeMigrationItem(item);
422
+ }
423
+ else {
424
+ item.status = "failed";
425
+ item.message = `unsupported runtime migration action: ${item.action}`;
426
+ }
527
427
  }
528
428
  }
529
- //# sourceMappingURL=runtimeMigration.js.map