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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (598) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +119 -22
  3. package/bundle/CHANGELOG.md +1351 -0
  4. package/bundle/DESIGN.md +229 -0
  5. package/bundle/LICENSE +201 -0
  6. package/bundle/README.md +143 -0
  7. package/bundle/UPGRADE.md +236 -0
  8. package/bundle/extract-corpus-parity.json +21 -0
  9. package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
  10. package/bundle/references/adapters/package-publication.json +437 -0
  11. package/bundle/references/adapters/package-registry.yaml +435 -189
  12. package/bundle/references/adapters/package-surface-characterization.md +66 -35
  13. package/bundle/references/adapters/runtime-lifecycle-adapters.yaml +74 -0
  14. package/bundle/references/adapters/runtime-lifecycle-authority.yaml +62 -0
  15. package/bundle/references/adapters/runtime-lifecycle-operation-contract.yaml +84 -0
  16. package/bundle/references/adapters/runtime-retired-resources.yaml +333 -0
  17. package/bundle/references/analysis/evidence-tier-authority.yaml +518 -0
  18. package/bundle/references/analysis/verification-policy.yaml +191 -0
  19. package/bundle/references/artifacts/artifact-registry-interface-model.yaml +20 -10
  20. package/bundle/references/artifacts/glossary-entry-contract.yaml +1254 -0
  21. package/bundle/references/artifacts/state-storage-authority.yaml +3022 -0
  22. package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
  23. package/bundle/references/cli/app-lifecycle-vocabulary.yaml +7 -8
  24. package/bundle/references/cli/capability-instruction-contract.yaml +11 -14
  25. package/bundle/references/cli/hybrid-route-contract.yaml +438 -0
  26. package/bundle/references/cli/routing-model.md +155 -0
  27. package/bundle/references/cli/trigger-schema-enrichment.md +147 -0
  28. package/bundle/references/cli/update-channels.yaml +19 -1
  29. package/bundle/references/cli/vocabulary-index.yaml +20 -17
  30. package/bundle/references/cli/vocabulary.md +326 -361
  31. package/bundle/references/meta/retained-reference-authority.yaml +151 -0
  32. package/bundle/registry.json +13 -13
  33. package/bundle/skills/agentera/SKILL.md +224 -422
  34. package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +84 -0
  35. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/exit.yaml +2 -2
  36. package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +25 -0
  37. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/validation.yaml +37 -18
  38. package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +102 -0
  39. package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/exit.yaml +6 -5
  40. package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +27 -0
  41. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +176 -0
  42. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/artifacts.yaml +12 -12
  43. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/exit.yaml +5 -5
  44. package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +16 -0
  45. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/validation.yaml +7 -7
  46. package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +51 -0
  47. package/bundle/skills/agentera/capabilities/{resonera → discuss}/schemas/exit.yaml +2 -2
  48. package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +20 -0
  49. package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +144 -0
  50. package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +80 -0
  51. package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +16 -0
  52. package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/validation.yaml +18 -18
  53. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/artifacts.yaml +18 -18
  54. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/exit.yaml +2 -2
  55. package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +16 -0
  56. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/validation.yaml +9 -9
  57. package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +76 -0
  58. package/bundle/skills/agentera/capabilities/{orkestrera → orchestrate}/schemas/exit.yaml +9 -7
  59. package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +23 -0
  60. package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +121 -0
  61. package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +66 -0
  62. package/bundle/skills/agentera/capabilities/{planera → plan}/schemas/exit.yaml +2 -2
  63. package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +23 -0
  64. package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +121 -0
  65. package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +23 -0
  66. package/bundle/skills/agentera/capabilities/{profilera → profile}/schemas/exit.yaml +6 -5
  67. package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +20 -0
  68. package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +115 -0
  69. package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +24 -0
  70. package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +16 -0
  71. package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/validation.yaml +2 -2
  72. package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +73 -0
  73. package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +22 -0
  74. package/bundle/skills/agentera/capabilities/{hej → status}/schemas/validation.yaml +5 -5
  75. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/artifacts.yaml +16 -16
  76. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/exit.yaml +7 -6
  77. package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +23 -0
  78. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/validation.yaml +18 -20
  79. package/bundle/skills/agentera/capability_schema_contract.yaml +178 -34
  80. package/bundle/skills/agentera/protocol.yaml +31 -31
  81. package/bundle/skills/agentera/route-phrases.yaml +81 -0
  82. package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +5 -4
  83. package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +39 -21
  84. package/bundle/skills/agentera/schemas/artifacts/design.yaml +5 -4
  85. package/bundle/skills/agentera/schemas/artifacts/docs.yaml +15 -19
  86. package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +145 -14
  87. package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +82 -0
  88. package/bundle/skills/agentera/schemas/artifacts/health.yaml +58 -21
  89. package/bundle/skills/agentera/schemas/artifacts/objective.yaml +22 -8
  90. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +458 -36
  91. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +128 -17
  92. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +342 -42
  93. package/bundle/skills/agentera/schemas/artifacts/vision.yaml +3 -3
  94. package/dist/analytics/extractCorpus/cli.js +190 -0
  95. package/dist/analytics/extractCorpus/copilotSessions.js +275 -0
  96. package/dist/analytics/extractCorpus/core.js +392 -0
  97. package/dist/analytics/extractCorpus/corpus.js +167 -0
  98. package/dist/analytics/extractCorpus/coverageAudit.js +260 -0
  99. package/dist/analytics/extractCorpus/cursorSessions.js +425 -0
  100. package/dist/analytics/extractCorpus/evidenceTiers.js +603 -0
  101. package/dist/analytics/extractCorpus/extractCorpusParity.js +105 -0
  102. package/dist/analytics/extractCorpus/filesystemSources.js +118 -0
  103. package/dist/analytics/extractCorpus/index.js +14 -0
  104. package/dist/analytics/extractCorpus/jsonlSessions.js +204 -0
  105. package/dist/analytics/extractCorpus/sqliteCaps.js +43 -0
  106. package/dist/analytics/extractCorpus/sqliteSessions.js +367 -0
  107. package/dist/analytics/extractCorpus/tierReader.js +108 -0
  108. package/dist/analytics/extractCorpus.js +2 -1791
  109. package/dist/analytics/glossaryAdviceResolution.js +166 -0
  110. package/dist/analytics/glossaryInputAcquisition.js +319 -0
  111. package/dist/analytics/personalGlossaryAdmission.js +133 -0
  112. package/dist/analytics/personalGlossaryProfile.js +219 -0
  113. package/dist/analytics/profileSignals.js +211 -0
  114. package/dist/analytics/usageStats.js +169 -42
  115. package/dist/audit/terminologyDrift.js +281 -0
  116. package/dist/bin/agentera.js +3 -2
  117. package/dist/capabilities/audit/instructions.js +16 -0
  118. package/dist/capabilities/build/instructions.js +56 -0
  119. package/dist/capabilities/design/instructions.js +4 -0
  120. package/dist/capabilities/discuss/instructions.js +29 -0
  121. package/dist/capabilities/document/instructions.js +11 -0
  122. package/dist/capabilities/index.js +29 -27
  123. package/dist/capabilities/optimize/instructions.js +14 -0
  124. package/dist/capabilities/orchestrate/instructions.js +42 -0
  125. package/dist/capabilities/plan/instructions.js +33 -0
  126. package/dist/capabilities/profile/instructions.js +70 -0
  127. package/dist/capabilities/research/instructions.js +5 -0
  128. package/dist/capabilities/status/instructions.js +15 -0
  129. package/dist/capabilities/status/startupInstructions.js +34 -0
  130. package/dist/capabilities/vision/instructions.js +4 -0
  131. package/dist/cli/appContext.js +30 -24
  132. package/dist/cli/argvalidate.js +0 -1
  133. package/dist/cli/capabilityContext/benchmark.js +565 -0
  134. package/dist/cli/capabilityContext/bespoke.js +44 -0
  135. package/dist/cli/capabilityContext/build.js +242 -0
  136. package/dist/cli/capabilityContext/closeout.js +233 -0
  137. package/dist/cli/capabilityContext/contract.js +179 -0
  138. package/dist/cli/capabilityContext/evidence.js +463 -0
  139. package/dist/cli/capabilityContext/index.js +3 -0
  140. package/dist/cli/capabilityContext/orchestration.js +131 -0
  141. package/dist/cli/capabilityContext/planState.js +260 -0
  142. package/dist/cli/capabilityContext/progress.js +142 -0
  143. package/dist/cli/capabilityContext/projectVerification.js +409 -0
  144. package/dist/cli/capabilityContext/shared.js +83 -0
  145. package/dist/cli/capabilityContext/slim.js +152 -0
  146. package/dist/cli/capabilityContext/startup.js +150 -0
  147. package/dist/cli/capabilityContext/startupAggregation.js +68 -0
  148. package/dist/cli/capabilityContext/types.js +56 -0
  149. package/dist/cli/capabilityContext.js +1 -2487
  150. package/dist/cli/commands/appHome.js +22 -0
  151. package/dist/cli/commands/capability.js +4 -4
  152. package/dist/cli/commands/compact.js +164 -14
  153. package/dist/cli/commands/doctor.js +122 -97
  154. package/dist/cli/commands/durability.js +81 -0
  155. package/dist/cli/commands/glossaryAdvice.js +138 -0
  156. package/dist/cli/commands/lint.js +26 -44
  157. package/dist/cli/commands/personalGlossary.js +176 -0
  158. package/dist/cli/commands/prime/briefOrientation.js +747 -0
  159. package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
  160. package/dist/cli/commands/prime/bundleStatus.js +190 -0
  161. package/dist/cli/commands/prime/collectEntityOrientation.js +326 -0
  162. package/dist/cli/commands/prime/collectOrientationState.js +212 -0
  163. package/dist/cli/commands/prime/orientationOutput.js +399 -0
  164. package/dist/cli/commands/prime/types.js +1 -0
  165. package/dist/cli/commands/prime/v1Migration.js +38 -0
  166. package/dist/cli/commands/prime.js +80 -558
  167. package/dist/cli/commands/profileGrounding.js +55 -0
  168. package/dist/cli/commands/query.js +78 -53
  169. package/dist/cli/commands/report.js +96 -25
  170. package/dist/cli/commands/route.js +142 -0
  171. package/dist/cli/commands/schema.js +266 -143
  172. package/dist/cli/commands/state/decisions.js +387 -0
  173. package/dist/cli/commands/state/docs.js +70 -0
  174. package/dist/cli/commands/state/experimentRecords.js +151 -0
  175. package/dist/cli/commands/state/experiments.js +14 -0
  176. package/dist/cli/commands/state/get.js +129 -0
  177. package/dist/cli/commands/state/health.js +14 -0
  178. package/dist/cli/commands/state/index.js +16 -0
  179. package/dist/cli/commands/state/list.js +194 -0
  180. package/dist/cli/commands/state/objective.js +25 -0
  181. package/dist/cli/commands/state/plan.js +14 -0
  182. package/dist/cli/commands/state/planTasks.js +154 -0
  183. package/dist/cli/commands/state/plans.js +154 -0
  184. package/dist/cli/commands/state/progress.js +13 -0
  185. package/dist/cli/commands/state/shared.js +14 -0
  186. package/dist/cli/commands/state/todo.js +42 -0
  187. package/dist/cli/commands/state/write.js +430 -0
  188. package/dist/cli/commands/upgrade.js +146 -5
  189. package/dist/cli/commands/upgradeVerify.js +118 -0
  190. package/dist/cli/commands/validate.js +272 -223
  191. package/dist/cli/commands/verify.js +24 -9
  192. package/dist/cli/contracts/bundleStatus.js +1 -0
  193. package/dist/cli/contracts/orientationState.js +1 -0
  194. package/dist/cli/dispatch/argvParser.js +32 -0
  195. package/dist/cli/dispatch/check.js +372 -0
  196. package/dist/cli/dispatch/commands.js +27 -0
  197. package/dist/cli/dispatch/index.js +207 -0
  198. package/dist/cli/dispatch/lifecycle.js +652 -0
  199. package/dist/cli/dispatch/prime.js +139 -0
  200. package/dist/cli/dispatch/projections.js +17 -0
  201. package/dist/cli/dispatch/shared.js +63 -0
  202. package/dist/cli/dispatch/state.js +140 -0
  203. package/dist/cli/dispatch.js +1 -1294
  204. package/dist/cli/errors.js +16 -17
  205. package/dist/cli/help.js +394 -43
  206. package/dist/cli/migrationRequired.js +87 -0
  207. package/dist/cli/orientation/attention.js +61 -0
  208. package/dist/cli/orientation/corpusCoverage.js +102 -0
  209. package/dist/cli/orientation.js +438 -170
  210. package/dist/cli/planArtifacts.js +350 -0
  211. package/dist/cli/planEvidence.js +157 -0
  212. package/dist/cli/planLifecycleState.js +36 -0
  213. package/dist/cli/planTaskIndex.js +11 -0
  214. package/dist/cli/preCutoverCommand.js +32 -0
  215. package/dist/cli/prime-blob.js +71 -3
  216. package/dist/cli/profileAcquisition.js +167 -0
  217. package/dist/cli/startupCompletenessContract.js +59 -0
  218. package/dist/cli/stateQuery.js +56 -14
  219. package/dist/cli/structured.js +0 -1
  220. package/dist/cli/todoMarkdown.js +25 -12
  221. package/dist/cli/todoReadinessSelection.js +192 -0
  222. package/dist/cli/todoSeverity.js +18 -0
  223. package/dist/core/atomicWriter.js +20 -0
  224. package/dist/core/developmentChannel.js +1 -0
  225. package/dist/core/developmentInvocation.js +374 -0
  226. package/dist/core/difflib.js +0 -1
  227. package/dist/core/envPaths.js +20 -0
  228. package/dist/core/jsonValue.js +5 -0
  229. package/dist/core/paths.js +0 -1
  230. package/dist/core/pyjson.js +67 -3
  231. package/dist/core/shell.js +4 -0
  232. package/dist/core/skillIdentity.js +23 -0
  233. package/dist/core/sourceRoot.js +9 -12
  234. package/dist/core/text.js +10 -0
  235. package/dist/core/toml.js +0 -1
  236. package/dist/core/yaml.js +8 -1
  237. package/dist/eval/evalSkills.js +30 -26
  238. package/dist/eval/hybridRouteEvaluation.js +155 -0
  239. package/dist/eval/semanticEval.js +43 -20
  240. package/dist/eval/semanticFixtures.js +16 -5
  241. package/dist/hooks/common.js +11 -79
  242. package/dist/hooks/compaction/apply.js +446 -0
  243. package/dist/hooks/compaction/dryRun.js +184 -0
  244. package/dist/hooks/compaction/index.js +22 -0
  245. package/dist/hooks/compaction/parse.js +325 -0
  246. package/dist/hooks/compaction/retention.js +202 -0
  247. package/dist/hooks/compaction/status.js +360 -0
  248. package/dist/hooks/compaction/types.js +5 -0
  249. package/dist/hooks/validateArtifact/agentFacing.js +9 -0
  250. package/dist/hooks/validateArtifact/index.js +92 -0
  251. package/dist/hooks/validateArtifact/markdown.js +145 -0
  252. package/dist/hooks/validateArtifact/schema.js +546 -0
  253. package/dist/hooks/validateArtifact/traversal.js +107 -0
  254. package/dist/hooks/validateArtifact/violations.js +107 -0
  255. package/dist/migrate/v2HandoffManifest.js +452 -0
  256. package/dist/registries/activationContract.js +2 -0
  257. package/dist/registries/activationTuples.js +107 -0
  258. package/dist/registries/artifactProtocolIds.js +78 -0
  259. package/dist/registries/artifactRegistry.js +224 -63
  260. package/dist/registries/artifactSchemaProjection.js +45 -0
  261. package/dist/registries/capabilityContract.js +129 -2
  262. package/dist/registries/evaluatorHandoffContract.js +2 -3
  263. package/dist/registries/evidenceTierContract.js +371 -0
  264. package/dist/registries/glossaryAdviceContract.js +79 -0
  265. package/dist/registries/glossaryCaveatContract.js +67 -0
  266. package/dist/registries/glossaryConsumerContractValidation.js +787 -0
  267. package/dist/registries/glossaryEntryContract.js +757 -0
  268. package/dist/registries/glossaryTermIdentity.js +17 -0
  269. package/dist/registries/glossaryTermOccurrence.js +20 -0
  270. package/dist/registries/hybridRoute.js +274 -0
  271. package/dist/registries/hybridRouteReceipt.js +221 -0
  272. package/dist/registries/packagePublication.js +229 -0
  273. package/dist/registries/packageRegistry.js +187 -211
  274. package/dist/registries/todoReadinessContract.js +448 -0
  275. package/dist/registries/triggerLoader.js +174 -0
  276. package/dist/registries/verbosityBudgetContract.js +205 -0
  277. package/dist/release/releaseMetadata.js +385 -0
  278. package/dist/runtime/lifecycleAdapterContract.js +457 -0
  279. package/dist/runtime/lifecycleAdapters.js +777 -0
  280. package/dist/runtime/lifecycleAuthority.js +453 -0
  281. package/dist/runtime/lifecycleOperationContract.js +123 -0
  282. package/dist/runtime/lifecycleOperations.js +634 -0
  283. package/dist/runtime/lifecycleOwnershipJournal.js +622 -0
  284. package/dist/runtime/lifecyclePublication.js +415 -0
  285. package/dist/runtime/lifecycleSnapshot.js +438 -0
  286. package/dist/runtime/nativeResourceCleanup.js +502 -0
  287. package/dist/setup/opencode.js +20 -0
  288. package/dist/setup/opencodeConstants.js +1 -0
  289. package/dist/setup/sharedSkill.js +45 -0
  290. package/dist/setup/smokeChecks.js +21 -82
  291. package/dist/state/archiveDiscovery.js +580 -0
  292. package/dist/state/archivePublication.js +225 -0
  293. package/dist/state/archiveRecovery.js +237 -0
  294. package/dist/state/archiveReplay.js +53 -0
  295. package/dist/state/canonicalMigrationRecord.js +36 -0
  296. package/dist/state/changelog.js +221 -0
  297. package/dist/state/decisionEntities.js +367 -0
  298. package/dist/state/decisionLegacyValidation.js +215 -0
  299. package/dist/state/decisionMigrationProvenance.js +199 -0
  300. package/dist/state/decisionOverlay.js +254 -0
  301. package/dist/state/decisionRevision.js +256 -0
  302. package/dist/state/decisionRevisionMigration.js +89 -0
  303. package/dist/state/directRetrieval.js +323 -0
  304. package/dist/state/durability.js +324 -0
  305. package/dist/state/entityCutover.js +459 -0
  306. package/dist/state/entityCutoverGit.js +127 -0
  307. package/dist/state/entityGlossaryAuthority.js +13 -0
  308. package/dist/state/entityListProjection.js +187 -0
  309. package/dist/state/entityListRuntimeRegistry.js +85 -0
  310. package/dist/state/entityMigrationCausality.js +97 -0
  311. package/dist/state/entityMigrationIdentity.js +5 -0
  312. package/dist/state/entityMigrationPreview.js +846 -0
  313. package/dist/state/entityMigrationTodo.js +133 -0
  314. package/dist/state/entityPublicationContext.js +806 -0
  315. package/dist/state/entityRetrievalHelp.js +506 -0
  316. package/dist/state/entityStorage.js +899 -0
  317. package/dist/state/exactReplacementRecovery.js +18 -0
  318. package/dist/state/experimentArchive.js +63 -0
  319. package/dist/state/experimentIdentity.js +202 -0
  320. package/dist/state/healthEntities.js +262 -0
  321. package/dist/state/healthEntityValidation.js +18 -0
  322. package/dist/state/healthRepair.js +69 -0
  323. package/dist/state/installRoot.js +64 -25
  324. package/dist/state/legacyEntityCutoverEvidence.js +65 -0
  325. package/dist/state/legacyIdentity.js +47 -0
  326. package/dist/state/legacySummaryRecord.js +6 -0
  327. package/dist/state/listAccounting.js +54 -0
  328. package/dist/state/listClassification.js +17 -0
  329. package/dist/state/listCursor.js +42 -0
  330. package/dist/state/listRetrieval.js +781 -0
  331. package/dist/state/migrationSourceBinding.js +30 -0
  332. package/dist/state/objectiveExperimentEntities.js +322 -0
  333. package/dist/state/planEntities.js +982 -0
  334. package/dist/state/planIdentity.js +47 -0
  335. package/dist/state/planLineageValidation.js +52 -0
  336. package/dist/state/planReplacementTransaction.js +475 -0
  337. package/dist/state/planRetrieval.js +313 -0
  338. package/dist/state/planTaskRetrieval.js +294 -0
  339. package/dist/state/progressEntities.js +512 -0
  340. package/dist/state/progressGlossaryCaveat.js +168 -0
  341. package/dist/state/progressPublicationOrder.js +19 -0
  342. package/dist/state/projectRoot.js +62 -0
  343. package/dist/state/projectionPolicy.js +190 -0
  344. package/dist/state/retrievalAuthority.js +156 -0
  345. package/dist/state/safeProjectFile.js +155 -0
  346. package/dist/state/startupAnalysis/benchmark.js +432 -0
  347. package/dist/state/startupAnalysis/contract.js +160 -0
  348. package/dist/state/startupAnalysis/helpers.js +286 -0
  349. package/dist/state/startupAnalysis/index.js +6 -0
  350. package/dist/state/startupAnalysis/metrics.js +340 -0
  351. package/dist/state/startupAnalysis/records.js +198 -0
  352. package/dist/state/startupAnalysis/report.js +111 -0
  353. package/dist/state/startupAnalysis/threshold.js +512 -0
  354. package/dist/state/startupAnalysis.js +2 -1953
  355. package/dist/state/startupProjection.js +499 -0
  356. package/dist/state/stateMode.js +85 -0
  357. package/dist/state/stateStorageAuthority.js +47 -0
  358. package/dist/state/summaryEntityRead.js +25 -0
  359. package/dist/state/summaryMigrationProvenance.js +66 -0
  360. package/dist/state/summarySourceRowAuthority.js +36 -0
  361. package/dist/state/todoActivationSafety.js +58 -0
  362. package/dist/state/todoDocsEntities.js +1069 -0
  363. package/dist/state/todoDocsEntityValidation.js +158 -0
  364. package/dist/state/todoMarkdownProjection.js +51 -0
  365. package/dist/state/todoReconciliationActivation.js +140 -0
  366. package/dist/state/todoReconciliationInspection.js +169 -0
  367. package/dist/state/todoReconciliationRepair.js +170 -0
  368. package/dist/state/todoReconciliationTransaction.js +582 -0
  369. package/dist/state/write/assign.js +20 -0
  370. package/dist/state/write/candidateMutation.js +269 -0
  371. package/dist/state/write/errors.js +11 -0
  372. package/dist/state/write/experimentPublication.js +192 -0
  373. package/dist/state/write/explain.js +363 -0
  374. package/dist/state/write/fields.js +61 -0
  375. package/dist/state/write/glossaryPublication.js +263 -0
  376. package/dist/state/write/grammar.js +285 -0
  377. package/dist/state/write/helpers.js +29 -0
  378. package/dist/state/write/index.js +12 -0
  379. package/dist/state/write/input.js +367 -0
  380. package/dist/state/write/lock.js +837 -0
  381. package/dist/state/write/mutation.js +234 -0
  382. package/dist/state/write/operations.js +170 -0
  383. package/dist/state/write/planEvaluation.js +128 -0
  384. package/dist/state/write/planPublication.js +179 -0
  385. package/dist/state/write/runtimeOperations.js +144 -0
  386. package/dist/state/write/serialize.js +1 -0
  387. package/dist/state/write/transaction.js +52 -0
  388. package/dist/state/write/validate.js +7 -0
  389. package/dist/upgrade/appContentRefresh.js +383 -0
  390. package/dist/upgrade/appModel.js +8 -7
  391. package/dist/upgrade/atomicWriter.js +1 -0
  392. package/dist/upgrade/bundleEvidence.js +33 -0
  393. package/dist/upgrade/channels.js +12 -8
  394. package/dist/upgrade/compatibility.js +56 -21
  395. package/dist/upgrade/doctor.js +197 -192
  396. package/dist/upgrade/doctorClassifier.js +187 -0
  397. package/dist/upgrade/installedHooksRetirement.js +196 -0
  398. package/dist/upgrade/legacyAgentCleanup.js +282 -0
  399. package/dist/upgrade/lifecycleUpgrade.js +113 -0
  400. package/dist/upgrade/migrateArtifactsV2ToV3.js +367 -149
  401. package/dist/upgrade/migrationPublication.js +122 -0
  402. package/dist/upgrade/nextMajorDoctor.js +42 -8
  403. package/dist/upgrade/npxPlatformStatus.js +22 -0
  404. package/dist/upgrade/projectIntegration.js +145 -187
  405. package/dist/upgrade/projectIntegrationDecision.js +50 -0
  406. package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
  407. package/dist/upgrade/runtimeMigration.js +273 -363
  408. package/dist/upgrade/upgradeCommands.js +14 -1
  409. package/dist/upgrade/upgradeLock.js +85 -0
  410. package/dist/upgrade/upgradeOrchestrator.js +263 -59
  411. package/dist/upgrade/v3CapabilitySurface.js +14 -0
  412. package/dist/upgrade/versionResolution.js +8 -1
  413. package/dist/validate/activationArtifactEvidence.js +844 -0
  414. package/dist/validate/activationConjunction.js +816 -0
  415. package/dist/validate/activationEvidenceManifest.js +515 -0
  416. package/dist/validate/activationPackageSemantics.js +29 -0
  417. package/dist/validate/appHomeContract.js +5 -11
  418. package/dist/validate/bootstrapAuthority.js +44 -0
  419. package/dist/validate/capability.js +133 -12
  420. package/dist/validate/crossCapability.js +15 -10
  421. package/dist/validate/retainedReferenceAuthority.js +879 -0
  422. package/dist/validate/selfAudit.js +73 -37
  423. package/dist/validate/v1LegacyCruft.js +131 -0
  424. package/dist/validate/vocabularyAuthority.js +303 -0
  425. package/package.json +53 -27
  426. package/bundle/references/adapters/cursor.md +0 -213
  427. package/bundle/references/adapters/opencode.md +0 -530
  428. package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
  429. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
  430. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  431. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -548
  432. package/bundle/references/adapters/runtime-feature-parity.md +0 -189
  433. package/bundle/references/analysis/benchmark.md +0 -267
  434. package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
  435. package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
  436. package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -355
  437. package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -278
  438. package/bundle/references/cli/capability-tool-classification.yaml +0 -53
  439. package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
  440. package/bundle/references/meta/documentation-inventory.md +0 -43
  441. package/bundle/references/v1-section-mapping.md +0 -47
  442. package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
  443. package/bundle/skills/agentera/agents/dokumentera.toml +0 -6
  444. package/bundle/skills/agentera/agents/hej.toml +0 -6
  445. package/bundle/skills/agentera/agents/inspektera.toml +0 -6
  446. package/bundle/skills/agentera/agents/inspirera.toml +0 -6
  447. package/bundle/skills/agentera/agents/optimera.toml +0 -6
  448. package/bundle/skills/agentera/agents/orkestrera.toml +0 -6
  449. package/bundle/skills/agentera/agents/planera.toml +0 -6
  450. package/bundle/skills/agentera/agents/profilera.toml +0 -6
  451. package/bundle/skills/agentera/agents/realisera.toml +0 -6
  452. package/bundle/skills/agentera/agents/resonera.toml +0 -6
  453. package/bundle/skills/agentera/agents/visionera.toml +0 -6
  454. package/bundle/skills/agentera/agents/visualisera.toml +0 -6
  455. package/bundle/skills/agentera/capabilities/dokumentera/schemas/artifacts.yaml +0 -73
  456. package/bundle/skills/agentera/capabilities/dokumentera/schemas/triggers.yaml +0 -35
  457. package/bundle/skills/agentera/capabilities/hej/schemas/artifacts.yaml +0 -69
  458. package/bundle/skills/agentera/capabilities/hej/schemas/triggers.yaml +0 -58
  459. package/bundle/skills/agentera/capabilities/inspektera/schemas/artifacts.yaml +0 -76
  460. package/bundle/skills/agentera/capabilities/inspektera/schemas/triggers.yaml +0 -38
  461. package/bundle/skills/agentera/capabilities/inspirera/schemas/artifacts.yaml +0 -24
  462. package/bundle/skills/agentera/capabilities/inspirera/schemas/triggers.yaml +0 -34
  463. package/bundle/skills/agentera/capabilities/optimera/schemas/triggers.yaml +0 -39
  464. package/bundle/skills/agentera/capabilities/orkestrera/schemas/artifacts.yaml +0 -64
  465. package/bundle/skills/agentera/capabilities/orkestrera/schemas/triggers.yaml +0 -42
  466. package/bundle/skills/agentera/capabilities/orkestrera/schemas/validation.yaml +0 -120
  467. package/bundle/skills/agentera/capabilities/planera/schemas/artifacts.yaml +0 -62
  468. package/bundle/skills/agentera/capabilities/planera/schemas/triggers.yaml +0 -34
  469. package/bundle/skills/agentera/capabilities/planera/schemas/validation.yaml +0 -61
  470. package/bundle/skills/agentera/capabilities/profilera/schemas/artifacts.yaml +0 -18
  471. package/bundle/skills/agentera/capabilities/profilera/schemas/triggers.yaml +0 -45
  472. package/bundle/skills/agentera/capabilities/profilera/schemas/validation.yaml +0 -57
  473. package/bundle/skills/agentera/capabilities/realisera/schemas/artifacts.yaml +0 -80
  474. package/bundle/skills/agentera/capabilities/realisera/schemas/triggers.yaml +0 -39
  475. package/bundle/skills/agentera/capabilities/realisera/schemas/validation.yaml +0 -110
  476. package/bundle/skills/agentera/capabilities/resonera/schemas/artifacts.yaml +0 -47
  477. package/bundle/skills/agentera/capabilities/resonera/schemas/triggers.yaml +0 -46
  478. package/bundle/skills/agentera/capabilities/resonera/schemas/validation.yaml +0 -77
  479. package/bundle/skills/agentera/capabilities/visionera/schemas/triggers.yaml +0 -41
  480. package/bundle/skills/agentera/capabilities/visualisera/schemas/triggers.yaml +0 -33
  481. package/bundle/skills/agentera/references/contract.md +0 -1039
  482. package/bundle/skills/hej/.claude-plugin/plugin.json +0 -6
  483. package/bundle/skills/hej/SKILL.md +0 -69
  484. package/bundle/skills/hej/agents/hej.toml +0 -11
  485. package/bundle/skills/hej/agents/openai.yaml +0 -8
  486. package/dist/analytics/extractCorpus.js.map +0 -1
  487. package/dist/analytics/usageStats.js.map +0 -1
  488. package/dist/bin/agentera.js.map +0 -1
  489. package/dist/capabilities/dokumentera/instructions.js +0 -6
  490. package/dist/capabilities/dokumentera/instructions.js.map +0 -1
  491. package/dist/capabilities/hej/instructions.js +0 -6
  492. package/dist/capabilities/hej/instructions.js.map +0 -1
  493. package/dist/capabilities/index.js.map +0 -1
  494. package/dist/capabilities/inspektera/instructions.js +0 -6
  495. package/dist/capabilities/inspektera/instructions.js.map +0 -1
  496. package/dist/capabilities/inspirera/instructions.js +0 -6
  497. package/dist/capabilities/inspirera/instructions.js.map +0 -1
  498. package/dist/capabilities/optimera/instructions.js +0 -6
  499. package/dist/capabilities/optimera/instructions.js.map +0 -1
  500. package/dist/capabilities/orkestrera/instructions.js +0 -6
  501. package/dist/capabilities/orkestrera/instructions.js.map +0 -1
  502. package/dist/capabilities/planera/instructions.js +0 -6
  503. package/dist/capabilities/planera/instructions.js.map +0 -1
  504. package/dist/capabilities/profilera/instructions.js +0 -6
  505. package/dist/capabilities/profilera/instructions.js.map +0 -1
  506. package/dist/capabilities/realisera/instructions.js +0 -6
  507. package/dist/capabilities/realisera/instructions.js.map +0 -1
  508. package/dist/capabilities/resonera/instructions.js +0 -6
  509. package/dist/capabilities/resonera/instructions.js.map +0 -1
  510. package/dist/capabilities/visionera/instructions.js +0 -6
  511. package/dist/capabilities/visionera/instructions.js.map +0 -1
  512. package/dist/capabilities/visualisera/instructions.js +0 -6
  513. package/dist/capabilities/visualisera/instructions.js.map +0 -1
  514. package/dist/cli/appContext.js.map +0 -1
  515. package/dist/cli/argvalidate.js.map +0 -1
  516. package/dist/cli/capabilityContext.js.map +0 -1
  517. package/dist/cli/commands/capability.js.map +0 -1
  518. package/dist/cli/commands/compact.js.map +0 -1
  519. package/dist/cli/commands/doctor.js.map +0 -1
  520. package/dist/cli/commands/lint.js.map +0 -1
  521. package/dist/cli/commands/prime.js.map +0 -1
  522. package/dist/cli/commands/query.js.map +0 -1
  523. package/dist/cli/commands/report.js.map +0 -1
  524. package/dist/cli/commands/schema.js.map +0 -1
  525. package/dist/cli/commands/state.js +0 -1023
  526. package/dist/cli/commands/state.js.map +0 -1
  527. package/dist/cli/commands/upgrade.js.map +0 -1
  528. package/dist/cli/commands/validate.js.map +0 -1
  529. package/dist/cli/commands/verify.js.map +0 -1
  530. package/dist/cli/dispatch.js.map +0 -1
  531. package/dist/cli/errors.js.map +0 -1
  532. package/dist/cli/help.js.map +0 -1
  533. package/dist/cli/orientation.js.map +0 -1
  534. package/dist/cli/prime-blob.js.map +0 -1
  535. package/dist/cli/stateQuery.js.map +0 -1
  536. package/dist/cli/structured.js.map +0 -1
  537. package/dist/cli/todoMarkdown.js.map +0 -1
  538. package/dist/core/difflib.js.map +0 -1
  539. package/dist/core/paths.js.map +0 -1
  540. package/dist/core/pyjson.js.map +0 -1
  541. package/dist/core/sourceRoot.js.map +0 -1
  542. package/dist/core/toml.js.map +0 -1
  543. package/dist/core/yaml.js.map +0 -1
  544. package/dist/eval/evalSkills.js.map +0 -1
  545. package/dist/eval/semanticEval.js.map +0 -1
  546. package/dist/eval/semanticFixtures.js.map +0 -1
  547. package/dist/hooks/common.js.map +0 -1
  548. package/dist/hooks/compaction.js +0 -935
  549. package/dist/hooks/compaction.js.map +0 -1
  550. package/dist/hooks/cursorPreToolUse.js +0 -19
  551. package/dist/hooks/cursorPreToolUse.js.map +0 -1
  552. package/dist/hooks/cursorSessionStart.js +0 -71
  553. package/dist/hooks/cursorSessionStart.js.map +0 -1
  554. package/dist/hooks/sessionStart.js +0 -209
  555. package/dist/hooks/sessionStart.js.map +0 -1
  556. package/dist/hooks/sessionStop.js +0 -212
  557. package/dist/hooks/sessionStop.js.map +0 -1
  558. package/dist/hooks/validateArtifact.js +0 -935
  559. package/dist/hooks/validateArtifact.js.map +0 -1
  560. package/dist/registries/artifactRegistry.js.map +0 -1
  561. package/dist/registries/capabilityContract.js.map +0 -1
  562. package/dist/registries/evaluatorHandoffContract.js.map +0 -1
  563. package/dist/registries/packageRegistry.js.map +0 -1
  564. package/dist/registries/runtimeAdapterRegistry.js +0 -315
  565. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  566. package/dist/setup/codex.js +0 -1197
  567. package/dist/setup/codex.js.map +0 -1
  568. package/dist/setup/copilot.js +0 -227
  569. package/dist/setup/copilot.js.map +0 -1
  570. package/dist/setup/cursor.js +0 -127
  571. package/dist/setup/cursor.js.map +0 -1
  572. package/dist/setup/doctor.js +0 -1297
  573. package/dist/setup/doctor.js.map +0 -1
  574. package/dist/setup/smokeChecks.js.map +0 -1
  575. package/dist/state/installRoot.js.map +0 -1
  576. package/dist/state/startupAnalysis.js.map +0 -1
  577. package/dist/upgrade/appModel.js.map +0 -1
  578. package/dist/upgrade/channels.js.map +0 -1
  579. package/dist/upgrade/compatibility.js.map +0 -1
  580. package/dist/upgrade/doctor.js.map +0 -1
  581. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -570
  582. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  583. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
  584. package/dist/upgrade/nextMajorDoctor.js.map +0 -1
  585. package/dist/upgrade/projectIntegration.js.map +0 -1
  586. package/dist/upgrade/runtimeMigration.js.map +0 -1
  587. package/dist/upgrade/upgradeCommands.js.map +0 -1
  588. package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
  589. package/dist/upgrade/versionResolution.js.map +0 -1
  590. package/dist/validate/appHomeContract.js.map +0 -1
  591. package/dist/validate/capability.js.map +0 -1
  592. package/dist/validate/crossCapability.js.map +0 -1
  593. package/dist/validate/lifecycleAdapters.js +0 -772
  594. package/dist/validate/lifecycleAdapters.js.map +0 -1
  595. package/dist/validate/selfAudit.js.map +0 -1
  596. /package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/exit.yaml +0 -0
  597. /package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/exit.yaml +0 -0
  598. /package/bundle/skills/agentera/capabilities/{hej → status}/schemas/exit.yaml +0 -0
@@ -0,0 +1,383 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { CAPABILITY_INSTRUCTIONS } from "../capabilities/index.js";
5
+ import { isFile, pathExists, resolvePath } from "../core/paths.js";
6
+ import { doctorRoots } from "./appModel.js";
7
+ import { hasBundleRootEvidence } from "./bundleEvidence.js";
8
+ import { INSTALLED_HOOKS_SURFACE_LABEL, applyInstalledHooksRetirementItems, detectStaleInstalledHooksSurface, planInstalledHooksRetirementItems, } from "./installedHooksRetirement.js";
9
+ import { bindMigrationResource, withBoundMigrationDirectory } from "./migrationPublication.js";
10
+ export const APP_CONTENT_REFRESH_ACTION = "refresh-app-content";
11
+ /**
12
+ * Top-level app-home entry names written and refreshed by {@link applyAppContentRefresh}.
13
+ * The cleanup gate treats these as refreshable managed app content (not user state,
14
+ * not genuinely unrecognized) so v3's own content surface is never flagged as a
15
+ * false-positive "unrecognized entries" block. Sourced here as the single authority;
16
+ * do not mirror this list in the gate or doctor.
17
+ */
18
+ export const MANAGED_APP_CONTENT_ROOT_ENTRIES = new Set([
19
+ "skills",
20
+ "references",
21
+ "registry.json",
22
+ "dist",
23
+ ]);
24
+ /** Stale-surface labels surfaced in upgrade dry-run (B6 / defect #11). */
25
+ export const APP_CONTENT_SURFACE_LABELS = [
26
+ "SKILL.md",
27
+ "protocol.yaml",
28
+ "capability_schema_contract.yaml",
29
+ "capabilities/*/schemas/*",
30
+ "references/",
31
+ "registry.json",
32
+ "dist/capabilities",
33
+ INSTALLED_HOOKS_SURFACE_LABEL,
34
+ ];
35
+ const V2_CAPABILITY_VERBS = [
36
+ "hej",
37
+ "visionera",
38
+ "resonera",
39
+ "inspirera",
40
+ "planera",
41
+ "realisera",
42
+ "optimera",
43
+ "inspektera",
44
+ "dokumentera",
45
+ "profilera",
46
+ "visualisera",
47
+ "orkestrera",
48
+ ];
49
+ const SKIP_COPY_PARTS = new Set(["__pycache__", ".pytest_cache", "node_modules"]);
50
+ const SKIP_COPY_SUFFIXES = [".pyc", ".pyo"];
51
+ function shouldSkipCopyEntry(name) {
52
+ if (SKIP_COPY_PARTS.has(name)) {
53
+ return true;
54
+ }
55
+ return SKIP_COPY_SUFFIXES.some((suffix) => name.endsWith(suffix));
56
+ }
57
+ function shouldSkipCapabilityFile(relFromSkills) {
58
+ return /capabilities\/[^/]+\/instructions\.md$/i.test(relFromSkills.replace(/\\/g, "/"));
59
+ }
60
+ function runtimeCompiledRoot() {
61
+ return path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
62
+ }
63
+ export function resolveAppContentSources(sourceRoot, compiledRoot = runtimeCompiledRoot()) {
64
+ const root = resolvePath(sourceRoot);
65
+ const candidate = path.join(resolvePath(compiledRoot), "capabilities");
66
+ const distCapabilities = pathExists(candidate) && fs.statSync(candidate).isDirectory() ? candidate : null;
67
+ return {
68
+ skillsDir: path.join(root, "skills"),
69
+ referencesDir: path.join(root, "references"),
70
+ registryJson: path.join(root, "registry.json"),
71
+ distCapabilities,
72
+ };
73
+ }
74
+ function readInstalledText(installedRoot, rel) {
75
+ const filePath = path.join(installedRoot, rel);
76
+ if (!isFile(filePath)) {
77
+ return null;
78
+ }
79
+ return fs.readFileSync(filePath, "utf8");
80
+ }
81
+ function filesEqual(left, right) {
82
+ if (!isFile(left) || !isFile(right)) {
83
+ return false;
84
+ }
85
+ return fs.readFileSync(left).equals(fs.readFileSync(right));
86
+ }
87
+ export function skillMdLooksV2(text) {
88
+ if (text.includes("packages/cli/src/capabilities") || text.includes("instructions.ts")) {
89
+ return false;
90
+ }
91
+ return V2_CAPABILITY_VERBS.some((verb) => new RegExp(`\\b${verb}\\b`).test(text));
92
+ }
93
+ export function contractLooksV2(text) {
94
+ return /\binstructions\.md\b/.test(text) && !/\binstructions\.ts\b/.test(text);
95
+ }
96
+ function installedRootForDetection(appHome) {
97
+ const roots = doctorRoots(appHome);
98
+ if (hasBundleRootEvidence(roots.activeBundleRoot)) {
99
+ return roots.activeBundleRoot;
100
+ }
101
+ if (isFile(path.join(roots.activeBundleRoot, "skills", "agentera", "SKILL.md"))) {
102
+ return roots.activeBundleRoot;
103
+ }
104
+ if (isFile(path.join(appHome, "skills", "agentera", "SKILL.md"))) {
105
+ return appHome;
106
+ }
107
+ return null;
108
+ }
109
+ function walkYamlFiles(dir) {
110
+ if (!pathExists(dir)) {
111
+ return [];
112
+ }
113
+ const out = [];
114
+ const walk = (current) => {
115
+ for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
116
+ const full = path.join(current, entry.name);
117
+ if (entry.isDirectory()) {
118
+ walk(full);
119
+ }
120
+ else if (entry.isFile() && entry.name.endsWith(".yaml")) {
121
+ out.push(full);
122
+ }
123
+ }
124
+ };
125
+ walk(dir);
126
+ return out;
127
+ }
128
+ function capabilitySchemasStale(installedRoot, sources) {
129
+ const sourceSchemasRoot = path.join(sources.skillsDir, "agentera", "capabilities");
130
+ const installedSchemasRoot = path.join(installedRoot, "skills", "agentera", "capabilities");
131
+ if (!pathExists(sourceSchemasRoot)) {
132
+ return false;
133
+ }
134
+ for (const sourceFile of walkYamlFiles(sourceSchemasRoot)) {
135
+ const rel = path.relative(sourceSchemasRoot, sourceFile);
136
+ const installedFile = path.join(installedSchemasRoot, rel);
137
+ if (!filesEqual(sourceFile, installedFile)) {
138
+ return true;
139
+ }
140
+ }
141
+ return false;
142
+ }
143
+ function referencesStale(installedRoot, sources) {
144
+ if (!pathExists(sources.referencesDir)) {
145
+ return false;
146
+ }
147
+ const installedReferences = path.join(installedRoot, "references");
148
+ if (!pathExists(installedReferences)) {
149
+ return true;
150
+ }
151
+ const walk = (sourceDir, installedDir) => {
152
+ for (const entry of fs.readdirSync(sourceDir, { withFileTypes: true })) {
153
+ if (shouldSkipCopyEntry(entry.name)) {
154
+ continue;
155
+ }
156
+ const sourcePath = path.join(sourceDir, entry.name);
157
+ const installedPath = path.join(installedDir, entry.name);
158
+ if (entry.isDirectory()) {
159
+ if (!pathExists(installedPath) || !fs.statSync(installedPath).isDirectory()) {
160
+ return true;
161
+ }
162
+ if (walk(sourcePath, installedPath)) {
163
+ return true;
164
+ }
165
+ continue;
166
+ }
167
+ if (!filesEqual(sourcePath, installedPath)) {
168
+ return true;
169
+ }
170
+ }
171
+ return false;
172
+ };
173
+ return walk(sources.referencesDir, installedReferences);
174
+ }
175
+ function distCapabilitiesStale(installedRoot, sources) {
176
+ if (!sources.distCapabilities) {
177
+ return false;
178
+ }
179
+ const installedDist = path.join(installedRoot, "dist", "capabilities");
180
+ for (const capability of Object.keys(CAPABILITY_INSTRUCTIONS)) {
181
+ const sourceModule = path.join(sources.distCapabilities, capability, "instructions.js");
182
+ const installedModule = path.join(installedDist, capability, "instructions.js");
183
+ if (!filesEqual(sourceModule, installedModule)) {
184
+ return true;
185
+ }
186
+ }
187
+ return false;
188
+ }
189
+ /**
190
+ * Returns stale v2 app-content surface labels for gap detection during upgrade dry-run.
191
+ */
192
+ export function detectStaleAppContentSurfaces(appHome, sourceRoot, compiledRoot) {
193
+ const installedRoot = installedRootForDetection(appHome);
194
+ if (!installedRoot) {
195
+ return [];
196
+ }
197
+ const sources = resolveAppContentSources(sourceRoot, compiledRoot);
198
+ const stale = [];
199
+ const skillRel = path.join("skills", "agentera", "SKILL.md");
200
+ const skillSource = path.join(sources.skillsDir, "agentera", "SKILL.md");
201
+ const skillInstalled = path.join(installedRoot, skillRel);
202
+ const skillText = readInstalledText(installedRoot, skillRel);
203
+ if (!filesEqual(skillSource, skillInstalled) || (skillText !== null && skillMdLooksV2(skillText))) {
204
+ stale.push("SKILL.md");
205
+ }
206
+ const protocolRel = path.join("skills", "agentera", "protocol.yaml");
207
+ if (!filesEqual(path.join(sources.skillsDir, "agentera", "protocol.yaml"), path.join(installedRoot, protocolRel))) {
208
+ stale.push("protocol.yaml");
209
+ }
210
+ const contractRel = path.join("skills", "agentera", "capability_schema_contract.yaml");
211
+ const contractText = readInstalledText(installedRoot, contractRel);
212
+ if (!filesEqual(path.join(sources.skillsDir, "agentera", "capability_schema_contract.yaml"), path.join(installedRoot, contractRel)) ||
213
+ (contractText !== null && contractLooksV2(contractText))) {
214
+ stale.push("capability_schema_contract.yaml");
215
+ }
216
+ if (capabilitySchemasStale(installedRoot, sources)) {
217
+ stale.push("capabilities/*/schemas/*");
218
+ }
219
+ if (referencesStale(installedRoot, sources)) {
220
+ stale.push("references/");
221
+ }
222
+ if (!filesEqual(sources.registryJson, path.join(installedRoot, "registry.json"))) {
223
+ stale.push("registry.json");
224
+ }
225
+ if (distCapabilitiesStale(installedRoot, sources)) {
226
+ stale.push("dist/capabilities");
227
+ }
228
+ if (detectStaleInstalledHooksSurface(appHome)) {
229
+ stale.push(INSTALLED_HOOKS_SURFACE_LABEL);
230
+ }
231
+ return stale;
232
+ }
233
+ function copyFileEnsuringDir(source, target) {
234
+ fs.mkdirSync(path.dirname(target), { recursive: true });
235
+ fs.copyFileSync(source, target);
236
+ }
237
+ function copyTree(sourceDir, targetDir, relPrefix = "") {
238
+ fs.mkdirSync(targetDir, { recursive: true });
239
+ for (const entry of fs.readdirSync(sourceDir, { withFileTypes: true })) {
240
+ if (shouldSkipCopyEntry(entry.name)) {
241
+ continue;
242
+ }
243
+ const rel = relPrefix ? `${relPrefix}/${entry.name}` : entry.name;
244
+ if (shouldSkipCapabilityFile(rel)) {
245
+ continue;
246
+ }
247
+ const from = path.join(sourceDir, entry.name);
248
+ const to = path.join(targetDir, entry.name);
249
+ if (entry.isDirectory()) {
250
+ copyTree(from, to, rel);
251
+ }
252
+ else if (entry.isFile()) {
253
+ copyFileEnsuringDir(from, to);
254
+ }
255
+ }
256
+ }
257
+ export function refreshAppContentTargetRoot(appHome) {
258
+ return resolvePath(appHome);
259
+ }
260
+ function applyAppContentRefreshToTarget(targetRoot, sourceRoot, compiledRoot) {
261
+ const sources = resolveAppContentSources(sourceRoot, compiledRoot);
262
+ if (!pathExists(sources.skillsDir)) {
263
+ throw new Error(`app content refresh: missing source skills directory at ${sources.skillsDir}`);
264
+ }
265
+ if (!pathExists(sources.referencesDir)) {
266
+ throw new Error(`app content refresh: missing source references directory at ${sources.referencesDir}`);
267
+ }
268
+ if (!isFile(sources.registryJson)) {
269
+ throw new Error(`app content refresh: missing source registry.json at ${sources.registryJson}`);
270
+ }
271
+ copyTree(sources.skillsDir, path.join(targetRoot, "skills"), "skills");
272
+ copyTree(sources.referencesDir, path.join(targetRoot, "references"), "references");
273
+ copyFileEnsuringDir(sources.registryJson, path.join(targetRoot, "registry.json"));
274
+ if (sources.distCapabilities) {
275
+ copyTree(sources.distCapabilities, path.join(targetRoot, "dist", "capabilities"), "dist/capabilities");
276
+ }
277
+ }
278
+ export function applyAppContentRefresh(appHome, sourceRoot, compiledRoot) {
279
+ applyAppContentRefreshToTarget(refreshAppContentTargetRoot(appHome), sourceRoot, compiledRoot);
280
+ }
281
+ function refreshItemStatus(staleSurfaces) {
282
+ return staleSurfaces.length > 0 ? "pending" : "noop";
283
+ }
284
+ export function planAppContentRefreshItems(ctx) {
285
+ const sourceRoot = ctx.sourceRoot;
286
+ if (!sourceRoot) {
287
+ return [];
288
+ }
289
+ const appHome = resolvePath(ctx.appHome);
290
+ const resolvedSourceRoot = resolvePath(sourceRoot);
291
+ const installedRoot = installedRootForDetection(appHome);
292
+ if (!installedRoot) {
293
+ if (!pathExists(appHome)) {
294
+ return ctx.installAppContentIfMissing ? [{
295
+ status: "pending",
296
+ action: APP_CONTENT_REFRESH_ACTION,
297
+ runtime: "installed-app",
298
+ source: resolvedSourceRoot,
299
+ target: refreshAppContentTargetRoot(appHome),
300
+ message: "will install stable app content required by selected lifecycle repair",
301
+ }] : [];
302
+ }
303
+ const target = refreshAppContentTargetRoot(appHome);
304
+ const item = {
305
+ status: "pending",
306
+ action: APP_CONTENT_REFRESH_ACTION,
307
+ runtime: "installed-app",
308
+ source: resolvedSourceRoot,
309
+ target,
310
+ message: "install root has user data only; will install v3 app content (skills, references, registry, dist/capabilities)",
311
+ };
312
+ const evidenceError = bindMigrationResource(item, "target", target, [path.dirname(target)], "directory");
313
+ if (evidenceError) {
314
+ item.status = "blocked";
315
+ item.message = `app content refresh preserved the target: ${evidenceError}; review the unsafe path manually`;
316
+ }
317
+ return [item];
318
+ }
319
+ const staleSurfaces = detectStaleAppContentSurfaces(appHome, resolvedSourceRoot, ctx.compiledRoot);
320
+ const hookItems = planInstalledHooksRetirementItems(ctx);
321
+ if (staleSurfaces.length === 0 && hookItems.every((item) => item.status === "noop")) {
322
+ return [
323
+ {
324
+ status: "noop",
325
+ action: APP_CONTENT_REFRESH_ACTION,
326
+ source: installedRoot,
327
+ target: refreshAppContentTargetRoot(appHome),
328
+ message: "installed app content already matches v3 source surfaces",
329
+ },
330
+ ];
331
+ }
332
+ const targetRoot = refreshAppContentTargetRoot(appHome);
333
+ const refreshItems = staleSurfaces.map((surface) => {
334
+ const item = {
335
+ status: refreshItemStatus([surface]),
336
+ action: APP_CONTENT_REFRESH_ACTION,
337
+ runtime: "installed-app",
338
+ source: resolvedSourceRoot,
339
+ target: targetRoot,
340
+ message: `will refresh stale v2 surface ${surface} from sourceRoot into managed app home`,
341
+ preserved: [...APP_CONTENT_SURFACE_LABELS],
342
+ removedPreview: staleSurfaces,
343
+ };
344
+ const evidenceError = bindMigrationResource(item, "target", targetRoot, [path.dirname(targetRoot)], "directory");
345
+ if (evidenceError) {
346
+ item.status = "blocked";
347
+ item.message = `app content refresh preserved the target: ${evidenceError}; review the unsafe path manually`;
348
+ }
349
+ return item;
350
+ });
351
+ return [...refreshItems, ...hookItems.filter((item) => item.status !== "noop")];
352
+ }
353
+ export function applyAppContentRefreshItem(item, ctx, beforePublication) {
354
+ if (item.status !== "pending" || item.action !== APP_CONTENT_REFRESH_ACTION) {
355
+ return;
356
+ }
357
+ try {
358
+ const sourceRoot = resolvePath(ctx.sourceRoot ?? item.source ?? "");
359
+ withBoundMigrationDirectory(item, "target", (targetRoot) => applyAppContentRefreshToTarget(targetRoot, sourceRoot, ctx.compiledRoot), beforePublication);
360
+ item.status = "applied";
361
+ item.message = "refreshed installed app content from v3 sourceRoot";
362
+ }
363
+ catch (exc) {
364
+ item.status = "blocked";
365
+ item.message = `refresh-app-content preserved the target: ${exc.message}; rerun and review it manually`;
366
+ }
367
+ }
368
+ export function applyAppContentRefreshItems(items, ctx) {
369
+ applyInstalledHooksRetirementItems(items, ctx);
370
+ const pending = items.filter((item) => item.action === APP_CONTENT_REFRESH_ACTION && item.status === "pending");
371
+ if (pending.length === 0) {
372
+ return;
373
+ }
374
+ applyAppContentRefreshItem(pending[0], ctx);
375
+ if (pending[0]?.status === "applied") {
376
+ for (const item of pending.slice(1)) {
377
+ if (item.action === APP_CONTENT_REFRESH_ACTION) {
378
+ item.status = "applied";
379
+ item.message = "refreshed installed app content from v3 sourceRoot";
380
+ }
381
+ }
382
+ }
383
+ }
@@ -2,9 +2,11 @@ import fs from "node:fs";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
4
  import { expanduser, isFile, pathExists, resolvePath } from "../core/paths.js";
5
+ import { resolveProfileDirOverride } from "../core/envPaths.js";
5
6
  import { resolveSourceRoot } from "../core/sourceRoot.js";
6
7
  import { SOURCE_LABELS, classifyResolvedRoot, isForeignPlatformDefaultAppHome, resolveCandidate, } from "../state/installRoot.js";
7
8
  import { loadRegistry } from "../registries/packageRegistry.js";
9
+ import { hasBundleRootEvidence } from "./bundleEvidence.js";
8
10
  /**
9
11
  * App-home / app-model resolution used by doctor and upgrade. Faithful TS port
10
12
  * of the resolution layer in scripts/agentera_upgrade.py.
@@ -32,8 +34,8 @@ function sourceRootMissing(root) {
32
34
  }
33
35
  export function loadSuiteVersion(sourceRoot) {
34
36
  const record = loadRegistry().get("agentera");
35
- const authority = record.version_authority;
36
- const authorityPath = path.join(sourceRoot, authority.persisted_authority);
37
+ const authority = record.version_authority; // cast: parsed registry IO boundary
38
+ const authorityPath = path.join(sourceRoot, authority.persisted_authority); // cast: parsed registry IO boundary
37
39
  if (!isFile(authorityPath)) {
38
40
  return null;
39
41
  }
@@ -55,10 +57,6 @@ export function loadSuiteVersion(sourceRoot) {
55
57
  const version = first && typeof first === "object" ? first.version : null;
56
58
  return typeof version === "string" && version ? version : null;
57
59
  }
58
- function hasBundleRootEvidence(root) {
59
- return (isFile(path.join(root, "scripts", "agentera")) &&
60
- isFile(path.join(root, "skills", "agentera", "SKILL.md")));
61
- }
62
60
  export function doctorRoots(appHome) {
63
61
  const managedAppRoot = path.join(appHome, "app");
64
62
  let activeBundleRoot;
@@ -138,6 +136,10 @@ export function resolveInstallRoot(value, sourceRoot, home, env = process.env) {
138
136
  }
139
137
  return candidate;
140
138
  }
139
+ const profileDir = resolveProfileDirOverride(env);
140
+ if (profileDir) {
141
+ return resolvePath(profileDir);
142
+ }
141
143
  const def = env[DEFAULT_INSTALL_ROOT_ENV];
142
144
  if (def) {
143
145
  const candidate = resolvePath(def);
@@ -189,4 +191,3 @@ export function resolveActiveAppModel(value = null, opts = {}) {
189
191
  runtimeRoot: roots.runtimeRoot,
190
192
  };
191
193
  }
192
- //# sourceMappingURL=appModel.js.map
@@ -0,0 +1 @@
1
+ export { writeFileAtomic } from "../core/atomicWriter.js";
@@ -0,0 +1,33 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { isFile } from "../core/paths.js";
4
+ const HEAD_READ_BYTES = 2048;
5
+ export function readScriptHead(filePath) {
6
+ let fd;
7
+ try {
8
+ fd = fs.openSync(filePath, "r");
9
+ const buf = Buffer.alloc(HEAD_READ_BYTES);
10
+ const bytes = fs.readSync(fd, buf, 0, HEAD_READ_BYTES, 0);
11
+ return buf.slice(0, bytes).toString("utf8");
12
+ }
13
+ catch {
14
+ return null;
15
+ }
16
+ finally {
17
+ if (fd !== undefined) {
18
+ try {
19
+ fs.closeSync(fd);
20
+ }
21
+ catch { }
22
+ }
23
+ }
24
+ }
25
+ export function hasBundleRootEvidence(root) {
26
+ if (!isFile(path.join(root, "scripts", "agentera"))) {
27
+ return false;
28
+ }
29
+ if (!isFile(path.join(root, "skills", "agentera", "SKILL.md"))) {
30
+ return false;
31
+ }
32
+ return readScriptHead(path.join(root, "scripts", "agentera")) !== null;
33
+ }
@@ -2,9 +2,10 @@ import fs from "node:fs";
2
2
  import path from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
4
  import { expanduser } from "../core/paths.js";
5
- import { isNpxBundleRoot, resolveSourceRoot } from "../core/sourceRoot.js";
5
+ import { resolveSourceRoot } from "../core/sourceRoot.js";
6
6
  import { loadTomlFile, parseToml } from "../core/toml.js";
7
7
  import { loadYamlMappingFile } from "../core/yaml.js";
8
+ import { cliDistributionMajor } from "./compatibility.js";
8
9
  /**
9
10
  * Update channel resolution for upgrade, doctor, and prime.
10
11
  * Authority: references/cli/update-channels.yaml
@@ -57,7 +58,7 @@ function readConfigChannel(home) {
57
58
  }
58
59
  let mapping;
59
60
  try {
60
- mapping = loadTomlFile(configPath);
61
+ mapping = loadTomlFile(configPath); // cast: TOML parse IO boundary
61
62
  }
62
63
  catch {
63
64
  return null;
@@ -73,7 +74,7 @@ function readConfigChannel(home) {
73
74
  }
74
75
  export function loadUpdateChannelsAuthority(sourceRoot) {
75
76
  const authorityPath = path.join(authorityRootFor(sourceRoot), UPDATE_CHANNELS_AUTHORITY);
76
- return loadYamlMappingFile(authorityPath);
77
+ return loadYamlMappingFile(authorityPath); // cast: YAML parse IO boundary
77
78
  }
78
79
  function authorityForSourceRoot(authorityRoot) {
79
80
  if (cachedAuthority && cachedAuthorityRoot === authorityRoot) {
@@ -124,7 +125,7 @@ export function assertStableNpmUpdateCommand(channel, updateCommand, distTag) {
124
125
  if (distTag !== "latest") {
125
126
  throw new Error(`stable channel dist tag must be latest, got ${JSON.stringify(distTag)}`);
126
127
  }
127
- const forbidden = [/@next\b/i, /@3\.\d/i, /@3\.0\.0-dev/i, /-alpha/i, /-rc/i, /-beta/i];
128
+ const forbidden = [/@next\b/i, /@3\.\d/i, /@3\.0\.0-next/i, /-alpha/i, /-rc/i, /-beta/i];
128
129
  for (const pattern of forbidden) {
129
130
  if (pattern.test(updateCommand)) {
130
131
  throw new Error(`stable channel update command must not target 3.x pre-releases: ${updateCommand}`);
@@ -204,14 +205,18 @@ export function resolveUpdateChannel(args = {}) {
204
205
  export function resolveInvokedUpdateChannel(args = {}) {
205
206
  const env = args.env ?? process.env;
206
207
  const sourceRoot = args.sourceRoot ?? resolveSourceRoot(env);
207
- if (isNpxBundleRoot(sourceRoot)) {
208
+ const selected = resolveSelectedChannel({ ...args, sourceRoot });
209
+ if (selected.source !== "default") {
210
+ return resolveUpdateChannel({ ...args, sourceRoot });
211
+ }
212
+ if (cliDistributionMajor(sourceRoot) >= 3) {
208
213
  return resolveUpdateChannel({ ...args, channel: "development", sourceRoot });
209
214
  }
210
- return resolveUpdateChannel(args);
215
+ return resolveUpdateChannel({ ...args, channel: "stable", sourceRoot });
211
216
  }
212
217
  /** Parse `update.channel` from TOML text (tests). */
213
218
  export function parseConfigUpdateChannel(text) {
214
- const raw = readNestedKey(parseToml(text), CONFIG_CHANNEL_KEY);
219
+ const raw = readNestedKey(parseToml(text), CONFIG_CHANNEL_KEY); // cast: TOML parse IO boundary
215
220
  if (raw === undefined || raw === null) {
216
221
  return null;
217
222
  }
@@ -220,4 +225,3 @@ export function parseConfigUpdateChannel(text) {
220
225
  }
221
226
  return parseChannelValue(raw, "config_file");
222
227
  }
223
- //# sourceMappingURL=channels.js.map
@@ -6,6 +6,7 @@ import { BUNDLE_MARKER } from "../state/installRoot.js";
6
6
  import { doctorRoots, loadSuiteVersion } from "./appModel.js";
7
7
  import { resolveUpdateChannel } from "./channels.js";
8
8
  import { classifyUpgradeOutcome, shouldIncludeCrossMajorPlanItems, } from "./versionResolution.js";
9
+ import { hasBundleRootEvidence } from "./bundleEvidence.js";
9
10
  export { shouldIncludeCrossMajorPlanItems } from "./versionResolution.js";
10
11
  /**
11
12
  * v2/v3 install layout detection and cross-major upgrade guard rails.
@@ -18,16 +19,24 @@ export const STATUS_READY_TO_APPLY = "ready_to_apply";
18
19
  export const STATUS_APPLIED = "applied";
19
20
  export const UPGRADE_PREVIEW_SCHEMA = "agentera.upgrade.v2";
20
21
  export const STATUS_CONCEPT_MAJOR_BOUNDARY = "major_boundary_crossing";
22
+ export function projectInstallTrack(kind) {
23
+ switch (kind) {
24
+ case "v2_managed_app_home":
25
+ return "v2";
26
+ case "v3_self_contained_npm":
27
+ return "v3";
28
+ case "source_checkout":
29
+ return "source";
30
+ case "unknown_foreign":
31
+ return "unknown";
32
+ }
33
+ }
21
34
  const CROSS_MAJOR_ITEMS = [
22
35
  { phase: "artifacts", verb: "migrate", name: "v2_to_v3_artifacts" },
23
36
  { phase: "runtime", verb: "migrate", name: "v2_to_v3_runtime_rewire" },
24
37
  { phase: "cleanup", verb: "migrate", name: "v2_to_v3_app_home_cleanup" },
25
38
  ];
26
- function hasBundleRootEvidence(root) {
27
- return (isFile(path.join(root, "scripts", "agentera")) &&
28
- isFile(path.join(root, "skills", "agentera", "SKILL.md")));
29
- }
30
- function isSourceCheckoutRoot(sourceRoot) {
39
+ export function isSourceCheckoutRoot(sourceRoot) {
31
40
  return (pathExists(path.join(sourceRoot, ".git")) &&
32
41
  isFile(path.join(sourceRoot, "skills", "agentera", "SKILL.md")) &&
33
42
  isFile(path.join(sourceRoot, "registry.json")) &&
@@ -50,11 +59,38 @@ function hasV2ManagedEvidence(signals, activeBundleRoot) {
50
59
  hasBundleRootEvidence(activeBundleRoot) &&
51
60
  !signals.npxBundleSentinelAtActiveRoot);
52
61
  }
62
+ let distributionMajorWarned = false;
63
+ function readPackageJsonMajor(sourceRoot) {
64
+ const pkgPath = path.join(sourceRoot, "package.json");
65
+ if (!isFile(pkgPath)) {
66
+ return null;
67
+ }
68
+ try {
69
+ const data = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
70
+ const version = data?.version;
71
+ if (typeof version !== "string" || !version) {
72
+ return null;
73
+ }
74
+ const major = Number.parseInt(version.split(".")[0] ?? "", 10);
75
+ if (Number.isFinite(major) && major > 0) {
76
+ return major;
77
+ }
78
+ }
79
+ catch {
80
+ // Malformed package.json — fall through to diagnostic
81
+ }
82
+ return null;
83
+ }
53
84
  export function cliDistributionMajor(sourceRoot) {
54
85
  if (isSourceCheckoutRoot(sourceRoot)) {
55
86
  return 3;
56
87
  }
57
88
  if (isNpxBundleRoot(sourceRoot)) {
89
+ const version = loadSuiteVersion(sourceRoot);
90
+ const major = version ? Number.parseInt(version.split(".")[0] ?? "", 10) : Number.NaN;
91
+ if (Number.isFinite(major) && major > 0) {
92
+ return major;
93
+ }
58
94
  return 3;
59
95
  }
60
96
  const version = loadSuiteVersion(sourceRoot);
@@ -64,17 +100,28 @@ export function cliDistributionMajor(sourceRoot) {
64
100
  return major;
65
101
  }
66
102
  }
103
+ const pkgMajor = readPackageJsonMajor(sourceRoot);
104
+ if (pkgMajor !== null) {
105
+ return pkgMajor;
106
+ }
107
+ if (!distributionMajorWarned) {
108
+ distributionMajorWarned = true;
109
+ process.stderr.write(`agentera: could not determine distribution major version from registry.json or package.json at ${sourceRoot}; defaulting to 2\n`);
110
+ }
67
111
  return 2;
68
112
  }
113
+ export function __resetDistributionMajorWarnedForTests() {
114
+ distributionMajorWarned = false;
115
+ }
69
116
  export function classifyInstall(args) {
70
117
  const appHome = args.appHome;
71
118
  const sourceRoot = args.sourceRoot;
72
119
  const roots = doctorRoots(appHome);
73
120
  const activeBundleRoot = roots.activeBundleRoot;
74
121
  const signals = readSignals(appHome, sourceRoot, activeBundleRoot);
75
- if (isNpxBundleRoot(sourceRoot) || isNpxBundleRoot(activeBundleRoot) || isNpxBundleRoot(appHome)) {
122
+ if (hasV2ManagedEvidence(signals, activeBundleRoot)) {
76
123
  return {
77
- kind: "v3_self_contained_npm",
124
+ kind: "v2_managed_app_home",
78
125
  appHome,
79
126
  activeBundleRoot,
80
127
  managedAppRoot: roots.managedAppRoot,
@@ -82,9 +129,9 @@ export function classifyInstall(args) {
82
129
  signals,
83
130
  };
84
131
  }
85
- if (hasV2ManagedEvidence(signals, activeBundleRoot)) {
132
+ if (isNpxBundleRoot(sourceRoot) || isNpxBundleRoot(activeBundleRoot) || isNpxBundleRoot(appHome)) {
86
133
  return {
87
- kind: "v2_managed_app_home",
134
+ kind: "v3_self_contained_npm",
88
135
  appHome,
89
136
  activeBundleRoot,
90
137
  managedAppRoot: roots.managedAppRoot,
@@ -142,17 +189,6 @@ function groupItemsByPhase(items) {
142
189
  }
143
190
  return phases;
144
191
  }
145
- export function collectV3MigrationOperations(preview) {
146
- const out = [];
147
- for (const phase of preview.phases) {
148
- for (const item of phase.items) {
149
- if (item.verb === "migrate" && item.tag === MAJOR_BOUNDARY_ITEM_TAG) {
150
- out.push(item);
151
- }
152
- }
153
- }
154
- return out;
155
- }
156
192
  export function previewCrossMajorGuard(args) {
157
193
  const channel = resolveUpdateChannel(args);
158
194
  const install = classifyInstall({ appHome: args.appHome, sourceRoot: args.sourceRoot });
@@ -198,4 +234,3 @@ export function foreignLayoutHasUnexpectedEntries(root) {
198
234
  return false;
199
235
  }
200
236
  }
201
- //# sourceMappingURL=compatibility.js.map