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,325 @@
1
+ /**
2
+ * Markdown entry parsing for the compaction writer.
3
+ *
4
+ * Splits a markdown artifact into "full" and "oneline" entries by
5
+ * walking the spec's heading regex, then collects the trailing
6
+ * detail body up to the next heading. The TODO-resolved section
7
+ * uses indented detail lines as the body delimiter; open items stay
8
+ * in severity bands and resolved items belong only under
9
+ * `## ✓ Resolved`.
10
+ */
11
+ import { parseTodoMarkdownListItem } from "../../cli/todoMarkdown.js";
12
+ import { MAX_FULL_ENTRIES, MAX_TOTAL_ENTRIES } from "../common.js";
13
+ import { SPECS, escapeRe, formatTodoOneline } from "./dryRun.js";
14
+ const SEVERITY_HEADING_RE = /^##\s*(⇶|⇉|→|⇢)\s/m;
15
+ const STRIKETHROUGH_ITEM_RE = /^(\s*)-\s+~~(.+?)~~\s*(.*)$/;
16
+ // Shared case-insensitive resolved-heading matcher. Duplicate detection
17
+ // (countTodoResolvedSectionHeadings), validation (markdown.ts), classification
18
+ // (isTodoResolvedSectionHeading), and extraction (extractResolvedSection) all
19
+ // use these so they accept the same variants: `## ✓ Resolved`, `## Resolved`,
20
+ // `## resolved`, `## RESOLVED`. Formerly extractResolvedSection used `\s+`
21
+ // (requiring a space after ##) without the `i` flag, silently rejecting
22
+ // case variants and `##Resolved`; now unified.
23
+ const TODO_RESOLVED_HEADING_RE = /^##\s*(?:✓\s+)?Resolved\s*$/im;
24
+ const TODO_RESOLVED_HEADING_GLOBAL_RE = /^##\s*(?:✓\s+)?Resolved\s*$/gim;
25
+ // TODO.md is a bounded human-facing queue, not a lossless numbered archive:
26
+ // dropped resolved entries are recoverable only via project history (Git),
27
+ // and only if previously committed. Surfaced in compaction diagnostics
28
+ // alongside the `dropped` count.
29
+ export const TODO_DROPPED_RECOVERY_GUIDANCE = "dropped resolved entries are not retained in a lossless archive; recover previously committed content via Git: `git log -p -- :/TODO.md` (non-Git projects have no historical recovery)";
30
+ export function splitArchive(text, archiveHeading) {
31
+ if (!archiveHeading)
32
+ return [text, ""];
33
+ const pattern = new RegExp(`^${escapeRe(archiveHeading)}\\s*$`, "m");
34
+ const match = pattern.exec(text);
35
+ if (!match)
36
+ return [text, ""];
37
+ const pre = text.slice(0, match.index).replace(/\s+$/, "");
38
+ const after = text.slice(match.index + match[0].length);
39
+ const nextSection = /^##\s/m.exec(after);
40
+ if (nextSection) {
41
+ const archiveBody = after.slice(0, nextSection.index);
42
+ const trailing = after.slice(nextSection.index);
43
+ return [pre, archiveBody.trim() + (trailing ? "\n\n" + trailing : "")];
44
+ }
45
+ return [pre, after.trim()];
46
+ }
47
+ export function parseFullEntries(text, spec) {
48
+ const entries = [];
49
+ const re = new RegExp(spec.entryHeadingRe.source, "gm");
50
+ const matches = [...text.matchAll(re)];
51
+ for (let i = 0; i < matches.length; i++) {
52
+ const m = matches[i];
53
+ const lineStart = text.lastIndexOf("\n", m.index - 1) + 1;
54
+ let lineEnd = text.indexOf("\n", m.index);
55
+ if (lineEnd === -1)
56
+ lineEnd = text.length;
57
+ const headerLine = text.slice(lineStart, lineEnd).trim();
58
+ const glyphMatch = /^(■)\s*/.exec(headerLine);
59
+ const glyph = glyphMatch ? glyphMatch[1] + " " : "";
60
+ const remainder = glyphMatch ? headerLine.slice(glyphMatch[0].length) : headerLine;
61
+ const header = glyph + remainder.replace(/^#+/, "").trim();
62
+ const bodyStart = lineEnd + 1;
63
+ let bodyEnd;
64
+ if (i + 1 < matches.length) {
65
+ bodyEnd = text.lastIndexOf("\n", matches[i + 1].index - 1) + 1;
66
+ }
67
+ else {
68
+ bodyEnd = text.length;
69
+ }
70
+ const body = text.slice(bodyStart, bodyEnd).trim();
71
+ entries.push({ header, body, kind: "full" });
72
+ }
73
+ return entries;
74
+ }
75
+ export function parseOnelineEntries(text, spec) {
76
+ if (spec.onelineHeadingRe === null)
77
+ return [];
78
+ const entries = [];
79
+ const re = new RegExp(spec.onelineHeadingRe.source);
80
+ for (const line of text.split(/\r\n|\r|\n/)) {
81
+ if (re.test(line)) {
82
+ entries.push({ header: line.replace(/\s+$/, ""), body: "", kind: "oneline" });
83
+ }
84
+ }
85
+ return entries;
86
+ }
87
+ export function extractResolvedSection(text) {
88
+ const m = TODO_RESOLVED_HEADING_RE.exec(text);
89
+ if (!m)
90
+ return [-1, -1, ""];
91
+ const bodyStart = m.index + m[0].length + 1;
92
+ const nextSection = /^##\s/m.exec(text.slice(bodyStart));
93
+ const bodyEnd = nextSection ? bodyStart + nextSection.index : text.length;
94
+ return [m.index, bodyEnd, text.slice(bodyStart, bodyEnd)];
95
+ }
96
+ export function parseTodoResolved(text, spec) {
97
+ const [, , body] = extractResolvedSection(text);
98
+ if (!body)
99
+ return [];
100
+ const entries = [];
101
+ const lines = body.split(/\r\n|\r|\n/);
102
+ const headRe = new RegExp(spec.entryHeadingRe.source);
103
+ let i = 0;
104
+ while (i < lines.length) {
105
+ const line = lines[i];
106
+ if (headRe.test(line)) {
107
+ const detailLines = [];
108
+ let j = i + 1;
109
+ while (j < lines.length) {
110
+ const nxt = lines[j];
111
+ if (nxt.startsWith(" ") || nxt.startsWith("\t")) {
112
+ detailLines.push(nxt);
113
+ j += 1;
114
+ }
115
+ else if (nxt.trim() === "") {
116
+ if (j + 1 < lines.length && (lines[j + 1].startsWith(" ") || lines[j + 1].startsWith("\t"))) {
117
+ detailLines.push(nxt);
118
+ j += 1;
119
+ }
120
+ else {
121
+ break;
122
+ }
123
+ }
124
+ else {
125
+ break;
126
+ }
127
+ }
128
+ const bodyText = detailLines.join("\n").trim();
129
+ entries.push({ header: line.replace(/\s+$/, ""), body: bodyText, kind: bodyText ? "full" : "oneline" });
130
+ i = j;
131
+ }
132
+ else {
133
+ i += 1;
134
+ }
135
+ }
136
+ return entries;
137
+ }
138
+ export function isTodoSeveritySectionHeading(line) {
139
+ return SEVERITY_HEADING_RE.test(line.trim());
140
+ }
141
+ export function isTodoResolvedSectionHeading(line) {
142
+ return TODO_RESOLVED_HEADING_RE.test(line.trim());
143
+ }
144
+ /**
145
+ * Count `## ✓ Resolved` section headings in a TODO.md. A well-formed queue has
146
+ * exactly one; duplicates make parsing silently process only the first and
147
+ * hide the remaining entries from the compaction budget. Callers (validation,
148
+ * compaction status, compaction apply) refuse when this returns a value > 1.
149
+ */
150
+ export function countTodoResolvedSectionHeadings(text) {
151
+ const matches = text.match(TODO_RESOLVED_HEADING_GLOBAL_RE);
152
+ return matches ? matches.length : 0;
153
+ }
154
+ export function classifyTodoSectionHeading(line) {
155
+ if (isTodoSeveritySectionHeading(line))
156
+ return "severity";
157
+ if (isTodoResolvedSectionHeading(line))
158
+ return "resolved";
159
+ if (/^##\s/.test(line.trim()))
160
+ return "other";
161
+ return "other";
162
+ }
163
+ export function strikethroughTodoLineToCheckbox(line) {
164
+ const m = STRIKETHROUGH_ITEM_RE.exec(line);
165
+ if (!m)
166
+ return null;
167
+ const tail = m[3]?.trim();
168
+ const body = m[2].trim();
169
+ return `${m[1]}- [x] ${body}${tail ? (tail.startsWith("·") ? ` ${tail}` : ` ${tail}`) : ""}`;
170
+ }
171
+ export function isLegacyStrikethroughTodoLine(line) {
172
+ return /^(\s*)-\s+~~/.test(line);
173
+ }
174
+ export function countTodoResolvedInSeverityBands(content) {
175
+ let count = 0;
176
+ let section = "other";
177
+ for (const line of content.split(/\r\n|\r|\n/)) {
178
+ const kind = classifyTodoSectionHeading(line);
179
+ if (kind !== "other" || /^##\s/.test(line.trim())) {
180
+ section = kind;
181
+ continue;
182
+ }
183
+ if (section !== "severity")
184
+ continue;
185
+ const trimmed = line.trim();
186
+ if (!trimmed.startsWith("-"))
187
+ continue;
188
+ const parsed = parseTodoMarkdownListItem(trimmed);
189
+ if (parsed?.status === "resolved" || isLegacyStrikethroughTodoLine(trimmed)) {
190
+ count += 1;
191
+ }
192
+ }
193
+ return count;
194
+ }
195
+ export function countTodoResolvedEntries(content) {
196
+ const spec = SPECS["todo-resolved"];
197
+ const resolvedSection = parseTodoResolved(content, spec);
198
+ const misplaced = countTodoResolvedInSeverityBands(content);
199
+ const total = resolvedSection.length + misplaced;
200
+ // Positional tiering per TC9: the first ten resolved rows are the
201
+ // recent/full-detail tier even when they have no indented body; rows
202
+ // 11+ are the summary tier. This keeps status reporting consistent
203
+ // with how compactTodoEntries assigns tiers (positional, not
204
+ // body-presence-based), so a compacted file with 10 header-only rows
205
+ // + 40 summaries reports 10/40 (not 0/50).
206
+ return {
207
+ full: Math.min(total, MAX_FULL_ENTRIES),
208
+ oneline: Math.max(0, total - MAX_FULL_ENTRIES),
209
+ };
210
+ }
211
+ /**
212
+ * Count resolved entries in positions 11-50 that need ≤15-word summarization
213
+ * but are not yet summaries. An entry needs summarization when:
214
+ * - it has an indented body (should be stripped), or
215
+ * - its kind is "full" (should be demoted to the summary tier), or
216
+ * - its header differs from what `formatTodoOneline` would produce (i.e.
217
+ * it is a long verbatim header, not a ≤15-word summary).
218
+ *
219
+ * Returns 0 when the Resolved section is already compacted (idempotent).
220
+ * `check compact` uses this to detect in-budget (≤50) TODOs that still need
221
+ * a formatting rewrite, so `--mode fix` is triggered before entries overflow.
222
+ */
223
+ export function countTodoPendingSummarization(content) {
224
+ const spec = SPECS["todo-resolved"];
225
+ const entries = parseTodoResolved(content, spec);
226
+ if (entries.length <= MAX_FULL_ENTRIES)
227
+ return 0;
228
+ const summaryTier = entries.slice(MAX_FULL_ENTRIES, MAX_TOTAL_ENTRIES);
229
+ let count = 0;
230
+ for (const entry of summaryTier) {
231
+ if (entry.body) {
232
+ count++;
233
+ continue;
234
+ }
235
+ if (entry.kind === "full") {
236
+ count++;
237
+ continue;
238
+ }
239
+ // kind=oneline, no body: check if header matches the summary format
240
+ // by forcing kind="full" through formatTodoOneline (truncation path).
241
+ const expected = formatTodoOneline({ ...entry, kind: "full" });
242
+ if (entry.header.trim() !== expected.trim())
243
+ count++;
244
+ }
245
+ return count;
246
+ }
247
+ /**
248
+ * Move resolved rows from severity bands into `## ✓ Resolved`, creating the
249
+ * section when absent. Newly migrated rows are prepended (newest-first folds).
250
+ */
251
+ export function normalizeTodoResolvedLayout(content) {
252
+ const lines = content.split(/\r\n|\r|\n/);
253
+ const beforeResolved = [];
254
+ const migratedResolved = [];
255
+ const existingResolved = [];
256
+ const afterResolved = [];
257
+ let section = "other";
258
+ let seenResolvedHeading = false;
259
+ for (const line of lines) {
260
+ const headingKind = classifyTodoSectionHeading(line);
261
+ if (headingKind === "resolved") {
262
+ seenResolvedHeading = true;
263
+ section = "resolved";
264
+ continue;
265
+ }
266
+ if (headingKind === "severity") {
267
+ section = "severity";
268
+ if (!seenResolvedHeading)
269
+ beforeResolved.push(line);
270
+ else
271
+ afterResolved.push(line);
272
+ continue;
273
+ }
274
+ if (/^##\s/.test(line.trim())) {
275
+ section = "other";
276
+ if (!seenResolvedHeading)
277
+ beforeResolved.push(line);
278
+ else
279
+ afterResolved.push(line);
280
+ continue;
281
+ }
282
+ const trimmed = line.trim();
283
+ if (section === "resolved") {
284
+ if (trimmed)
285
+ existingResolved.push(line);
286
+ continue;
287
+ }
288
+ if (section === "severity" && trimmed.startsWith("-")) {
289
+ const converted = strikethroughTodoLineToCheckbox(line) ?? line;
290
+ const parsed = parseTodoMarkdownListItem(converted.trim());
291
+ if (parsed?.status === "resolved" || isLegacyStrikethroughTodoLine(trimmed)) {
292
+ migratedResolved.push(converted.trim());
293
+ continue;
294
+ }
295
+ }
296
+ if (!seenResolvedHeading)
297
+ beforeResolved.push(line);
298
+ else
299
+ afterResolved.push(line);
300
+ }
301
+ if (migratedResolved.length === 0) {
302
+ return { text: content, changed: false };
303
+ }
304
+ const rebuilt = [...beforeResolved];
305
+ if (rebuilt.length > 0 && rebuilt[rebuilt.length - 1]?.trim() !== "")
306
+ rebuilt.push("");
307
+ rebuilt.push("## ✓ Resolved");
308
+ rebuilt.push(...migratedResolved, ...existingResolved);
309
+ if (afterResolved.length > 0) {
310
+ rebuilt.push("");
311
+ rebuilt.push(...afterResolved);
312
+ }
313
+ const text = rebuilt.join("\n").replace(/\n*$/, "\n");
314
+ return { text, changed: text !== content };
315
+ }
316
+ export function parseEntries(text, specName) {
317
+ const spec = SPECS[specName];
318
+ if (spec.name === "todo-resolved") {
319
+ return parseTodoResolved(text, spec);
320
+ }
321
+ const [pre, archiveBody] = splitArchive(text, spec.archiveHeading || "");
322
+ const fullEntries = parseFullEntries(pre, spec);
323
+ const onelineEntries = parseOnelineEntries(archiveBody, spec);
324
+ return [...fullEntries, ...onelineEntries];
325
+ }
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Retention primitives for compaction: stable sort, recent-vs-older
3
+ * partitioning, archive sorting, and decision-specific entry
4
+ * selection (satisfaction-aware). The pure helpers here are reused
5
+ * by `apply.ts` (which writes the compacted result back to disk)
6
+ * and by `status.ts` (which counts overflow without writing).
7
+ */
8
+ import { MAX_FULL_ENTRIES, MAX_ONELINE_ENTRIES, MAX_TOTAL_ENTRIES, applyRetentionCaps } from "../common.js";
9
+ import { truncateWords } from "./dryRun.js";
10
+ export function overLimitCount(activeCount, archiveCount) {
11
+ const totalCount = activeCount + archiveCount;
12
+ return Math.max(Math.max(activeCount - MAX_FULL_ENTRIES, 0), Math.max(archiveCount - MAX_ONELINE_ENTRIES, 0), Math.max(totalCount - MAX_TOTAL_ENTRIES, 0));
13
+ }
14
+ export function stableSortBy(arr, key, reverse = false) {
15
+ return arr
16
+ .map((x, i) => [x, i])
17
+ .sort((a, b) => {
18
+ const ka = key(a[0]);
19
+ const kb = key(b[0]);
20
+ let cmp = ka < kb ? -1 : ka > kb ? 1 : 0;
21
+ if (reverse)
22
+ cmp = -cmp;
23
+ return cmp !== 0 ? cmp : a[1] - b[1];
24
+ })
25
+ .map(([x]) => x);
26
+ }
27
+ export function yamlEntryNumber(entry) {
28
+ let summary;
29
+ if (entry && typeof entry === "object" && !Array.isArray(entry)) {
30
+ const number = entry.number;
31
+ if (typeof number === "number" && Number.isInteger(number))
32
+ return number;
33
+ if (typeof number === "string" && /^\d+$/.test(number))
34
+ return parseInt(number, 10);
35
+ summary = String(entry.summary ?? "");
36
+ }
37
+ else {
38
+ summary = String(entry);
39
+ }
40
+ const match = /(?:Cycle|Decision|Audit|Experiment|EXP-)\s*(\d+)/.exec(summary);
41
+ return match ? parseInt(match[1], 10) : 0;
42
+ }
43
+ function yamlEntryTimestamp(entry) {
44
+ if (entry && typeof entry === "object" && !Array.isArray(entry)) {
45
+ return String(entry.timestamp || entry.date || "");
46
+ }
47
+ return "";
48
+ }
49
+ function yamlSummaryText(entry, ...fields) {
50
+ for (const field of fields) {
51
+ const value = entry[field];
52
+ if (typeof value === "string" && value.trim()) {
53
+ return truncateWords(value.trim(), 15);
54
+ }
55
+ if (value && typeof value === "object" && !Array.isArray(value) && Object.keys(value).length > 0) {
56
+ return truncateWords(Object.entries(value).map(([k, v]) => `${k}: ${v}`).join(", "), 15);
57
+ }
58
+ }
59
+ return "no summary";
60
+ }
61
+ function isEmptyish(v) {
62
+ return (v === null ||
63
+ v === undefined ||
64
+ v === "" ||
65
+ (Array.isArray(v) && v.length === 0) ||
66
+ (typeof v === "object" && v !== null && !Array.isArray(v) && Object.keys(v).length === 0));
67
+ }
68
+ export function yamlArchiveEntry(specName, entry) {
69
+ if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
70
+ return { summary: String(entry) };
71
+ }
72
+ const e = entry;
73
+ if (specName === "progress") {
74
+ const number = e.number ?? "?";
75
+ const date = String(e.timestamp ?? "").split(/\s+/)[0] || "";
76
+ const datePart = date ? ` (${date})` : "";
77
+ const summary = yamlSummaryText(e, "what", "type");
78
+ return { summary: `Cycle ${number}${datePart}: ${summary}` };
79
+ }
80
+ if (specName === "decisions") {
81
+ const number = e.number ?? "?";
82
+ const date = String(e.date ?? "");
83
+ const datePart = date ? ` (${date})` : "";
84
+ const choice = yamlSummaryText(e, "choice", "question");
85
+ const archiveEntry = { summary: `Decision ${number}${datePart}: ${choice}` };
86
+ for (const field of ["number", "date", "choice", "outcome", "feeds_into", "satisfaction"]) {
87
+ const value = e[field];
88
+ if (!isEmptyish(value))
89
+ archiveEntry[field] = value;
90
+ }
91
+ if (!("outcome" in archiveEntry) && !isEmptyish(archiveEntry.choice)) {
92
+ archiveEntry.outcome = archiveEntry.choice;
93
+ }
94
+ return archiveEntry;
95
+ }
96
+ if (specName === "health") {
97
+ const number = e.number ?? "?";
98
+ const date = String(e.date ?? "");
99
+ const datePart = date ? ` (${date})` : "";
100
+ const summary = yamlSummaryText(e, "trajectory", "grades");
101
+ return { summary: `Audit ${number}${datePart}: ${summary}` };
102
+ }
103
+ if (specName === "experiments") {
104
+ return { number: e.number, summary: yamlSummaryText(e, "conclusion", "label") };
105
+ }
106
+ if (specName === "session") {
107
+ return { timestamp: String(e.timestamp ?? ""), summary: yamlSummaryText(e, "summary") };
108
+ }
109
+ return { summary: yamlSummaryText(e, "summary") };
110
+ }
111
+ export function yamlSortEntries(entries, specName) {
112
+ if (specName === "decisions" || specName === "health" || specName === "experiments") {
113
+ return stableSortBy(entries, yamlEntryNumber);
114
+ }
115
+ if (specName === "session") {
116
+ return stableSortBy(entries, yamlEntryTimestamp, true);
117
+ }
118
+ return stableSortBy(entries, yamlEntryNumber, true);
119
+ }
120
+ export function yamlRecentFullAndOlder(entries, specName, fullCapacity = MAX_FULL_ENTRIES) {
121
+ const newestFirst = specName === "session"
122
+ ? stableSortBy(entries, yamlEntryTimestamp, true)
123
+ : stableSortBy(entries, yamlEntryNumber, true);
124
+ const recent = newestFirst.slice(0, fullCapacity);
125
+ const older = newestFirst.slice(fullCapacity);
126
+ return [yamlSortEntries(recent, specName), older];
127
+ }
128
+ function yamlArchiveSortKey(entry) {
129
+ const timestamp = yamlEntryTimestamp(entry);
130
+ if (timestamp)
131
+ return ["timestamp", timestamp];
132
+ return ["number", yamlEntryNumber(entry)];
133
+ }
134
+ export function yamlArchiveEntries(entries) {
135
+ // Sort by (tag, value) descending, mirroring Python tuple comparison.
136
+ return entries
137
+ .map((x, i) => [x, i])
138
+ .sort((a, b) => {
139
+ const ka = yamlArchiveSortKey(a[0]);
140
+ const kb = yamlArchiveSortKey(b[0]);
141
+ let cmp = 0;
142
+ if (ka[0] !== kb[0])
143
+ cmp = ka[0] < kb[0] ? -1 : 1;
144
+ else
145
+ cmp = ka[1] < kb[1] ? -1 : ka[1] > kb[1] ? 1 : 0;
146
+ cmp = -cmp;
147
+ return cmp !== 0 ? cmp : a[1] - b[1];
148
+ })
149
+ .map(([x]) => x);
150
+ }
151
+ function decisionSatisfactionState(entry) {
152
+ if (!entry || typeof entry !== "object")
153
+ return null;
154
+ // cast: decision record fields read from parsed decisions.yaml
155
+ const satisfaction = entry.satisfaction;
156
+ if (!satisfaction || typeof satisfaction !== "object")
157
+ return null;
158
+ const state = satisfaction.state;
159
+ return typeof state === "string" ? state : null;
160
+ }
161
+ export function decisionRequiresUserReview(entry) {
162
+ if (!entry || typeof entry !== "object")
163
+ return true;
164
+ // cast: decision record fields read from parsed decisions.yaml
165
+ const satisfaction = entry.satisfaction;
166
+ if (!satisfaction || typeof satisfaction !== "object")
167
+ return true;
168
+ const confirmation = satisfaction.user_confirmation;
169
+ const confirmedBy = confirmation && typeof confirmation === "object" ? confirmation.confirmed_by : null;
170
+ const confirmedAt = confirmation && typeof confirmation === "object" ? confirmation.confirmed_at : null;
171
+ return (decisionSatisfactionState(entry) !== "user_confirmed_satisfied" ||
172
+ !confirmation ||
173
+ typeof confirmation !== "object" ||
174
+ typeof confirmedBy !== "string" ||
175
+ confirmedBy.trim() === "" ||
176
+ typeof confirmedAt !== "string" ||
177
+ confirmedAt.trim() === "");
178
+ }
179
+ export function decisionSatisfiedActiveCount(active) {
180
+ return active.filter((e) => !decisionRequiresUserReview(e)).length;
181
+ }
182
+ export function decisionProtectedOverflowCount(active, archive) {
183
+ const protectedActive = active.filter((e) => decisionRequiresUserReview(e)).length;
184
+ const protectedArchive = archive.filter((e) => decisionRequiresUserReview(e)).length;
185
+ return Math.max(protectedActive - MAX_FULL_ENTRIES, protectedArchive - MAX_ONELINE_ENTRIES, protectedActive + protectedArchive - MAX_TOTAL_ENTRIES, 0);
186
+ }
187
+ export function selectDecisionActiveEntries(active, fullCapacity = MAX_FULL_ENTRIES) {
188
+ const protectedEntries = active.filter((e) => decisionRequiresUserReview(e));
189
+ const satisfied = active.filter((e) => !decisionRequiresUserReview(e));
190
+ const newestSatisfied = stableSortBy(satisfied, yamlEntryNumber, true);
191
+ const satisfiedCapacity = Math.max(fullCapacity - protectedEntries.length, 0);
192
+ const keepSatisfied = newestSatisfied.slice(0, satisfiedCapacity);
193
+ const compactSatisfied = newestSatisfied.slice(satisfiedCapacity);
194
+ return [yamlSortEntries([...protectedEntries, ...keepSatisfied], "decisions"), compactSatisfied];
195
+ }
196
+ export function selectDecisionArchiveEntries(archiveCandidates) {
197
+ // Review pressure is a projection concern, not a write failure. Capacity
198
+ // selection happens after archive recovery so protected records are never
199
+ // discarded merely because they are unresolved.
200
+ return yamlSortEntries(archiveCandidates, "decisions");
201
+ }
202
+ export { applyRetentionCaps };