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
@@ -7,6 +7,16 @@ function shellQuote(value) {
7
7
  export function commandText(parts) {
8
8
  return parts.map(shellQuote).join(" ");
9
9
  }
10
+ export function fullEntityUpgradeCommand(project) {
11
+ return commandText([
12
+ "npx", "-y", "agentera@next", "upgrade", "--channel", "development", "--project", project, "--yes",
13
+ ]);
14
+ }
15
+ export function fullEntityUpgradePreviewCommand(project) {
16
+ return commandText([
17
+ "npx", "-y", "agentera@next", "upgrade", "--channel", "development", "--project", project, "--dry-run",
18
+ ]);
19
+ }
10
20
  /** Channel-aware upgrade preview/apply commands (doctor, prime, orchestrator). */
11
21
  export function buildUpgradeCommands(args) {
12
22
  const base = args.channel.updateCommand.split(/\s+/).slice(0, 3);
@@ -32,9 +42,12 @@ export function buildUpgradeCommands(args) {
32
42
  applyParts.push("--only", phase);
33
43
  }
34
44
  }
45
+ if (args.legacyCleanup) {
46
+ previewParts.push("--legacy-cleanup", args.legacyCleanup);
47
+ applyParts.push("--legacy-cleanup", args.legacyCleanup);
48
+ }
35
49
  return {
36
50
  dryRunCommand: commandText(previewParts),
37
51
  applyCommand: commandText(applyParts),
38
52
  };
39
53
  }
40
- //# sourceMappingURL=upgradeCommands.js.map
@@ -0,0 +1,85 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ const MAX_LOCK_BYTES = 4 * 1024;
5
+ export class UpgradeLockError extends Error {
6
+ constructor(lockPath) {
7
+ super(`upgrade mutation is locked; inspect ${lockPath}, remove that file only if no upgrade owns it, then rerun`);
8
+ this.name = "UpgradeLockError";
9
+ }
10
+ }
11
+ export function upgradeLockPath(root, domain) {
12
+ return path.join(root, ".agentera", `upgrade-${domain}.lock`);
13
+ }
14
+ function manualRecovery(lockPath) {
15
+ return new UpgradeLockError(lockPath);
16
+ }
17
+ function removeCreatedParent(parent, created) {
18
+ if (!created)
19
+ return;
20
+ try {
21
+ fs.rmdirSync(parent);
22
+ }
23
+ catch (error) {
24
+ const code = error.code;
25
+ if (code !== "ENOENT" && code !== "ENOTEMPTY" && code !== "EEXIST")
26
+ throw error;
27
+ }
28
+ }
29
+ function lockRecord(lockPath) {
30
+ try {
31
+ const stat = fs.lstatSync(lockPath);
32
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.size > MAX_LOCK_BYTES)
33
+ return null;
34
+ const value = JSON.parse(fs.readFileSync(lockPath, "utf8"));
35
+ if (value === null
36
+ || typeof value !== "object"
37
+ || Object.keys(value).length !== 1
38
+ || typeof value.token !== "string"
39
+ || value.token.length === 0)
40
+ return null;
41
+ return value;
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ }
47
+ export function acquireUpgradeLock(root, domain) {
48
+ const lockPath = upgradeLockPath(root, domain);
49
+ const parent = path.dirname(lockPath);
50
+ let createdParent = false;
51
+ try {
52
+ fs.mkdirSync(parent);
53
+ createdParent = true;
54
+ }
55
+ catch (error) {
56
+ if (error.code !== "EEXIST")
57
+ throw error;
58
+ }
59
+ const token = randomUUID();
60
+ let fd;
61
+ try {
62
+ fd = fs.openSync(lockPath, fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL, 0o600);
63
+ }
64
+ catch (error) {
65
+ removeCreatedParent(parent, createdParent);
66
+ if (error.code === "EEXIST")
67
+ throw manualRecovery(lockPath);
68
+ throw error;
69
+ }
70
+ try {
71
+ fs.writeFileSync(fd, `${JSON.stringify({ token })}\n`);
72
+ fs.fsyncSync(fd);
73
+ }
74
+ finally {
75
+ fs.closeSync(fd);
76
+ }
77
+ return { domain, path: lockPath, token, createdParent };
78
+ }
79
+ export function releaseUpgradeLock(lock) {
80
+ const record = lockRecord(lock.path);
81
+ if (!record || record.token !== lock.token)
82
+ throw manualRecovery(lock.path);
83
+ fs.unlinkSync(lock.path);
84
+ removeCreatedParent(path.dirname(lock.path), lock.createdParent);
85
+ }
@@ -1,16 +1,22 @@
1
1
  import os from "node:os";
2
+ import path from "node:path";
2
3
  import { expanduser, resolvePath } from "../core/paths.js";
3
4
  import { resolveDoctorInstallRoot, resolveSourceRootStrict } from "./appModel.js";
4
- import { MAJOR_BOUNDARY_ITEM_TAG, STATUS_APPLIED, STATUS_MANUAL_REVIEW_NEEDED, STATUS_NO_CHANGES_NEEDED, STATUS_READY_TO_APPLY, UPGRADE_PREVIEW_SCHEMA, classifyInstall, crossMajorBoundaryApplies, previewCrossMajorGuard, } from "./compatibility.js";
5
+ import { MAJOR_BOUNDARY_ITEM_TAG, STATUS_APPLIED, STATUS_MANUAL_REVIEW_NEEDED, STATUS_NO_CHANGES_NEEDED, STATUS_READY_TO_APPLY, UPGRADE_PREVIEW_SCHEMA, classifyInstall, crossMajorBoundaryApplies, } from "./compatibility.js";
5
6
  import { classifyUpgradeOutcome, isBlockedUpgradeOutcome, shouldIncludeCrossMajorPlanItems, } from "./versionResolution.js";
6
- import { resolveUpdateChannel } from "./channels.js";
7
+ import { resolveInvokedUpdateChannel } from "./channels.js";
7
8
  import { buildUpgradeCommands } from "./upgradeCommands.js";
8
- import { projectHasPendingRuntimeRewire } from "./projectIntegration.js";
9
- import { MIGRATION_STATUSES, applyMigrationPhases, detectV1ArtifactPairs, dryRunMigration, } from "./migrateArtifactsV2ToV3.js";
9
+ import { pendingRuntimeMigrationItems } from "./projectIntegration.js";
10
+ import { REMOVE_LEGACY_AGENT_ACTION, planLegacyAgentCleanupItems, planLegacyCapabilityAgentCleanupItems, } from "./legacyAgentCleanup.js";
11
+ import { MIGRATION_STATUSES, applyMigrationPhases, delegatePlanLifecycleToEntityCutover, detectV1ArtifactPairs, dryRunMigration, hasPendingPlanLifecycleMigration, } from "./migrateArtifactsV2ToV3.js";
12
+ import { runLifecycleUpgrade, } from "./lifecycleUpgrade.js";
13
+ import { acquireUpgradeLock, releaseUpgradeLock } from "./upgradeLock.js";
14
+ import { applyPreparedEntityCutover, inspectEntityCutoverForUpgrade, prepareEntityCutoverForUpgrade, } from "../state/entityCutover.js";
15
+ import { detectStateMode } from "../state/stateMode.js";
10
16
  const DEFAULT_PHASES = ["detect", "artifacts", "runtime", "cleanup"];
11
17
  const MIGRATION_ONLY_PHASES = ["artifacts", "runtime", "cleanup"];
12
18
  function emptySummary() {
13
- return { pending: 0, applied: 0, noop: 0, blocked: 0, failed: 0, skipped: 0 };
19
+ return { pending: 0, applied: 0, noop: 0, blocked: 0, failed: 0 };
14
20
  }
15
21
  function aggregateSummary(phases) {
16
22
  const summary = emptySummary();
@@ -30,8 +36,6 @@ function workflowStatus(summary) {
30
36
  return "pending";
31
37
  if (summary.applied > 0)
32
38
  return "applied";
33
- if (summary.skipped > 0 && summary.noop === 0 && summary.applied === 0)
34
- return "skipped";
35
39
  return "noop";
36
40
  }
37
41
  function lifecycleStatusFromWorkflow(workflow, mode) {
@@ -41,7 +45,6 @@ function lifecycleStatusFromWorkflow(workflow, mode) {
41
45
  case "applied":
42
46
  return STATUS_APPLIED;
43
47
  case "noop":
44
- case "skipped":
45
48
  return STATUS_NO_CHANGES_NEEDED;
46
49
  case "blocked":
47
50
  case "failed":
@@ -76,8 +79,6 @@ function summarizeOrchestratorPhase(name, items, message = "") {
76
79
  status = "pending";
77
80
  else if (summary.applied > 0)
78
81
  status = "applied";
79
- else if (summary.skipped > 0 && summary.noop === 0 && summary.applied === 0)
80
- status = "skipped";
81
82
  else
82
83
  status = "noop";
83
84
  return { name, status, summary, items, message };
@@ -123,13 +124,127 @@ function migrationPhaseToOrchestrator(phase) {
123
124
  message: phase.message,
124
125
  };
125
126
  }
127
+ function entityReadinessPhase(project, sourceRoot, pendingV1Artifacts, selected, apply, activeUpgradeLockPaths) {
128
+ try {
129
+ const cutover = inspectEntityCutoverForUpgrade(project, sourceRoot, apply && selected, activeUpgradeLockPaths);
130
+ if (cutover.phase === "active") {
131
+ return summarizeOrchestratorPhase("entities", [{
132
+ status: "noop",
133
+ action: "entity-state-active",
134
+ message: "validated entity authority is already active",
135
+ }]);
136
+ }
137
+ if (cutover.phase !== "ready") {
138
+ if (!selected) {
139
+ return summarizeOrchestratorPhase("entities", [{
140
+ status: "blocked",
141
+ action: "entity-cutover-required",
142
+ message: "a forward entity cutover must complete inside one full upgrade before any filtered effects",
143
+ }]);
144
+ }
145
+ return summarizeOrchestratorPhase("entities", [{
146
+ status: "pending",
147
+ action: "entity-cutover",
148
+ message: "validated forward entity publication is ready to complete without deleting canonical entities",
149
+ }]);
150
+ }
151
+ if (!selected) {
152
+ return summarizeOrchestratorPhase("entities", [{
153
+ status: "blocked",
154
+ action: "entity-cutover-required",
155
+ message: "marker-absent projects require one full cross-major upgrade; filtered apply is unavailable",
156
+ }]);
157
+ }
158
+ if (pendingV1Artifacts) {
159
+ return summarizeOrchestratorPhase("entities", [{
160
+ status: "blocked",
161
+ action: "resolve-v1-state",
162
+ message: "pending v1 Markdown state is not a supported automatic source; preserve it and follow the manual v1 recovery instructions in UPGRADE.md",
163
+ }]);
164
+ }
165
+ const empty = cutover.entityCount === 0;
166
+ return summarizeOrchestratorPhase("entities", [{
167
+ status: empty ? "blocked" : "pending",
168
+ action: empty ? "unsupported-state-source" : "entity-cutover",
169
+ message: empty
170
+ ? "marker-absent state has no recognized v2 entity input; preserve it and follow the manual source recovery instructions in UPGRADE.md"
171
+ : `${cutover.entityCount} entity record(s) are ready for marker-last Git cutover${cutover.todoReconciliation ? "; apply also journals TODO visible IDs, Markdown-owned public baselines, activation, canonical Markdown, and the authority marker" : ""}`,
172
+ }]);
173
+ }
174
+ catch (error) {
175
+ return summarizeOrchestratorPhase("entities", [{
176
+ status: "blocked",
177
+ action: "validate-entity-state",
178
+ message: error.message,
179
+ }]);
180
+ }
181
+ }
182
+ function lifecyclePhase(result) {
183
+ const cleanup = result.cleanupSummary;
184
+ const summary = {
185
+ pending: cleanup.pending,
186
+ applied: cleanup.applied,
187
+ noop: cleanup.noop,
188
+ failed: cleanup.failed,
189
+ blocked: cleanup.blocked_unowned + cleanup.skipped_dependency + cleanup.action_required,
190
+ };
191
+ return {
192
+ name: "lifecycle",
193
+ status: workflowStatus(summary),
194
+ summary,
195
+ items: [],
196
+ message: "summary only; selected native Agentera resource cleanup outcomes are reported under lifecycle.nativeResourceCleanup",
197
+ };
198
+ }
199
+ function isIndependentLegacyAgentCollision(phase, item) {
200
+ return phase.name === "cleanup" && item.action === REMOVE_LEGACY_AGENT_ACTION && item.status === "blocked";
201
+ }
126
202
  export function buildUpgradePlan(args) {
127
- const sourceRoot = resolveSourceRootStrict();
203
+ if (args.runtime) {
204
+ throw new Error(`--runtime ${args.runtime} is retired; use the shared skill at ~/.agents/skills/agentera plus the CLI and remove --runtime`);
205
+ }
128
206
  const home = resolvePath(expanduser(args.home ?? os.homedir()));
129
- const env = { ...process.env, HOME: home };
130
207
  const project = resolvePath(expanduser(args.project ?? process.cwd()));
208
+ if (!args.yes)
209
+ return buildUpgradePlanUnlocked(args, home, project, []);
210
+ const projectLock = acquireUpgradeLock(project, "project");
211
+ try {
212
+ const runtimeLock = acquireUpgradeLock(home, "runtime");
213
+ try {
214
+ return buildUpgradePlanUnlocked(args, home, project, [projectLock.path, runtimeLock.path]);
215
+ }
216
+ finally {
217
+ releaseUpgradeLock(runtimeLock);
218
+ }
219
+ }
220
+ finally {
221
+ releaseUpgradeLock(projectLock);
222
+ }
223
+ }
224
+ function buildUpgradePlanUnlocked(args, home, project, activeUpgradeLockPaths) {
225
+ const sourceRoot = resolveSourceRootStrict();
226
+ const homeScopedPath = (value) => {
227
+ if (!value)
228
+ return null;
229
+ // Relative overrides retain their normal process-cwd meaning before the
230
+ // resolved path is checked. The home itself and its descendants are valid.
231
+ const resolved = resolvePath(value);
232
+ const relative = path.relative(home, resolved);
233
+ const withinHome = relative === ""
234
+ || (relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative));
235
+ return withinHome ? resolved : null;
236
+ };
237
+ const xdgConfigHome = homeScopedPath(process.env.XDG_CONFIG_HOME) ?? path.join(home, ".config");
238
+ const env = {
239
+ ...process.env,
240
+ HOME: home,
241
+ XDG_CONFIG_HOME: xdgConfigHome,
242
+ };
243
+ if (!homeScopedPath(process.env.OPENCODE_CONFIG_DIR)) {
244
+ delete env.OPENCODE_CONFIG_DIR;
245
+ }
131
246
  const [installRoot] = resolveDoctorInstallRoot(args.installRoot ?? null, { home, sourceRoot });
132
- const channel = resolveUpdateChannel({
247
+ const channel = resolveInvokedUpdateChannel({
133
248
  channel: args.channel ?? null,
134
249
  env,
135
250
  home,
@@ -143,6 +258,42 @@ export function buildUpgradePlan(args) {
143
258
  channel,
144
259
  });
145
260
  const crossMajorBoundary = crossMajorBoundaryApplies(install, sourceRoot);
261
+ if (args.legacyCleanup) {
262
+ const lifecycle = runLifecycleUpgrade({
263
+ home,
264
+ appHome: installRoot,
265
+ apply: Boolean(args.yes),
266
+ resourceCleanup: args.legacyCleanup,
267
+ });
268
+ const phases = [lifecyclePhase(lifecycle)];
269
+ const summary = aggregateSummary(phases);
270
+ const status = workflowStatus(summary);
271
+ const commands = buildUpgradeCommands({
272
+ project,
273
+ installRoot: crossMajorBoundary ? installRoot : null,
274
+ channel,
275
+ legacyCleanup: args.legacyCleanup,
276
+ cwdDefault: true,
277
+ });
278
+ return {
279
+ schemaVersion: UPGRADE_PREVIEW_SCHEMA,
280
+ mode: args.yes ? "apply" : "plan",
281
+ status,
282
+ lifecycleStatus: lifecycleStatusFromWorkflow(status, args.yes ? "apply" : "plan"),
283
+ channel,
284
+ install,
285
+ upgradeOutcome,
286
+ crossMajorBoundary,
287
+ project,
288
+ appHome: installRoot,
289
+ home,
290
+ phases,
291
+ lifecycle,
292
+ summary,
293
+ dryRunCommand: summary.pending > 0 ? commands.dryRunCommand : null,
294
+ applyCommand: summary.pending > 0 ? commands.applyCommand : null,
295
+ };
296
+ }
146
297
  const phaseFilter = selectedPhases(args.only);
147
298
  const migrationCtx = {
148
299
  appHome: installRoot,
@@ -152,32 +303,77 @@ export function buildUpgradePlan(args) {
152
303
  sourceRoot,
153
304
  channel: args.channel ?? null,
154
305
  env,
306
+ installAppContentIfMissing: false,
155
307
  };
156
- const pendingRuntimeRewire = projectHasPendingRuntimeRewire(migrationCtx);
308
+ const pendingRuntimeSync = pendingRuntimeMigrationItems(migrationCtx).length > 0;
157
309
  const pendingV1Artifacts = detectV1ArtifactPairs(project).length > 0;
310
+ const pendingPlanLifecycleMigration = hasPendingPlanLifecycleMigration(project);
158
311
  const crossMajorMigration = crossMajorBoundary && shouldIncludeCrossMajorPlanItems(channel, upgradeOutcome);
159
- const artifactsOnlyMigration = pendingV1Artifacts && !crossMajorMigration;
160
- const runtimeOnlyMigration = pendingRuntimeRewire && !crossMajorMigration && !artifactsOnlyMigration;
161
- const runMigration = crossMajorMigration || pendingRuntimeRewire || pendingV1Artifacts;
162
- const effectiveOnly = args.only && args.only.length > 0
163
- ? args.only
164
- : artifactsOnlyMigration
165
- ? ["artifacts"]
166
- : runtimeOnlyMigration
167
- ? ["runtime"]
168
- : MIGRATION_ONLY_PHASES;
312
+ const entityAuthorityActive = detectStateMode(project, sourceRoot) === "entities";
313
+ const projectEntityCutover = !entityAuthorityActive
314
+ && channel.distributionMajor >= 3
315
+ && !args.only
316
+ && !args.legacyCleanup;
317
+ const pendingCleanup = [
318
+ ...planLegacyAgentCleanupItems(migrationCtx),
319
+ ...planLegacyCapabilityAgentCleanupItems(migrationCtx),
320
+ ].some((item) => item.status !== "noop");
321
+ const runMigration = crossMajorMigration || projectEntityCutover || pendingRuntimeSync || pendingV1Artifacts || pendingPlanLifecycleMigration || pendingCleanup;
169
322
  const phases = [];
170
323
  if (phaseFilter.has("detect")) {
171
324
  phases.push(buildDetectPhase(install, crossMajorBoundary, upgradeOutcome, channel));
172
325
  }
173
326
  let migrationPreview = runMigration ? dryRunMigration(migrationCtx) : null;
174
- if (args.yes && migrationPreview) {
175
- migrationPreview = applyMigrationPhases(migrationCtx, migrationPreview, effectiveOnly);
327
+ const entityBoundary = projectEntityCutover || crossMajorMigration;
328
+ const filteredEntityBoundary = entityBoundary && Boolean(args.only && args.only.length > 0);
329
+ const entitySelected = entityBoundary && (!filteredEntityBoundary || (!args.yes && Boolean(args.only?.includes("artifacts"))));
330
+ const partialStateApply = filteredEntityBoundary && !entitySelected;
331
+ let entityPhase = entitySelected || partialStateApply || (entityAuthorityActive && crossMajorMigration)
332
+ ? entityReadinessPhase(project, sourceRoot, pendingV1Artifacts, entitySelected, Boolean(args.yes), activeUpgradeLockPaths)
333
+ : null;
334
+ const entityCutoverPending = entityPhase?.items.some(({ action }) => action === "entity-cutover") ?? false;
335
+ if (migrationPreview && (entityAuthorityActive || (args.yes && entityCutoverPending))) {
336
+ delegatePlanLifecycleToEntityCutover(migrationPreview.artifacts);
337
+ }
338
+ const lifecycleArgs = args.legacyCleanup ? {
339
+ home,
340
+ appHome: installRoot,
341
+ apply: false,
342
+ resourceCleanup: args.legacyCleanup,
343
+ } : null;
344
+ let lifecycle = lifecycleArgs ? runLifecycleUpgrade(lifecycleArgs) : null;
345
+ const plannedPhases = [
346
+ ...phases,
347
+ ...(migrationPreview && phaseFilter.has("artifacts") ? [migrationPhaseToOrchestrator(migrationPreview.artifacts)] : []),
348
+ ...(entityPhase ? [entityPhase] : []),
349
+ ...(migrationPreview && phaseFilter.has("runtime") ? [migrationPhaseToOrchestrator(migrationPreview.runtime)] : []),
350
+ ...(migrationPreview && phaseFilter.has("cleanup") ? [migrationPhaseToOrchestrator(migrationPreview.cleanup)] : []),
351
+ ...(lifecycle ? [lifecyclePhase(lifecycle)] : []),
352
+ ];
353
+ const entityPreflight = aggregateSummary(plannedPhases.filter((phase) => ["detect", "artifacts", "entities"].includes(phase.name)));
354
+ const entityPreflightBlocked = entityPreflight.blocked > 0 || entityPreflight.failed > 0;
355
+ let preparedEntityMigration = null;
356
+ if (args.yes && entitySelected && entityPhase?.status === "pending" && !entityPreflightBlocked) {
357
+ preparedEntityMigration = prepareEntityCutoverForUpgrade(project, sourceRoot, activeUpgradeLockPaths);
358
+ }
359
+ if (preparedEntityMigration) {
360
+ const result = applyPreparedEntityCutover(preparedEntityMigration, activeUpgradeLockPaths);
361
+ entityPhase = summarizeOrchestratorPhase("entities", [{
362
+ status: "applied",
363
+ action: "entity-cutover",
364
+ message: `${result.entity_count} entity record(s) published and validated; authority marker written last`,
365
+ }]);
366
+ }
367
+ if (args.yes && migrationPreview && !entityPreflightBlocked) {
368
+ const applyPhases = args.only ?? MIGRATION_ONLY_PHASES;
369
+ migrationPreview = applyMigrationPhases(migrationCtx, migrationPreview, applyPhases);
176
370
  }
177
371
  if (migrationPreview) {
178
372
  if (phaseFilter.has("artifacts")) {
179
373
  phases.push(migrationPhaseToOrchestrator(migrationPreview.artifacts));
180
374
  }
375
+ if (entityPhase)
376
+ phases.push(entityPhase);
181
377
  if (phaseFilter.has("runtime")) {
182
378
  phases.push(migrationPhaseToOrchestrator(migrationPreview.runtime));
183
379
  }
@@ -185,43 +381,27 @@ export function buildUpgradePlan(args) {
185
381
  phases.push(migrationPhaseToOrchestrator(migrationPreview.cleanup));
186
382
  }
187
383
  }
188
- else if (crossMajorBoundary) {
189
- const guard = previewCrossMajorGuard({
190
- appHome: installRoot,
191
- sourceRoot,
192
- channel: args.channel ?? null,
193
- env,
194
- home,
195
- catalog: null,
196
- });
197
- for (const guardPhase of guard.phases) {
198
- if (guardPhase.name === "detect" || !phaseFilter.has(guardPhase.name)) {
199
- continue;
200
- }
201
- const items = guardPhase.items.map((item) => ({
202
- status: "blocked",
203
- action: item.verb,
204
- message: `${item.name} requires semver forward-major confirmation on the selected channel`,
205
- }));
206
- phases.push({
207
- name: guardPhase.name,
208
- status: items.length > 0 ? "blocked" : "noop",
209
- summary: { ...emptySummary(), blocked: items.length },
210
- items,
211
- message: "",
212
- });
213
- }
384
+ if (!migrationPreview && entityPhase)
385
+ phases.push(entityPhase);
386
+ if (lifecycleArgs && args.yes && !entityPreflightBlocked) {
387
+ lifecycle = runLifecycleUpgrade({ ...lifecycleArgs, apply: true });
388
+ }
389
+ if (lifecycle) {
390
+ phases.push(lifecyclePhase(lifecycle));
214
391
  }
215
392
  const summary = aggregateSummary(phases);
216
393
  const status = workflowStatus(summary);
394
+ const appSummary = aggregateSummary(phases.filter((phase) => phase.name !== "lifecycle"));
395
+ const appApplyBlocked = appSummary.blocked > 0 || appSummary.failed > 0;
217
396
  const mode = args.yes ? "apply" : "plan";
218
397
  const lifecycleStatus = lifecycleStatusFromWorkflow(status, mode);
219
- const blocked = status === "blocked" || status === "failed";
398
+ const hasPending = summary.pending > 0;
220
399
  const commands = buildUpgradeCommands({
221
400
  project,
222
401
  installRoot: crossMajorMigration || crossMajorBoundary ? installRoot : null,
223
402
  channel,
224
- only: args.only ?? (artifactsOnlyMigration ? ["artifacts"] : runtimeOnlyMigration ? ["runtime"] : undefined),
403
+ only: args.only,
404
+ legacyCleanup: args.legacyCleanup,
225
405
  cwdDefault: true,
226
406
  });
227
407
  return {
@@ -237,9 +417,10 @@ export function buildUpgradePlan(args) {
237
417
  appHome: installRoot,
238
418
  home,
239
419
  phases,
420
+ lifecycle,
240
421
  summary,
241
- dryRunCommand: blocked || lifecycleStatus === STATUS_NO_CHANGES_NEEDED ? null : commands.dryRunCommand,
242
- applyCommand: blocked || lifecycleStatus === STATUS_NO_CHANGES_NEEDED ? null : commands.applyCommand,
422
+ dryRunCommand: appApplyBlocked || !hasPending ? null : commands.dryRunCommand,
423
+ applyCommand: appApplyBlocked || !hasPending ? null : commands.applyCommand,
243
424
  };
244
425
  }
245
426
  export function validateUpgradeApply(args, plan) {
@@ -249,10 +430,25 @@ export function validateUpgradeApply(args, plan) {
249
430
  if (!args.yes) {
250
431
  return null;
251
432
  }
252
- if (isBlockedUpgradeOutcome(plan.upgradeOutcome)) {
433
+ if (plan.crossMajorBoundary && args.only && args.only.length > 0) {
434
+ return "cross-major v2→v3 apply must run as one full upgrade --yes; --only is preview-only at this boundary";
435
+ }
436
+ if (!args.legacyCleanup && isBlockedUpgradeOutcome(plan.upgradeOutcome)) {
253
437
  return plan.upgradeOutcome.message ?? "upgrade blocked";
254
438
  }
255
- if (plan.crossMajorBoundary &&
439
+ const appPhases = plan.phases.filter((phase) => phase.name !== "lifecycle");
440
+ const entityImportPending = appPhases.some((phase) => phase.name === "entities" && phase.items.some((item) => item.action === "entity-cutover" && item.status === "pending"));
441
+ const applyBlockingPhases = entityImportPending
442
+ ? appPhases.filter((phase) => ["detect", "artifacts", "entities"].includes(phase.name))
443
+ : appPhases;
444
+ const blockingItems = applyBlockingPhases.flatMap((phase) => phase.items.filter((item) => (item.status === "blocked" || item.status === "failed") && !isIndependentLegacyAgentCollision(phase, item)));
445
+ if (blockingItems.length > 0) {
446
+ return blockingItems[0]?.message
447
+ ?? "upgrade preflight is blocked; no changes were applied";
448
+ }
449
+ if (!args.legacyCleanup
450
+ &&
451
+ plan.crossMajorBoundary &&
256
452
  !shouldIncludeCrossMajorPlanItems(plan.channel, plan.upgradeOutcome)) {
257
453
  return ("cross-major v2→v3 migration requires the development channel while stable tracks 2.x; " +
258
454
  "run the same command with --dry-run on --channel development, then apply with --yes");
@@ -288,6 +484,15 @@ export function renderUpgradePlan(plan) {
288
484
  }
289
485
  }
290
486
  }
487
+ if (plan.lifecycle) {
488
+ lines.push("");
489
+ lines.push("native Agentera resource cleanup:");
490
+ lines.push(` ownership journal: ${plan.lifecycle.ownershipJournal.state} at ${plan.lifecycle.ownershipJournal.path}`);
491
+ lines.push(` secure publication: ${plan.lifecycle.platform.securePublication ? "available" : "unavailable"} (${plan.lifecycle.platform.requirement})`);
492
+ lines.push(` scope: ownership-proven native Agentera resource ${plan.lifecycle.nativeResourceCleanup.resourceId}; unrelated user-owned data excluded`);
493
+ const cleanup = plan.lifecycle.cleanupSummary;
494
+ lines.push(` counts: pending=${cleanup.pending}, applied=${cleanup.applied}, noop=${cleanup.noop}, blocked=${cleanup.blocked_unowned + cleanup.action_required}`);
495
+ }
291
496
  if (plan.mode === "plan" && plan.summary.pending > 0 && plan.applyCommand) {
292
497
  lines.push("");
293
498
  lines.push(`Next: if this preview looks right, apply with: ${plan.applyCommand}`);
@@ -317,4 +522,3 @@ export function sortKeysDeep(value) {
317
522
  return value;
318
523
  }
319
524
  export { MAJOR_BOUNDARY_ITEM_TAG };
320
- //# sourceMappingURL=upgradeOrchestrator.js.map
@@ -0,0 +1,14 @@
1
+ import path from "node:path";
2
+ import { CAPABILITY_INSTRUCTIONS } from "../capabilities/index.js";
3
+ import { isFile } from "../core/paths.js";
4
+ const INSTRUCTION_MODULE_ROOT = path.join("packages", "cli", "src", "capabilities");
5
+ /**
6
+ * v3 repo signal (D65): all twelve capability instruction modules live under
7
+ * packages/cli/src/capabilities/<name>/instructions.ts. When present, in-tree
8
+ * .cursor/agents/ uses prime --context and must not be overwritten from a v2
9
+ * app-home bundle during runtime rewiring.
10
+ */
11
+ export function projectUsesV3CapabilityInstructionModules(projectRoot) {
12
+ const root = path.resolve(projectRoot);
13
+ return Object.keys(CAPABILITY_INSTRUCTIONS).every((name) => isFile(path.join(root, INSTRUCTION_MODULE_ROOT, name, "instructions.ts")));
14
+ }
@@ -4,6 +4,7 @@ import { isNpxBundleRoot } from "../core/sourceRoot.js";
4
4
  import { classifyResolvedRoot } from "../state/installRoot.js";
5
5
  import { doctorRoots, loadSuiteVersion } from "./appModel.js";
6
6
  import { loadUpdateChannelsAuthority } from "./channels.js";
7
+ import { isStableSuccessorAnnounced } from "./nextMajorDoctor.js";
7
8
  export const IRREVERSIBLE_V2_RETURN = "return to the v2 Python line is permanently unsupported after migrating to v3+";
8
9
  let testVersionCatalog = null;
9
10
  /** Reset injectable catalog (tests). */
@@ -132,6 +133,13 @@ export function classifyUpgradeOutcome(args) {
132
133
  message: "stable channel tracks the 2.x support line; switch to the development channel to preview v2→v3 migration",
133
134
  };
134
135
  }
136
+ if (!isStableSuccessorAnnounced(args.sourceRoot, "stable")) {
137
+ return {
138
+ ...base,
139
+ kind: "up_to_date",
140
+ message: `v3 successor line is not announced yet; v2 managed app files remain current on the ${args.channel.channel} channel`,
141
+ };
142
+ }
135
143
  return {
136
144
  ...base,
137
145
  kind: "migration_to_latest_on_channel",
@@ -176,4 +184,3 @@ export function isBlockedUpgradeOutcome(outcome) {
176
184
  return (outcome.kind === "blocked_downgrade_to_v2" ||
177
185
  outcome.kind === "blocked_downgrade_not_implemented");
178
186
  }
179
- //# sourceMappingURL=versionResolution.js.map