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.
- package/LICENSE +201 -0
- package/README.md +108 -22
- package/bundle/.agentera-npx-bundle.json +1 -1
- package/bundle/CHANGELOG.md +1351 -0
- package/bundle/DESIGN.md +229 -0
- package/bundle/LICENSE +201 -0
- package/bundle/README.md +143 -0
- package/bundle/UPGRADE.md +236 -0
- package/bundle/extract-corpus-parity.json +21 -0
- package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
- package/bundle/references/adapters/package-publication.json +437 -0
- package/bundle/references/adapters/package-registry.yaml +434 -189
- package/bundle/references/adapters/package-surface-characterization.md +66 -35
- package/bundle/references/adapters/runtime-lifecycle-adapters.yaml +74 -0
- package/bundle/references/adapters/runtime-lifecycle-authority.yaml +62 -0
- package/bundle/references/adapters/runtime-lifecycle-operation-contract.yaml +84 -0
- package/bundle/references/adapters/runtime-retired-resources.yaml +333 -0
- package/bundle/references/analysis/evidence-tier-authority.yaml +518 -0
- package/bundle/references/analysis/verification-policy.yaml +191 -0
- package/bundle/references/artifacts/artifact-registry-interface-model.yaml +20 -10
- package/bundle/references/artifacts/glossary-entry-contract.yaml +1254 -0
- package/bundle/references/artifacts/state-storage-authority.yaml +2982 -0
- package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
- package/bundle/references/cli/app-lifecycle-vocabulary.yaml +7 -8
- package/bundle/references/cli/capability-instruction-contract.yaml +97 -59
- package/bundle/references/cli/hybrid-route-contract.yaml +438 -0
- package/bundle/references/cli/routing-model.md +155 -0
- package/bundle/references/cli/trigger-schema-enrichment.md +147 -0
- package/bundle/references/cli/update-channels.yaml +35 -2
- package/bundle/references/cli/vocabulary-index.yaml +23 -20
- package/bundle/references/cli/vocabulary.md +337 -366
- package/bundle/references/meta/retained-reference-authority.yaml +151 -0
- package/bundle/registry.json +14 -14
- package/bundle/skills/agentera/SKILL.md +218 -408
- package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +84 -0
- package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/exit.yaml +2 -2
- package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +25 -0
- package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/validation.yaml +37 -18
- package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +102 -0
- package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/exit.yaml +6 -5
- package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +27 -0
- package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +176 -0
- package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/artifacts.yaml +12 -12
- package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/exit.yaml +5 -5
- package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +16 -0
- package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/validation.yaml +7 -7
- package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +51 -0
- package/bundle/skills/agentera/capabilities/{resonera → discuss}/schemas/exit.yaml +2 -2
- package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +20 -0
- package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +144 -0
- package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +80 -0
- package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +16 -0
- package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/validation.yaml +18 -18
- package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/artifacts.yaml +18 -18
- package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/exit.yaml +2 -2
- package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +16 -0
- package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/validation.yaml +9 -9
- package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +76 -0
- package/bundle/skills/agentera/capabilities/{orkestrera → orchestrate}/schemas/exit.yaml +9 -7
- package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +23 -0
- package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +121 -0
- package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +66 -0
- package/bundle/skills/agentera/capabilities/{planera → plan}/schemas/exit.yaml +2 -2
- package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +23 -0
- package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +121 -0
- package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +23 -0
- package/bundle/skills/agentera/capabilities/{profilera → profile}/schemas/exit.yaml +6 -5
- package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +20 -0
- package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +115 -0
- package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +24 -0
- package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +16 -0
- package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/validation.yaml +2 -2
- package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +73 -0
- package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +22 -0
- package/bundle/skills/agentera/capabilities/{hej → status}/schemas/validation.yaml +5 -5
- package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/artifacts.yaml +16 -16
- package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/exit.yaml +7 -6
- package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +23 -0
- package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/validation.yaml +18 -20
- package/bundle/skills/agentera/capability_schema_contract.yaml +200 -37
- package/bundle/skills/agentera/protocol.yaml +31 -31
- package/bundle/skills/agentera/route-phrases.yaml +81 -0
- package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +5 -4
- package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +40 -22
- package/bundle/skills/agentera/schemas/artifacts/design.yaml +5 -4
- package/bundle/skills/agentera/schemas/artifacts/docs.yaml +15 -19
- package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +145 -14
- package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +82 -0
- package/bundle/skills/agentera/schemas/artifacts/health.yaml +58 -21
- package/bundle/skills/agentera/schemas/artifacts/objective.yaml +22 -8
- package/bundle/skills/agentera/schemas/artifacts/plan.yaml +421 -33
- package/bundle/skills/agentera/schemas/artifacts/progress.yaml +143 -53
- package/bundle/skills/agentera/schemas/artifacts/todo.yaml +345 -31
- package/bundle/skills/agentera/schemas/artifacts/vision.yaml +3 -3
- package/dist/analytics/extractCorpus/cli.js +190 -0
- package/dist/analytics/extractCorpus/copilotSessions.js +275 -0
- package/dist/analytics/extractCorpus/core.js +392 -0
- package/dist/analytics/extractCorpus/corpus.js +167 -0
- package/dist/analytics/extractCorpus/coverageAudit.js +260 -0
- package/dist/analytics/extractCorpus/cursorSessions.js +425 -0
- package/dist/analytics/extractCorpus/evidenceTiers.js +603 -0
- package/dist/analytics/extractCorpus/extractCorpusParity.js +105 -0
- package/dist/analytics/extractCorpus/filesystemSources.js +118 -0
- package/dist/analytics/extractCorpus/index.js +14 -0
- package/dist/analytics/extractCorpus/jsonlSessions.js +204 -0
- package/dist/analytics/extractCorpus/sqliteCaps.js +43 -0
- package/dist/analytics/extractCorpus/sqliteSessions.js +367 -0
- package/dist/analytics/extractCorpus/tierReader.js +108 -0
- package/dist/analytics/extractCorpus.js +2 -1791
- package/dist/analytics/glossaryAdviceResolution.js +166 -0
- package/dist/analytics/glossaryInputAcquisition.js +319 -0
- package/dist/analytics/personalGlossaryAdmission.js +133 -0
- package/dist/analytics/personalGlossaryProfile.js +219 -0
- package/dist/analytics/profileSignals.js +211 -0
- package/dist/analytics/usageStats.js +169 -42
- package/dist/audit/terminologyDrift.js +281 -0
- package/dist/bin/agentera.js +3 -2
- package/dist/capabilities/audit/instructions.js +16 -0
- package/dist/capabilities/build/instructions.js +56 -0
- package/dist/capabilities/design/instructions.js +4 -0
- package/dist/capabilities/discuss/instructions.js +29 -0
- package/dist/capabilities/document/instructions.js +11 -0
- package/dist/capabilities/index.js +40 -0
- package/dist/capabilities/optimize/instructions.js +14 -0
- package/dist/capabilities/orchestrate/instructions.js +40 -0
- package/dist/capabilities/plan/instructions.js +32 -0
- package/dist/capabilities/profile/instructions.js +70 -0
- package/dist/capabilities/research/instructions.js +5 -0
- package/dist/capabilities/status/instructions.js +11 -0
- package/dist/capabilities/status/startupInstructions.js +34 -0
- package/dist/capabilities/vision/instructions.js +4 -0
- package/dist/cli/appContext.js +30 -24
- package/dist/cli/argvalidate.js +0 -1
- package/dist/cli/capabilityContext/benchmark.js +565 -0
- package/dist/cli/capabilityContext/bespoke.js +44 -0
- package/dist/cli/capabilityContext/build.js +242 -0
- package/dist/cli/capabilityContext/closeout.js +233 -0
- package/dist/cli/capabilityContext/contract.js +179 -0
- package/dist/cli/capabilityContext/evidence.js +463 -0
- package/dist/cli/capabilityContext/index.js +3 -0
- package/dist/cli/capabilityContext/orchestration.js +131 -0
- package/dist/cli/capabilityContext/planState.js +260 -0
- package/dist/cli/capabilityContext/progress.js +142 -0
- package/dist/cli/capabilityContext/projectVerification.js +409 -0
- package/dist/cli/capabilityContext/shared.js +83 -0
- package/dist/cli/capabilityContext/slim.js +152 -0
- package/dist/cli/capabilityContext/startup.js +150 -0
- package/dist/cli/capabilityContext/startupAggregation.js +68 -0
- package/dist/cli/capabilityContext/types.js +56 -0
- package/dist/cli/capabilityContext.js +1 -2421
- package/dist/cli/commands/appHome.js +22 -0
- package/dist/cli/commands/capability.js +5 -12
- package/dist/cli/commands/compact.js +41 -13
- package/dist/cli/commands/doctor.js +127 -97
- package/dist/cli/commands/durability.js +81 -0
- package/dist/cli/commands/glossaryAdvice.js +138 -0
- package/dist/cli/commands/lint.js +26 -44
- package/dist/cli/commands/personalGlossary.js +176 -0
- package/dist/cli/commands/prime/briefOrientation.js +747 -0
- package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
- package/dist/cli/commands/prime/bundleStatus.js +190 -0
- package/dist/cli/commands/prime/collectEntityOrientation.js +311 -0
- package/dist/cli/commands/prime/collectOrientationState.js +212 -0
- package/dist/cli/commands/prime/orientationOutput.js +397 -0
- package/dist/cli/commands/prime/types.js +1 -0
- package/dist/cli/commands/prime/v1Migration.js +38 -0
- package/dist/cli/commands/prime.js +80 -558
- package/dist/cli/commands/profileGrounding.js +55 -0
- package/dist/cli/commands/query.js +78 -53
- package/dist/cli/commands/report.js +96 -25
- package/dist/cli/commands/route.js +142 -0
- package/dist/cli/commands/schema.js +266 -143
- package/dist/cli/commands/state/decisions.js +387 -0
- package/dist/cli/commands/state/docs.js +70 -0
- package/dist/cli/commands/state/experimentRecords.js +151 -0
- package/dist/cli/commands/state/experiments.js +14 -0
- package/dist/cli/commands/state/get.js +129 -0
- package/dist/cli/commands/state/health.js +14 -0
- package/dist/cli/commands/state/index.js +16 -0
- package/dist/cli/commands/state/list.js +194 -0
- package/dist/cli/commands/state/objective.js +25 -0
- package/dist/cli/commands/state/plan.js +14 -0
- package/dist/cli/commands/state/planTasks.js +154 -0
- package/dist/cli/commands/state/plans.js +154 -0
- package/dist/cli/commands/state/progress.js +13 -0
- package/dist/cli/commands/state/shared.js +14 -0
- package/dist/cli/commands/state/todo.js +42 -0
- package/dist/cli/commands/state/write.js +434 -0
- package/dist/cli/commands/upgrade.js +146 -5
- package/dist/cli/commands/upgradeVerify.js +118 -0
- package/dist/cli/commands/validate.js +272 -213
- package/dist/cli/commands/verify.js +24 -9
- package/dist/cli/contracts/bundleStatus.js +1 -0
- package/dist/cli/contracts/orientationState.js +1 -0
- package/dist/cli/dispatch/argvParser.js +32 -0
- package/dist/cli/dispatch/check.js +372 -0
- package/dist/cli/dispatch/commands.js +27 -0
- package/dist/cli/dispatch/index.js +207 -0
- package/dist/cli/dispatch/lifecycle.js +652 -0
- package/dist/cli/dispatch/prime.js +139 -0
- package/dist/cli/dispatch/projections.js +17 -0
- package/dist/cli/dispatch/shared.js +63 -0
- package/dist/cli/dispatch/state.js +140 -0
- package/dist/cli/dispatch.js +1 -996
- package/dist/cli/errors.js +52 -0
- package/dist/cli/help.js +390 -43
- package/dist/cli/migrationRequired.js +87 -0
- package/dist/cli/orientation/attention.js +59 -0
- package/dist/cli/orientation/corpusCoverage.js +102 -0
- package/dist/cli/orientation.js +444 -173
- package/dist/cli/planArtifacts.js +350 -0
- package/dist/cli/planEvidence.js +157 -0
- package/dist/cli/planLifecycleState.js +36 -0
- package/dist/cli/planTaskIndex.js +11 -0
- package/dist/cli/preCutoverCommand.js +32 -0
- package/dist/cli/prime-blob.js +71 -3
- package/dist/cli/profileAcquisition.js +167 -0
- package/dist/cli/startupCompletenessContract.js +59 -0
- package/dist/cli/stateQuery.js +63 -14
- package/dist/cli/structured.js +0 -1
- package/dist/cli/todoMarkdown.js +46 -0
- package/dist/cli/todoReadinessSelection.js +192 -0
- package/dist/cli/todoSeverity.js +18 -0
- package/dist/core/atomicWriter.js +20 -0
- package/dist/core/developmentChannel.js +1 -0
- package/dist/core/developmentInvocation.js +374 -0
- package/dist/core/difflib.js +0 -1
- package/dist/core/envPaths.js +20 -0
- package/dist/core/jsonValue.js +5 -0
- package/dist/core/paths.js +0 -1
- package/dist/core/pyjson.js +67 -3
- package/dist/core/shell.js +4 -0
- package/dist/core/skillIdentity.js +23 -0
- package/dist/core/sourceRoot.js +9 -12
- package/dist/core/text.js +10 -0
- package/dist/core/toml.js +0 -1
- package/dist/core/yaml.js +8 -1
- package/dist/eval/evalSkills.js +30 -26
- package/dist/eval/hybridRouteEvaluation.js +155 -0
- package/dist/eval/semanticEval.js +43 -20
- package/dist/eval/semanticFixtures.js +16 -5
- package/dist/hooks/common.js +11 -81
- package/dist/hooks/compaction/apply.js +446 -0
- package/dist/hooks/compaction/dryRun.js +184 -0
- package/dist/hooks/compaction/index.js +22 -0
- package/dist/hooks/compaction/parse.js +325 -0
- package/dist/hooks/compaction/retention.js +202 -0
- package/dist/hooks/compaction/status.js +360 -0
- package/dist/hooks/compaction/types.js +5 -0
- package/dist/hooks/validateArtifact/agentFacing.js +9 -0
- package/dist/hooks/validateArtifact/index.js +92 -0
- package/dist/hooks/validateArtifact/markdown.js +145 -0
- package/dist/hooks/validateArtifact/schema.js +546 -0
- package/dist/hooks/validateArtifact/traversal.js +107 -0
- package/dist/hooks/validateArtifact/violations.js +107 -0
- package/dist/migrate/v2HandoffManifest.js +452 -0
- package/dist/registries/activationContract.js +2 -0
- package/dist/registries/activationTuples.js +106 -0
- package/dist/registries/artifactProtocolIds.js +78 -0
- package/dist/registries/artifactRegistry.js +224 -63
- package/dist/registries/artifactSchemaProjection.js +45 -0
- package/dist/registries/capabilityContract.js +141 -13
- package/dist/registries/evaluatorHandoffContract.js +170 -0
- package/dist/registries/evidenceTierContract.js +371 -0
- package/dist/registries/glossaryAdviceContract.js +79 -0
- package/dist/registries/glossaryCaveatContract.js +67 -0
- package/dist/registries/glossaryConsumerContractValidation.js +787 -0
- package/dist/registries/glossaryEntryContract.js +757 -0
- package/dist/registries/glossaryTermIdentity.js +17 -0
- package/dist/registries/glossaryTermOccurrence.js +20 -0
- package/dist/registries/hybridRoute.js +274 -0
- package/dist/registries/hybridRouteReceipt.js +221 -0
- package/dist/registries/packagePublication.js +229 -0
- package/dist/registries/packageRegistry.js +187 -211
- package/dist/registries/todoReadinessContract.js +448 -0
- package/dist/registries/triggerLoader.js +174 -0
- package/dist/registries/verbosityBudgetContract.js +205 -0
- package/dist/release/releaseMetadata.js +385 -0
- package/dist/runtime/lifecycleAdapterContract.js +457 -0
- package/dist/runtime/lifecycleAdapters.js +777 -0
- package/dist/runtime/lifecycleAuthority.js +453 -0
- package/dist/runtime/lifecycleOperationContract.js +123 -0
- package/dist/runtime/lifecycleOperations.js +634 -0
- package/dist/runtime/lifecycleOwnershipJournal.js +622 -0
- package/dist/runtime/lifecyclePublication.js +415 -0
- package/dist/runtime/lifecycleSnapshot.js +438 -0
- package/dist/runtime/nativeResourceCleanup.js +502 -0
- package/dist/setup/opencode.js +20 -0
- package/dist/setup/opencodeConstants.js +1 -0
- package/dist/setup/sharedSkill.js +45 -0
- package/dist/setup/smokeChecks.js +21 -82
- package/dist/state/archiveDiscovery.js +580 -0
- package/dist/state/archivePublication.js +225 -0
- package/dist/state/archiveRecovery.js +237 -0
- package/dist/state/archiveReplay.js +53 -0
- package/dist/state/canonicalMigrationRecord.js +36 -0
- package/dist/state/changelog.js +221 -0
- package/dist/state/decisionEntities.js +367 -0
- package/dist/state/decisionLegacyValidation.js +215 -0
- package/dist/state/decisionMigrationProvenance.js +199 -0
- package/dist/state/decisionOverlay.js +254 -0
- package/dist/state/decisionRevision.js +256 -0
- package/dist/state/decisionRevisionMigration.js +89 -0
- package/dist/state/directRetrieval.js +323 -0
- package/dist/state/durability.js +324 -0
- package/dist/state/entityCutover.js +459 -0
- package/dist/state/entityCutoverGit.js +127 -0
- package/dist/state/entityGlossaryAuthority.js +13 -0
- package/dist/state/entityListProjection.js +187 -0
- package/dist/state/entityListRuntimeRegistry.js +85 -0
- package/dist/state/entityMigrationCausality.js +97 -0
- package/dist/state/entityMigrationIdentity.js +5 -0
- package/dist/state/entityMigrationPreview.js +846 -0
- package/dist/state/entityMigrationTodo.js +133 -0
- package/dist/state/entityPublicationContext.js +806 -0
- package/dist/state/entityRetrievalHelp.js +506 -0
- package/dist/state/entityStorage.js +896 -0
- package/dist/state/exactReplacementRecovery.js +18 -0
- package/dist/state/experimentArchive.js +63 -0
- package/dist/state/experimentIdentity.js +202 -0
- package/dist/state/healthEntities.js +262 -0
- package/dist/state/healthEntityValidation.js +18 -0
- package/dist/state/healthRepair.js +69 -0
- package/dist/state/installRoot.js +64 -25
- package/dist/state/legacyEntityCutoverEvidence.js +65 -0
- package/dist/state/legacyIdentity.js +47 -0
- package/dist/state/legacySummaryRecord.js +6 -0
- package/dist/state/listAccounting.js +54 -0
- package/dist/state/listClassification.js +17 -0
- package/dist/state/listCursor.js +42 -0
- package/dist/state/listRetrieval.js +781 -0
- package/dist/state/migrationSourceBinding.js +30 -0
- package/dist/state/objectiveExperimentEntities.js +322 -0
- package/dist/state/planEntities.js +530 -0
- package/dist/state/planIdentity.js +47 -0
- package/dist/state/planRetrieval.js +313 -0
- package/dist/state/planTaskRetrieval.js +294 -0
- package/dist/state/progressEntities.js +512 -0
- package/dist/state/progressGlossaryCaveat.js +168 -0
- package/dist/state/progressPublicationOrder.js +19 -0
- package/dist/state/projectRoot.js +62 -0
- package/dist/state/projectionPolicy.js +190 -0
- package/dist/state/retrievalAuthority.js +156 -0
- package/dist/state/safeProjectFile.js +155 -0
- package/dist/state/startupAnalysis/benchmark.js +432 -0
- package/dist/state/startupAnalysis/contract.js +160 -0
- package/dist/state/startupAnalysis/helpers.js +286 -0
- package/dist/state/startupAnalysis/index.js +6 -0
- package/dist/state/startupAnalysis/metrics.js +340 -0
- package/dist/state/startupAnalysis/records.js +198 -0
- package/dist/state/startupAnalysis/report.js +111 -0
- package/dist/state/startupAnalysis/threshold.js +512 -0
- package/dist/state/startupAnalysis.js +2 -1953
- package/dist/state/startupProjection.js +499 -0
- package/dist/state/stateMode.js +85 -0
- package/dist/state/stateStorageAuthority.js +47 -0
- package/dist/state/summaryEntityRead.js +25 -0
- package/dist/state/summaryMigrationProvenance.js +66 -0
- package/dist/state/summarySourceRowAuthority.js +36 -0
- package/dist/state/todoDocsEntities.js +1064 -0
- package/dist/state/todoDocsEntityValidation.js +158 -0
- package/dist/state/todoMarkdownProjection.js +51 -0
- package/dist/state/todoReconciliationActivation.js +132 -0
- package/dist/state/todoReconciliationInspection.js +173 -0
- package/dist/state/todoReconciliationRepair.js +170 -0
- package/dist/state/todoReconciliationTransaction.js +582 -0
- package/dist/state/write/assign.js +20 -0
- package/dist/state/write/candidateMutation.js +269 -0
- package/dist/state/write/errors.js +11 -0
- package/dist/state/write/experimentPublication.js +192 -0
- package/dist/state/write/explain.js +332 -0
- package/dist/state/write/fields.js +61 -0
- package/dist/state/write/glossaryPublication.js +263 -0
- package/dist/state/write/grammar.js +280 -0
- package/dist/state/write/helpers.js +29 -0
- package/dist/state/write/index.js +12 -0
- package/dist/state/write/input.js +367 -0
- package/dist/state/write/lock.js +837 -0
- package/dist/state/write/mutation.js +234 -0
- package/dist/state/write/operations.js +169 -0
- package/dist/state/write/planEvaluation.js +128 -0
- package/dist/state/write/planPublication.js +179 -0
- package/dist/state/write/runtimeOperations.js +142 -0
- package/dist/state/write/serialize.js +1 -0
- package/dist/state/write/transaction.js +52 -0
- package/dist/state/write/validate.js +7 -0
- package/dist/upgrade/appContentRefresh.js +383 -0
- package/dist/upgrade/appModel.js +8 -7
- package/dist/upgrade/atomicWriter.js +1 -0
- package/dist/upgrade/bundleEvidence.js +33 -0
- package/dist/upgrade/channels.js +12 -8
- package/dist/upgrade/compatibility.js +56 -21
- package/dist/upgrade/doctor.js +197 -192
- package/dist/upgrade/doctorClassifier.js +187 -0
- package/dist/upgrade/installedHooksRetirement.js +196 -0
- package/dist/upgrade/legacyAgentCleanup.js +282 -0
- package/dist/upgrade/lifecycleUpgrade.js +113 -0
- package/dist/upgrade/migrateArtifactsV2ToV3.js +367 -149
- package/dist/upgrade/migrationPublication.js +122 -0
- package/dist/upgrade/nextMajorDoctor.js +155 -0
- package/dist/upgrade/npxPlatformStatus.js +22 -0
- package/dist/upgrade/projectIntegration.js +145 -187
- package/dist/upgrade/projectIntegrationDecision.js +50 -0
- package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
- package/dist/upgrade/runtimeMigration.js +278 -352
- package/dist/upgrade/upgradeCommands.js +14 -1
- package/dist/upgrade/upgradeLock.js +85 -0
- package/dist/upgrade/upgradeOrchestrator.js +263 -59
- package/dist/upgrade/v3CapabilitySurface.js +14 -0
- package/dist/upgrade/versionResolution.js +12 -5
- package/dist/validate/activationArtifactEvidence.js +844 -0
- package/dist/validate/activationConjunction.js +816 -0
- package/dist/validate/activationEvidenceManifest.js +515 -0
- package/dist/validate/activationPackageSemantics.js +29 -0
- package/dist/validate/appHomeContract.js +5 -11
- package/dist/validate/bootstrapAuthority.js +44 -0
- package/dist/validate/capability.js +144 -15
- package/dist/validate/crossCapability.js +15 -10
- package/dist/validate/retainedReferenceAuthority.js +879 -0
- package/dist/validate/selfAudit.js +73 -37
- package/dist/validate/v1LegacyCruft.js +131 -0
- package/dist/validate/vocabularyAuthority.js +303 -0
- package/package.json +53 -27
- package/bundle/references/adapters/cursor.md +0 -213
- package/bundle/references/adapters/opencode.md +0 -530
- package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
- package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
- package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
- package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -548
- package/bundle/references/adapters/runtime-feature-parity.md +0 -189
- package/bundle/references/analysis/benchmark.md +0 -267
- package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
- package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
- package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -355
- package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -278
- package/bundle/references/cli/capability-tool-classification.yaml +0 -53
- package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
- package/bundle/references/meta/documentation-inventory.md +0 -43
- package/bundle/references/v1-section-mapping.md +0 -47
- package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
- package/bundle/skills/agentera/agents/dokumentera.toml +0 -6
- package/bundle/skills/agentera/agents/hej.toml +0 -6
- package/bundle/skills/agentera/agents/inspektera.toml +0 -6
- package/bundle/skills/agentera/agents/inspirera.toml +0 -6
- package/bundle/skills/agentera/agents/optimera.toml +0 -6
- package/bundle/skills/agentera/agents/orkestrera.toml +0 -6
- package/bundle/skills/agentera/agents/planera.toml +0 -6
- package/bundle/skills/agentera/agents/profilera.toml +0 -6
- package/bundle/skills/agentera/agents/realisera.toml +0 -6
- package/bundle/skills/agentera/agents/resonera.toml +0 -6
- package/bundle/skills/agentera/agents/visionera.toml +0 -6
- package/bundle/skills/agentera/agents/visualisera.toml +0 -6
- package/bundle/skills/agentera/capabilities/dokumentera/instructions.md +0 -428
- package/bundle/skills/agentera/capabilities/dokumentera/schemas/artifacts.yaml +0 -73
- package/bundle/skills/agentera/capabilities/dokumentera/schemas/triggers.yaml +0 -35
- package/bundle/skills/agentera/capabilities/hej/instructions.md +0 -331
- package/bundle/skills/agentera/capabilities/hej/schemas/artifacts.yaml +0 -69
- package/bundle/skills/agentera/capabilities/hej/schemas/triggers.yaml +0 -58
- package/bundle/skills/agentera/capabilities/inspektera/instructions.md +0 -514
- package/bundle/skills/agentera/capabilities/inspektera/schemas/artifacts.yaml +0 -76
- package/bundle/skills/agentera/capabilities/inspektera/schemas/triggers.yaml +0 -38
- package/bundle/skills/agentera/capabilities/inspirera/instructions.md +0 -280
- package/bundle/skills/agentera/capabilities/inspirera/schemas/artifacts.yaml +0 -24
- package/bundle/skills/agentera/capabilities/inspirera/schemas/triggers.yaml +0 -34
- package/bundle/skills/agentera/capabilities/optimera/instructions.md +0 -437
- package/bundle/skills/agentera/capabilities/optimera/schemas/triggers.yaml +0 -39
- package/bundle/skills/agentera/capabilities/orkestrera/instructions.md +0 -433
- package/bundle/skills/agentera/capabilities/orkestrera/schemas/artifacts.yaml +0 -64
- package/bundle/skills/agentera/capabilities/orkestrera/schemas/triggers.yaml +0 -42
- package/bundle/skills/agentera/capabilities/orkestrera/schemas/validation.yaml +0 -107
- package/bundle/skills/agentera/capabilities/planera/instructions.md +0 -368
- package/bundle/skills/agentera/capabilities/planera/schemas/artifacts.yaml +0 -62
- package/bundle/skills/agentera/capabilities/planera/schemas/triggers.yaml +0 -34
- package/bundle/skills/agentera/capabilities/planera/schemas/validation.yaml +0 -61
- package/bundle/skills/agentera/capabilities/profilera/instructions.md +0 -419
- package/bundle/skills/agentera/capabilities/profilera/schemas/artifacts.yaml +0 -18
- package/bundle/skills/agentera/capabilities/profilera/schemas/triggers.yaml +0 -45
- package/bundle/skills/agentera/capabilities/profilera/schemas/validation.yaml +0 -57
- package/bundle/skills/agentera/capabilities/realisera/instructions.md +0 -403
- package/bundle/skills/agentera/capabilities/realisera/schemas/artifacts.yaml +0 -80
- package/bundle/skills/agentera/capabilities/realisera/schemas/triggers.yaml +0 -39
- package/bundle/skills/agentera/capabilities/realisera/schemas/validation.yaml +0 -110
- package/bundle/skills/agentera/capabilities/resonera/instructions.md +0 -329
- package/bundle/skills/agentera/capabilities/resonera/schemas/artifacts.yaml +0 -47
- package/bundle/skills/agentera/capabilities/resonera/schemas/triggers.yaml +0 -46
- package/bundle/skills/agentera/capabilities/resonera/schemas/validation.yaml +0 -77
- package/bundle/skills/agentera/capabilities/visionera/instructions.md +0 -309
- package/bundle/skills/agentera/capabilities/visionera/schemas/triggers.yaml +0 -41
- package/bundle/skills/agentera/capabilities/visualisera/instructions.md +0 -400
- package/bundle/skills/agentera/capabilities/visualisera/schemas/triggers.yaml +0 -33
- package/bundle/skills/agentera/references/contract.md +0 -1039
- package/bundle/skills/hej/.claude-plugin/plugin.json +0 -6
- package/bundle/skills/hej/SKILL.md +0 -69
- package/bundle/skills/hej/agents/hej.toml +0 -11
- package/bundle/skills/hej/agents/openai.yaml +0 -8
- package/dist/analytics/extractCorpus.js.map +0 -1
- package/dist/analytics/usageStats.js.map +0 -1
- package/dist/bin/agentera.js.map +0 -1
- package/dist/cli/appContext.js.map +0 -1
- package/dist/cli/argvalidate.js.map +0 -1
- package/dist/cli/capabilityContext.js.map +0 -1
- package/dist/cli/commands/backfill.js +0 -84
- package/dist/cli/commands/backfill.js.map +0 -1
- package/dist/cli/commands/capability.js.map +0 -1
- package/dist/cli/commands/compact.js.map +0 -1
- package/dist/cli/commands/doctor.js.map +0 -1
- package/dist/cli/commands/lint.js.map +0 -1
- package/dist/cli/commands/prime.js.map +0 -1
- package/dist/cli/commands/query.js.map +0 -1
- package/dist/cli/commands/report.js.map +0 -1
- package/dist/cli/commands/schema.js.map +0 -1
- package/dist/cli/commands/state.js +0 -1012
- package/dist/cli/commands/state.js.map +0 -1
- package/dist/cli/commands/upgrade.js.map +0 -1
- package/dist/cli/commands/validate.js.map +0 -1
- package/dist/cli/commands/verify.js.map +0 -1
- package/dist/cli/dispatch.js.map +0 -1
- package/dist/cli/help.js.map +0 -1
- package/dist/cli/orientation.js.map +0 -1
- package/dist/cli/prime-blob.js.map +0 -1
- package/dist/cli/stateQuery.js.map +0 -1
- package/dist/cli/structured.js.map +0 -1
- package/dist/core/difflib.js.map +0 -1
- package/dist/core/git.js +0 -43
- package/dist/core/git.js.map +0 -1
- package/dist/core/paths.js.map +0 -1
- package/dist/core/pyjson.js.map +0 -1
- package/dist/core/sourceRoot.js.map +0 -1
- package/dist/core/toml.js.map +0 -1
- package/dist/core/yaml.js.map +0 -1
- package/dist/eval/evalSkills.js.map +0 -1
- package/dist/eval/semanticEval.js.map +0 -1
- package/dist/eval/semanticFixtures.js.map +0 -1
- package/dist/hooks/common.js.map +0 -1
- package/dist/hooks/compaction.js +0 -935
- package/dist/hooks/compaction.js.map +0 -1
- package/dist/hooks/cursorPreToolUse.js +0 -19
- package/dist/hooks/cursorPreToolUse.js.map +0 -1
- package/dist/hooks/cursorSessionStart.js +0 -71
- package/dist/hooks/cursorSessionStart.js.map +0 -1
- package/dist/hooks/sessionStart.js +0 -209
- package/dist/hooks/sessionStart.js.map +0 -1
- package/dist/hooks/sessionStop.js +0 -212
- package/dist/hooks/sessionStop.js.map +0 -1
- package/dist/hooks/validateArtifact.js +0 -933
- package/dist/hooks/validateArtifact.js.map +0 -1
- package/dist/registries/artifactRegistry.js.map +0 -1
- package/dist/registries/capabilityContract.js.map +0 -1
- package/dist/registries/packageRegistry.js.map +0 -1
- package/dist/registries/runtimeAdapterRegistry.js +0 -315
- package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
- package/dist/setup/codex.js +0 -1056
- package/dist/setup/codex.js.map +0 -1
- package/dist/setup/copilot.js +0 -227
- package/dist/setup/copilot.js.map +0 -1
- package/dist/setup/cursor.js +0 -127
- package/dist/setup/cursor.js.map +0 -1
- package/dist/setup/doctor.js +0 -1297
- package/dist/setup/doctor.js.map +0 -1
- package/dist/setup/smokeChecks.js.map +0 -1
- package/dist/state/installRoot.js.map +0 -1
- package/dist/state/progressCommit.js +0 -289
- package/dist/state/progressCommit.js.map +0 -1
- package/dist/state/startupAnalysis.js.map +0 -1
- package/dist/upgrade/appModel.js.map +0 -1
- package/dist/upgrade/channels.js.map +0 -1
- package/dist/upgrade/compatibility.js.map +0 -1
- package/dist/upgrade/doctor.js.map +0 -1
- package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -571
- package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
- package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
- package/dist/upgrade/projectIntegration.js.map +0 -1
- package/dist/upgrade/runtimeMigration.js.map +0 -1
- package/dist/upgrade/upgradeCommands.js.map +0 -1
- package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
- package/dist/upgrade/versionResolution.js.map +0 -1
- package/dist/validate/appHomeContract.js.map +0 -1
- package/dist/validate/capability.js.map +0 -1
- package/dist/validate/crossCapability.js.map +0 -1
- package/dist/validate/lifecycleAdapters.js +0 -772
- package/dist/validate/lifecycleAdapters.js.map +0 -1
- package/dist/validate/selfAudit.js.map +0 -1
- /package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/exit.yaml +0 -0
- /package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/exit.yaml +0 -0
- /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;
|