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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (585) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +108 -22
  3. package/bundle/.agentera-npx-bundle.json +1 -1
  4. package/bundle/CHANGELOG.md +1351 -0
  5. package/bundle/DESIGN.md +229 -0
  6. package/bundle/LICENSE +201 -0
  7. package/bundle/README.md +143 -0
  8. package/bundle/UPGRADE.md +236 -0
  9. package/bundle/extract-corpus-parity.json +21 -0
  10. package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
  11. package/bundle/references/adapters/package-publication.json +437 -0
  12. package/bundle/references/adapters/package-registry.yaml +434 -189
  13. package/bundle/references/adapters/package-surface-characterization.md +66 -35
  14. package/bundle/references/adapters/runtime-lifecycle-adapters.yaml +74 -0
  15. package/bundle/references/adapters/runtime-lifecycle-authority.yaml +62 -0
  16. package/bundle/references/adapters/runtime-lifecycle-operation-contract.yaml +84 -0
  17. package/bundle/references/adapters/runtime-retired-resources.yaml +333 -0
  18. package/bundle/references/analysis/evidence-tier-authority.yaml +518 -0
  19. package/bundle/references/analysis/verification-policy.yaml +191 -0
  20. package/bundle/references/artifacts/artifact-registry-interface-model.yaml +20 -10
  21. package/bundle/references/artifacts/glossary-entry-contract.yaml +1254 -0
  22. package/bundle/references/artifacts/state-storage-authority.yaml +2982 -0
  23. package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
  24. package/bundle/references/cli/app-lifecycle-vocabulary.yaml +7 -8
  25. package/bundle/references/cli/capability-instruction-contract.yaml +97 -59
  26. package/bundle/references/cli/hybrid-route-contract.yaml +438 -0
  27. package/bundle/references/cli/routing-model.md +155 -0
  28. package/bundle/references/cli/trigger-schema-enrichment.md +147 -0
  29. package/bundle/references/cli/update-channels.yaml +35 -2
  30. package/bundle/references/cli/vocabulary-index.yaml +23 -20
  31. package/bundle/references/cli/vocabulary.md +337 -366
  32. package/bundle/references/meta/retained-reference-authority.yaml +151 -0
  33. package/bundle/registry.json +14 -14
  34. package/bundle/skills/agentera/SKILL.md +218 -408
  35. package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +84 -0
  36. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/exit.yaml +2 -2
  37. package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +25 -0
  38. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/validation.yaml +37 -18
  39. package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +102 -0
  40. package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/exit.yaml +6 -5
  41. package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +27 -0
  42. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +176 -0
  43. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/artifacts.yaml +12 -12
  44. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/exit.yaml +5 -5
  45. package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +16 -0
  46. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/validation.yaml +7 -7
  47. package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +51 -0
  48. package/bundle/skills/agentera/capabilities/{resonera → discuss}/schemas/exit.yaml +2 -2
  49. package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +20 -0
  50. package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +144 -0
  51. package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +80 -0
  52. package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +16 -0
  53. package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/validation.yaml +18 -18
  54. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/artifacts.yaml +18 -18
  55. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/exit.yaml +2 -2
  56. package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +16 -0
  57. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/validation.yaml +9 -9
  58. package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +76 -0
  59. package/bundle/skills/agentera/capabilities/{orkestrera → orchestrate}/schemas/exit.yaml +9 -7
  60. package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +23 -0
  61. package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +121 -0
  62. package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +66 -0
  63. package/bundle/skills/agentera/capabilities/{planera → plan}/schemas/exit.yaml +2 -2
  64. package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +23 -0
  65. package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +121 -0
  66. package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +23 -0
  67. package/bundle/skills/agentera/capabilities/{profilera → profile}/schemas/exit.yaml +6 -5
  68. package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +20 -0
  69. package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +115 -0
  70. package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +24 -0
  71. package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +16 -0
  72. package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/validation.yaml +2 -2
  73. package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +73 -0
  74. package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +22 -0
  75. package/bundle/skills/agentera/capabilities/{hej → status}/schemas/validation.yaml +5 -5
  76. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/artifacts.yaml +16 -16
  77. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/exit.yaml +7 -6
  78. package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +23 -0
  79. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/validation.yaml +18 -20
  80. package/bundle/skills/agentera/capability_schema_contract.yaml +200 -37
  81. package/bundle/skills/agentera/protocol.yaml +31 -31
  82. package/bundle/skills/agentera/route-phrases.yaml +81 -0
  83. package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +5 -4
  84. package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +40 -22
  85. package/bundle/skills/agentera/schemas/artifacts/design.yaml +5 -4
  86. package/bundle/skills/agentera/schemas/artifacts/docs.yaml +15 -19
  87. package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +145 -14
  88. package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +82 -0
  89. package/bundle/skills/agentera/schemas/artifacts/health.yaml +58 -21
  90. package/bundle/skills/agentera/schemas/artifacts/objective.yaml +22 -8
  91. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +421 -33
  92. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +143 -53
  93. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +345 -31
  94. package/bundle/skills/agentera/schemas/artifacts/vision.yaml +3 -3
  95. package/dist/analytics/extractCorpus/cli.js +190 -0
  96. package/dist/analytics/extractCorpus/copilotSessions.js +275 -0
  97. package/dist/analytics/extractCorpus/core.js +392 -0
  98. package/dist/analytics/extractCorpus/corpus.js +167 -0
  99. package/dist/analytics/extractCorpus/coverageAudit.js +260 -0
  100. package/dist/analytics/extractCorpus/cursorSessions.js +425 -0
  101. package/dist/analytics/extractCorpus/evidenceTiers.js +603 -0
  102. package/dist/analytics/extractCorpus/extractCorpusParity.js +105 -0
  103. package/dist/analytics/extractCorpus/filesystemSources.js +118 -0
  104. package/dist/analytics/extractCorpus/index.js +14 -0
  105. package/dist/analytics/extractCorpus/jsonlSessions.js +204 -0
  106. package/dist/analytics/extractCorpus/sqliteCaps.js +43 -0
  107. package/dist/analytics/extractCorpus/sqliteSessions.js +367 -0
  108. package/dist/analytics/extractCorpus/tierReader.js +108 -0
  109. package/dist/analytics/extractCorpus.js +2 -1791
  110. package/dist/analytics/glossaryAdviceResolution.js +166 -0
  111. package/dist/analytics/glossaryInputAcquisition.js +319 -0
  112. package/dist/analytics/personalGlossaryAdmission.js +133 -0
  113. package/dist/analytics/personalGlossaryProfile.js +219 -0
  114. package/dist/analytics/profileSignals.js +211 -0
  115. package/dist/analytics/usageStats.js +169 -42
  116. package/dist/audit/terminologyDrift.js +281 -0
  117. package/dist/bin/agentera.js +3 -2
  118. package/dist/capabilities/audit/instructions.js +16 -0
  119. package/dist/capabilities/build/instructions.js +56 -0
  120. package/dist/capabilities/design/instructions.js +4 -0
  121. package/dist/capabilities/discuss/instructions.js +29 -0
  122. package/dist/capabilities/document/instructions.js +11 -0
  123. package/dist/capabilities/index.js +40 -0
  124. package/dist/capabilities/optimize/instructions.js +14 -0
  125. package/dist/capabilities/orchestrate/instructions.js +40 -0
  126. package/dist/capabilities/plan/instructions.js +32 -0
  127. package/dist/capabilities/profile/instructions.js +70 -0
  128. package/dist/capabilities/research/instructions.js +5 -0
  129. package/dist/capabilities/status/instructions.js +11 -0
  130. package/dist/capabilities/status/startupInstructions.js +34 -0
  131. package/dist/capabilities/vision/instructions.js +4 -0
  132. package/dist/cli/appContext.js +30 -24
  133. package/dist/cli/argvalidate.js +0 -1
  134. package/dist/cli/capabilityContext/benchmark.js +565 -0
  135. package/dist/cli/capabilityContext/bespoke.js +44 -0
  136. package/dist/cli/capabilityContext/build.js +242 -0
  137. package/dist/cli/capabilityContext/closeout.js +233 -0
  138. package/dist/cli/capabilityContext/contract.js +179 -0
  139. package/dist/cli/capabilityContext/evidence.js +463 -0
  140. package/dist/cli/capabilityContext/index.js +3 -0
  141. package/dist/cli/capabilityContext/orchestration.js +131 -0
  142. package/dist/cli/capabilityContext/planState.js +260 -0
  143. package/dist/cli/capabilityContext/progress.js +142 -0
  144. package/dist/cli/capabilityContext/projectVerification.js +409 -0
  145. package/dist/cli/capabilityContext/shared.js +83 -0
  146. package/dist/cli/capabilityContext/slim.js +152 -0
  147. package/dist/cli/capabilityContext/startup.js +150 -0
  148. package/dist/cli/capabilityContext/startupAggregation.js +68 -0
  149. package/dist/cli/capabilityContext/types.js +56 -0
  150. package/dist/cli/capabilityContext.js +1 -2421
  151. package/dist/cli/commands/appHome.js +22 -0
  152. package/dist/cli/commands/capability.js +5 -12
  153. package/dist/cli/commands/compact.js +41 -13
  154. package/dist/cli/commands/doctor.js +127 -97
  155. package/dist/cli/commands/durability.js +81 -0
  156. package/dist/cli/commands/glossaryAdvice.js +138 -0
  157. package/dist/cli/commands/lint.js +26 -44
  158. package/dist/cli/commands/personalGlossary.js +176 -0
  159. package/dist/cli/commands/prime/briefOrientation.js +747 -0
  160. package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
  161. package/dist/cli/commands/prime/bundleStatus.js +190 -0
  162. package/dist/cli/commands/prime/collectEntityOrientation.js +311 -0
  163. package/dist/cli/commands/prime/collectOrientationState.js +212 -0
  164. package/dist/cli/commands/prime/orientationOutput.js +397 -0
  165. package/dist/cli/commands/prime/types.js +1 -0
  166. package/dist/cli/commands/prime/v1Migration.js +38 -0
  167. package/dist/cli/commands/prime.js +80 -558
  168. package/dist/cli/commands/profileGrounding.js +55 -0
  169. package/dist/cli/commands/query.js +78 -53
  170. package/dist/cli/commands/report.js +96 -25
  171. package/dist/cli/commands/route.js +142 -0
  172. package/dist/cli/commands/schema.js +266 -143
  173. package/dist/cli/commands/state/decisions.js +387 -0
  174. package/dist/cli/commands/state/docs.js +70 -0
  175. package/dist/cli/commands/state/experimentRecords.js +151 -0
  176. package/dist/cli/commands/state/experiments.js +14 -0
  177. package/dist/cli/commands/state/get.js +129 -0
  178. package/dist/cli/commands/state/health.js +14 -0
  179. package/dist/cli/commands/state/index.js +16 -0
  180. package/dist/cli/commands/state/list.js +194 -0
  181. package/dist/cli/commands/state/objective.js +25 -0
  182. package/dist/cli/commands/state/plan.js +14 -0
  183. package/dist/cli/commands/state/planTasks.js +154 -0
  184. package/dist/cli/commands/state/plans.js +154 -0
  185. package/dist/cli/commands/state/progress.js +13 -0
  186. package/dist/cli/commands/state/shared.js +14 -0
  187. package/dist/cli/commands/state/todo.js +42 -0
  188. package/dist/cli/commands/state/write.js +434 -0
  189. package/dist/cli/commands/upgrade.js +146 -5
  190. package/dist/cli/commands/upgradeVerify.js +118 -0
  191. package/dist/cli/commands/validate.js +272 -213
  192. package/dist/cli/commands/verify.js +24 -9
  193. package/dist/cli/contracts/bundleStatus.js +1 -0
  194. package/dist/cli/contracts/orientationState.js +1 -0
  195. package/dist/cli/dispatch/argvParser.js +32 -0
  196. package/dist/cli/dispatch/check.js +372 -0
  197. package/dist/cli/dispatch/commands.js +27 -0
  198. package/dist/cli/dispatch/index.js +207 -0
  199. package/dist/cli/dispatch/lifecycle.js +652 -0
  200. package/dist/cli/dispatch/prime.js +139 -0
  201. package/dist/cli/dispatch/projections.js +17 -0
  202. package/dist/cli/dispatch/shared.js +63 -0
  203. package/dist/cli/dispatch/state.js +140 -0
  204. package/dist/cli/dispatch.js +1 -996
  205. package/dist/cli/errors.js +52 -0
  206. package/dist/cli/help.js +390 -43
  207. package/dist/cli/migrationRequired.js +87 -0
  208. package/dist/cli/orientation/attention.js +59 -0
  209. package/dist/cli/orientation/corpusCoverage.js +102 -0
  210. package/dist/cli/orientation.js +444 -173
  211. package/dist/cli/planArtifacts.js +350 -0
  212. package/dist/cli/planEvidence.js +157 -0
  213. package/dist/cli/planLifecycleState.js +36 -0
  214. package/dist/cli/planTaskIndex.js +11 -0
  215. package/dist/cli/preCutoverCommand.js +32 -0
  216. package/dist/cli/prime-blob.js +71 -3
  217. package/dist/cli/profileAcquisition.js +167 -0
  218. package/dist/cli/startupCompletenessContract.js +59 -0
  219. package/dist/cli/stateQuery.js +63 -14
  220. package/dist/cli/structured.js +0 -1
  221. package/dist/cli/todoMarkdown.js +46 -0
  222. package/dist/cli/todoReadinessSelection.js +192 -0
  223. package/dist/cli/todoSeverity.js +18 -0
  224. package/dist/core/atomicWriter.js +20 -0
  225. package/dist/core/developmentChannel.js +1 -0
  226. package/dist/core/developmentInvocation.js +374 -0
  227. package/dist/core/difflib.js +0 -1
  228. package/dist/core/envPaths.js +20 -0
  229. package/dist/core/jsonValue.js +5 -0
  230. package/dist/core/paths.js +0 -1
  231. package/dist/core/pyjson.js +67 -3
  232. package/dist/core/shell.js +4 -0
  233. package/dist/core/skillIdentity.js +23 -0
  234. package/dist/core/sourceRoot.js +9 -12
  235. package/dist/core/text.js +10 -0
  236. package/dist/core/toml.js +0 -1
  237. package/dist/core/yaml.js +8 -1
  238. package/dist/eval/evalSkills.js +30 -26
  239. package/dist/eval/hybridRouteEvaluation.js +155 -0
  240. package/dist/eval/semanticEval.js +43 -20
  241. package/dist/eval/semanticFixtures.js +16 -5
  242. package/dist/hooks/common.js +11 -81
  243. package/dist/hooks/compaction/apply.js +446 -0
  244. package/dist/hooks/compaction/dryRun.js +184 -0
  245. package/dist/hooks/compaction/index.js +22 -0
  246. package/dist/hooks/compaction/parse.js +325 -0
  247. package/dist/hooks/compaction/retention.js +202 -0
  248. package/dist/hooks/compaction/status.js +360 -0
  249. package/dist/hooks/compaction/types.js +5 -0
  250. package/dist/hooks/validateArtifact/agentFacing.js +9 -0
  251. package/dist/hooks/validateArtifact/index.js +92 -0
  252. package/dist/hooks/validateArtifact/markdown.js +145 -0
  253. package/dist/hooks/validateArtifact/schema.js +546 -0
  254. package/dist/hooks/validateArtifact/traversal.js +107 -0
  255. package/dist/hooks/validateArtifact/violations.js +107 -0
  256. package/dist/migrate/v2HandoffManifest.js +452 -0
  257. package/dist/registries/activationContract.js +2 -0
  258. package/dist/registries/activationTuples.js +106 -0
  259. package/dist/registries/artifactProtocolIds.js +78 -0
  260. package/dist/registries/artifactRegistry.js +224 -63
  261. package/dist/registries/artifactSchemaProjection.js +45 -0
  262. package/dist/registries/capabilityContract.js +141 -13
  263. package/dist/registries/evaluatorHandoffContract.js +170 -0
  264. package/dist/registries/evidenceTierContract.js +371 -0
  265. package/dist/registries/glossaryAdviceContract.js +79 -0
  266. package/dist/registries/glossaryCaveatContract.js +67 -0
  267. package/dist/registries/glossaryConsumerContractValidation.js +787 -0
  268. package/dist/registries/glossaryEntryContract.js +757 -0
  269. package/dist/registries/glossaryTermIdentity.js +17 -0
  270. package/dist/registries/glossaryTermOccurrence.js +20 -0
  271. package/dist/registries/hybridRoute.js +274 -0
  272. package/dist/registries/hybridRouteReceipt.js +221 -0
  273. package/dist/registries/packagePublication.js +229 -0
  274. package/dist/registries/packageRegistry.js +187 -211
  275. package/dist/registries/todoReadinessContract.js +448 -0
  276. package/dist/registries/triggerLoader.js +174 -0
  277. package/dist/registries/verbosityBudgetContract.js +205 -0
  278. package/dist/release/releaseMetadata.js +385 -0
  279. package/dist/runtime/lifecycleAdapterContract.js +457 -0
  280. package/dist/runtime/lifecycleAdapters.js +777 -0
  281. package/dist/runtime/lifecycleAuthority.js +453 -0
  282. package/dist/runtime/lifecycleOperationContract.js +123 -0
  283. package/dist/runtime/lifecycleOperations.js +634 -0
  284. package/dist/runtime/lifecycleOwnershipJournal.js +622 -0
  285. package/dist/runtime/lifecyclePublication.js +415 -0
  286. package/dist/runtime/lifecycleSnapshot.js +438 -0
  287. package/dist/runtime/nativeResourceCleanup.js +502 -0
  288. package/dist/setup/opencode.js +20 -0
  289. package/dist/setup/opencodeConstants.js +1 -0
  290. package/dist/setup/sharedSkill.js +45 -0
  291. package/dist/setup/smokeChecks.js +21 -82
  292. package/dist/state/archiveDiscovery.js +580 -0
  293. package/dist/state/archivePublication.js +225 -0
  294. package/dist/state/archiveRecovery.js +237 -0
  295. package/dist/state/archiveReplay.js +53 -0
  296. package/dist/state/canonicalMigrationRecord.js +36 -0
  297. package/dist/state/changelog.js +221 -0
  298. package/dist/state/decisionEntities.js +367 -0
  299. package/dist/state/decisionLegacyValidation.js +215 -0
  300. package/dist/state/decisionMigrationProvenance.js +199 -0
  301. package/dist/state/decisionOverlay.js +254 -0
  302. package/dist/state/decisionRevision.js +256 -0
  303. package/dist/state/decisionRevisionMigration.js +89 -0
  304. package/dist/state/directRetrieval.js +323 -0
  305. package/dist/state/durability.js +324 -0
  306. package/dist/state/entityCutover.js +459 -0
  307. package/dist/state/entityCutoverGit.js +127 -0
  308. package/dist/state/entityGlossaryAuthority.js +13 -0
  309. package/dist/state/entityListProjection.js +187 -0
  310. package/dist/state/entityListRuntimeRegistry.js +85 -0
  311. package/dist/state/entityMigrationCausality.js +97 -0
  312. package/dist/state/entityMigrationIdentity.js +5 -0
  313. package/dist/state/entityMigrationPreview.js +846 -0
  314. package/dist/state/entityMigrationTodo.js +133 -0
  315. package/dist/state/entityPublicationContext.js +806 -0
  316. package/dist/state/entityRetrievalHelp.js +506 -0
  317. package/dist/state/entityStorage.js +896 -0
  318. package/dist/state/exactReplacementRecovery.js +18 -0
  319. package/dist/state/experimentArchive.js +63 -0
  320. package/dist/state/experimentIdentity.js +202 -0
  321. package/dist/state/healthEntities.js +262 -0
  322. package/dist/state/healthEntityValidation.js +18 -0
  323. package/dist/state/healthRepair.js +69 -0
  324. package/dist/state/installRoot.js +64 -25
  325. package/dist/state/legacyEntityCutoverEvidence.js +65 -0
  326. package/dist/state/legacyIdentity.js +47 -0
  327. package/dist/state/legacySummaryRecord.js +6 -0
  328. package/dist/state/listAccounting.js +54 -0
  329. package/dist/state/listClassification.js +17 -0
  330. package/dist/state/listCursor.js +42 -0
  331. package/dist/state/listRetrieval.js +781 -0
  332. package/dist/state/migrationSourceBinding.js +30 -0
  333. package/dist/state/objectiveExperimentEntities.js +322 -0
  334. package/dist/state/planEntities.js +530 -0
  335. package/dist/state/planIdentity.js +47 -0
  336. package/dist/state/planRetrieval.js +313 -0
  337. package/dist/state/planTaskRetrieval.js +294 -0
  338. package/dist/state/progressEntities.js +512 -0
  339. package/dist/state/progressGlossaryCaveat.js +168 -0
  340. package/dist/state/progressPublicationOrder.js +19 -0
  341. package/dist/state/projectRoot.js +62 -0
  342. package/dist/state/projectionPolicy.js +190 -0
  343. package/dist/state/retrievalAuthority.js +156 -0
  344. package/dist/state/safeProjectFile.js +155 -0
  345. package/dist/state/startupAnalysis/benchmark.js +432 -0
  346. package/dist/state/startupAnalysis/contract.js +160 -0
  347. package/dist/state/startupAnalysis/helpers.js +286 -0
  348. package/dist/state/startupAnalysis/index.js +6 -0
  349. package/dist/state/startupAnalysis/metrics.js +340 -0
  350. package/dist/state/startupAnalysis/records.js +198 -0
  351. package/dist/state/startupAnalysis/report.js +111 -0
  352. package/dist/state/startupAnalysis/threshold.js +512 -0
  353. package/dist/state/startupAnalysis.js +2 -1953
  354. package/dist/state/startupProjection.js +499 -0
  355. package/dist/state/stateMode.js +85 -0
  356. package/dist/state/stateStorageAuthority.js +47 -0
  357. package/dist/state/summaryEntityRead.js +25 -0
  358. package/dist/state/summaryMigrationProvenance.js +66 -0
  359. package/dist/state/summarySourceRowAuthority.js +36 -0
  360. package/dist/state/todoDocsEntities.js +1064 -0
  361. package/dist/state/todoDocsEntityValidation.js +158 -0
  362. package/dist/state/todoMarkdownProjection.js +51 -0
  363. package/dist/state/todoReconciliationActivation.js +132 -0
  364. package/dist/state/todoReconciliationInspection.js +173 -0
  365. package/dist/state/todoReconciliationRepair.js +170 -0
  366. package/dist/state/todoReconciliationTransaction.js +582 -0
  367. package/dist/state/write/assign.js +20 -0
  368. package/dist/state/write/candidateMutation.js +269 -0
  369. package/dist/state/write/errors.js +11 -0
  370. package/dist/state/write/experimentPublication.js +192 -0
  371. package/dist/state/write/explain.js +332 -0
  372. package/dist/state/write/fields.js +61 -0
  373. package/dist/state/write/glossaryPublication.js +263 -0
  374. package/dist/state/write/grammar.js +280 -0
  375. package/dist/state/write/helpers.js +29 -0
  376. package/dist/state/write/index.js +12 -0
  377. package/dist/state/write/input.js +367 -0
  378. package/dist/state/write/lock.js +837 -0
  379. package/dist/state/write/mutation.js +234 -0
  380. package/dist/state/write/operations.js +169 -0
  381. package/dist/state/write/planEvaluation.js +128 -0
  382. package/dist/state/write/planPublication.js +179 -0
  383. package/dist/state/write/runtimeOperations.js +142 -0
  384. package/dist/state/write/serialize.js +1 -0
  385. package/dist/state/write/transaction.js +52 -0
  386. package/dist/state/write/validate.js +7 -0
  387. package/dist/upgrade/appContentRefresh.js +383 -0
  388. package/dist/upgrade/appModel.js +8 -7
  389. package/dist/upgrade/atomicWriter.js +1 -0
  390. package/dist/upgrade/bundleEvidence.js +33 -0
  391. package/dist/upgrade/channels.js +12 -8
  392. package/dist/upgrade/compatibility.js +56 -21
  393. package/dist/upgrade/doctor.js +197 -192
  394. package/dist/upgrade/doctorClassifier.js +187 -0
  395. package/dist/upgrade/installedHooksRetirement.js +196 -0
  396. package/dist/upgrade/legacyAgentCleanup.js +282 -0
  397. package/dist/upgrade/lifecycleUpgrade.js +113 -0
  398. package/dist/upgrade/migrateArtifactsV2ToV3.js +367 -149
  399. package/dist/upgrade/migrationPublication.js +122 -0
  400. package/dist/upgrade/nextMajorDoctor.js +155 -0
  401. package/dist/upgrade/npxPlatformStatus.js +22 -0
  402. package/dist/upgrade/projectIntegration.js +145 -187
  403. package/dist/upgrade/projectIntegrationDecision.js +50 -0
  404. package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
  405. package/dist/upgrade/runtimeMigration.js +278 -352
  406. package/dist/upgrade/upgradeCommands.js +14 -1
  407. package/dist/upgrade/upgradeLock.js +85 -0
  408. package/dist/upgrade/upgradeOrchestrator.js +263 -59
  409. package/dist/upgrade/v3CapabilitySurface.js +14 -0
  410. package/dist/upgrade/versionResolution.js +12 -5
  411. package/dist/validate/activationArtifactEvidence.js +844 -0
  412. package/dist/validate/activationConjunction.js +816 -0
  413. package/dist/validate/activationEvidenceManifest.js +515 -0
  414. package/dist/validate/activationPackageSemantics.js +29 -0
  415. package/dist/validate/appHomeContract.js +5 -11
  416. package/dist/validate/bootstrapAuthority.js +44 -0
  417. package/dist/validate/capability.js +144 -15
  418. package/dist/validate/crossCapability.js +15 -10
  419. package/dist/validate/retainedReferenceAuthority.js +879 -0
  420. package/dist/validate/selfAudit.js +73 -37
  421. package/dist/validate/v1LegacyCruft.js +131 -0
  422. package/dist/validate/vocabularyAuthority.js +303 -0
  423. package/package.json +53 -27
  424. package/bundle/references/adapters/cursor.md +0 -213
  425. package/bundle/references/adapters/opencode.md +0 -530
  426. package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
  427. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
  428. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  429. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -548
  430. package/bundle/references/adapters/runtime-feature-parity.md +0 -189
  431. package/bundle/references/analysis/benchmark.md +0 -267
  432. package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
  433. package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
  434. package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -355
  435. package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -278
  436. package/bundle/references/cli/capability-tool-classification.yaml +0 -53
  437. package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
  438. package/bundle/references/meta/documentation-inventory.md +0 -43
  439. package/bundle/references/v1-section-mapping.md +0 -47
  440. package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
  441. package/bundle/skills/agentera/agents/dokumentera.toml +0 -6
  442. package/bundle/skills/agentera/agents/hej.toml +0 -6
  443. package/bundle/skills/agentera/agents/inspektera.toml +0 -6
  444. package/bundle/skills/agentera/agents/inspirera.toml +0 -6
  445. package/bundle/skills/agentera/agents/optimera.toml +0 -6
  446. package/bundle/skills/agentera/agents/orkestrera.toml +0 -6
  447. package/bundle/skills/agentera/agents/planera.toml +0 -6
  448. package/bundle/skills/agentera/agents/profilera.toml +0 -6
  449. package/bundle/skills/agentera/agents/realisera.toml +0 -6
  450. package/bundle/skills/agentera/agents/resonera.toml +0 -6
  451. package/bundle/skills/agentera/agents/visionera.toml +0 -6
  452. package/bundle/skills/agentera/agents/visualisera.toml +0 -6
  453. package/bundle/skills/agentera/capabilities/dokumentera/instructions.md +0 -428
  454. package/bundle/skills/agentera/capabilities/dokumentera/schemas/artifacts.yaml +0 -73
  455. package/bundle/skills/agentera/capabilities/dokumentera/schemas/triggers.yaml +0 -35
  456. package/bundle/skills/agentera/capabilities/hej/instructions.md +0 -331
  457. package/bundle/skills/agentera/capabilities/hej/schemas/artifacts.yaml +0 -69
  458. package/bundle/skills/agentera/capabilities/hej/schemas/triggers.yaml +0 -58
  459. package/bundle/skills/agentera/capabilities/inspektera/instructions.md +0 -514
  460. package/bundle/skills/agentera/capabilities/inspektera/schemas/artifacts.yaml +0 -76
  461. package/bundle/skills/agentera/capabilities/inspektera/schemas/triggers.yaml +0 -38
  462. package/bundle/skills/agentera/capabilities/inspirera/instructions.md +0 -280
  463. package/bundle/skills/agentera/capabilities/inspirera/schemas/artifacts.yaml +0 -24
  464. package/bundle/skills/agentera/capabilities/inspirera/schemas/triggers.yaml +0 -34
  465. package/bundle/skills/agentera/capabilities/optimera/instructions.md +0 -437
  466. package/bundle/skills/agentera/capabilities/optimera/schemas/triggers.yaml +0 -39
  467. package/bundle/skills/agentera/capabilities/orkestrera/instructions.md +0 -433
  468. package/bundle/skills/agentera/capabilities/orkestrera/schemas/artifacts.yaml +0 -64
  469. package/bundle/skills/agentera/capabilities/orkestrera/schemas/triggers.yaml +0 -42
  470. package/bundle/skills/agentera/capabilities/orkestrera/schemas/validation.yaml +0 -107
  471. package/bundle/skills/agentera/capabilities/planera/instructions.md +0 -368
  472. package/bundle/skills/agentera/capabilities/planera/schemas/artifacts.yaml +0 -62
  473. package/bundle/skills/agentera/capabilities/planera/schemas/triggers.yaml +0 -34
  474. package/bundle/skills/agentera/capabilities/planera/schemas/validation.yaml +0 -61
  475. package/bundle/skills/agentera/capabilities/profilera/instructions.md +0 -419
  476. package/bundle/skills/agentera/capabilities/profilera/schemas/artifacts.yaml +0 -18
  477. package/bundle/skills/agentera/capabilities/profilera/schemas/triggers.yaml +0 -45
  478. package/bundle/skills/agentera/capabilities/profilera/schemas/validation.yaml +0 -57
  479. package/bundle/skills/agentera/capabilities/realisera/instructions.md +0 -403
  480. package/bundle/skills/agentera/capabilities/realisera/schemas/artifacts.yaml +0 -80
  481. package/bundle/skills/agentera/capabilities/realisera/schemas/triggers.yaml +0 -39
  482. package/bundle/skills/agentera/capabilities/realisera/schemas/validation.yaml +0 -110
  483. package/bundle/skills/agentera/capabilities/resonera/instructions.md +0 -329
  484. package/bundle/skills/agentera/capabilities/resonera/schemas/artifacts.yaml +0 -47
  485. package/bundle/skills/agentera/capabilities/resonera/schemas/triggers.yaml +0 -46
  486. package/bundle/skills/agentera/capabilities/resonera/schemas/validation.yaml +0 -77
  487. package/bundle/skills/agentera/capabilities/visionera/instructions.md +0 -309
  488. package/bundle/skills/agentera/capabilities/visionera/schemas/triggers.yaml +0 -41
  489. package/bundle/skills/agentera/capabilities/visualisera/instructions.md +0 -400
  490. package/bundle/skills/agentera/capabilities/visualisera/schemas/triggers.yaml +0 -33
  491. package/bundle/skills/agentera/references/contract.md +0 -1039
  492. package/bundle/skills/hej/.claude-plugin/plugin.json +0 -6
  493. package/bundle/skills/hej/SKILL.md +0 -69
  494. package/bundle/skills/hej/agents/hej.toml +0 -11
  495. package/bundle/skills/hej/agents/openai.yaml +0 -8
  496. package/dist/analytics/extractCorpus.js.map +0 -1
  497. package/dist/analytics/usageStats.js.map +0 -1
  498. package/dist/bin/agentera.js.map +0 -1
  499. package/dist/cli/appContext.js.map +0 -1
  500. package/dist/cli/argvalidate.js.map +0 -1
  501. package/dist/cli/capabilityContext.js.map +0 -1
  502. package/dist/cli/commands/backfill.js +0 -84
  503. package/dist/cli/commands/backfill.js.map +0 -1
  504. package/dist/cli/commands/capability.js.map +0 -1
  505. package/dist/cli/commands/compact.js.map +0 -1
  506. package/dist/cli/commands/doctor.js.map +0 -1
  507. package/dist/cli/commands/lint.js.map +0 -1
  508. package/dist/cli/commands/prime.js.map +0 -1
  509. package/dist/cli/commands/query.js.map +0 -1
  510. package/dist/cli/commands/report.js.map +0 -1
  511. package/dist/cli/commands/schema.js.map +0 -1
  512. package/dist/cli/commands/state.js +0 -1012
  513. package/dist/cli/commands/state.js.map +0 -1
  514. package/dist/cli/commands/upgrade.js.map +0 -1
  515. package/dist/cli/commands/validate.js.map +0 -1
  516. package/dist/cli/commands/verify.js.map +0 -1
  517. package/dist/cli/dispatch.js.map +0 -1
  518. package/dist/cli/help.js.map +0 -1
  519. package/dist/cli/orientation.js.map +0 -1
  520. package/dist/cli/prime-blob.js.map +0 -1
  521. package/dist/cli/stateQuery.js.map +0 -1
  522. package/dist/cli/structured.js.map +0 -1
  523. package/dist/core/difflib.js.map +0 -1
  524. package/dist/core/git.js +0 -43
  525. package/dist/core/git.js.map +0 -1
  526. package/dist/core/paths.js.map +0 -1
  527. package/dist/core/pyjson.js.map +0 -1
  528. package/dist/core/sourceRoot.js.map +0 -1
  529. package/dist/core/toml.js.map +0 -1
  530. package/dist/core/yaml.js.map +0 -1
  531. package/dist/eval/evalSkills.js.map +0 -1
  532. package/dist/eval/semanticEval.js.map +0 -1
  533. package/dist/eval/semanticFixtures.js.map +0 -1
  534. package/dist/hooks/common.js.map +0 -1
  535. package/dist/hooks/compaction.js +0 -935
  536. package/dist/hooks/compaction.js.map +0 -1
  537. package/dist/hooks/cursorPreToolUse.js +0 -19
  538. package/dist/hooks/cursorPreToolUse.js.map +0 -1
  539. package/dist/hooks/cursorSessionStart.js +0 -71
  540. package/dist/hooks/cursorSessionStart.js.map +0 -1
  541. package/dist/hooks/sessionStart.js +0 -209
  542. package/dist/hooks/sessionStart.js.map +0 -1
  543. package/dist/hooks/sessionStop.js +0 -212
  544. package/dist/hooks/sessionStop.js.map +0 -1
  545. package/dist/hooks/validateArtifact.js +0 -933
  546. package/dist/hooks/validateArtifact.js.map +0 -1
  547. package/dist/registries/artifactRegistry.js.map +0 -1
  548. package/dist/registries/capabilityContract.js.map +0 -1
  549. package/dist/registries/packageRegistry.js.map +0 -1
  550. package/dist/registries/runtimeAdapterRegistry.js +0 -315
  551. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  552. package/dist/setup/codex.js +0 -1056
  553. package/dist/setup/codex.js.map +0 -1
  554. package/dist/setup/copilot.js +0 -227
  555. package/dist/setup/copilot.js.map +0 -1
  556. package/dist/setup/cursor.js +0 -127
  557. package/dist/setup/cursor.js.map +0 -1
  558. package/dist/setup/doctor.js +0 -1297
  559. package/dist/setup/doctor.js.map +0 -1
  560. package/dist/setup/smokeChecks.js.map +0 -1
  561. package/dist/state/installRoot.js.map +0 -1
  562. package/dist/state/progressCommit.js +0 -289
  563. package/dist/state/progressCommit.js.map +0 -1
  564. package/dist/state/startupAnalysis.js.map +0 -1
  565. package/dist/upgrade/appModel.js.map +0 -1
  566. package/dist/upgrade/channels.js.map +0 -1
  567. package/dist/upgrade/compatibility.js.map +0 -1
  568. package/dist/upgrade/doctor.js.map +0 -1
  569. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -571
  570. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  571. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
  572. package/dist/upgrade/projectIntegration.js.map +0 -1
  573. package/dist/upgrade/runtimeMigration.js.map +0 -1
  574. package/dist/upgrade/upgradeCommands.js.map +0 -1
  575. package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
  576. package/dist/upgrade/versionResolution.js.map +0 -1
  577. package/dist/validate/appHomeContract.js.map +0 -1
  578. package/dist/validate/capability.js.map +0 -1
  579. package/dist/validate/crossCapability.js.map +0 -1
  580. package/dist/validate/lifecycleAdapters.js +0 -772
  581. package/dist/validate/lifecycleAdapters.js.map +0 -1
  582. package/dist/validate/selfAudit.js.map +0 -1
  583. /package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/exit.yaml +0 -0
  584. /package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/exit.yaml +0 -0
  585. /package/bundle/skills/agentera/capabilities/{hej → status}/schemas/exit.yaml +0 -0
@@ -0,0 +1,446 @@
1
+ /**
2
+ * Compaction writers (the "apply" surface).
3
+ *
4
+ * Reads the artifact, calls the retention/selection helpers, then
5
+ * writes the compacted result back to disk. `compactYamlFile` is for
6
+ * the three YAML artifacts (progress, decisions, health);
7
+ * `compactFile` handles both YAML and markdown (TODO resolved).
8
+ *
9
+ * Note: `entry.header`/`entry.body` reads are typed `as string` because the
10
+ * entries originate from parsed markdown artifact text (an IO boundary); at
11
+ * runtime these fields are always strings.
12
+ */
13
+ import fs from "node:fs";
14
+ import path from "node:path";
15
+ import YAML from "yaml";
16
+ import { loadYamlMapping } from "../../core/yaml.js";
17
+ import { MAX_FULL_ENTRIES, MAX_ONELINE_ENTRIES, MAX_TOTAL_ENTRIES, applyRetentionCaps } from "../common.js";
18
+ import { COMPACTABLE_YAML_ARTIFACTS, SPECS, YAML_SPEC_BY_ARTIFACT, formatTodoOneline } from "./dryRun.js";
19
+ import { decisionRequiresUserReview, selectDecisionActiveEntries, selectDecisionArchiveEntries, stableSortBy, yamlArchiveEntry, yamlEntryNumber, yamlRecentFullAndOlder, yamlSortEntries, } from "./retention.js";
20
+ import { normalizeTodoResolvedLayout, parseEntries, parseTodoResolved, extractResolvedSection, countTodoResolvedSectionHeadings, countTodoPendingSummarization, TODO_DROPPED_RECOVERY_GUIDANCE } from "./parse.js";
21
+ import { hydrateDecisionRecords } from "../../state/decisionOverlay.js";
22
+ import { gateProjectionEntries } from "../../state/archiveRecovery.js";
23
+ import { loadProjectionPolicy, projectionOmission, } from "../../state/projectionPolicy.js";
24
+ function restoreRawSatisfaction(selected, rawEntries) {
25
+ return selected.map((entry) => {
26
+ const raw = rawEntries.find((candidate) => yamlEntryNumber(candidate) === yamlEntryNumber(entry));
27
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
28
+ return entry;
29
+ const restored = { ...entry };
30
+ if ("satisfaction" in raw)
31
+ restored.satisfaction = raw.satisfaction;
32
+ else
33
+ delete restored.satisfaction;
34
+ return restored;
35
+ });
36
+ }
37
+ function existingOmissionCount(data) {
38
+ const count = data.omitted_count;
39
+ return typeof count === "number" && Number.isSafeInteger(count) && count > 0 ? count : 0;
40
+ }
41
+ function archiveProjectionCandidates(specName, rawArchive, generatedArchive, summaryCapacity) {
42
+ // Inline summaries have no independently verified complete record. They
43
+ // participate in the same bounded projection as verified summaries, but
44
+ // their omission explicitly remains degraded legacy history.
45
+ const candidates = [
46
+ ...rawArchive.map((entry) => ({ entry, source: "legacy_summary", index: 0 })),
47
+ ...generatedArchive.map((entry) => ({ entry, source: "archive", index: 1 })),
48
+ ];
49
+ const ordered = candidates.sort((left, right) => {
50
+ const leftTimestamp = String(left.entry?.timestamp ?? left.entry?.date ?? "");
51
+ const rightTimestamp = String(right.entry?.timestamp ?? right.entry?.date ?? "");
52
+ if (leftTimestamp !== rightTimestamp)
53
+ return leftTimestamp < rightTimestamp ? 1 : -1;
54
+ const leftNumber = yamlEntryNumber(left.entry);
55
+ const rightNumber = yamlEntryNumber(right.entry);
56
+ if (leftNumber !== rightNumber)
57
+ return rightNumber - leftNumber;
58
+ return left.index - right.index;
59
+ });
60
+ const reviewFirst = specName === "decisions"
61
+ ? [
62
+ ...ordered.filter((candidate) => decisionRequiresUserReview(candidate.entry)),
63
+ ...ordered.filter((candidate) => !decisionRequiresUserReview(candidate.entry)),
64
+ ]
65
+ : ordered;
66
+ const retained = reviewFirst.slice(0, summaryCapacity);
67
+ const omitted = reviewFirst.slice(summaryCapacity);
68
+ const provenance = [];
69
+ for (const source of ["legacy_summary", "archive"]) {
70
+ const omittedCount = omitted.filter((candidate) => candidate.source === source).length;
71
+ if (omittedCount === 0)
72
+ continue;
73
+ provenance.push({
74
+ source,
75
+ detail_availability: source === "legacy_summary" ? "unavailable" : "full",
76
+ compatibility: source === "legacy_summary" ? "degraded" : "complete",
77
+ archive_verified: source === "archive",
78
+ omitted_count: omittedCount,
79
+ });
80
+ }
81
+ return {
82
+ archive: yamlSortEntries(retained.map((candidate) => candidate.entry), specName),
83
+ omitted: omitted.length,
84
+ provenance,
85
+ };
86
+ }
87
+ function existingOmissionProvenance(data) {
88
+ const raw = data.omission_provenance;
89
+ const values = Array.isArray(raw) ? raw : raw && typeof raw === "object" ? [raw] : [];
90
+ return values.filter((entry) => Boolean(entry && typeof entry === "object" && !Array.isArray(entry)));
91
+ }
92
+ export function compactYamlBytes(bytes, artifact, projectRoot) {
93
+ if (!(artifact in COMPACTABLE_YAML_ARTIFACTS)) {
94
+ throw new Error(`unsupported YAML artifact: ${artifact}`);
95
+ }
96
+ const [activeKey, archiveKey] = COMPACTABLE_YAML_ARTIFACTS[artifact];
97
+ const specName = YAML_SPEC_BY_ARTIFACT[artifact];
98
+ const data = loadYamlMapping(bytes);
99
+ let active = data[activeKey] || [];
100
+ let archive = data[archiveKey] || [];
101
+ if (!Array.isArray(active))
102
+ active = [];
103
+ if (!Array.isArray(archive))
104
+ archive = [];
105
+ const rawActive = active;
106
+ const rawArchive = archive;
107
+ const policy = loadProjectionPolicy();
108
+ const selectionActive = specName === "decisions" && projectRoot
109
+ ? hydrateDecisionRecords(rawActive, projectRoot)
110
+ : rawActive;
111
+ const fullBefore = rawActive.length;
112
+ const onelineBefore = rawArchive.length;
113
+ if (fullBefore <= policy.activeEntries && onelineBefore <= policy.summaryEntries && fullBefore + onelineBefore <= policy.totalEntries) {
114
+ return {
115
+ bytes,
116
+ result: {
117
+ full_before: fullBefore,
118
+ oneline_before: onelineBefore,
119
+ full_after: fullBefore,
120
+ oneline_after: onelineBefore,
121
+ dropped: 0,
122
+ omitted_count: 0,
123
+ changed: false,
124
+ },
125
+ };
126
+ }
127
+ let recentFull;
128
+ let olderActive;
129
+ if (specName === "decisions") {
130
+ const [selectedRecent, selectedOlder] = selectDecisionActiveEntries(selectionActive, policy.activeEntries);
131
+ recentFull = restoreRawSatisfaction(selectedRecent, rawActive);
132
+ olderActive = restoreRawSatisfaction(selectedOlder, rawActive);
133
+ }
134
+ else {
135
+ [recentFull, olderActive] = yamlRecentFullAndOlder(rawActive, specName, policy.activeEntries);
136
+ }
137
+ const projectionRoot = projectRoot ?? process.cwd();
138
+ // Experiment summaries are the pre-existing 10/40/50 projection itself.
139
+ // Durable experiment archives are introduced separately; publication must
140
+ // not silently disable the current projection while that policy is pending.
141
+ const gated = specName === "experiments"
142
+ ? {
143
+ verified: olderActive,
144
+ refused: [],
145
+ recovery: {
146
+ status: "unsupported",
147
+ attempted: olderActive.length,
148
+ verified: 0,
149
+ retained_full: 0,
150
+ refused_count: 0,
151
+ refusals: [],
152
+ },
153
+ }
154
+ : gateProjectionEntries(projectionRoot, specName, olderActive);
155
+ const compactedFromActive = gated.verified.map((entry) => yamlArchiveEntry(specName, entry));
156
+ const retainedFull = gated.refused.map(({ entry }) => entry);
157
+ recentFull = yamlSortEntries([...recentFull, ...retainedFull], specName);
158
+ const archiveProjection = archiveProjectionCandidates(specName, rawArchive, compactedFromActive, policy.summaryEntries);
159
+ let archiveAfter = archiveProjection.archive;
160
+ if (specName === "decisions") {
161
+ const selectionArchiveCandidates = projectRoot
162
+ ? hydrateDecisionRecords(archiveAfter, projectRoot)
163
+ : archiveAfter;
164
+ archiveAfter = restoreRawSatisfaction(selectDecisionArchiveEntries(selectionArchiveCandidates), archiveAfter);
165
+ }
166
+ const omittedCount = existingOmissionCount(data) + archiveProjection.omitted;
167
+ if (omittedCount > 0) {
168
+ Object.assign(data, projectionOmission(specName, omittedCount, "projection_capacity", {
169
+ forceOmitted: true,
170
+ provenance: [...existingOmissionProvenance(data), ...archiveProjection.provenance],
171
+ }));
172
+ }
173
+ data[activeKey] = recentFull;
174
+ if (archiveAfter.length > 0 || archiveKey in data || compactedFromActive.length > 0) {
175
+ data[archiveKey] = archiveAfter;
176
+ }
177
+ else {
178
+ delete data[archiveKey];
179
+ }
180
+ const compactedBytes = YAML.stringify(data);
181
+ const fullAfter = recentFull.length;
182
+ const onelineAfter = archiveAfter.length;
183
+ // A projection may omit detail only after its complete numbered archive is
184
+ // verified. Omission is reported separately; logical entries are never
185
+ // counted as dropped.
186
+ const dropped = 0;
187
+ return {
188
+ bytes: compactedBytes,
189
+ result: {
190
+ full_before: fullBefore,
191
+ oneline_before: onelineBefore,
192
+ full_after: fullAfter,
193
+ oneline_after: onelineAfter,
194
+ dropped,
195
+ omitted_count: omittedCount,
196
+ ...(omittedCount > 0 ? { omission_reason: "projection_capacity" } : {}),
197
+ changed: true,
198
+ recovery: gated.recovery,
199
+ },
200
+ };
201
+ }
202
+ export function compactYamlFile(p, artifact, projectRoot) {
203
+ if (!fs.existsSync(p))
204
+ throw new Error(p);
205
+ const inferredProjectRoot = path.basename(path.dirname(p)) === ".agentera" ? path.dirname(path.dirname(p)) : path.dirname(p);
206
+ const compacted = compactYamlBytes(fs.readFileSync(p, "utf8"), artifact, projectRoot ?? inferredProjectRoot);
207
+ if (compacted.result.changed)
208
+ fs.writeFileSync(p, compacted.bytes);
209
+ return compacted.result;
210
+ }
211
+ function detectDirection(entries) {
212
+ let asc = 0;
213
+ let desc = 0;
214
+ for (let i = 0; i < entries.length - 1; i++) {
215
+ const a = yamlEntryNumber(entries[i]);
216
+ const b = yamlEntryNumber(entries[i + 1]);
217
+ if (a === 0 || b === 0 || a === b)
218
+ continue;
219
+ if (a < b)
220
+ asc += 1;
221
+ else
222
+ desc += 1;
223
+ }
224
+ if (asc === 0 && desc === 0)
225
+ return "descending";
226
+ return asc > desc ? "ascending" : "descending";
227
+ }
228
+ export function compactEntries(entries, maxFull = MAX_FULL_ENTRIES, maxOneline = MAX_ONELINE_ENTRIES, formatOneline = null) {
229
+ const maxTotal = maxFull + maxOneline;
230
+ if (entries.length === 0)
231
+ return [];
232
+ const ascending = detectDirection(entries) === "ascending";
233
+ const newestFirst = stableSortBy(entries, yamlEntryNumber, true);
234
+ const full = [];
235
+ const archive = [];
236
+ newestFirst.forEach((entry, i) => {
237
+ if (i < maxFull) {
238
+ full.push(entry);
239
+ }
240
+ else if (i < maxTotal) {
241
+ if (entry.kind === "full" && formatOneline !== null) {
242
+ archive.push({ header: formatOneline(entry), body: "", kind: "oneline" });
243
+ }
244
+ else {
245
+ archive.push(entry);
246
+ }
247
+ }
248
+ });
249
+ const result = applyRetentionCaps(full, archive, { maxFull, maxOneline, maxTotal });
250
+ if (ascending)
251
+ result.reverse();
252
+ return result;
253
+ }
254
+ function compactTodoEntries(entries) {
255
+ // Positional tiering per TC9: the first ten resolved rows are the
256
+ // recent/full-detail tier even when they have no indented body; rows
257
+ // 11-50 are the summary tier; rows beyond 50 are dropped. Using
258
+ // position (not body presence) ensures: (1) a TODO with 55 bodyless
259
+ // one-liners retains 50 (10 promoted to full + 40 summary), not 40;
260
+ // (2) a second compaction is idempotent because a compacted file
261
+ // with 0 body + 50 headers still reports total=50 (not oneline=50>40).
262
+ const result = [];
263
+ for (let i = 0; i < entries.length; i++) {
264
+ if (i < MAX_FULL_ENTRIES) {
265
+ // First 10: full-detail tier — preserve body if present, promote
266
+ // kind to "full" so the writer keeps the header (not formatOneline).
267
+ result.push(entries[i].kind === "oneline"
268
+ ? { ...entries[i], kind: "full" }
269
+ : entries[i]);
270
+ }
271
+ else if (i < MAX_TOTAL_ENTRIES) {
272
+ // Items 11-50: summary tier — force ≤15-word summary formatting
273
+ // by passing kind="full" to formatTodoOneline so it goes through
274
+ // the truncation path (strip metadata + truncateWords). This must
275
+ // NOT use kind="oneline" (passthrough), which preserves long
276
+ // verbatim headers unchanged.
277
+ const summary = formatTodoOneline({ ...entries[i], kind: "full" });
278
+ result.push({ header: summary, body: "", kind: "oneline" });
279
+ }
280
+ // Items 51+: dropped entirely.
281
+ }
282
+ return result;
283
+ }
284
+ function formatProgressLike(headerPrefix, entries, spec) {
285
+ // `entry.header`/`entry.body` below come from parsed markdown artifact text; the
286
+ // `as string` casts sit at that markdown-parse IO boundary (runtime values are strings).
287
+ const lines = [];
288
+ if (headerPrefix.trim()) {
289
+ lines.push(headerPrefix.replace(/\s+$/, ""));
290
+ lines.push("");
291
+ }
292
+ const fullEntries = entries.filter((e) => e.kind === "full");
293
+ const onelineEntries = entries.filter((e) => e.kind === "oneline");
294
+ for (const entry of fullEntries) {
295
+ const header = entry.header;
296
+ const glyphMatch = /^(■)\s+(.*)$/.exec(header);
297
+ if (glyphMatch) {
298
+ lines.push(`${glyphMatch[1]} ## ${glyphMatch[2]}`);
299
+ }
300
+ else {
301
+ lines.push(`## ${header}`);
302
+ }
303
+ if (entry.body) {
304
+ lines.push("");
305
+ lines.push(entry.body);
306
+ }
307
+ lines.push("");
308
+ }
309
+ if (onelineEntries.length > 0 && spec.archiveHeading) {
310
+ lines.push(spec.archiveHeading);
311
+ lines.push("");
312
+ for (const entry of onelineEntries) {
313
+ lines.push(entry.header);
314
+ }
315
+ lines.push("");
316
+ }
317
+ return lines.join("\n").replace(/\s+$/, "") + "\n";
318
+ }
319
+ function extractHeaderPrefix(text, spec) {
320
+ const firstEntry = new RegExp(spec.entryHeadingRe.source, "m").exec(text);
321
+ let firstArchiveIdx = -1;
322
+ if (spec.archiveHeading) {
323
+ const archiveMatch = new RegExp(`^${spec.archiveHeading.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\s*$`, "m").exec(text);
324
+ if (archiveMatch)
325
+ firstArchiveIdx = archiveMatch.index;
326
+ }
327
+ const candidates = [firstEntry ? firstEntry.index : -1, firstArchiveIdx].filter((c) => c >= 0);
328
+ if (candidates.length === 0)
329
+ return text.replace(/\s+$/, "");
330
+ return text.slice(0, Math.min(...candidates)).replace(/\s+$/, "");
331
+ }
332
+ function compactTodoResolved(p) {
333
+ const spec = SPECS["todo-resolved"];
334
+ let text = fs.readFileSync(p, "utf8");
335
+ // Enforce exactly one `## ✓ Resolved` heading. Multiple headings hide
336
+ // trailing entries from parsing; zero headings leave placement ambiguous.
337
+ // The check-mode status path emits the error before reaching here; this
338
+ // guard protects direct callers (e.g. validate-artifact auto-compact).
339
+ const headingCount = countTodoResolvedSectionHeadings(text);
340
+ if (headingCount > 1) {
341
+ throw new Error(`TODO.md has ${headingCount} '## ✓ Resolved' sections; merge into exactly one before compacting. ` +
342
+ `Compaction drops oldest resolved entries and is destructive (no lossless archive); ` +
343
+ TODO_DROPPED_RECOVERY_GUIDANCE);
344
+ }
345
+ if (headingCount === 0) {
346
+ throw new Error("TODO.md has no required '## ✓ Resolved' section; add exactly one before compacting.");
347
+ }
348
+ // headingCount === 1: normalize (migrate misplaced items into existing heading)
349
+ const normalized = normalizeTodoResolvedLayout(text);
350
+ if (normalized.changed) {
351
+ fs.writeFileSync(p, normalized.text);
352
+ text = normalized.text;
353
+ }
354
+ const [start, end, currentBody] = extractResolvedSection(text);
355
+ if (start < 0)
356
+ return { full_before: 0, oneline_before: 0, full_after: 0, oneline_after: 0, dropped: 0, changed: normalized.changed };
357
+ const entries = parseTodoResolved(text, spec);
358
+ const totalBefore = entries.length;
359
+ // Positional tiering per TC9 (consistent with countTodoResolvedEntries and
360
+ // compactTodoEntries): first min(N,10) = full tier, rest = oneline tier.
361
+ const fullBefore = Math.min(totalBefore, MAX_FULL_ENTRIES);
362
+ const onelineBefore = Math.max(0, totalBefore - MAX_FULL_ENTRIES);
363
+ // Skip the rewrite when within budget AND no rows 11-50 need reformatting.
364
+ // This preserves idempotency: a fully-compacted file (10 verbatim + 40
365
+ // summaries) reports pendingSummarization=0 and returns changed=false.
366
+ const pendingSummarization = countTodoPendingSummarization(text);
367
+ if (totalBefore <= MAX_TOTAL_ENTRIES && pendingSummarization === 0) {
368
+ return {
369
+ full_before: fullBefore,
370
+ oneline_before: onelineBefore,
371
+ full_after: fullBefore,
372
+ oneline_after: onelineBefore,
373
+ dropped: 0,
374
+ changed: normalized.changed,
375
+ };
376
+ }
377
+ // Either total > 50 (entries to drop) or pendingSummarization > 0 (rows
378
+ // 11-50 need ≤15-word summary formatting). Run compactTodoEntries and
379
+ // rewrite the Resolved section body.
380
+ const compacted = compactTodoEntries(entries);
381
+ const fullAfter = compacted.filter((e) => e.kind === "full").length;
382
+ const onelineAfter = compacted.filter((e) => e.kind === "oneline").length;
383
+ const dropped = totalBefore - compacted.length;
384
+ const newLines = [];
385
+ for (const entry of compacted) {
386
+ if (entry.kind === "full") {
387
+ newLines.push(entry.header);
388
+ if (entry.body)
389
+ newLines.push(entry.body);
390
+ }
391
+ else {
392
+ newLines.push(spec.formatOneline(entry));
393
+ }
394
+ }
395
+ const newBody = newLines.join("\n") + "\n";
396
+ const headingEnd = text.indexOf("\n", start) + 1;
397
+ const newText = text.slice(0, headingEnd) + "\n" + newBody + text.slice(end);
398
+ fs.writeFileSync(p, newText);
399
+ return {
400
+ full_before: fullBefore,
401
+ oneline_before: onelineBefore,
402
+ full_after: fullAfter,
403
+ oneline_after: onelineAfter,
404
+ dropped,
405
+ // TODO has no lossless numbered archive: dropped resolved entries are
406
+ // recoverable only via project history (Git), and only if previously
407
+ // committed. Surface this honestly in the JSON result rather than
408
+ // implying a lossless projection.
409
+ ...(dropped > 0 ? { omission_reason: TODO_DROPPED_RECOVERY_GUIDANCE } : {}),
410
+ changed: true,
411
+ };
412
+ }
413
+ export function compactFile(p, specName) {
414
+ if (!(specName in SPECS))
415
+ throw new Error(`unknown spec: ${specName}`);
416
+ if (!fs.existsSync(p))
417
+ throw new Error(p);
418
+ const spec = SPECS[specName];
419
+ if (spec.name === "todo-resolved") {
420
+ return compactTodoResolved(p);
421
+ }
422
+ const text = fs.readFileSync(p, "utf8");
423
+ const entries = parseEntries(text, specName);
424
+ const fullBefore = entries.filter((e) => e.kind === "full").length;
425
+ const onelineBefore = entries.filter((e) => e.kind === "oneline").length;
426
+ const totalBefore = fullBefore + onelineBefore;
427
+ const needsCompact = fullBefore > MAX_FULL_ENTRIES || onelineBefore > MAX_ONELINE_ENTRIES || totalBefore > MAX_FULL_ENTRIES + MAX_ONELINE_ENTRIES;
428
+ if (!needsCompact) {
429
+ return { full_before: fullBefore, oneline_before: onelineBefore, full_after: fullBefore, oneline_after: onelineBefore, dropped: 0, changed: false };
430
+ }
431
+ const compacted = compactEntries(entries, MAX_FULL_ENTRIES, MAX_ONELINE_ENTRIES, spec.formatOneline);
432
+ const fullAfter = compacted.filter((e) => e.kind === "full").length;
433
+ const onelineAfter = compacted.filter((e) => e.kind === "oneline").length;
434
+ const dropped = totalBefore - compacted.length;
435
+ const headerPrefix = extractHeaderPrefix(text, spec);
436
+ const newText = formatProgressLike(headerPrefix, compacted, spec);
437
+ fs.writeFileSync(p, newText);
438
+ return { full_before: fullBefore, oneline_before: onelineBefore, full_after: fullAfter, oneline_after: onelineAfter, dropped, changed: true };
439
+ }
440
+ export function detectOverflow(text, specName) {
441
+ const entries = parseEntries(text, specName);
442
+ const fullCount = entries.filter((e) => e.kind === "full").length;
443
+ const onelineCount = entries.filter((e) => e.kind === "oneline").length;
444
+ return [fullCount, onelineCount];
445
+ }
446
+ void yamlSortEntries;
@@ -0,0 +1,184 @@
1
+ /**
2
+ * One-line formatters and artifact specifications.
3
+ *
4
+ * Each entry type (progress, decisions, health, experiments,
5
+ * todo-resolved) has its own SPECS row, archive heading, and
6
+ * formatOneline function. This module owns the body-field extraction
7
+ * helpers shared by all the formatters.
8
+ */
9
+ // --- body field helpers ----------------------------------------------------
10
+ export function escapeRe(s) {
11
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
12
+ }
13
+ export function extractField(body, label) {
14
+ const pattern = new RegExp(`^\\*\\*${escapeRe(label)}\\*\\*:\\s*(.+?)$`, "m");
15
+ const m = pattern.exec(body);
16
+ return m ? m[1].trim() : "";
17
+ }
18
+ function firstNonEmpty(body) {
19
+ for (const line of body.split(/\r\n|\r|\n/)) {
20
+ if (line.trim())
21
+ return line.trim();
22
+ }
23
+ return "";
24
+ }
25
+ export function truncateWords(text, limit = 15) {
26
+ const words = text.split(/\s+/).filter((w) => w.length > 0);
27
+ // Match Python str.split() token count but preserve original spacing on no-trunc.
28
+ const tokenCount = (text.match(/\S+/g) ?? []).length;
29
+ if (tokenCount <= limit)
30
+ return text;
31
+ return words.slice(0, limit).join(" ") + "...";
32
+ }
33
+ const HEADER_NUM_RE = /(?:Cycle|Decision|Audit|Experiment)\s+(\d+)/;
34
+ const HEADER_DATE_RE = /(\d{4}-\d{2}-\d{2})/;
35
+ export const NUMBER_RE = /(?:Cycle|Decision|Audit|Experiment|EXP-)\s*(\d+)/;
36
+ export function parseHeader(header) {
37
+ const numMatch = HEADER_NUM_RE.exec(header);
38
+ const dateMatch = HEADER_DATE_RE.exec(header);
39
+ const number = numMatch ? numMatch[1] : "";
40
+ const date = dateMatch ? dateMatch[1] : "";
41
+ const parts = header.split(" · ");
42
+ let title = parts.length >= 2 ? parts[parts.length - 1].trim() : "";
43
+ if (title === date) {
44
+ title = parts.length >= 3 ? parts[parts.length - 2].trim() : "";
45
+ }
46
+ return [number, date, title];
47
+ }
48
+ // --- one-line formatters ---------------------------------------------------
49
+ // `entry.header`/`entry.body` below come from parsed markdown artifact text; the
50
+ // `as string` casts sit at that markdown-parse IO boundary (runtime values are strings).
51
+ function formatProgressOneline(entry) {
52
+ let [number, date, title] = parseHeader(entry.header);
53
+ if (!title) {
54
+ title = extractField(entry.body, "What") || firstNonEmpty(entry.body);
55
+ }
56
+ title = truncateWords(title || "(no summary)", 20);
57
+ const numberPart = number ? `Cycle ${number}` : "Cycle ?";
58
+ const datePart = date ? ` (${date})` : "";
59
+ return `- ${numberPart}${datePart}: ${title}`;
60
+ }
61
+ function formatDecisionOneline(entry) {
62
+ const [number, date] = parseHeader(entry.header);
63
+ let chosen = extractField(entry.body, "Chosen alternative");
64
+ if (!chosen)
65
+ chosen = extractField(entry.body, "Chosen");
66
+ if (!chosen)
67
+ chosen = firstNonEmpty(entry.body);
68
+ chosen = truncateWords(chosen || "(no rationale)", 20);
69
+ const numberPart = number ? `Decision ${number}` : "Decision ?";
70
+ const datePart = date ? ` (${date})` : "";
71
+ return `- ${numberPart}${datePart}: ${chosen}`;
72
+ }
73
+ function formatHealthOneline(entry) {
74
+ const [number, date] = parseHeader(entry.header);
75
+ let grade = extractField(entry.body, "Overall");
76
+ if (!grade)
77
+ grade = extractField(entry.body, "Grade");
78
+ let trajectory = extractField(entry.body, "Overall trajectory");
79
+ if (!trajectory)
80
+ trajectory = "";
81
+ const summaryBits = [];
82
+ if (grade)
83
+ summaryBits.push(truncateWords(grade, 10));
84
+ if (trajectory && trajectory !== grade)
85
+ summaryBits.push(truncateWords(trajectory, 10));
86
+ const summary = summaryBits.length > 0 ? summaryBits.join(" | ") : "no summary";
87
+ const numberPart = number ? `Audit ${number}` : "Audit ?";
88
+ const datePart = date ? ` · ${date}` : "";
89
+ return `### ${numberPart}${datePart} (${summary})`;
90
+ }
91
+ function formatExperimentOneline(entry) {
92
+ const [number] = parseHeader(entry.header);
93
+ let summary = extractField(entry.body, "Metric");
94
+ if (!summary)
95
+ summary = extractField(entry.body, "Conclusion");
96
+ if (!summary)
97
+ summary = extractField(entry.body, "Result");
98
+ if (!summary)
99
+ summary = firstNonEmpty(entry.body);
100
+ summary = truncateWords(summary || "(no result)", 15);
101
+ const numberPart = number ? `EXP-${number}` : "EXP-?";
102
+ return `- ${numberPart}: ${summary}`;
103
+ }
104
+ const TODO_CHECKBOX_RE = /^-\s*\[x\]\s*/;
105
+ const TODO_ISS_LABEL_RE = /ISS-\d+:?\s*/;
106
+ function isTodoOnelinePassthrough(entry) {
107
+ return entry.kind === "oneline";
108
+ }
109
+ function stripTodoMetadata(header) {
110
+ let stripped = header.replace(TODO_CHECKBOX_RE, "");
111
+ stripped = stripped.replace(/~~/g, "").trim();
112
+ stripped = stripped.split(" · ")[0].trim();
113
+ stripped = stripped.replace(TODO_ISS_LABEL_RE, "").trim();
114
+ return stripped;
115
+ }
116
+ export function formatTodoOneline(entry) {
117
+ const header = String(entry.header).trim();
118
+ if (isTodoOnelinePassthrough(entry)) {
119
+ return header.startsWith("- ") ? header : `- ${header}`;
120
+ }
121
+ const summary = truncateWords(stripTodoMetadata(header) || "(resolved)", 15);
122
+ return `- [x] ${summary}`;
123
+ }
124
+ export const SPECS = {
125
+ progress: {
126
+ name: "progress",
127
+ entryHeadingRe: /^■?\s*##\s+Cycle\s+\d+/m,
128
+ onelineHeadingRe: /^-\s+Cycle\s+\d+/m,
129
+ archiveHeading: "## Archived Cycles",
130
+ formatOneline: formatProgressOneline,
131
+ scopedSection: null,
132
+ },
133
+ decisions: {
134
+ name: "decisions",
135
+ entryHeadingRe: /^##\s+Decision\s+\d+/m,
136
+ onelineHeadingRe: /^-\s+Decision\s+\d+/m,
137
+ archiveHeading: "## Archived Decisions",
138
+ formatOneline: formatDecisionOneline,
139
+ scopedSection: null,
140
+ },
141
+ health: {
142
+ name: "health",
143
+ entryHeadingRe: /^##\s+Audit\s+\d+/m,
144
+ onelineHeadingRe: /^###\s+Audit\s+\d+/m,
145
+ archiveHeading: "## Archived Audits",
146
+ formatOneline: formatHealthOneline,
147
+ scopedSection: null,
148
+ },
149
+ experiments: {
150
+ name: "experiments",
151
+ entryHeadingRe: /^##\s+Experiment\s+\d+/m,
152
+ onelineHeadingRe: /^-\s+EXP-\d+/m,
153
+ archiveHeading: "## Archived Experiments",
154
+ formatOneline: formatExperimentOneline,
155
+ scopedSection: null,
156
+ },
157
+ "todo-resolved": {
158
+ name: "todo-resolved",
159
+ entryHeadingRe: /^-\s+\[x\]\s+/m,
160
+ onelineHeadingRe: null,
161
+ archiveHeading: null,
162
+ formatOneline: formatTodoOneline,
163
+ scopedSection: "## ✓ Resolved",
164
+ },
165
+ };
166
+ export const COMPACTABLE_YAML_ARTIFACTS = {
167
+ progress: ["cycles", "archive"],
168
+ decisions: ["decisions", "archive"],
169
+ health: ["audits", "archive"],
170
+ experiments: ["experiments", "archive"],
171
+ };
172
+ export const YAML_SPEC_BY_ARTIFACT = {
173
+ progress: "progress",
174
+ decisions: "decisions",
175
+ health: "health",
176
+ experiments: "experiments",
177
+ };
178
+ export const NON_COMPACTABLE_ARTIFACTS = {
179
+ changelog: ["exempt", "public release history is not compacted"],
180
+ plan: ["unsupported", "active plan is lifecycle state, not a uniform retained-entry log"],
181
+ docs: ["unsupported", "docs owns artifact mapping and schema metadata"],
182
+ vision: ["protected", "vision state is protected during execution cycles"],
183
+ design: ["unsupported", "design is a human-facing identity artifact, not a uniform retained-entry log"],
184
+ };
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Public surface for the compaction engine.
3
+ *
4
+ * Re-exports the API consumed by `cli/commands/compact.ts` and the
5
+ * test suite. The actual implementation lives in the per-
6
+ * responsibility submodules:
7
+ *
8
+ * dryRun.ts one-line formatters and SPECS metadata
9
+ * retention.ts sort, select, and decision-satisfaction helpers
10
+ * parse.ts markdown entry parsing
11
+ * apply.ts writers (compactYamlFile, compactFile, detectOverflow)
12
+ * status.ts read-only status reporting (computeCompactionStatus,
13
+ * checkCompaction, fixCompaction, runCompaction)
14
+ */
15
+ import { applyRetentionCaps as _applyRetentionCaps } from "../common.js";
16
+ import { compactFile, compactYamlBytes, compactYamlFile, detectOverflow, compactEntries, } from "./apply.js";
17
+ import { checkCompaction, computeCompactionStatus, fixCompaction, runCompaction } from "./status.js";
18
+ import { parseEntries, parseFullEntries, parseOnelineEntries, splitArchive, extractResolvedSection, parseTodoResolved, countTodoResolvedEntries, countTodoResolvedSectionHeadings, countTodoPendingSummarization, normalizeTodoResolvedLayout, TODO_DROPPED_RECOVERY_GUIDANCE, } from "./parse.js";
19
+ import { SPECS, COMPACTABLE_YAML_ARTIFACTS, NON_COMPACTABLE_ARTIFACTS, YAML_SPEC_BY_ARTIFACT, formatTodoOneline } from "./dryRun.js";
20
+ import { overLimitCount, stableSortBy, yamlArchiveEntry, yamlArchiveEntries, yamlRecentFullAndOlder, yamlSortEntries, yamlEntryNumber, decisionProtectedOverflowCount, decisionRequiresUserReview, selectDecisionActiveEntries, selectDecisionArchiveEntries, } from "./retention.js";
21
+ export { compactFile, compactYamlBytes, compactYamlFile, detectOverflow, compactEntries, checkCompaction, computeCompactionStatus, fixCompaction, runCompaction, parseEntries, parseFullEntries, parseOnelineEntries, splitArchive, extractResolvedSection, parseTodoResolved, SPECS, COMPACTABLE_YAML_ARTIFACTS, NON_COMPACTABLE_ARTIFACTS, YAML_SPEC_BY_ARTIFACT, formatTodoOneline, countTodoResolvedEntries, countTodoResolvedSectionHeadings, countTodoPendingSummarization, TODO_DROPPED_RECOVERY_GUIDANCE, normalizeTodoResolvedLayout, overLimitCount, stableSortBy, yamlArchiveEntry, yamlArchiveEntries, yamlRecentFullAndOlder, yamlSortEntries, yamlEntryNumber, decisionProtectedOverflowCount, decisionRequiresUserReview, selectDecisionActiveEntries, selectDecisionArchiveEntries, };
22
+ void _applyRetentionCaps;