agentera 3.0.0-dev.5 → 3.0.0-dev.51

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 (598) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +119 -22
  3. package/bundle/CHANGELOG.md +1351 -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 +236 -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 +437 -0
  11. package/bundle/references/adapters/package-registry.yaml +435 -189
  12. package/bundle/references/adapters/package-surface-characterization.md +66 -35
  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 +191 -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 +3022 -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 -1
  29. package/bundle/references/cli/vocabulary-index.yaml +20 -17
  30. package/bundle/references/cli/vocabulary.md +326 -361
  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 +224 -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 +102 -0
  39. package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/exit.yaml +6 -5
  40. package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +27 -0
  41. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +176 -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 +458 -36
  91. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +128 -17
  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 +190 -0
  95. package/dist/analytics/extractCorpus/copilotSessions.js +275 -0
  96. package/dist/analytics/extractCorpus/core.js +392 -0
  97. package/dist/analytics/extractCorpus/corpus.js +167 -0
  98. package/dist/analytics/extractCorpus/coverageAudit.js +260 -0
  99. package/dist/analytics/extractCorpus/cursorSessions.js +425 -0
  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 +118 -0
  103. package/dist/analytics/extractCorpus/index.js +14 -0
  104. package/dist/analytics/extractCorpus/jsonlSessions.js +204 -0
  105. package/dist/analytics/extractCorpus/sqliteCaps.js +43 -0
  106. package/dist/analytics/extractCorpus/sqliteSessions.js +367 -0
  107. package/dist/analytics/extractCorpus/tierReader.js +108 -0
  108. package/dist/analytics/extractCorpus.js +2 -1791
  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 +56 -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 +565 -0
  134. package/dist/cli/capabilityContext/bespoke.js +44 -0
  135. package/dist/cli/capabilityContext/build.js +242 -0
  136. package/dist/cli/capabilityContext/closeout.js +233 -0
  137. package/dist/cli/capabilityContext/contract.js +179 -0
  138. package/dist/cli/capabilityContext/evidence.js +463 -0
  139. package/dist/cli/capabilityContext/index.js +3 -0
  140. package/dist/cli/capabilityContext/orchestration.js +131 -0
  141. package/dist/cli/capabilityContext/planState.js +260 -0
  142. package/dist/cli/capabilityContext/progress.js +142 -0
  143. package/dist/cli/capabilityContext/projectVerification.js +409 -0
  144. package/dist/cli/capabilityContext/shared.js +83 -0
  145. package/dist/cli/capabilityContext/slim.js +152 -0
  146. package/dist/cli/capabilityContext/startup.js +150 -0
  147. package/dist/cli/capabilityContext/startupAggregation.js +68 -0
  148. package/dist/cli/capabilityContext/types.js +56 -0
  149. package/dist/cli/capabilityContext.js +1 -2487
  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 +164 -14
  153. package/dist/cli/commands/doctor.js +122 -97
  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 +26 -44
  157. package/dist/cli/commands/personalGlossary.js +176 -0
  158. package/dist/cli/commands/prime/briefOrientation.js +747 -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 +212 -0
  163. package/dist/cli/commands/prime/orientationOutput.js +399 -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 +78 -53
  169. package/dist/cli/commands/report.js +96 -25
  170. package/dist/cli/commands/route.js +142 -0
  171. package/dist/cli/commands/schema.js +266 -143
  172. package/dist/cli/commands/state/decisions.js +387 -0
  173. package/dist/cli/commands/state/docs.js +70 -0
  174. package/dist/cli/commands/state/experimentRecords.js +151 -0
  175. package/dist/cli/commands/state/experiments.js +14 -0
  176. package/dist/cli/commands/state/get.js +129 -0
  177. package/dist/cli/commands/state/health.js +14 -0
  178. package/dist/cli/commands/state/index.js +16 -0
  179. package/dist/cli/commands/state/list.js +194 -0
  180. package/dist/cli/commands/state/objective.js +25 -0
  181. package/dist/cli/commands/state/plan.js +14 -0
  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 +13 -0
  185. package/dist/cli/commands/state/shared.js +14 -0
  186. package/dist/cli/commands/state/todo.js +42 -0
  187. package/dist/cli/commands/state/write.js +430 -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 +272 -223
  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 +372 -0
  196. package/dist/cli/dispatch/commands.js +27 -0
  197. package/dist/cli/dispatch/index.js +207 -0
  198. package/dist/cli/dispatch/lifecycle.js +652 -0
  199. package/dist/cli/dispatch/prime.js +139 -0
  200. package/dist/cli/dispatch/projections.js +17 -0
  201. package/dist/cli/dispatch/shared.js +63 -0
  202. package/dist/cli/dispatch/state.js +140 -0
  203. package/dist/cli/dispatch.js +1 -1294
  204. package/dist/cli/errors.js +16 -17
  205. package/dist/cli/help.js +394 -43
  206. package/dist/cli/migrationRequired.js +87 -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 +11 -79
  242. package/dist/hooks/compaction/apply.js +446 -0
  243. package/dist/hooks/compaction/dryRun.js +184 -0
  244. package/dist/hooks/compaction/index.js +22 -0
  245. package/dist/hooks/compaction/parse.js +325 -0
  246. package/dist/hooks/compaction/retention.js +202 -0
  247. package/dist/hooks/compaction/status.js +360 -0
  248. package/dist/hooks/compaction/types.js +5 -0
  249. package/dist/hooks/validateArtifact/agentFacing.js +9 -0
  250. package/dist/hooks/validateArtifact/index.js +92 -0
  251. package/dist/hooks/validateArtifact/markdown.js +145 -0
  252. package/dist/hooks/validateArtifact/schema.js +546 -0
  253. package/dist/hooks/validateArtifact/traversal.js +107 -0
  254. package/dist/hooks/validateArtifact/violations.js +107 -0
  255. package/dist/migrate/v2HandoffManifest.js +452 -0
  256. package/dist/registries/activationContract.js +2 -0
  257. package/dist/registries/activationTuples.js +107 -0
  258. package/dist/registries/artifactProtocolIds.js +78 -0
  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 +229 -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 +385 -0
  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 -0
  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 +846 -0
  313. package/dist/state/entityMigrationTodo.js +133 -0
  314. package/dist/state/entityPublicationContext.js +806 -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 +982 -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/projectRoot.js +62 -0
  343. package/dist/state/projectionPolicy.js +190 -0
  344. package/dist/state/retrievalAuthority.js +156 -0
  345. package/dist/state/safeProjectFile.js +155 -0
  346. package/dist/state/startupAnalysis/benchmark.js +432 -0
  347. package/dist/state/startupAnalysis/contract.js +160 -0
  348. package/dist/state/startupAnalysis/helpers.js +286 -0
  349. package/dist/state/startupAnalysis/index.js +6 -0
  350. package/dist/state/startupAnalysis/metrics.js +340 -0
  351. package/dist/state/startupAnalysis/records.js +198 -0
  352. package/dist/state/startupAnalysis/report.js +111 -0
  353. package/dist/state/startupAnalysis/threshold.js +512 -0
  354. package/dist/state/startupAnalysis.js +2 -1953
  355. package/dist/state/startupProjection.js +499 -0
  356. package/dist/state/stateMode.js +85 -0
  357. package/dist/state/stateStorageAuthority.js +47 -0
  358. package/dist/state/summaryEntityRead.js +25 -0
  359. package/dist/state/summaryMigrationProvenance.js +66 -0
  360. package/dist/state/summarySourceRowAuthority.js +36 -0
  361. package/dist/state/todoActivationSafety.js +58 -0
  362. package/dist/state/todoDocsEntities.js +1069 -0
  363. package/dist/state/todoDocsEntityValidation.js +158 -0
  364. package/dist/state/todoMarkdownProjection.js +51 -0
  365. package/dist/state/todoReconciliationActivation.js +140 -0
  366. package/dist/state/todoReconciliationInspection.js +169 -0
  367. package/dist/state/todoReconciliationRepair.js +170 -0
  368. package/dist/state/todoReconciliationTransaction.js +582 -0
  369. package/dist/state/write/assign.js +20 -0
  370. package/dist/state/write/candidateMutation.js +269 -0
  371. package/dist/state/write/errors.js +11 -0
  372. package/dist/state/write/experimentPublication.js +192 -0
  373. package/dist/state/write/explain.js +363 -0
  374. package/dist/state/write/fields.js +61 -0
  375. package/dist/state/write/glossaryPublication.js +263 -0
  376. package/dist/state/write/grammar.js +285 -0
  377. package/dist/state/write/helpers.js +29 -0
  378. package/dist/state/write/index.js +12 -0
  379. package/dist/state/write/input.js +367 -0
  380. package/dist/state/write/lock.js +837 -0
  381. package/dist/state/write/mutation.js +234 -0
  382. package/dist/state/write/operations.js +170 -0
  383. package/dist/state/write/planEvaluation.js +128 -0
  384. package/dist/state/write/planPublication.js +179 -0
  385. package/dist/state/write/runtimeOperations.js +144 -0
  386. package/dist/state/write/serialize.js +1 -0
  387. package/dist/state/write/transaction.js +52 -0
  388. package/dist/state/write/validate.js +7 -0
  389. package/dist/upgrade/appContentRefresh.js +383 -0
  390. package/dist/upgrade/appModel.js +8 -7
  391. package/dist/upgrade/atomicWriter.js +1 -0
  392. package/dist/upgrade/bundleEvidence.js +33 -0
  393. package/dist/upgrade/channels.js +12 -8
  394. package/dist/upgrade/compatibility.js +56 -21
  395. package/dist/upgrade/doctor.js +197 -192
  396. package/dist/upgrade/doctorClassifier.js +187 -0
  397. package/dist/upgrade/installedHooksRetirement.js +196 -0
  398. package/dist/upgrade/legacyAgentCleanup.js +282 -0
  399. package/dist/upgrade/lifecycleUpgrade.js +113 -0
  400. package/dist/upgrade/migrateArtifactsV2ToV3.js +367 -149
  401. package/dist/upgrade/migrationPublication.js +122 -0
  402. package/dist/upgrade/nextMajorDoctor.js +42 -8
  403. package/dist/upgrade/npxPlatformStatus.js +22 -0
  404. package/dist/upgrade/projectIntegration.js +145 -187
  405. package/dist/upgrade/projectIntegrationDecision.js +50 -0
  406. package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
  407. package/dist/upgrade/runtimeMigration.js +273 -363
  408. package/dist/upgrade/upgradeCommands.js +14 -1
  409. package/dist/upgrade/upgradeLock.js +85 -0
  410. package/dist/upgrade/upgradeOrchestrator.js +263 -59
  411. package/dist/upgrade/v3CapabilitySurface.js +14 -0
  412. package/dist/upgrade/versionResolution.js +8 -1
  413. package/dist/validate/activationArtifactEvidence.js +844 -0
  414. package/dist/validate/activationConjunction.js +816 -0
  415. package/dist/validate/activationEvidenceManifest.js +515 -0
  416. package/dist/validate/activationPackageSemantics.js +29 -0
  417. package/dist/validate/appHomeContract.js +5 -11
  418. package/dist/validate/bootstrapAuthority.js +44 -0
  419. package/dist/validate/capability.js +133 -12
  420. package/dist/validate/crossCapability.js +15 -10
  421. package/dist/validate/retainedReferenceAuthority.js +879 -0
  422. package/dist/validate/selfAudit.js +73 -37
  423. package/dist/validate/v1LegacyCruft.js +131 -0
  424. package/dist/validate/vocabularyAuthority.js +303 -0
  425. package/package.json +53 -27
  426. package/bundle/references/adapters/cursor.md +0 -213
  427. package/bundle/references/adapters/opencode.md +0 -530
  428. package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
  429. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
  430. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  431. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -548
  432. package/bundle/references/adapters/runtime-feature-parity.md +0 -189
  433. package/bundle/references/analysis/benchmark.md +0 -267
  434. package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
  435. package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
  436. package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -355
  437. package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -278
  438. package/bundle/references/cli/capability-tool-classification.yaml +0 -53
  439. package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
  440. package/bundle/references/meta/documentation-inventory.md +0 -43
  441. package/bundle/references/v1-section-mapping.md +0 -47
  442. package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
  443. package/bundle/skills/agentera/agents/dokumentera.toml +0 -6
  444. package/bundle/skills/agentera/agents/hej.toml +0 -6
  445. package/bundle/skills/agentera/agents/inspektera.toml +0 -6
  446. package/bundle/skills/agentera/agents/inspirera.toml +0 -6
  447. package/bundle/skills/agentera/agents/optimera.toml +0 -6
  448. package/bundle/skills/agentera/agents/orkestrera.toml +0 -6
  449. package/bundle/skills/agentera/agents/planera.toml +0 -6
  450. package/bundle/skills/agentera/agents/profilera.toml +0 -6
  451. package/bundle/skills/agentera/agents/realisera.toml +0 -6
  452. package/bundle/skills/agentera/agents/resonera.toml +0 -6
  453. package/bundle/skills/agentera/agents/visionera.toml +0 -6
  454. package/bundle/skills/agentera/agents/visualisera.toml +0 -6
  455. package/bundle/skills/agentera/capabilities/dokumentera/schemas/artifacts.yaml +0 -73
  456. package/bundle/skills/agentera/capabilities/dokumentera/schemas/triggers.yaml +0 -35
  457. package/bundle/skills/agentera/capabilities/hej/schemas/artifacts.yaml +0 -69
  458. package/bundle/skills/agentera/capabilities/hej/schemas/triggers.yaml +0 -58
  459. package/bundle/skills/agentera/capabilities/inspektera/schemas/artifacts.yaml +0 -76
  460. package/bundle/skills/agentera/capabilities/inspektera/schemas/triggers.yaml +0 -38
  461. package/bundle/skills/agentera/capabilities/inspirera/schemas/artifacts.yaml +0 -24
  462. package/bundle/skills/agentera/capabilities/inspirera/schemas/triggers.yaml +0 -34
  463. package/bundle/skills/agentera/capabilities/optimera/schemas/triggers.yaml +0 -39
  464. package/bundle/skills/agentera/capabilities/orkestrera/schemas/artifacts.yaml +0 -64
  465. package/bundle/skills/agentera/capabilities/orkestrera/schemas/triggers.yaml +0 -42
  466. package/bundle/skills/agentera/capabilities/orkestrera/schemas/validation.yaml +0 -120
  467. package/bundle/skills/agentera/capabilities/planera/schemas/artifacts.yaml +0 -62
  468. package/bundle/skills/agentera/capabilities/planera/schemas/triggers.yaml +0 -34
  469. package/bundle/skills/agentera/capabilities/planera/schemas/validation.yaml +0 -61
  470. package/bundle/skills/agentera/capabilities/profilera/schemas/artifacts.yaml +0 -18
  471. package/bundle/skills/agentera/capabilities/profilera/schemas/triggers.yaml +0 -45
  472. package/bundle/skills/agentera/capabilities/profilera/schemas/validation.yaml +0 -57
  473. package/bundle/skills/agentera/capabilities/realisera/schemas/artifacts.yaml +0 -80
  474. package/bundle/skills/agentera/capabilities/realisera/schemas/triggers.yaml +0 -39
  475. package/bundle/skills/agentera/capabilities/realisera/schemas/validation.yaml +0 -110
  476. package/bundle/skills/agentera/capabilities/resonera/schemas/artifacts.yaml +0 -47
  477. package/bundle/skills/agentera/capabilities/resonera/schemas/triggers.yaml +0 -46
  478. package/bundle/skills/agentera/capabilities/resonera/schemas/validation.yaml +0 -77
  479. package/bundle/skills/agentera/capabilities/visionera/schemas/triggers.yaml +0 -41
  480. package/bundle/skills/agentera/capabilities/visualisera/schemas/triggers.yaml +0 -33
  481. package/bundle/skills/agentera/references/contract.md +0 -1039
  482. package/bundle/skills/hej/.claude-plugin/plugin.json +0 -6
  483. package/bundle/skills/hej/SKILL.md +0 -69
  484. package/bundle/skills/hej/agents/hej.toml +0 -11
  485. package/bundle/skills/hej/agents/openai.yaml +0 -8
  486. package/dist/analytics/extractCorpus.js.map +0 -1
  487. package/dist/analytics/usageStats.js.map +0 -1
  488. package/dist/bin/agentera.js.map +0 -1
  489. package/dist/capabilities/dokumentera/instructions.js +0 -6
  490. package/dist/capabilities/dokumentera/instructions.js.map +0 -1
  491. package/dist/capabilities/hej/instructions.js +0 -6
  492. package/dist/capabilities/hej/instructions.js.map +0 -1
  493. package/dist/capabilities/index.js.map +0 -1
  494. package/dist/capabilities/inspektera/instructions.js +0 -6
  495. package/dist/capabilities/inspektera/instructions.js.map +0 -1
  496. package/dist/capabilities/inspirera/instructions.js +0 -6
  497. package/dist/capabilities/inspirera/instructions.js.map +0 -1
  498. package/dist/capabilities/optimera/instructions.js +0 -6
  499. package/dist/capabilities/optimera/instructions.js.map +0 -1
  500. package/dist/capabilities/orkestrera/instructions.js +0 -6
  501. package/dist/capabilities/orkestrera/instructions.js.map +0 -1
  502. package/dist/capabilities/planera/instructions.js +0 -6
  503. package/dist/capabilities/planera/instructions.js.map +0 -1
  504. package/dist/capabilities/profilera/instructions.js +0 -6
  505. package/dist/capabilities/profilera/instructions.js.map +0 -1
  506. package/dist/capabilities/realisera/instructions.js +0 -6
  507. package/dist/capabilities/realisera/instructions.js.map +0 -1
  508. package/dist/capabilities/resonera/instructions.js +0 -6
  509. package/dist/capabilities/resonera/instructions.js.map +0 -1
  510. package/dist/capabilities/visionera/instructions.js +0 -6
  511. package/dist/capabilities/visionera/instructions.js.map +0 -1
  512. package/dist/capabilities/visualisera/instructions.js +0 -6
  513. package/dist/capabilities/visualisera/instructions.js.map +0 -1
  514. package/dist/cli/appContext.js.map +0 -1
  515. package/dist/cli/argvalidate.js.map +0 -1
  516. package/dist/cli/capabilityContext.js.map +0 -1
  517. package/dist/cli/commands/capability.js.map +0 -1
  518. package/dist/cli/commands/compact.js.map +0 -1
  519. package/dist/cli/commands/doctor.js.map +0 -1
  520. package/dist/cli/commands/lint.js.map +0 -1
  521. package/dist/cli/commands/prime.js.map +0 -1
  522. package/dist/cli/commands/query.js.map +0 -1
  523. package/dist/cli/commands/report.js.map +0 -1
  524. package/dist/cli/commands/schema.js.map +0 -1
  525. package/dist/cli/commands/state.js +0 -1023
  526. package/dist/cli/commands/state.js.map +0 -1
  527. package/dist/cli/commands/upgrade.js.map +0 -1
  528. package/dist/cli/commands/validate.js.map +0 -1
  529. package/dist/cli/commands/verify.js.map +0 -1
  530. package/dist/cli/dispatch.js.map +0 -1
  531. package/dist/cli/errors.js.map +0 -1
  532. package/dist/cli/help.js.map +0 -1
  533. package/dist/cli/orientation.js.map +0 -1
  534. package/dist/cli/prime-blob.js.map +0 -1
  535. package/dist/cli/stateQuery.js.map +0 -1
  536. package/dist/cli/structured.js.map +0 -1
  537. package/dist/cli/todoMarkdown.js.map +0 -1
  538. package/dist/core/difflib.js.map +0 -1
  539. package/dist/core/paths.js.map +0 -1
  540. package/dist/core/pyjson.js.map +0 -1
  541. package/dist/core/sourceRoot.js.map +0 -1
  542. package/dist/core/toml.js.map +0 -1
  543. package/dist/core/yaml.js.map +0 -1
  544. package/dist/eval/evalSkills.js.map +0 -1
  545. package/dist/eval/semanticEval.js.map +0 -1
  546. package/dist/eval/semanticFixtures.js.map +0 -1
  547. package/dist/hooks/common.js.map +0 -1
  548. package/dist/hooks/compaction.js +0 -935
  549. package/dist/hooks/compaction.js.map +0 -1
  550. package/dist/hooks/cursorPreToolUse.js +0 -19
  551. package/dist/hooks/cursorPreToolUse.js.map +0 -1
  552. package/dist/hooks/cursorSessionStart.js +0 -71
  553. package/dist/hooks/cursorSessionStart.js.map +0 -1
  554. package/dist/hooks/sessionStart.js +0 -209
  555. package/dist/hooks/sessionStart.js.map +0 -1
  556. package/dist/hooks/sessionStop.js +0 -212
  557. package/dist/hooks/sessionStop.js.map +0 -1
  558. package/dist/hooks/validateArtifact.js +0 -935
  559. package/dist/hooks/validateArtifact.js.map +0 -1
  560. package/dist/registries/artifactRegistry.js.map +0 -1
  561. package/dist/registries/capabilityContract.js.map +0 -1
  562. package/dist/registries/evaluatorHandoffContract.js.map +0 -1
  563. package/dist/registries/packageRegistry.js.map +0 -1
  564. package/dist/registries/runtimeAdapterRegistry.js +0 -315
  565. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  566. package/dist/setup/codex.js +0 -1197
  567. package/dist/setup/codex.js.map +0 -1
  568. package/dist/setup/copilot.js +0 -227
  569. package/dist/setup/copilot.js.map +0 -1
  570. package/dist/setup/cursor.js +0 -127
  571. package/dist/setup/cursor.js.map +0 -1
  572. package/dist/setup/doctor.js +0 -1297
  573. package/dist/setup/doctor.js.map +0 -1
  574. package/dist/setup/smokeChecks.js.map +0 -1
  575. package/dist/state/installRoot.js.map +0 -1
  576. package/dist/state/startupAnalysis.js.map +0 -1
  577. package/dist/upgrade/appModel.js.map +0 -1
  578. package/dist/upgrade/channels.js.map +0 -1
  579. package/dist/upgrade/compatibility.js.map +0 -1
  580. package/dist/upgrade/doctor.js.map +0 -1
  581. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -570
  582. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  583. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
  584. package/dist/upgrade/nextMajorDoctor.js.map +0 -1
  585. package/dist/upgrade/projectIntegration.js.map +0 -1
  586. package/dist/upgrade/runtimeMigration.js.map +0 -1
  587. package/dist/upgrade/upgradeCommands.js.map +0 -1
  588. package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
  589. package/dist/upgrade/versionResolution.js.map +0 -1
  590. package/dist/validate/appHomeContract.js.map +0 -1
  591. package/dist/validate/capability.js.map +0 -1
  592. package/dist/validate/crossCapability.js.map +0 -1
  593. package/dist/validate/lifecycleAdapters.js +0 -772
  594. package/dist/validate/lifecycleAdapters.js.map +0 -1
  595. package/dist/validate/selfAudit.js.map +0 -1
  596. /package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/exit.yaml +0 -0
  597. /package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/exit.yaml +0 -0
  598. /package/bundle/skills/agentera/capabilities/{hej → status}/schemas/exit.yaml +0 -0
@@ -0,0 +1,196 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { isFile, pathExists, resolvePath } from "../core/paths.js";
4
+ import { doctorRoots } from "./appModel.js";
5
+ import { hasBundleRootEvidence } from "./bundleEvidence.js";
6
+ import { bindMigrationResource, removeBoundMigrationResource, verifyBoundMigrationResource, } from "./migrationPublication.js";
7
+ export const INSTALLED_HOOKS_SURFACE_LABEL = "hooks/";
8
+ export const RETIRE_INSTALLED_HOOKS_ACTION = "retire-installed-hooks";
9
+ const V2_HOOK_INVOCATION_PATTERNS = [
10
+ /\buv run\b[^"'\n]*hooks\/[^"'\n]*\.py/,
11
+ /\$\{AGENTERA_HOME\}\/hooks\/[^"'\n]*\.py/,
12
+ /\$\{AGENTERA_HOME\}\/app\/hooks\/[^"'\n]*\.py/,
13
+ /\$\{PLUGIN_ROOT\}\/hooks\/[^"'\n]*\.py/,
14
+ ];
15
+ const SKIP_HOOK_SCAN_PARTS = new Set([".agentera", "sessions", "benchmarks", "intermediate", "backup"]);
16
+ const V2_INSTALLED_HOOK_FILES = new Set([
17
+ "validate_artifact.py",
18
+ "cursor_session_start.py",
19
+ "cursor_pre_tool_use.py",
20
+ "cursor_session_stop.py",
21
+ "session_start.py",
22
+ "session_stop.py",
23
+ "codex-hooks.json",
24
+ ]);
25
+ function hooksDirHasPythonFiles(hooksDir) {
26
+ if (!pathExists(hooksDir) || !fs.statSync(hooksDir).isDirectory()) {
27
+ return false;
28
+ }
29
+ return fs.readdirSync(hooksDir).some((name) => name.endsWith(".py"));
30
+ }
31
+ function listInstalledHookDirs(appHome) {
32
+ const resolved = resolvePath(appHome);
33
+ const roots = doctorRoots(resolved);
34
+ const candidates = [
35
+ path.join(resolved, "hooks"),
36
+ path.join(roots.managedAppRoot, "hooks"),
37
+ path.join(roots.activeBundleRoot, "hooks"),
38
+ ];
39
+ const seen = new Set();
40
+ const out = [];
41
+ for (const hooksDir of candidates) {
42
+ const normalized = path.resolve(hooksDir);
43
+ if (seen.has(normalized) || !hooksDirHasPythonFiles(hooksDir)) {
44
+ continue;
45
+ }
46
+ seen.add(normalized);
47
+ out.push(hooksDir);
48
+ }
49
+ return out;
50
+ }
51
+ export function installedBundleUsesV2PythonHooks(appHome) {
52
+ return listInstalledHookDirs(appHome).length > 0;
53
+ }
54
+ export function textReferencesV2InstalledHooks(text) {
55
+ return V2_HOOK_INVOCATION_PATTERNS.some((pattern) => pattern.test(text));
56
+ }
57
+ function shouldScanInstalledHookFile(name) {
58
+ return (name.endsWith(".json") ||
59
+ name.endsWith(".toml") ||
60
+ name.endsWith(".js") ||
61
+ name.endsWith(".md") ||
62
+ name.endsWith(".yaml") ||
63
+ name.endsWith(".yml"));
64
+ }
65
+ /** Scan installed hook manifests for shipped v2 hook command invocations. */
66
+ export function scanInstalledBundleForV2HookInvocations(appHome) {
67
+ const resolved = resolvePath(appHome);
68
+ const hits = [];
69
+ for (const hooksDir of listInstalledHookDirs(resolved)) {
70
+ const walk = (current) => {
71
+ for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
72
+ const full = path.join(current, entry.name);
73
+ if (entry.isDirectory()) {
74
+ walk(full);
75
+ continue;
76
+ }
77
+ if (!shouldScanInstalledHookFile(entry.name)) {
78
+ continue;
79
+ }
80
+ const rel = path.relative(resolved, full);
81
+ const text = fs.readFileSync(full, "utf8");
82
+ if (textReferencesV2InstalledHooks(text)) {
83
+ hits.push(rel);
84
+ }
85
+ }
86
+ };
87
+ walk(hooksDir);
88
+ }
89
+ return hits;
90
+ }
91
+ export function detectStaleInstalledHooksSurface(appHome) {
92
+ return (installedBundleUsesV2PythonHooks(appHome) ||
93
+ scanInstalledBundleForV2HookInvocations(appHome).length > 0);
94
+ }
95
+ export function planInstalledHooksRetirementItems(ctx) {
96
+ const appHome = resolvePath(ctx.appHome);
97
+ const roots = doctorRoots(appHome);
98
+ if (!hasBundleRootEvidence(roots.activeBundleRoot)) {
99
+ return [{
100
+ status: "noop",
101
+ action: RETIRE_INSTALLED_HOOKS_ACTION,
102
+ runtime: "installed-app",
103
+ source: appHome,
104
+ message: "installed hooks preserved because managed bundle ownership is unproven",
105
+ }];
106
+ }
107
+ const hookDirs = listInstalledHookDirs(appHome);
108
+ const stale = hookDirs.length > 0 || scanInstalledBundleForV2HookInvocations(appHome).length > 0;
109
+ if (!stale) {
110
+ return [
111
+ {
112
+ status: "noop",
113
+ action: RETIRE_INSTALLED_HOOKS_ACTION,
114
+ runtime: "installed-app",
115
+ source: appHome,
116
+ message: "installed app home has no v2 Python hooks surface",
117
+ },
118
+ ];
119
+ }
120
+ const items = [];
121
+ for (const hooksDir of hookDirs) {
122
+ for (const name of fs.readdirSync(hooksDir).filter((entry) => V2_INSTALLED_HOOK_FILES.has(entry))) {
123
+ const source = path.join(hooksDir, name);
124
+ const item = {
125
+ status: "pending",
126
+ action: RETIRE_INSTALLED_HOOKS_ACTION,
127
+ runtime: "installed-app",
128
+ source,
129
+ target: appHome,
130
+ message: `will retire marker-owned v2 installed hook ${path.relative(appHome, source)}`,
131
+ removedPreview: [path.relative(appHome, source)],
132
+ };
133
+ const evidenceError = bindMigrationResource(item, "source", source, [appHome], "file");
134
+ if (evidenceError) {
135
+ item.status = "blocked";
136
+ item.message = `installed hook preserved: ${evidenceError}; review the unsafe path manually`;
137
+ }
138
+ items.push(item);
139
+ }
140
+ }
141
+ return items;
142
+ }
143
+ export function applyInstalledHooksRetirementItems(items, ctx) {
144
+ const pending = items.filter((item) => item.action === RETIRE_INSTALLED_HOOKS_ACTION && item.status === "pending");
145
+ if (pending.length === 0) {
146
+ return;
147
+ }
148
+ try {
149
+ for (const item of pending)
150
+ verifyBoundMigrationResource(item, "source");
151
+ for (const item of pending) {
152
+ removeBoundMigrationResource(item, "source");
153
+ item.status = "applied";
154
+ item.message = `retired v2 installed hook ${path.relative(resolvePath(ctx.appHome), item.source)}`;
155
+ }
156
+ }
157
+ catch (exc) {
158
+ for (const item of pending) {
159
+ item.status = "blocked";
160
+ item.message = `installed hook preserved: ${exc.message}; rerun migration and review it manually`;
161
+ }
162
+ }
163
+ }
164
+ export function installedHookPathsAfterMigration(appHome) {
165
+ const resolved = resolvePath(appHome);
166
+ const out = [];
167
+ const walk = (current) => {
168
+ if (!pathExists(current)) {
169
+ return;
170
+ }
171
+ for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
172
+ if (SKIP_HOOK_SCAN_PARTS.has(entry.name)) {
173
+ continue;
174
+ }
175
+ const full = path.join(current, entry.name);
176
+ if (entry.isDirectory()) {
177
+ if (entry.name === "hooks") {
178
+ for (const hookEntry of fs.readdirSync(full)) {
179
+ if (hookEntry.endsWith(".py")) {
180
+ out.push(path.relative(resolved, path.join(full, hookEntry)));
181
+ }
182
+ }
183
+ }
184
+ walk(full);
185
+ }
186
+ }
187
+ };
188
+ walk(resolved);
189
+ return out;
190
+ }
191
+ export function installedBundleHasV2HookInvocationText(appHome) {
192
+ return scanInstalledBundleForV2HookInvocations(appHome).length > 0;
193
+ }
194
+ export function isV2HookScript(filePath) {
195
+ return isFile(filePath) && filePath.endsWith(".py") && filePath.includes(`${path.sep}hooks${path.sep}`);
196
+ }
@@ -0,0 +1,282 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { createHash } from "node:crypto";
4
+ import { isFile, pathExists, resolvePath } from "../core/paths.js";
5
+ import { opencodeConfigDir } from "../setup/opencode.js";
6
+ import { bindMigrationResource, removeBoundMigrationResource } from "./migrationPublication.js";
7
+ export const REMOVE_LEGACY_AGENT_ACTION = "remove-legacy-agent";
8
+ /** Literal marker v2 wrote into managed per-capability agent files. */
9
+ const MANAGED_AGENT_MARKER = "<!-- agentera: managed -->";
10
+ /** Closed set of v2 Swedish-verb agent files left orphaned after v3 single-agent copy (#20). */
11
+ export const V2_SWEDISH_VERB_AGENT_FILES = [
12
+ "dokumentera.md",
13
+ "hej.md",
14
+ "inspektera.md",
15
+ "inspirera.md",
16
+ "optimera.md",
17
+ "orkestrera.md",
18
+ "planera.md",
19
+ "profilera.md",
20
+ "realisera.md",
21
+ "resonera.md",
22
+ "visionera.md",
23
+ "visualisera.md",
24
+ ];
25
+ const V2_SWEDISH_VERB_AGENT_SET = new Set(V2_SWEDISH_VERB_AGENT_FILES);
26
+ export function isV2SwedishVerbAgentFile(name) {
27
+ return V2_SWEDISH_VERB_AGENT_SET.has(name);
28
+ }
29
+ /**
30
+ * Closed set of v2 English-named per-capability agent files replaced by the
31
+ * single v3 `agentera.md` primary agent. These shipped under `.cursor/agents`
32
+ * and `.opencode/agents` and must be removed when the managed marker is present.
33
+ */
34
+ export const V2_ENGLISH_CAPABILITY_AGENT_FILES = [
35
+ "audit.md",
36
+ "build.md",
37
+ "design.md",
38
+ "discuss.md",
39
+ "document.md",
40
+ "optimize.md",
41
+ "orchestrate.md",
42
+ "plan.md",
43
+ "profile.md",
44
+ "research.md",
45
+ "status.md",
46
+ "vision.md",
47
+ ];
48
+ const V2_ENGLISH_CAPABILITY_AGENT_SET = new Set(V2_ENGLISH_CAPABILITY_AGENT_FILES);
49
+ export function isV2EnglishCapabilityAgentFile(name) {
50
+ return V2_ENGLISH_CAPABILITY_AGENT_SET.has(name);
51
+ }
52
+ function regularFileIdentity(filePath) {
53
+ try {
54
+ const stat = fs.lstatSync(filePath);
55
+ return stat.isFile() ? `${stat.dev}:${stat.ino}` : null;
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ function managedAgentOwnership(filePath) {
62
+ const identity = regularFileIdentity(filePath);
63
+ if (!identity)
64
+ return null;
65
+ let body;
66
+ try {
67
+ body = fs.readFileSync(filePath, "utf8");
68
+ }
69
+ catch {
70
+ return null;
71
+ }
72
+ if (!body.includes(MANAGED_AGENT_MARKER))
73
+ return null;
74
+ return {
75
+ kind: "managed-marker-file",
76
+ identity,
77
+ fingerprint: `sha256:${createHash("sha256").update(body).digest("hex")}`,
78
+ };
79
+ }
80
+ function planAgentFiles(ctx, names, description) {
81
+ const items = [];
82
+ for (const { runtime, agentsDir } of legacyAgentScanTargets(ctx)) {
83
+ let directory;
84
+ try {
85
+ directory = fs.lstatSync(agentsDir);
86
+ }
87
+ catch {
88
+ continue;
89
+ }
90
+ if (!directory.isDirectory()) {
91
+ items.push({
92
+ status: "blocked",
93
+ action: REMOVE_LEGACY_AGENT_ACTION,
94
+ runtime,
95
+ source: agentsDir,
96
+ message: `preserved ${agentsDir}: the legacy agents path is not a real directory; replace the unsafe path or review it manually`,
97
+ });
98
+ continue;
99
+ }
100
+ for (const name of names) {
101
+ const source = path.join(agentsDir, name);
102
+ let candidate;
103
+ try {
104
+ candidate = fs.lstatSync(source);
105
+ }
106
+ catch {
107
+ continue;
108
+ }
109
+ if (!candidate.isFile()) {
110
+ items.push({
111
+ status: "blocked",
112
+ action: REMOVE_LEGACY_AGENT_ACTION,
113
+ runtime,
114
+ source,
115
+ message: `preserved ${source}: only a marker-owned regular file is eligible; review the unsafe resource manually`,
116
+ });
117
+ continue;
118
+ }
119
+ const ownership = managedAgentOwnership(source);
120
+ const item = {
121
+ status: ownership ? "pending" : "blocked",
122
+ action: REMOVE_LEGACY_AGENT_ACTION,
123
+ runtime,
124
+ source,
125
+ ...(ownership ? { ownership } : {}),
126
+ message: ownership
127
+ ? `will remove marker-owned v2 ${description} ${name}`
128
+ : `preserved ${source}: the legacy filename does not prove Agentera ownership; confirm ownership and remove it manually if appropriate`,
129
+ };
130
+ if (ownership) {
131
+ const evidenceError = bindMigrationResource(item, "source", source, [agentsDir], "file");
132
+ if (evidenceError) {
133
+ item.status = "blocked";
134
+ item.message = `preserved ${source}: ${evidenceError}; review the unsafe path manually`;
135
+ }
136
+ }
137
+ items.push(item);
138
+ }
139
+ }
140
+ return items;
141
+ }
142
+ export function legacyAgentScanTargets(ctx) {
143
+ const project = resolvePath(ctx.project);
144
+ const home = resolvePath(ctx.home);
145
+ const appHome = resolvePath(ctx.appHome);
146
+ const env = ctx.env ?? { HOME: home };
147
+ const targets = [];
148
+ const seen = new Set();
149
+ const push = (runtime, agentsDir) => {
150
+ const normalized = path.resolve(agentsDir);
151
+ if (seen.has(normalized)) {
152
+ return;
153
+ }
154
+ seen.add(normalized);
155
+ targets.push({ runtime, agentsDir: normalized });
156
+ };
157
+ push("cursor", path.join(project, ".cursor", "agents"));
158
+ push("cursor", path.join(home, ".cursor", "agents"));
159
+ if (appHome !== project && appHome !== home) {
160
+ push("cursor", path.join(appHome, ".cursor", "agents"));
161
+ }
162
+ push("opencode", path.join(opencodeConfigDir(home, env), "agents"));
163
+ return targets;
164
+ }
165
+ export function scanLegacySwedishVerbAgentPaths(agentsDir) {
166
+ if (!pathExists(agentsDir) || !fs.statSync(agentsDir).isDirectory()) {
167
+ return [];
168
+ }
169
+ const hits = [];
170
+ for (const name of fs.readdirSync(agentsDir)) {
171
+ if (!isV2SwedishVerbAgentFile(name)) {
172
+ continue;
173
+ }
174
+ const filePath = path.join(agentsDir, name);
175
+ if (isFile(filePath)) {
176
+ hits.push(filePath);
177
+ }
178
+ }
179
+ return hits.sort();
180
+ }
181
+ /**
182
+ * Scan an agents directory for v2 English-named per-capability agents that v3
183
+ * superseded with the single `agentera.md` primary agent. Only files carrying
184
+ * the managed marker are returned, so user-owned agents without the marker are
185
+ * preserved.
186
+ */
187
+ export function scanLegacyCapabilityAgentPaths(agentsDir) {
188
+ if (!pathExists(agentsDir) || !fs.statSync(agentsDir).isDirectory()) {
189
+ return [];
190
+ }
191
+ const hits = [];
192
+ for (const name of fs.readdirSync(agentsDir)) {
193
+ if (!isV2EnglishCapabilityAgentFile(name)) {
194
+ continue;
195
+ }
196
+ const filePath = path.join(agentsDir, name);
197
+ if (!isFile(filePath)) {
198
+ continue;
199
+ }
200
+ const body = fs.readFileSync(filePath, "utf8");
201
+ if (body.includes(MANAGED_AGENT_MARKER)) {
202
+ hits.push(filePath);
203
+ }
204
+ }
205
+ return hits.sort();
206
+ }
207
+ /** Scan a tree for reintroduced Swedish-verb agents (v1LegacyCruft-style guard). */
208
+ export function scanLegacySwedishVerbAgentViolations(root) {
209
+ const resolved = resolvePath(root);
210
+ const violations = [];
211
+ const agentDirs = [
212
+ path.join(resolved, ".cursor", "agents"),
213
+ path.join(resolved, ".opencode", "agents"),
214
+ ];
215
+ for (const agentsDir of agentDirs) {
216
+ for (const filePath of scanLegacySwedishVerbAgentPaths(agentsDir)) {
217
+ violations.push(path.relative(resolved, filePath));
218
+ }
219
+ }
220
+ return violations.sort();
221
+ }
222
+ export function planLegacyAgentCleanupItems(ctx) {
223
+ return planAgentFiles(ctx, V2_SWEDISH_VERB_AGENT_FILES, "Swedish-verb agent");
224
+ }
225
+ export function planLegacyCapabilityAgentCleanupItems(ctx) {
226
+ return planAgentFiles(ctx, V2_ENGLISH_CAPABILITY_AGENT_FILES, "per-capability agent");
227
+ }
228
+ export function applyLegacyAgentCleanupItems(items, ctx) {
229
+ const allowed = new Set(legacyAgentScanTargets(ctx).map(({ agentsDir }) => path.resolve(agentsDir)));
230
+ for (const item of items) {
231
+ if (item.status !== "pending" || item.action !== REMOVE_LEGACY_AGENT_ACTION || !item.source) {
232
+ continue;
233
+ }
234
+ const basename = path.basename(item.source);
235
+ try {
236
+ if (!allowed.has(path.dirname(path.resolve(item.source)))) {
237
+ item.status = "blocked";
238
+ item.message = `preserved ${item.source}: path is outside the legacy agent cleanup allowlist; review it manually`;
239
+ continue;
240
+ }
241
+ const ownership = managedAgentOwnership(item.source);
242
+ if (!ownership) {
243
+ let absent = false;
244
+ try {
245
+ fs.lstatSync(item.source);
246
+ }
247
+ catch (error) {
248
+ absent = error.code === "ENOENT";
249
+ }
250
+ if (absent) {
251
+ item.status = "noop";
252
+ item.message = `legacy agent already absent at ${item.source}`;
253
+ }
254
+ else {
255
+ item.status = "blocked";
256
+ item.message = `preserved ${item.source}: managed marker ownership is missing or unsafe; review it manually`;
257
+ }
258
+ continue;
259
+ }
260
+ if (item.ownership?.kind !== "managed-marker-file"
261
+ || item.ownership.identity !== ownership.identity
262
+ || item.ownership.fingerprint !== ownership.fingerprint) {
263
+ item.status = "blocked";
264
+ item.message = `preserved ${item.source}: ownership identity or fingerprint changed after preview; rerun migration and review the resource`;
265
+ continue;
266
+ }
267
+ if ((!isV2SwedishVerbAgentFile(basename) && !isV2EnglishCapabilityAgentFile(basename)) ||
268
+ !regularFileIdentity(item.source)) {
269
+ item.status = "noop";
270
+ item.message = `legacy agent already absent at ${item.source}`;
271
+ continue;
272
+ }
273
+ removeBoundMigrationResource(item, "source");
274
+ item.status = "applied";
275
+ item.message = `removed orphaned v2 legacy agent ${basename}`;
276
+ }
277
+ catch (exc) {
278
+ item.status = "blocked";
279
+ item.message = `preserved ${item.source}: ${exc.message}; rerun migration and review it manually`;
280
+ }
281
+ }
282
+ }
@@ -0,0 +1,113 @@
1
+ import { appendLifecycleOwnershipJournal, lifecycleOwnershipJournalPath, readLifecycleOwnershipJournal, } from "../runtime/lifecycleOwnershipJournal.js";
2
+ import { secureLifecycleRemovalAvailable } from "../runtime/lifecyclePublication.js";
3
+ import { applyNativeResourceCleanup, previewNativeResourceCleanup, } from "../runtime/nativeResourceCleanup.js";
4
+ export const LIFECYCLE_UPGRADE_SCHEMA = "agentera.lifecycleUpgrade.v1";
5
+ function emptySummary() {
6
+ return {
7
+ applied: 0,
8
+ noop: 0,
9
+ failed: 0,
10
+ blocked_unowned: 0,
11
+ skipped_dependency: 0,
12
+ action_required: 0,
13
+ pending: 0,
14
+ };
15
+ }
16
+ function previewSummary(preview) {
17
+ const summary = emptySummary();
18
+ for (const operation of preview.plan.operations) {
19
+ if (operation.action === "noop")
20
+ summary.noop += 1;
21
+ else if (operation.action === "blocked_unowned")
22
+ summary.blocked_unowned += 1;
23
+ else if (operation.action === "action_required")
24
+ summary.action_required += 1;
25
+ else
26
+ summary.pending += 1;
27
+ }
28
+ return summary;
29
+ }
30
+ function resultSummary(result) {
31
+ return { ...result.summary, pending: 0 };
32
+ }
33
+ function blockedPlan(plan, reason) {
34
+ return {
35
+ ...plan,
36
+ operations: plan.operations.map((operation) => operation.action === "noop"
37
+ ? operation
38
+ : { ...operation, action: "action_required", reason }),
39
+ };
40
+ }
41
+ function journalBlocksMutation(journal) {
42
+ return !["absent", "clean"].includes(journal.state);
43
+ }
44
+ function journalBlocker(journal) {
45
+ const diagnostics = journal.diagnostics
46
+ .map((diagnostic) => diagnostic.replace(/^\d{20}-[0-9a-f-]{36}\.json:\s*/i, ""));
47
+ return `ownership journal is ${journal.state}: ${diagnostics.join("; ")}`;
48
+ }
49
+ function statusFor(mode, summary, requiredUnmet) {
50
+ if (summary.failed > 0
51
+ || summary.blocked_unowned > 0
52
+ || summary.skipped_dependency > 0
53
+ || summary.action_required > 0
54
+ || requiredUnmet.length > 0)
55
+ return "non_success";
56
+ if (mode === "preview" && summary.pending > 0)
57
+ return "pending";
58
+ if (mode === "apply" && summary.applied > 0)
59
+ return "success";
60
+ return "noop";
61
+ }
62
+ /** Preview or apply one explicit ownership-proven native Agentera resource cleanup. */
63
+ export function runLifecycleUpgrade(args, options = {}) {
64
+ const journal = readLifecycleOwnershipJournal(lifecycleOwnershipJournalPath(args.appHome));
65
+ let preview = previewNativeResourceCleanup({
66
+ resourceId: args.resourceCleanup,
67
+ home: args.home,
68
+ ledger: journal.ledger,
69
+ });
70
+ if (journalBlocksMutation(journal)) {
71
+ const reason = journalBlocker(journal);
72
+ preview = {
73
+ ...preview,
74
+ ledgerAuthorization: "blocked",
75
+ ledgerDiagnostics: [...preview.ledgerDiagnostics, reason],
76
+ plan: blockedPlan(preview.plan, reason),
77
+ };
78
+ }
79
+ let outputJournal = journal;
80
+ let nativeResourceCleanup = preview;
81
+ let cleanupSummary = previewSummary(preview);
82
+ if (args.apply && !journalBlocksMutation(journal)) {
83
+ nativeResourceCleanup = applyNativeResourceCleanup(preview, {
84
+ ...options,
85
+ approved: true,
86
+ persistLedger(ledger) {
87
+ appendLifecycleOwnershipJournal(journal.path, ledger);
88
+ },
89
+ });
90
+ cleanupSummary = resultSummary(nativeResourceCleanup);
91
+ outputJournal = readLifecycleOwnershipJournal(journal.path);
92
+ }
93
+ const requiredUnmet = "plan" in nativeResourceCleanup
94
+ ? nativeResourceCleanup.plan.operations
95
+ .filter((operation) => operation.required && operation.action !== "noop")
96
+ .map((operation) => operation.id)
97
+ : nativeResourceCleanup.requiredUnmet;
98
+ const mode = args.apply ? "apply" : "preview";
99
+ return {
100
+ schemaVersion: LIFECYCLE_UPGRADE_SCHEMA,
101
+ mode,
102
+ status: statusFor(mode, cleanupSummary, requiredUnmet),
103
+ approval: args.apply ? "approved" : "not_requested",
104
+ platform: {
105
+ securePublication: secureLifecycleRemovalAvailable(),
106
+ requirement: "linux_proc_self_fd",
107
+ },
108
+ ownershipJournal: outputJournal,
109
+ nativeResourceCleanup,
110
+ cleanupSummary,
111
+ requiredUnmet,
112
+ };
113
+ }