agentera 3.0.0-dev.4 → 3.0.0-dev.46

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 (585) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +108 -22
  3. package/bundle/.agentera-npx-bundle.json +1 -1
  4. package/bundle/CHANGELOG.md +1351 -0
  5. package/bundle/DESIGN.md +229 -0
  6. package/bundle/LICENSE +201 -0
  7. package/bundle/README.md +143 -0
  8. package/bundle/UPGRADE.md +236 -0
  9. package/bundle/extract-corpus-parity.json +21 -0
  10. package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
  11. package/bundle/references/adapters/package-publication.json +437 -0
  12. package/bundle/references/adapters/package-registry.yaml +434 -189
  13. package/bundle/references/adapters/package-surface-characterization.md +66 -35
  14. package/bundle/references/adapters/runtime-lifecycle-adapters.yaml +74 -0
  15. package/bundle/references/adapters/runtime-lifecycle-authority.yaml +62 -0
  16. package/bundle/references/adapters/runtime-lifecycle-operation-contract.yaml +84 -0
  17. package/bundle/references/adapters/runtime-retired-resources.yaml +333 -0
  18. package/bundle/references/analysis/evidence-tier-authority.yaml +518 -0
  19. package/bundle/references/analysis/verification-policy.yaml +191 -0
  20. package/bundle/references/artifacts/artifact-registry-interface-model.yaml +20 -10
  21. package/bundle/references/artifacts/glossary-entry-contract.yaml +1254 -0
  22. package/bundle/references/artifacts/state-storage-authority.yaml +2982 -0
  23. package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
  24. package/bundle/references/cli/app-lifecycle-vocabulary.yaml +7 -8
  25. package/bundle/references/cli/capability-instruction-contract.yaml +97 -59
  26. package/bundle/references/cli/hybrid-route-contract.yaml +438 -0
  27. package/bundle/references/cli/routing-model.md +155 -0
  28. package/bundle/references/cli/trigger-schema-enrichment.md +147 -0
  29. package/bundle/references/cli/update-channels.yaml +35 -2
  30. package/bundle/references/cli/vocabulary-index.yaml +23 -20
  31. package/bundle/references/cli/vocabulary.md +337 -366
  32. package/bundle/references/meta/retained-reference-authority.yaml +151 -0
  33. package/bundle/registry.json +14 -14
  34. package/bundle/skills/agentera/SKILL.md +218 -408
  35. package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +84 -0
  36. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/exit.yaml +2 -2
  37. package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +25 -0
  38. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/validation.yaml +37 -18
  39. package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +102 -0
  40. package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/exit.yaml +6 -5
  41. package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +27 -0
  42. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +176 -0
  43. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/artifacts.yaml +12 -12
  44. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/exit.yaml +5 -5
  45. package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +16 -0
  46. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/validation.yaml +7 -7
  47. package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +51 -0
  48. package/bundle/skills/agentera/capabilities/{resonera → discuss}/schemas/exit.yaml +2 -2
  49. package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +20 -0
  50. package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +144 -0
  51. package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +80 -0
  52. package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +16 -0
  53. package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/validation.yaml +18 -18
  54. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/artifacts.yaml +18 -18
  55. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/exit.yaml +2 -2
  56. package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +16 -0
  57. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/validation.yaml +9 -9
  58. package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +76 -0
  59. package/bundle/skills/agentera/capabilities/{orkestrera → orchestrate}/schemas/exit.yaml +9 -7
  60. package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +23 -0
  61. package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +121 -0
  62. package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +66 -0
  63. package/bundle/skills/agentera/capabilities/{planera → plan}/schemas/exit.yaml +2 -2
  64. package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +23 -0
  65. package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +121 -0
  66. package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +23 -0
  67. package/bundle/skills/agentera/capabilities/{profilera → profile}/schemas/exit.yaml +6 -5
  68. package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +20 -0
  69. package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +115 -0
  70. package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +24 -0
  71. package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +16 -0
  72. package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/validation.yaml +2 -2
  73. package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +73 -0
  74. package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +22 -0
  75. package/bundle/skills/agentera/capabilities/{hej → status}/schemas/validation.yaml +5 -5
  76. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/artifacts.yaml +16 -16
  77. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/exit.yaml +7 -6
  78. package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +23 -0
  79. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/validation.yaml +18 -20
  80. package/bundle/skills/agentera/capability_schema_contract.yaml +200 -37
  81. package/bundle/skills/agentera/protocol.yaml +31 -31
  82. package/bundle/skills/agentera/route-phrases.yaml +81 -0
  83. package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +5 -4
  84. package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +40 -22
  85. package/bundle/skills/agentera/schemas/artifacts/design.yaml +5 -4
  86. package/bundle/skills/agentera/schemas/artifacts/docs.yaml +15 -19
  87. package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +145 -14
  88. package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +82 -0
  89. package/bundle/skills/agentera/schemas/artifacts/health.yaml +58 -21
  90. package/bundle/skills/agentera/schemas/artifacts/objective.yaml +22 -8
  91. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +421 -33
  92. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +143 -53
  93. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +345 -31
  94. package/bundle/skills/agentera/schemas/artifacts/vision.yaml +3 -3
  95. package/dist/analytics/extractCorpus/cli.js +190 -0
  96. package/dist/analytics/extractCorpus/copilotSessions.js +275 -0
  97. package/dist/analytics/extractCorpus/core.js +392 -0
  98. package/dist/analytics/extractCorpus/corpus.js +167 -0
  99. package/dist/analytics/extractCorpus/coverageAudit.js +260 -0
  100. package/dist/analytics/extractCorpus/cursorSessions.js +425 -0
  101. package/dist/analytics/extractCorpus/evidenceTiers.js +603 -0
  102. package/dist/analytics/extractCorpus/extractCorpusParity.js +105 -0
  103. package/dist/analytics/extractCorpus/filesystemSources.js +118 -0
  104. package/dist/analytics/extractCorpus/index.js +14 -0
  105. package/dist/analytics/extractCorpus/jsonlSessions.js +204 -0
  106. package/dist/analytics/extractCorpus/sqliteCaps.js +43 -0
  107. package/dist/analytics/extractCorpus/sqliteSessions.js +367 -0
  108. package/dist/analytics/extractCorpus/tierReader.js +108 -0
  109. package/dist/analytics/extractCorpus.js +2 -1791
  110. package/dist/analytics/glossaryAdviceResolution.js +166 -0
  111. package/dist/analytics/glossaryInputAcquisition.js +319 -0
  112. package/dist/analytics/personalGlossaryAdmission.js +133 -0
  113. package/dist/analytics/personalGlossaryProfile.js +219 -0
  114. package/dist/analytics/profileSignals.js +211 -0
  115. package/dist/analytics/usageStats.js +169 -42
  116. package/dist/audit/terminologyDrift.js +281 -0
  117. package/dist/bin/agentera.js +3 -2
  118. package/dist/capabilities/audit/instructions.js +16 -0
  119. package/dist/capabilities/build/instructions.js +56 -0
  120. package/dist/capabilities/design/instructions.js +4 -0
  121. package/dist/capabilities/discuss/instructions.js +29 -0
  122. package/dist/capabilities/document/instructions.js +11 -0
  123. package/dist/capabilities/index.js +40 -0
  124. package/dist/capabilities/optimize/instructions.js +14 -0
  125. package/dist/capabilities/orchestrate/instructions.js +40 -0
  126. package/dist/capabilities/plan/instructions.js +32 -0
  127. package/dist/capabilities/profile/instructions.js +70 -0
  128. package/dist/capabilities/research/instructions.js +5 -0
  129. package/dist/capabilities/status/instructions.js +11 -0
  130. package/dist/capabilities/status/startupInstructions.js +34 -0
  131. package/dist/capabilities/vision/instructions.js +4 -0
  132. package/dist/cli/appContext.js +30 -24
  133. package/dist/cli/argvalidate.js +0 -1
  134. package/dist/cli/capabilityContext/benchmark.js +565 -0
  135. package/dist/cli/capabilityContext/bespoke.js +44 -0
  136. package/dist/cli/capabilityContext/build.js +242 -0
  137. package/dist/cli/capabilityContext/closeout.js +233 -0
  138. package/dist/cli/capabilityContext/contract.js +179 -0
  139. package/dist/cli/capabilityContext/evidence.js +463 -0
  140. package/dist/cli/capabilityContext/index.js +3 -0
  141. package/dist/cli/capabilityContext/orchestration.js +131 -0
  142. package/dist/cli/capabilityContext/planState.js +260 -0
  143. package/dist/cli/capabilityContext/progress.js +142 -0
  144. package/dist/cli/capabilityContext/projectVerification.js +409 -0
  145. package/dist/cli/capabilityContext/shared.js +83 -0
  146. package/dist/cli/capabilityContext/slim.js +152 -0
  147. package/dist/cli/capabilityContext/startup.js +150 -0
  148. package/dist/cli/capabilityContext/startupAggregation.js +68 -0
  149. package/dist/cli/capabilityContext/types.js +56 -0
  150. package/dist/cli/capabilityContext.js +1 -2421
  151. package/dist/cli/commands/appHome.js +22 -0
  152. package/dist/cli/commands/capability.js +5 -12
  153. package/dist/cli/commands/compact.js +41 -13
  154. package/dist/cli/commands/doctor.js +127 -97
  155. package/dist/cli/commands/durability.js +81 -0
  156. package/dist/cli/commands/glossaryAdvice.js +138 -0
  157. package/dist/cli/commands/lint.js +26 -44
  158. package/dist/cli/commands/personalGlossary.js +176 -0
  159. package/dist/cli/commands/prime/briefOrientation.js +747 -0
  160. package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
  161. package/dist/cli/commands/prime/bundleStatus.js +190 -0
  162. package/dist/cli/commands/prime/collectEntityOrientation.js +311 -0
  163. package/dist/cli/commands/prime/collectOrientationState.js +212 -0
  164. package/dist/cli/commands/prime/orientationOutput.js +397 -0
  165. package/dist/cli/commands/prime/types.js +1 -0
  166. package/dist/cli/commands/prime/v1Migration.js +38 -0
  167. package/dist/cli/commands/prime.js +80 -558
  168. package/dist/cli/commands/profileGrounding.js +55 -0
  169. package/dist/cli/commands/query.js +78 -53
  170. package/dist/cli/commands/report.js +96 -25
  171. package/dist/cli/commands/route.js +142 -0
  172. package/dist/cli/commands/schema.js +266 -143
  173. package/dist/cli/commands/state/decisions.js +387 -0
  174. package/dist/cli/commands/state/docs.js +70 -0
  175. package/dist/cli/commands/state/experimentRecords.js +151 -0
  176. package/dist/cli/commands/state/experiments.js +14 -0
  177. package/dist/cli/commands/state/get.js +129 -0
  178. package/dist/cli/commands/state/health.js +14 -0
  179. package/dist/cli/commands/state/index.js +16 -0
  180. package/dist/cli/commands/state/list.js +194 -0
  181. package/dist/cli/commands/state/objective.js +25 -0
  182. package/dist/cli/commands/state/plan.js +14 -0
  183. package/dist/cli/commands/state/planTasks.js +154 -0
  184. package/dist/cli/commands/state/plans.js +154 -0
  185. package/dist/cli/commands/state/progress.js +13 -0
  186. package/dist/cli/commands/state/shared.js +14 -0
  187. package/dist/cli/commands/state/todo.js +42 -0
  188. package/dist/cli/commands/state/write.js +434 -0
  189. package/dist/cli/commands/upgrade.js +146 -5
  190. package/dist/cli/commands/upgradeVerify.js +118 -0
  191. package/dist/cli/commands/validate.js +272 -213
  192. package/dist/cli/commands/verify.js +24 -9
  193. package/dist/cli/contracts/bundleStatus.js +1 -0
  194. package/dist/cli/contracts/orientationState.js +1 -0
  195. package/dist/cli/dispatch/argvParser.js +32 -0
  196. package/dist/cli/dispatch/check.js +372 -0
  197. package/dist/cli/dispatch/commands.js +27 -0
  198. package/dist/cli/dispatch/index.js +207 -0
  199. package/dist/cli/dispatch/lifecycle.js +652 -0
  200. package/dist/cli/dispatch/prime.js +139 -0
  201. package/dist/cli/dispatch/projections.js +17 -0
  202. package/dist/cli/dispatch/shared.js +63 -0
  203. package/dist/cli/dispatch/state.js +140 -0
  204. package/dist/cli/dispatch.js +1 -996
  205. package/dist/cli/errors.js +52 -0
  206. package/dist/cli/help.js +390 -43
  207. package/dist/cli/migrationRequired.js +87 -0
  208. package/dist/cli/orientation/attention.js +59 -0
  209. package/dist/cli/orientation/corpusCoverage.js +102 -0
  210. package/dist/cli/orientation.js +444 -173
  211. package/dist/cli/planArtifacts.js +350 -0
  212. package/dist/cli/planEvidence.js +157 -0
  213. package/dist/cli/planLifecycleState.js +36 -0
  214. package/dist/cli/planTaskIndex.js +11 -0
  215. package/dist/cli/preCutoverCommand.js +32 -0
  216. package/dist/cli/prime-blob.js +71 -3
  217. package/dist/cli/profileAcquisition.js +167 -0
  218. package/dist/cli/startupCompletenessContract.js +59 -0
  219. package/dist/cli/stateQuery.js +63 -14
  220. package/dist/cli/structured.js +0 -1
  221. package/dist/cli/todoMarkdown.js +46 -0
  222. package/dist/cli/todoReadinessSelection.js +192 -0
  223. package/dist/cli/todoSeverity.js +18 -0
  224. package/dist/core/atomicWriter.js +20 -0
  225. package/dist/core/developmentChannel.js +1 -0
  226. package/dist/core/developmentInvocation.js +374 -0
  227. package/dist/core/difflib.js +0 -1
  228. package/dist/core/envPaths.js +20 -0
  229. package/dist/core/jsonValue.js +5 -0
  230. package/dist/core/paths.js +0 -1
  231. package/dist/core/pyjson.js +67 -3
  232. package/dist/core/shell.js +4 -0
  233. package/dist/core/skillIdentity.js +23 -0
  234. package/dist/core/sourceRoot.js +9 -12
  235. package/dist/core/text.js +10 -0
  236. package/dist/core/toml.js +0 -1
  237. package/dist/core/yaml.js +8 -1
  238. package/dist/eval/evalSkills.js +30 -26
  239. package/dist/eval/hybridRouteEvaluation.js +155 -0
  240. package/dist/eval/semanticEval.js +43 -20
  241. package/dist/eval/semanticFixtures.js +16 -5
  242. package/dist/hooks/common.js +11 -81
  243. package/dist/hooks/compaction/apply.js +446 -0
  244. package/dist/hooks/compaction/dryRun.js +184 -0
  245. package/dist/hooks/compaction/index.js +22 -0
  246. package/dist/hooks/compaction/parse.js +325 -0
  247. package/dist/hooks/compaction/retention.js +202 -0
  248. package/dist/hooks/compaction/status.js +360 -0
  249. package/dist/hooks/compaction/types.js +5 -0
  250. package/dist/hooks/validateArtifact/agentFacing.js +9 -0
  251. package/dist/hooks/validateArtifact/index.js +92 -0
  252. package/dist/hooks/validateArtifact/markdown.js +145 -0
  253. package/dist/hooks/validateArtifact/schema.js +546 -0
  254. package/dist/hooks/validateArtifact/traversal.js +107 -0
  255. package/dist/hooks/validateArtifact/violations.js +107 -0
  256. package/dist/migrate/v2HandoffManifest.js +452 -0
  257. package/dist/registries/activationContract.js +2 -0
  258. package/dist/registries/activationTuples.js +106 -0
  259. package/dist/registries/artifactProtocolIds.js +78 -0
  260. package/dist/registries/artifactRegistry.js +224 -63
  261. package/dist/registries/artifactSchemaProjection.js +45 -0
  262. package/dist/registries/capabilityContract.js +141 -13
  263. package/dist/registries/evaluatorHandoffContract.js +170 -0
  264. package/dist/registries/evidenceTierContract.js +371 -0
  265. package/dist/registries/glossaryAdviceContract.js +79 -0
  266. package/dist/registries/glossaryCaveatContract.js +67 -0
  267. package/dist/registries/glossaryConsumerContractValidation.js +787 -0
  268. package/dist/registries/glossaryEntryContract.js +757 -0
  269. package/dist/registries/glossaryTermIdentity.js +17 -0
  270. package/dist/registries/glossaryTermOccurrence.js +20 -0
  271. package/dist/registries/hybridRoute.js +274 -0
  272. package/dist/registries/hybridRouteReceipt.js +221 -0
  273. package/dist/registries/packagePublication.js +229 -0
  274. package/dist/registries/packageRegistry.js +187 -211
  275. package/dist/registries/todoReadinessContract.js +448 -0
  276. package/dist/registries/triggerLoader.js +174 -0
  277. package/dist/registries/verbosityBudgetContract.js +205 -0
  278. package/dist/release/releaseMetadata.js +385 -0
  279. package/dist/runtime/lifecycleAdapterContract.js +457 -0
  280. package/dist/runtime/lifecycleAdapters.js +777 -0
  281. package/dist/runtime/lifecycleAuthority.js +453 -0
  282. package/dist/runtime/lifecycleOperationContract.js +123 -0
  283. package/dist/runtime/lifecycleOperations.js +634 -0
  284. package/dist/runtime/lifecycleOwnershipJournal.js +622 -0
  285. package/dist/runtime/lifecyclePublication.js +415 -0
  286. package/dist/runtime/lifecycleSnapshot.js +438 -0
  287. package/dist/runtime/nativeResourceCleanup.js +502 -0
  288. package/dist/setup/opencode.js +20 -0
  289. package/dist/setup/opencodeConstants.js +1 -0
  290. package/dist/setup/sharedSkill.js +45 -0
  291. package/dist/setup/smokeChecks.js +21 -82
  292. package/dist/state/archiveDiscovery.js +580 -0
  293. package/dist/state/archivePublication.js +225 -0
  294. package/dist/state/archiveRecovery.js +237 -0
  295. package/dist/state/archiveReplay.js +53 -0
  296. package/dist/state/canonicalMigrationRecord.js +36 -0
  297. package/dist/state/changelog.js +221 -0
  298. package/dist/state/decisionEntities.js +367 -0
  299. package/dist/state/decisionLegacyValidation.js +215 -0
  300. package/dist/state/decisionMigrationProvenance.js +199 -0
  301. package/dist/state/decisionOverlay.js +254 -0
  302. package/dist/state/decisionRevision.js +256 -0
  303. package/dist/state/decisionRevisionMigration.js +89 -0
  304. package/dist/state/directRetrieval.js +323 -0
  305. package/dist/state/durability.js +324 -0
  306. package/dist/state/entityCutover.js +459 -0
  307. package/dist/state/entityCutoverGit.js +127 -0
  308. package/dist/state/entityGlossaryAuthority.js +13 -0
  309. package/dist/state/entityListProjection.js +187 -0
  310. package/dist/state/entityListRuntimeRegistry.js +85 -0
  311. package/dist/state/entityMigrationCausality.js +97 -0
  312. package/dist/state/entityMigrationIdentity.js +5 -0
  313. package/dist/state/entityMigrationPreview.js +846 -0
  314. package/dist/state/entityMigrationTodo.js +133 -0
  315. package/dist/state/entityPublicationContext.js +806 -0
  316. package/dist/state/entityRetrievalHelp.js +506 -0
  317. package/dist/state/entityStorage.js +896 -0
  318. package/dist/state/exactReplacementRecovery.js +18 -0
  319. package/dist/state/experimentArchive.js +63 -0
  320. package/dist/state/experimentIdentity.js +202 -0
  321. package/dist/state/healthEntities.js +262 -0
  322. package/dist/state/healthEntityValidation.js +18 -0
  323. package/dist/state/healthRepair.js +69 -0
  324. package/dist/state/installRoot.js +64 -25
  325. package/dist/state/legacyEntityCutoverEvidence.js +65 -0
  326. package/dist/state/legacyIdentity.js +47 -0
  327. package/dist/state/legacySummaryRecord.js +6 -0
  328. package/dist/state/listAccounting.js +54 -0
  329. package/dist/state/listClassification.js +17 -0
  330. package/dist/state/listCursor.js +42 -0
  331. package/dist/state/listRetrieval.js +781 -0
  332. package/dist/state/migrationSourceBinding.js +30 -0
  333. package/dist/state/objectiveExperimentEntities.js +322 -0
  334. package/dist/state/planEntities.js +530 -0
  335. package/dist/state/planIdentity.js +47 -0
  336. package/dist/state/planRetrieval.js +313 -0
  337. package/dist/state/planTaskRetrieval.js +294 -0
  338. package/dist/state/progressEntities.js +512 -0
  339. package/dist/state/progressGlossaryCaveat.js +168 -0
  340. package/dist/state/progressPublicationOrder.js +19 -0
  341. package/dist/state/projectRoot.js +62 -0
  342. package/dist/state/projectionPolicy.js +190 -0
  343. package/dist/state/retrievalAuthority.js +156 -0
  344. package/dist/state/safeProjectFile.js +155 -0
  345. package/dist/state/startupAnalysis/benchmark.js +432 -0
  346. package/dist/state/startupAnalysis/contract.js +160 -0
  347. package/dist/state/startupAnalysis/helpers.js +286 -0
  348. package/dist/state/startupAnalysis/index.js +6 -0
  349. package/dist/state/startupAnalysis/metrics.js +340 -0
  350. package/dist/state/startupAnalysis/records.js +198 -0
  351. package/dist/state/startupAnalysis/report.js +111 -0
  352. package/dist/state/startupAnalysis/threshold.js +512 -0
  353. package/dist/state/startupAnalysis.js +2 -1953
  354. package/dist/state/startupProjection.js +499 -0
  355. package/dist/state/stateMode.js +85 -0
  356. package/dist/state/stateStorageAuthority.js +47 -0
  357. package/dist/state/summaryEntityRead.js +25 -0
  358. package/dist/state/summaryMigrationProvenance.js +66 -0
  359. package/dist/state/summarySourceRowAuthority.js +36 -0
  360. package/dist/state/todoDocsEntities.js +1064 -0
  361. package/dist/state/todoDocsEntityValidation.js +158 -0
  362. package/dist/state/todoMarkdownProjection.js +51 -0
  363. package/dist/state/todoReconciliationActivation.js +132 -0
  364. package/dist/state/todoReconciliationInspection.js +173 -0
  365. package/dist/state/todoReconciliationRepair.js +170 -0
  366. package/dist/state/todoReconciliationTransaction.js +582 -0
  367. package/dist/state/write/assign.js +20 -0
  368. package/dist/state/write/candidateMutation.js +269 -0
  369. package/dist/state/write/errors.js +11 -0
  370. package/dist/state/write/experimentPublication.js +192 -0
  371. package/dist/state/write/explain.js +332 -0
  372. package/dist/state/write/fields.js +61 -0
  373. package/dist/state/write/glossaryPublication.js +263 -0
  374. package/dist/state/write/grammar.js +280 -0
  375. package/dist/state/write/helpers.js +29 -0
  376. package/dist/state/write/index.js +12 -0
  377. package/dist/state/write/input.js +367 -0
  378. package/dist/state/write/lock.js +837 -0
  379. package/dist/state/write/mutation.js +234 -0
  380. package/dist/state/write/operations.js +169 -0
  381. package/dist/state/write/planEvaluation.js +128 -0
  382. package/dist/state/write/planPublication.js +179 -0
  383. package/dist/state/write/runtimeOperations.js +142 -0
  384. package/dist/state/write/serialize.js +1 -0
  385. package/dist/state/write/transaction.js +52 -0
  386. package/dist/state/write/validate.js +7 -0
  387. package/dist/upgrade/appContentRefresh.js +383 -0
  388. package/dist/upgrade/appModel.js +8 -7
  389. package/dist/upgrade/atomicWriter.js +1 -0
  390. package/dist/upgrade/bundleEvidence.js +33 -0
  391. package/dist/upgrade/channels.js +12 -8
  392. package/dist/upgrade/compatibility.js +56 -21
  393. package/dist/upgrade/doctor.js +197 -192
  394. package/dist/upgrade/doctorClassifier.js +187 -0
  395. package/dist/upgrade/installedHooksRetirement.js +196 -0
  396. package/dist/upgrade/legacyAgentCleanup.js +282 -0
  397. package/dist/upgrade/lifecycleUpgrade.js +113 -0
  398. package/dist/upgrade/migrateArtifactsV2ToV3.js +367 -149
  399. package/dist/upgrade/migrationPublication.js +122 -0
  400. package/dist/upgrade/nextMajorDoctor.js +155 -0
  401. package/dist/upgrade/npxPlatformStatus.js +22 -0
  402. package/dist/upgrade/projectIntegration.js +145 -187
  403. package/dist/upgrade/projectIntegrationDecision.js +50 -0
  404. package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
  405. package/dist/upgrade/runtimeMigration.js +278 -352
  406. package/dist/upgrade/upgradeCommands.js +14 -1
  407. package/dist/upgrade/upgradeLock.js +85 -0
  408. package/dist/upgrade/upgradeOrchestrator.js +263 -59
  409. package/dist/upgrade/v3CapabilitySurface.js +14 -0
  410. package/dist/upgrade/versionResolution.js +12 -5
  411. package/dist/validate/activationArtifactEvidence.js +844 -0
  412. package/dist/validate/activationConjunction.js +816 -0
  413. package/dist/validate/activationEvidenceManifest.js +515 -0
  414. package/dist/validate/activationPackageSemantics.js +29 -0
  415. package/dist/validate/appHomeContract.js +5 -11
  416. package/dist/validate/bootstrapAuthority.js +44 -0
  417. package/dist/validate/capability.js +144 -15
  418. package/dist/validate/crossCapability.js +15 -10
  419. package/dist/validate/retainedReferenceAuthority.js +879 -0
  420. package/dist/validate/selfAudit.js +73 -37
  421. package/dist/validate/v1LegacyCruft.js +131 -0
  422. package/dist/validate/vocabularyAuthority.js +303 -0
  423. package/package.json +53 -27
  424. package/bundle/references/adapters/cursor.md +0 -213
  425. package/bundle/references/adapters/opencode.md +0 -530
  426. package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
  427. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
  428. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  429. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -548
  430. package/bundle/references/adapters/runtime-feature-parity.md +0 -189
  431. package/bundle/references/analysis/benchmark.md +0 -267
  432. package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
  433. package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
  434. package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -355
  435. package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -278
  436. package/bundle/references/cli/capability-tool-classification.yaml +0 -53
  437. package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
  438. package/bundle/references/meta/documentation-inventory.md +0 -43
  439. package/bundle/references/v1-section-mapping.md +0 -47
  440. package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
  441. package/bundle/skills/agentera/agents/dokumentera.toml +0 -6
  442. package/bundle/skills/agentera/agents/hej.toml +0 -6
  443. package/bundle/skills/agentera/agents/inspektera.toml +0 -6
  444. package/bundle/skills/agentera/agents/inspirera.toml +0 -6
  445. package/bundle/skills/agentera/agents/optimera.toml +0 -6
  446. package/bundle/skills/agentera/agents/orkestrera.toml +0 -6
  447. package/bundle/skills/agentera/agents/planera.toml +0 -6
  448. package/bundle/skills/agentera/agents/profilera.toml +0 -6
  449. package/bundle/skills/agentera/agents/realisera.toml +0 -6
  450. package/bundle/skills/agentera/agents/resonera.toml +0 -6
  451. package/bundle/skills/agentera/agents/visionera.toml +0 -6
  452. package/bundle/skills/agentera/agents/visualisera.toml +0 -6
  453. package/bundle/skills/agentera/capabilities/dokumentera/instructions.md +0 -428
  454. package/bundle/skills/agentera/capabilities/dokumentera/schemas/artifacts.yaml +0 -73
  455. package/bundle/skills/agentera/capabilities/dokumentera/schemas/triggers.yaml +0 -35
  456. package/bundle/skills/agentera/capabilities/hej/instructions.md +0 -331
  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/instructions.md +0 -514
  460. package/bundle/skills/agentera/capabilities/inspektera/schemas/artifacts.yaml +0 -76
  461. package/bundle/skills/agentera/capabilities/inspektera/schemas/triggers.yaml +0 -38
  462. package/bundle/skills/agentera/capabilities/inspirera/instructions.md +0 -280
  463. package/bundle/skills/agentera/capabilities/inspirera/schemas/artifacts.yaml +0 -24
  464. package/bundle/skills/agentera/capabilities/inspirera/schemas/triggers.yaml +0 -34
  465. package/bundle/skills/agentera/capabilities/optimera/instructions.md +0 -437
  466. package/bundle/skills/agentera/capabilities/optimera/schemas/triggers.yaml +0 -39
  467. package/bundle/skills/agentera/capabilities/orkestrera/instructions.md +0 -433
  468. package/bundle/skills/agentera/capabilities/orkestrera/schemas/artifacts.yaml +0 -64
  469. package/bundle/skills/agentera/capabilities/orkestrera/schemas/triggers.yaml +0 -42
  470. package/bundle/skills/agentera/capabilities/orkestrera/schemas/validation.yaml +0 -107
  471. package/bundle/skills/agentera/capabilities/planera/instructions.md +0 -368
  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/instructions.md +0 -419
  476. package/bundle/skills/agentera/capabilities/profilera/schemas/artifacts.yaml +0 -18
  477. package/bundle/skills/agentera/capabilities/profilera/schemas/triggers.yaml +0 -45
  478. package/bundle/skills/agentera/capabilities/profilera/schemas/validation.yaml +0 -57
  479. package/bundle/skills/agentera/capabilities/realisera/instructions.md +0 -403
  480. package/bundle/skills/agentera/capabilities/realisera/schemas/artifacts.yaml +0 -80
  481. package/bundle/skills/agentera/capabilities/realisera/schemas/triggers.yaml +0 -39
  482. package/bundle/skills/agentera/capabilities/realisera/schemas/validation.yaml +0 -110
  483. package/bundle/skills/agentera/capabilities/resonera/instructions.md +0 -329
  484. package/bundle/skills/agentera/capabilities/resonera/schemas/artifacts.yaml +0 -47
  485. package/bundle/skills/agentera/capabilities/resonera/schemas/triggers.yaml +0 -46
  486. package/bundle/skills/agentera/capabilities/resonera/schemas/validation.yaml +0 -77
  487. package/bundle/skills/agentera/capabilities/visionera/instructions.md +0 -309
  488. package/bundle/skills/agentera/capabilities/visionera/schemas/triggers.yaml +0 -41
  489. package/bundle/skills/agentera/capabilities/visualisera/instructions.md +0 -400
  490. package/bundle/skills/agentera/capabilities/visualisera/schemas/triggers.yaml +0 -33
  491. package/bundle/skills/agentera/references/contract.md +0 -1039
  492. package/bundle/skills/hej/.claude-plugin/plugin.json +0 -6
  493. package/bundle/skills/hej/SKILL.md +0 -69
  494. package/bundle/skills/hej/agents/hej.toml +0 -11
  495. package/bundle/skills/hej/agents/openai.yaml +0 -8
  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/cli/appContext.js.map +0 -1
  500. package/dist/cli/argvalidate.js.map +0 -1
  501. package/dist/cli/capabilityContext.js.map +0 -1
  502. package/dist/cli/commands/backfill.js +0 -84
  503. package/dist/cli/commands/backfill.js.map +0 -1
  504. package/dist/cli/commands/capability.js.map +0 -1
  505. package/dist/cli/commands/compact.js.map +0 -1
  506. package/dist/cli/commands/doctor.js.map +0 -1
  507. package/dist/cli/commands/lint.js.map +0 -1
  508. package/dist/cli/commands/prime.js.map +0 -1
  509. package/dist/cli/commands/query.js.map +0 -1
  510. package/dist/cli/commands/report.js.map +0 -1
  511. package/dist/cli/commands/schema.js.map +0 -1
  512. package/dist/cli/commands/state.js +0 -1012
  513. package/dist/cli/commands/state.js.map +0 -1
  514. package/dist/cli/commands/upgrade.js.map +0 -1
  515. package/dist/cli/commands/validate.js.map +0 -1
  516. package/dist/cli/commands/verify.js.map +0 -1
  517. package/dist/cli/dispatch.js.map +0 -1
  518. package/dist/cli/help.js.map +0 -1
  519. package/dist/cli/orientation.js.map +0 -1
  520. package/dist/cli/prime-blob.js.map +0 -1
  521. package/dist/cli/stateQuery.js.map +0 -1
  522. package/dist/cli/structured.js.map +0 -1
  523. package/dist/core/difflib.js.map +0 -1
  524. package/dist/core/git.js +0 -43
  525. package/dist/core/git.js.map +0 -1
  526. package/dist/core/paths.js.map +0 -1
  527. package/dist/core/pyjson.js.map +0 -1
  528. package/dist/core/sourceRoot.js.map +0 -1
  529. package/dist/core/toml.js.map +0 -1
  530. package/dist/core/yaml.js.map +0 -1
  531. package/dist/eval/evalSkills.js.map +0 -1
  532. package/dist/eval/semanticEval.js.map +0 -1
  533. package/dist/eval/semanticFixtures.js.map +0 -1
  534. package/dist/hooks/common.js.map +0 -1
  535. package/dist/hooks/compaction.js +0 -935
  536. package/dist/hooks/compaction.js.map +0 -1
  537. package/dist/hooks/cursorPreToolUse.js +0 -19
  538. package/dist/hooks/cursorPreToolUse.js.map +0 -1
  539. package/dist/hooks/cursorSessionStart.js +0 -71
  540. package/dist/hooks/cursorSessionStart.js.map +0 -1
  541. package/dist/hooks/sessionStart.js +0 -209
  542. package/dist/hooks/sessionStart.js.map +0 -1
  543. package/dist/hooks/sessionStop.js +0 -212
  544. package/dist/hooks/sessionStop.js.map +0 -1
  545. package/dist/hooks/validateArtifact.js +0 -933
  546. package/dist/hooks/validateArtifact.js.map +0 -1
  547. package/dist/registries/artifactRegistry.js.map +0 -1
  548. package/dist/registries/capabilityContract.js.map +0 -1
  549. package/dist/registries/packageRegistry.js.map +0 -1
  550. package/dist/registries/runtimeAdapterRegistry.js +0 -315
  551. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  552. package/dist/setup/codex.js +0 -1056
  553. package/dist/setup/codex.js.map +0 -1
  554. package/dist/setup/copilot.js +0 -227
  555. package/dist/setup/copilot.js.map +0 -1
  556. package/dist/setup/cursor.js +0 -127
  557. package/dist/setup/cursor.js.map +0 -1
  558. package/dist/setup/doctor.js +0 -1297
  559. package/dist/setup/doctor.js.map +0 -1
  560. package/dist/setup/smokeChecks.js.map +0 -1
  561. package/dist/state/installRoot.js.map +0 -1
  562. package/dist/state/progressCommit.js +0 -289
  563. package/dist/state/progressCommit.js.map +0 -1
  564. package/dist/state/startupAnalysis.js.map +0 -1
  565. package/dist/upgrade/appModel.js.map +0 -1
  566. package/dist/upgrade/channels.js.map +0 -1
  567. package/dist/upgrade/compatibility.js.map +0 -1
  568. package/dist/upgrade/doctor.js.map +0 -1
  569. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -571
  570. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  571. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
  572. package/dist/upgrade/projectIntegration.js.map +0 -1
  573. package/dist/upgrade/runtimeMigration.js.map +0 -1
  574. package/dist/upgrade/upgradeCommands.js.map +0 -1
  575. package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
  576. package/dist/upgrade/versionResolution.js.map +0 -1
  577. package/dist/validate/appHomeContract.js.map +0 -1
  578. package/dist/validate/capability.js.map +0 -1
  579. package/dist/validate/crossCapability.js.map +0 -1
  580. package/dist/validate/lifecycleAdapters.js +0 -772
  581. package/dist/validate/lifecycleAdapters.js.map +0 -1
  582. package/dist/validate/selfAudit.js.map +0 -1
  583. /package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/exit.yaml +0 -0
  584. /package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/exit.yaml +0 -0
  585. /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
+ }