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,167 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import { TextDecoder } from "node:util";
|
|
3
|
+
import { personalProfileGrounding, PersonalGlossaryBoundaryError, } from "../analytics/personalGlossaryProfile.js";
|
|
4
|
+
import { personalProfileGroundingContract } from "../registries/glossaryEntryContract.js";
|
|
5
|
+
import { discoverSchemasDir } from "./appContext.js";
|
|
6
|
+
import { parseProfileHeaderDates, registryArtifactPath } from "./orientation.js";
|
|
7
|
+
const DEFAULT_STALE_DAYS = 7;
|
|
8
|
+
const STALE_DAYS_ENV = "AGENTERA_PROFILE_MAX_AGE_DAYS";
|
|
9
|
+
function errorCode(error) {
|
|
10
|
+
return typeof error === "object" && error !== null && "code" in error
|
|
11
|
+
? String(error.code)
|
|
12
|
+
: undefined;
|
|
13
|
+
}
|
|
14
|
+
function sameIdentity(left, right) {
|
|
15
|
+
return left.dev === right.dev && left.ino === right.ino && left.mode === right.mode;
|
|
16
|
+
}
|
|
17
|
+
function sameSnapshot(left, right) {
|
|
18
|
+
return sameIdentity(left, right)
|
|
19
|
+
&& left.size === right.size
|
|
20
|
+
&& left.mtimeNs === right.mtimeNs
|
|
21
|
+
&& left.ctimeNs === right.ctimeNs;
|
|
22
|
+
}
|
|
23
|
+
/** Read one path without following a final symlink and reject source changes. */
|
|
24
|
+
export function readProfileSourceSafely(profilePath, maxBytes, hooks = {}) {
|
|
25
|
+
let pathSnapshot;
|
|
26
|
+
try {
|
|
27
|
+
pathSnapshot = fs.lstatSync(profilePath, { bigint: true });
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
return { status: errorCode(error) === "ENOENT" ? "absent" : "unreadable" };
|
|
31
|
+
}
|
|
32
|
+
if (!pathSnapshot.isFile() || pathSnapshot.isSymbolicLink())
|
|
33
|
+
return { status: "unsafe" };
|
|
34
|
+
hooks.afterPathSnapshot?.();
|
|
35
|
+
let fd;
|
|
36
|
+
try {
|
|
37
|
+
const noFollow = hooks.noFollowFlag ?? (fs.constants.O_NOFOLLOW ?? 0);
|
|
38
|
+
fd = fs.openSync(profilePath, fs.constants.O_RDONLY | noFollow);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
return { status: errorCode(error) === "ELOOP" ? "unsafe" : "unreadable" };
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const opened = fs.fstatSync(fd, { bigint: true });
|
|
45
|
+
if (!opened.isFile() || !sameIdentity(pathSnapshot, opened))
|
|
46
|
+
return { status: "unsafe" };
|
|
47
|
+
if (opened.size > BigInt(maxBytes))
|
|
48
|
+
return { status: "oversized" };
|
|
49
|
+
hooks.afterOpen?.();
|
|
50
|
+
const bytes = Buffer.alloc(maxBytes + 1);
|
|
51
|
+
let offset = 0;
|
|
52
|
+
while (offset < bytes.length) {
|
|
53
|
+
const read = fs.readSync(fd, bytes, offset, bytes.length - offset, offset);
|
|
54
|
+
if (read === 0)
|
|
55
|
+
break;
|
|
56
|
+
offset += read;
|
|
57
|
+
}
|
|
58
|
+
hooks.afterRead?.();
|
|
59
|
+
const afterRead = fs.fstatSync(fd, { bigint: true });
|
|
60
|
+
let currentPath;
|
|
61
|
+
try {
|
|
62
|
+
currentPath = fs.lstatSync(profilePath, { bigint: true });
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return { status: "unsafe" };
|
|
66
|
+
}
|
|
67
|
+
if (!sameSnapshot(opened, afterRead) || !sameSnapshot(afterRead, currentPath)) {
|
|
68
|
+
return { status: "unsafe" };
|
|
69
|
+
}
|
|
70
|
+
if (offset > maxBytes)
|
|
71
|
+
return { status: "oversized" };
|
|
72
|
+
return { status: "ok", bytes: bytes.subarray(0, offset) };
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return { status: "unreadable" };
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
try {
|
|
79
|
+
fs.closeSync(fd);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// The acquisition already has a bounded result; close diagnostics are private.
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function staleThreshold(env) {
|
|
87
|
+
const parsed = Number.parseInt(env[STALE_DAYS_ENV] ?? String(DEFAULT_STALE_DAYS), 10);
|
|
88
|
+
return Number.isNaN(parsed) || parsed < 0 ? DEFAULT_STALE_DAYS : parsed;
|
|
89
|
+
}
|
|
90
|
+
function unknownFreshness(env) {
|
|
91
|
+
return {
|
|
92
|
+
state: "unknown",
|
|
93
|
+
days_since_generated: null,
|
|
94
|
+
stale_threshold_days: staleThreshold(env),
|
|
95
|
+
generated_date: null,
|
|
96
|
+
validated_date: null,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function freshness(text, env) {
|
|
100
|
+
const dates = parseProfileHeaderDates(text);
|
|
101
|
+
const anchor = dates.generatedUtc === null
|
|
102
|
+
? dates.validatedUtc
|
|
103
|
+
: dates.validatedUtc === null
|
|
104
|
+
? dates.generatedUtc
|
|
105
|
+
: Math.max(dates.generatedUtc, dates.validatedUtc);
|
|
106
|
+
const threshold = staleThreshold(env);
|
|
107
|
+
if (anchor === null) {
|
|
108
|
+
return { ...unknownFreshness(env), generated_date: dates.generatedDate, validated_date: dates.validatedDate };
|
|
109
|
+
}
|
|
110
|
+
const now = new Date();
|
|
111
|
+
const today = Date.UTC(now.getFullYear(), now.getMonth(), now.getDate());
|
|
112
|
+
const days = Math.round((today - anchor) / 86_400_000);
|
|
113
|
+
return {
|
|
114
|
+
state: days >= threshold ? "stale" : "current",
|
|
115
|
+
days_since_generated: days,
|
|
116
|
+
stale_threshold_days: threshold,
|
|
117
|
+
generated_date: dates.generatedDate,
|
|
118
|
+
validated_date: dates.validatedDate,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function result(profilePath, env, status, validityClass, recovery) {
|
|
122
|
+
return {
|
|
123
|
+
validity: { status, class: validityClass, recovery },
|
|
124
|
+
freshness: unknownFreshness(env),
|
|
125
|
+
profilePath,
|
|
126
|
+
groundingContent: null,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
export function acquireProfile(schemasDir, env = process.env, hooks = {}) {
|
|
130
|
+
const contract = personalProfileGroundingContract();
|
|
131
|
+
let profilePath;
|
|
132
|
+
try {
|
|
133
|
+
profilePath = registryArtifactPath("profile", schemasDir ?? discoverSchemasDir(), env, { warn: false });
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
return result(null, env, "repair_needed", "unsafe", contract.repairRecovery);
|
|
137
|
+
}
|
|
138
|
+
const source = readProfileSourceSafely(profilePath, contract.maxProfileUtf8Bytes, hooks);
|
|
139
|
+
if (source.status === "absent") {
|
|
140
|
+
return result(profilePath, env, "absent", "absent", contract.absentRecovery);
|
|
141
|
+
}
|
|
142
|
+
if (source.status !== "ok") {
|
|
143
|
+
return result(profilePath, env, "repair_needed", source.status, contract.repairRecovery);
|
|
144
|
+
}
|
|
145
|
+
let decoded;
|
|
146
|
+
try {
|
|
147
|
+
decoded = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(source.bytes);
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return result(profilePath, env, "repair_needed", "invalid_utf8", contract.repairRecovery);
|
|
151
|
+
}
|
|
152
|
+
try {
|
|
153
|
+
const groundingContent = personalProfileGrounding(decoded);
|
|
154
|
+
return {
|
|
155
|
+
validity: { status: "valid", class: "valid", recovery: null },
|
|
156
|
+
freshness: freshness(decoded, env),
|
|
157
|
+
profilePath,
|
|
158
|
+
groundingContent,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
const validityClass = error instanceof PersonalGlossaryBoundaryError
|
|
163
|
+
? error.availability
|
|
164
|
+
: "malformed";
|
|
165
|
+
return result(profilePath, env, "repair_needed", validityClass, contract.repairRecovery);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { STATE_FAMILY_FALLBACK_COMMANDS, STATE_FAMILY_LIST_COMMANDS } from "./capabilityContext/types.js";
|
|
2
|
+
export const STARTUP_AVAILABLE_STATE_FIELDS = [
|
|
3
|
+
"app_home",
|
|
4
|
+
"mode",
|
|
5
|
+
"profile",
|
|
6
|
+
"v1_migration",
|
|
7
|
+
"health",
|
|
8
|
+
"todo",
|
|
9
|
+
"plan",
|
|
10
|
+
"docs",
|
|
11
|
+
"progress",
|
|
12
|
+
"objective",
|
|
13
|
+
"state_presence",
|
|
14
|
+
"project_integration",
|
|
15
|
+
"attention",
|
|
16
|
+
"decision_attention",
|
|
17
|
+
"next_action",
|
|
18
|
+
"orchestration_context",
|
|
19
|
+
"closeout_context",
|
|
20
|
+
"evidence_context",
|
|
21
|
+
"benchmark_context",
|
|
22
|
+
"execution_context",
|
|
23
|
+
];
|
|
24
|
+
export const STARTUP_COMPLETENESS_CONFIDENCE_CAVEATS = [
|
|
25
|
+
"representative benchmark evidence exists, but some source products remain degraded by schema divergence",
|
|
26
|
+
"Audit evidence context uses existing status, plan, progress, docs, health, TODO, and decisions state outputs",
|
|
27
|
+
];
|
|
28
|
+
export const STARTUP_COMPLETENESS_CLI_FALLBACK = [
|
|
29
|
+
STATE_FAMILY_FALLBACK_COMMANDS.plan,
|
|
30
|
+
STATE_FAMILY_FALLBACK_COMMANDS.docs,
|
|
31
|
+
STATE_FAMILY_LIST_COMMANDS.progress,
|
|
32
|
+
];
|
|
33
|
+
export function startupCompletenessContract(input = {}) {
|
|
34
|
+
const missingState = [];
|
|
35
|
+
const schemaError = input.schemaError ?? null;
|
|
36
|
+
if (schemaError) {
|
|
37
|
+
missingState.push(schemaError);
|
|
38
|
+
}
|
|
39
|
+
if (input.profileStatus === "not found")
|
|
40
|
+
missingState.push("profile not found");
|
|
41
|
+
if (input.profileStatus === "absent")
|
|
42
|
+
missingState.push("profile absent");
|
|
43
|
+
if (input.profileStatus === "repair_needed")
|
|
44
|
+
missingState.push("profile repair needed");
|
|
45
|
+
const complete = missingState.length === 0;
|
|
46
|
+
return {
|
|
47
|
+
complete_for_capability_startup: complete,
|
|
48
|
+
raw_artifact_reads_required: false,
|
|
49
|
+
raw_artifact_read_policy: "Do not read raw artifacts when complete_for_capability_startup is true. " +
|
|
50
|
+
"When incomplete, try cli_fallback first; raw reads are permitted only for a named corruption or CLI-defect diagnostic.",
|
|
51
|
+
available_state: [...STARTUP_AVAILABLE_STATE_FIELDS],
|
|
52
|
+
missing_state: missingState,
|
|
53
|
+
confidence_caveats: [...STARTUP_COMPLETENESS_CONFIDENCE_CAVEATS],
|
|
54
|
+
cli_fallback: [...STARTUP_COMPLETENESS_CLI_FALLBACK],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export function capabilityStartupComplete(input = {}) {
|
|
58
|
+
return Boolean(startupCompletenessContract(input).complete_for_capability_startup);
|
|
59
|
+
}
|
package/dist/cli/stateQuery.js
CHANGED
|
@@ -5,7 +5,11 @@ import { loadYamlMapping } from "../core/yaml.js";
|
|
|
5
5
|
import { activeAppModel, discoverSchemasDir } from "./appContext.js";
|
|
6
6
|
import { validateAgentString, validateIdentifier } from "./argvalidate.js";
|
|
7
7
|
import { emitStructured } from "./structured.js";
|
|
8
|
-
|
|
8
|
+
import { truncateCodePoints } from "../core/text.js";
|
|
9
|
+
import { boundStructuredProjection } from "../state/projectionPolicy.js";
|
|
10
|
+
import { preCutoverCommand } from "./preCutoverCommand.js";
|
|
11
|
+
/** Shared state-query infrastructure ported from scripts/agentera. */
|
|
12
|
+
export const REQUIRED_SPARSE_CONTEXT_FIELDS = ["command", "outcome"];
|
|
9
13
|
export const ROUTINE_STRUCTURED_FIELDS = [
|
|
10
14
|
"command",
|
|
11
15
|
"status",
|
|
@@ -14,18 +18,51 @@ export const ROUTINE_STRUCTURED_FIELDS = [
|
|
|
14
18
|
"source",
|
|
15
19
|
"filters",
|
|
16
20
|
"summary",
|
|
21
|
+
"plans",
|
|
17
22
|
"source_contract",
|
|
18
23
|
];
|
|
24
|
+
/** Canonical structured field set for the bare prime orientation briefing.
|
|
25
|
+
* `agentera schema` discovery, the emitted prime JSON `source_contract.fields`,
|
|
26
|
+
* and the text-mode source-contract line derive from this list. The shared skill
|
|
27
|
+
* is the permanent host integration authority. The published bare-prime shape
|
|
28
|
+
* stays stable: omission of default-only conditional payload is governed by
|
|
29
|
+
* `state_presence` (missing-vs-empty) and named recovery commands, not by
|
|
30
|
+
* trimming this set. */
|
|
31
|
+
export const PRIME_STRUCTURED_FIELDS = [
|
|
32
|
+
"command", "outcome", "app_home", "app", "mode", "v1_migration", "health",
|
|
33
|
+
"todo", "plan", "docs", "progress", "objective", "state_presence", "shared_skill", "project_integration", "attention",
|
|
34
|
+
"history",
|
|
35
|
+
"decision_attention", "next_action", "orchestration_context", "closeout_context",
|
|
36
|
+
"evidence_context", "benchmark_context", "execution_context", "startup", "source", "source_contract",
|
|
37
|
+
];
|
|
38
|
+
/** Retired prime fields that receive one structured correction instead of
|
|
39
|
+
* falling through to the generic unsupported-field error. */
|
|
40
|
+
export const RETIRED_PRIME_FIELD_CORRECTIONS = {
|
|
41
|
+
issues: "todo",
|
|
42
|
+
};
|
|
43
|
+
/** Field declared available on the prime selector but emitted only by the
|
|
44
|
+
* `prime --context <capability>` surface, not by the bare default briefing.
|
|
45
|
+
* The bare briefing carries it as a `source_contract.capability_context`
|
|
46
|
+
* pointer with a `fetch_command`. */
|
|
47
|
+
export const PRIME_CONTEXT_ONLY_FIELDS = ["capability_context"];
|
|
48
|
+
/** Fields selectable via `prime [--context <cap>] --fields`. Derives the
|
|
49
|
+
* canonical structured set and the context-only `capability_context` pointer
|
|
50
|
+
* from one authority, so schema discovery and the prime selector cannot drift. */
|
|
51
|
+
export function availablePrimeFields(command) {
|
|
52
|
+
return command === "prime"
|
|
53
|
+
? [...PRIME_STRUCTURED_FIELDS, ...PRIME_CONTEXT_ONLY_FIELDS]
|
|
54
|
+
: [...PRIME_STRUCTURED_FIELDS];
|
|
55
|
+
}
|
|
19
56
|
export const COMMAND_FILTERS = {
|
|
20
|
-
|
|
21
|
-
plan: ["status"],
|
|
22
|
-
progress: ["topic", "status", "limit"],
|
|
23
|
-
health: ["dimension"],
|
|
57
|
+
prime: [],
|
|
58
|
+
plan: ["status", "limit", "cursor"],
|
|
59
|
+
progress: ["topic", "status", "limit", "cursor"],
|
|
60
|
+
health: ["dimension", "limit", "cursor"],
|
|
24
61
|
todo: ["severity", "status"],
|
|
25
|
-
decisions: ["topic"],
|
|
62
|
+
decisions: ["topic", "limit", "cursor"],
|
|
26
63
|
docs: ["topic", "status"],
|
|
27
64
|
objective: ["status"],
|
|
28
|
-
experiments: ["topic", "status", "limit"],
|
|
65
|
+
experiments: ["topic", "status", "limit", "cursor", "objective"],
|
|
29
66
|
query: ["list_artifacts", "topic", "severity", "dimension", "status", "limit"],
|
|
30
67
|
};
|
|
31
68
|
export function appModelPayload(model = activeAppModel()) {
|
|
@@ -39,8 +76,8 @@ export function surfaceMissingMessage(surface, p, model = activeAppModel()) {
|
|
|
39
76
|
return (`${surface} is missing. Agentera cannot find it at ${p}. ` +
|
|
40
77
|
`Agentera directory: ${payload.appHome}. ` +
|
|
41
78
|
`App files directory: ${payload.managedAppRoot}. ` +
|
|
42
|
-
|
|
43
|
-
"
|
|
79
|
+
`Run \`${preCutoverCommand("doctor")}\` to preview the repair; run ` +
|
|
80
|
+
`\`${preCutoverCommand("doctor --format json")}\` for structured details. ` +
|
|
44
81
|
`Technical details: appHome=${payload.appHome} managedAppRoot=${payload.managedAppRoot} ` +
|
|
45
82
|
`skillRoot=${payload.skillRoot} runtimeRoot=${payload.runtimeRoot}.`);
|
|
46
83
|
}
|
|
@@ -72,13 +109,16 @@ export function extractEntries(data) {
|
|
|
72
109
|
if (Array.isArray(data))
|
|
73
110
|
return data.filter((e) => e && typeof e === "object" && !Array.isArray(e));
|
|
74
111
|
if (typeof data === "object") {
|
|
112
|
+
// cast: data is the parsed artifact body from loadArtifact (YAML/JSON IO boundary)
|
|
75
113
|
for (const [key, val] of Object.entries(data)) {
|
|
76
114
|
if (key === "archive")
|
|
77
115
|
continue;
|
|
78
116
|
if (Array.isArray(val) && val.length > 0 && val[0] && typeof val[0] === "object" && !Array.isArray(val[0])) {
|
|
117
|
+
// cast: val is an entries array selected from the parsed artifact (IO boundary)
|
|
79
118
|
return val;
|
|
80
119
|
}
|
|
81
120
|
}
|
|
121
|
+
// cast: single-object artifact body from loadArtifact (IO boundary)
|
|
82
122
|
return [data];
|
|
83
123
|
}
|
|
84
124
|
return [];
|
|
@@ -94,6 +134,7 @@ function pyStr(val) {
|
|
|
94
134
|
if (Array.isArray(val))
|
|
95
135
|
return "[" + val.map((v) => pyReprInner(v)).join(", ") + "]";
|
|
96
136
|
if (typeof val === "object") {
|
|
137
|
+
// cast: val is an artifact-scalar object being rendered for display (IO boundary)
|
|
97
138
|
return "{" + Object.entries(val).map(([k, v]) => `${pyReprInner(k)}: ${pyReprInner(v)}`).join(", ") + "}";
|
|
98
139
|
}
|
|
99
140
|
return String(val);
|
|
@@ -106,13 +147,13 @@ function pyReprInner(val) {
|
|
|
106
147
|
export function formatScalar(val) {
|
|
107
148
|
if (Array.isArray(val) || (val !== null && typeof val === "object")) {
|
|
108
149
|
const s = pyStr(val);
|
|
109
|
-
return s
|
|
150
|
+
return truncateCodePoints(s, 80, "...");
|
|
110
151
|
}
|
|
111
152
|
return pyStr(val);
|
|
112
153
|
}
|
|
113
154
|
export function truncate(value, limit = 110) {
|
|
114
155
|
const text = formatScalar(value).replace(/\n/g, " ");
|
|
115
|
-
return text
|
|
156
|
+
return truncateCodePoints(text, limit, "...");
|
|
116
157
|
}
|
|
117
158
|
export function asList(value) {
|
|
118
159
|
return Array.isArray(value) ? value : [];
|
|
@@ -137,6 +178,7 @@ export function printStatusCounts(prefix, counts, out) {
|
|
|
137
178
|
}
|
|
138
179
|
export function stringFieldNames(fields) {
|
|
139
180
|
return Object.entries(fields)
|
|
181
|
+
// cast: field descriptor read from a parsed artifact schema (YAML IO boundary)
|
|
140
182
|
.filter(([, d]) => d?.type === "string")
|
|
141
183
|
.map(([n]) => n);
|
|
142
184
|
}
|
|
@@ -162,6 +204,7 @@ export function filterByFieldValue(entries, fieldName, value, substring = false)
|
|
|
162
204
|
result.push(e);
|
|
163
205
|
}
|
|
164
206
|
else if (v && typeof v === "object") {
|
|
207
|
+
// cast: v is a field value drawn from a parsed artifact entry (IO boundary)
|
|
165
208
|
const keys = Object.keys(v);
|
|
166
209
|
if (keys.includes(value) || (substring && keys.some((k) => k.toLowerCase().includes(vl))))
|
|
167
210
|
result.push(e);
|
|
@@ -180,6 +223,13 @@ function cycleSortKey(entry) {
|
|
|
180
223
|
return [0, timestamp];
|
|
181
224
|
return [0, ""];
|
|
182
225
|
}
|
|
226
|
+
export function omitProgressCommit(entry) {
|
|
227
|
+
const { commit: _commit, ...rest } = entry;
|
|
228
|
+
return rest;
|
|
229
|
+
}
|
|
230
|
+
export function progressEntriesForOutput(entries) {
|
|
231
|
+
return entries.map(omitProgressCommit);
|
|
232
|
+
}
|
|
183
233
|
export function recentCycles(entries, limit) {
|
|
184
234
|
const sorted = [...entries].sort((a, b) => {
|
|
185
235
|
const ka = cycleSortKey(a);
|
|
@@ -250,7 +300,7 @@ export function requestedFields(fieldsArg) {
|
|
|
250
300
|
return fields;
|
|
251
301
|
}
|
|
252
302
|
function availableStructuredFields(command) {
|
|
253
|
-
// State commands only; prime/
|
|
303
|
+
// State commands only; prime/capability handled by their own commands.
|
|
254
304
|
return ROUTINE_STRUCTURED_FIELDS;
|
|
255
305
|
}
|
|
256
306
|
export function selectStructuredFields(command, value, fieldsArg, err) {
|
|
@@ -275,7 +325,7 @@ export function emitStateStructured(command, value, format, fieldsArg, out, err)
|
|
|
275
325
|
const selected = selectStructuredFields(command, value, fieldsArg, err);
|
|
276
326
|
if (selected === null)
|
|
277
327
|
return 1;
|
|
278
|
-
emitStructured(selected, format, out);
|
|
328
|
+
emitStructured(boundStructuredProjection(selected, command, format), format, out);
|
|
279
329
|
return 0;
|
|
280
330
|
}
|
|
281
331
|
export function validateFilterValues(args, names) {
|
|
@@ -289,4 +339,3 @@ export function validateFilterValues(args, names) {
|
|
|
289
339
|
}
|
|
290
340
|
}
|
|
291
341
|
}
|
|
292
|
-
//# sourceMappingURL=stateQuery.js.map
|
package/dist/cli/structured.js
CHANGED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown TODO list-item parsing for GitHub checkboxes and Agentera type tags.
|
|
3
|
+
*/
|
|
4
|
+
const TODO_LIST_ITEM_RE = /^- \[([^\]]+)\]\s+(.*)/;
|
|
5
|
+
const TODO_TYPE_TAG_RE = /^\[([a-z][a-z0-9_-]*)(?::([^\]\s]+))?\]\s+(.*)$/;
|
|
6
|
+
const TODO_LEGACY_ID_RE = /^(?:(\[[a-z][a-z0-9_-]*(?::[^\]\s]+)?\]\s+))?`([a-z]{10})`\s+(.*)$/;
|
|
7
|
+
const TODO_ID_TAG_RE = /^\[id:([a-z]{10})\]\s+(.*)$/;
|
|
8
|
+
function isGithubCheckboxResolved(token) {
|
|
9
|
+
return token.toLowerCase() === "x";
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Classify a trimmed markdown TODO bullet line.
|
|
13
|
+
* Returns null when the line is not a `- […] …` list item.
|
|
14
|
+
*/
|
|
15
|
+
export function parseTodoMarkdownListItem(line) {
|
|
16
|
+
const m = TODO_LIST_ITEM_RE.exec(line);
|
|
17
|
+
if (!m)
|
|
18
|
+
return null;
|
|
19
|
+
const token = m[1];
|
|
20
|
+
const rest = m[2].trim();
|
|
21
|
+
const explicitId = TODO_ID_TAG_RE.exec(rest);
|
|
22
|
+
const legacyId = explicitId ? null : TODO_LEGACY_ID_RE.exec(rest);
|
|
23
|
+
const id = explicitId?.[1] ?? legacyId?.[2];
|
|
24
|
+
const publicRest = explicitId?.[2]?.trim()
|
|
25
|
+
?? (legacyId ? `${legacyId[1] ?? ""}${legacyId[3]}`.trim() : rest);
|
|
26
|
+
const typed = TODO_TYPE_TAG_RE.exec(publicRest) ?? TODO_TYPE_TAG_RE.exec(`[${token}] ${publicRest}`);
|
|
27
|
+
const status = isGithubCheckboxResolved(token) ? "resolved" : "open";
|
|
28
|
+
return {
|
|
29
|
+
status,
|
|
30
|
+
description: rest,
|
|
31
|
+
...(typed ? { kind: typed[1], target_version: typed[2] ?? null, title: typed[3].trim() } : { title: publicRest }),
|
|
32
|
+
...(id ? { id } : {}),
|
|
33
|
+
...(publicRest !== rest ? { public_description: publicRest } : {}),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export function isResolvedTodoMarkdownStatus(status) {
|
|
37
|
+
return status === "resolved";
|
|
38
|
+
}
|
|
39
|
+
export function renderTodoPublicRecord(record) {
|
|
40
|
+
if (typeof record.title === "string" && record.title.trim()) {
|
|
41
|
+
const kind = typeof record.kind === "string" && record.kind.trim() ? record.kind : "task";
|
|
42
|
+
const target = typeof record.target_version === "string" && record.target_version.trim() ? `:${record.target_version}` : "";
|
|
43
|
+
return `[${kind}${target}] ${record.title.trim()}`;
|
|
44
|
+
}
|
|
45
|
+
return String(record.description ?? "");
|
|
46
|
+
}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { preCutoverCommand } from "./preCutoverCommand.js";
|
|
3
|
+
import { loadTodoReadinessContract } from "../registries/todoReadinessContract.js";
|
|
4
|
+
import { TODO_SEVERITY_ORDER } from "./todoSeverity.js";
|
|
5
|
+
import { renderTodoPublicRecord } from "./todoMarkdown.js";
|
|
6
|
+
function mapping(value) {
|
|
7
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
8
|
+
}
|
|
9
|
+
function validProjectedOrder(value) {
|
|
10
|
+
if (!mapping(value))
|
|
11
|
+
return false;
|
|
12
|
+
if (value.kind === "absent")
|
|
13
|
+
return Object.keys(value).length === 1;
|
|
14
|
+
return value.kind === "managed"
|
|
15
|
+
&& Object.keys(value).sort().join(",") === "kind,markdownOrder"
|
|
16
|
+
&& Number.isSafeInteger(value.markdownOrder)
|
|
17
|
+
&& Number(value.markdownOrder) > 0;
|
|
18
|
+
}
|
|
19
|
+
function projectedMode(entities) {
|
|
20
|
+
const declared = entities.filter((entity) => Object.hasOwn(entity, "projectedOrder"));
|
|
21
|
+
if (!declared.length)
|
|
22
|
+
return false;
|
|
23
|
+
if (declared.length !== entities.length || declared.some((entity) => !validProjectedOrder(entity.projectedOrder))) {
|
|
24
|
+
throw new Error("projected TODO readiness requires one valid projectedOrder for every entity");
|
|
25
|
+
}
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
function compareProjectedOrder(left, right) {
|
|
29
|
+
const a = left.projectedOrder;
|
|
30
|
+
const b = right.projectedOrder;
|
|
31
|
+
if (a.kind !== b.kind)
|
|
32
|
+
return a.kind === "managed" ? -1 : 1;
|
|
33
|
+
if (a.kind === "managed" && b.kind === "managed")
|
|
34
|
+
return a.markdownOrder - b.markdownOrder || left.id.localeCompare(right.id);
|
|
35
|
+
return (left.queueRank ?? Number.MAX_SAFE_INTEGER) - (right.queueRank ?? Number.MAX_SAFE_INTEGER) || left.id.localeCompare(right.id);
|
|
36
|
+
}
|
|
37
|
+
function dependencies(readiness) {
|
|
38
|
+
return Array.isArray(readiness.dependencies)
|
|
39
|
+
? readiness.dependencies.filter(mapping)
|
|
40
|
+
: [];
|
|
41
|
+
}
|
|
42
|
+
function hasDependencyCycle(itemId, byId) {
|
|
43
|
+
const visit = (id, visiting, visited) => {
|
|
44
|
+
if (visiting.has(id))
|
|
45
|
+
return true;
|
|
46
|
+
if (visited.has(id))
|
|
47
|
+
return false;
|
|
48
|
+
const entity = byId.get(id);
|
|
49
|
+
const readiness = mapping(entity?.record.readiness) ? entity.record.readiness : null;
|
|
50
|
+
if (!readiness)
|
|
51
|
+
return false;
|
|
52
|
+
visiting.add(id);
|
|
53
|
+
for (const dependency of dependencies(readiness)) {
|
|
54
|
+
if (dependency.artifact === "todo" && typeof dependency.id === "string") {
|
|
55
|
+
if (visit(dependency.id, visiting, visited))
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
visiting.delete(id);
|
|
60
|
+
visited.add(id);
|
|
61
|
+
return false;
|
|
62
|
+
};
|
|
63
|
+
return visit(itemId, new Set(), new Set());
|
|
64
|
+
}
|
|
65
|
+
export function evaluateTodoReadinessQueue(entities, sourceRoot) {
|
|
66
|
+
if (entities.length === 0) {
|
|
67
|
+
return {
|
|
68
|
+
selected: null,
|
|
69
|
+
evaluations: [],
|
|
70
|
+
triage: { count: 0, bounded: true, recovery: null },
|
|
71
|
+
abstainRecovery: null,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const contract = sourceRoot
|
|
75
|
+
? loadTodoReadinessContract(path.join(sourceRoot, "skills/agentera/schemas/artifacts/todo.yaml"), path.join(sourceRoot, "skills/agentera/protocol.yaml"), path.join(sourceRoot, "skills/agentera/capability_schema_contract.yaml"))
|
|
76
|
+
: loadTodoReadinessContract();
|
|
77
|
+
const projected = projectedMode(entities);
|
|
78
|
+
const byId = new Map(entities.map((entity) => [entity.id, entity]));
|
|
79
|
+
const evaluate = (entity) => {
|
|
80
|
+
const { record } = entity;
|
|
81
|
+
const readiness = mapping(record.readiness) ? record.readiness : null;
|
|
82
|
+
const dependencyList = readiness ? dependencies(readiness) : [];
|
|
83
|
+
let outcome = "actionable";
|
|
84
|
+
let declaredRecovery = null;
|
|
85
|
+
if (record.status === "resolved")
|
|
86
|
+
outcome = "todo_resolved";
|
|
87
|
+
else if (!readiness)
|
|
88
|
+
outcome = "readiness_absent";
|
|
89
|
+
else if (readiness.blocked !== null) {
|
|
90
|
+
outcome = "blocked";
|
|
91
|
+
declaredRecovery = mapping(readiness.blocked) && typeof readiness.blocked.recovery === "string"
|
|
92
|
+
? readiness.blocked.recovery
|
|
93
|
+
: null;
|
|
94
|
+
}
|
|
95
|
+
else if (mapping(readiness.gate) && readiness.gate.state === "pending") {
|
|
96
|
+
outcome = "gate_pending";
|
|
97
|
+
declaredRecovery = typeof readiness.gate.recovery === "string" ? readiness.gate.recovery : null;
|
|
98
|
+
}
|
|
99
|
+
else if (dependencyList.some((dependency) => dependency.artifact !== "todo")) {
|
|
100
|
+
outcome = "dependency_cross_artifact";
|
|
101
|
+
}
|
|
102
|
+
else if (dependencyList.some((dependency) => typeof dependency.id !== "string" || !byId.has(dependency.id))) {
|
|
103
|
+
outcome = "dependency_missing";
|
|
104
|
+
}
|
|
105
|
+
else if (hasDependencyCycle(entity.id, byId)) {
|
|
106
|
+
outcome = "dependency_cycle";
|
|
107
|
+
}
|
|
108
|
+
else if (dependencyList.some((dependency) => byId.get(String(dependency.id))?.record.status !== "resolved")) {
|
|
109
|
+
outcome = "dependency_open";
|
|
110
|
+
}
|
|
111
|
+
const authority = contract.outcomes[outcome];
|
|
112
|
+
const capability = readiness && typeof readiness.capability === "string" ? readiness.capability : undefined;
|
|
113
|
+
const queueRank = readiness && Number.isInteger(readiness.queue_rank) ? Number(readiness.queue_rank) : undefined;
|
|
114
|
+
return {
|
|
115
|
+
id: entity.id,
|
|
116
|
+
artifact: entity.artifact,
|
|
117
|
+
severity: String(record.severity ?? "normal"),
|
|
118
|
+
description: renderTodoPublicRecord(record),
|
|
119
|
+
outcome,
|
|
120
|
+
result: String(authority.result),
|
|
121
|
+
eligible: authority.eligible === true,
|
|
122
|
+
attention: String(authority.attention),
|
|
123
|
+
recovery: declaredRecovery ?? (typeof authority.recovery === "string" ? authority.recovery : null),
|
|
124
|
+
retrieval: { exact: preCutoverCommand(`state todo get --id ${entity.id} --format json`) },
|
|
125
|
+
...(capability ? {
|
|
126
|
+
capability,
|
|
127
|
+
phase: contract.phaseByCapability.get(capability),
|
|
128
|
+
reason: typeof readiness?.reason === "string" ? readiness.reason : "",
|
|
129
|
+
} : {}),
|
|
130
|
+
...(queueRank === undefined ? {} : { queueRank }),
|
|
131
|
+
...(projected ? { projectedOrder: entity.projectedOrder } : {}),
|
|
132
|
+
};
|
|
133
|
+
};
|
|
134
|
+
const evaluations = entities.map(evaluate);
|
|
135
|
+
const actionable = evaluations.filter((entry) => entry.eligible);
|
|
136
|
+
if (!projected) {
|
|
137
|
+
const ranks = new Map();
|
|
138
|
+
for (const entry of actionable) {
|
|
139
|
+
const key = `${entry.severity}\0${String(entry.queueRank)}`;
|
|
140
|
+
ranks.set(key, [...(ranks.get(key) ?? []), entry]);
|
|
141
|
+
}
|
|
142
|
+
for (const conflicts of ranks.values()) {
|
|
143
|
+
if (conflicts.length < 2)
|
|
144
|
+
continue;
|
|
145
|
+
const authority = contract.outcomes.ordering_conflict;
|
|
146
|
+
for (const entry of conflicts) {
|
|
147
|
+
entry.outcome = "ordering_conflict";
|
|
148
|
+
entry.result = String(authority.result);
|
|
149
|
+
entry.eligible = false;
|
|
150
|
+
entry.attention = String(authority.attention);
|
|
151
|
+
entry.recovery = typeof authority.recovery === "string" ? authority.recovery : null;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const selected = evaluations
|
|
156
|
+
.filter((entry) => entry.eligible)
|
|
157
|
+
.sort((left, right) => (TODO_SEVERITY_ORDER[left.severity] ?? TODO_SEVERITY_ORDER.normal)
|
|
158
|
+
- (TODO_SEVERITY_ORDER[right.severity] ?? TODO_SEVERITY_ORDER.normal)
|
|
159
|
+
|| (projected
|
|
160
|
+
? compareProjectedOrder(left, right)
|
|
161
|
+
: (left.queueRank ?? Number.MAX_SAFE_INTEGER) - (right.queueRank ?? Number.MAX_SAFE_INTEGER) || left.id.localeCompare(right.id)))[0] ?? null;
|
|
162
|
+
const triageCount = evaluations.filter((entry) => entry.attention === "item").length;
|
|
163
|
+
const mixedRecovery = contract.queueOutcomes.mixed_actionable_and_triage?.recovery;
|
|
164
|
+
const queueRecovery = contract.queueOutcomes.all_non_actionable?.recovery;
|
|
165
|
+
const nonActionable = evaluations
|
|
166
|
+
.filter((entry) => !entry.eligible && entry.result !== "resolved")
|
|
167
|
+
.sort((left, right) => (TODO_SEVERITY_ORDER[left.severity] ?? TODO_SEVERITY_ORDER.normal)
|
|
168
|
+
- (TODO_SEVERITY_ORDER[right.severity] ?? TODO_SEVERITY_ORDER.normal)
|
|
169
|
+
|| contract.precedence.indexOf(left.outcome) - contract.precedence.indexOf(right.outcome)
|
|
170
|
+
|| (left.queueRank ?? Number.MAX_SAFE_INTEGER) - (right.queueRank ?? Number.MAX_SAFE_INTEGER));
|
|
171
|
+
const recoveryCandidate = nonActionable[0];
|
|
172
|
+
const equallyRankedRecoveries = recoveryCandidate
|
|
173
|
+
? new Set(nonActionable
|
|
174
|
+
.filter((entry) => entry.severity === recoveryCandidate.severity
|
|
175
|
+
&& entry.outcome === recoveryCandidate.outcome
|
|
176
|
+
&& entry.queueRank === recoveryCandidate.queueRank)
|
|
177
|
+
.map((entry) => entry.recovery))
|
|
178
|
+
: new Set();
|
|
179
|
+
const abstainRecovery = equallyRankedRecoveries.size === 1
|
|
180
|
+
? recoveryCandidate?.recovery ?? null
|
|
181
|
+
: typeof queueRecovery === "string" ? queueRecovery : null;
|
|
182
|
+
return {
|
|
183
|
+
selected,
|
|
184
|
+
evaluations,
|
|
185
|
+
triage: {
|
|
186
|
+
count: triageCount,
|
|
187
|
+
bounded: true,
|
|
188
|
+
recovery: triageCount > 0 && typeof mixedRecovery === "string" ? mixedRecovery : null,
|
|
189
|
+
},
|
|
190
|
+
abstainRecovery: !selected ? abstainRecovery : null,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Severity band keys for TODO.md sections — shared by state todo, prime, and orientation. */
|
|
2
|
+
export const TODO_SEVERITY_ORDER_KEYS = [
|
|
3
|
+
"critical",
|
|
4
|
+
"degraded",
|
|
5
|
+
"warning",
|
|
6
|
+
"normal",
|
|
7
|
+
"info",
|
|
8
|
+
"annoying",
|
|
9
|
+
];
|
|
10
|
+
/** Sort priority for TODO severity bands (lower = higher priority). */
|
|
11
|
+
export const TODO_SEVERITY_ORDER = {
|
|
12
|
+
critical: 0,
|
|
13
|
+
degraded: 1,
|
|
14
|
+
warning: 1,
|
|
15
|
+
normal: 2,
|
|
16
|
+
info: 3,
|
|
17
|
+
annoying: 3,
|
|
18
|
+
};
|