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