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,350 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import YAML, { isMap, isScalar, isSeq } from "yaml";
|
|
4
|
+
import { loadYamlMapping } from "../core/yaml.js";
|
|
5
|
+
import { resolvePlanIdentity } from "../state/planIdentity.js";
|
|
6
|
+
import { asList, firstPresent } from "./stateQuery.js";
|
|
7
|
+
/** The immutable filenames produced by the typed plan archive writer. */
|
|
8
|
+
const PLAN_ARCHIVE_FILE = /^PLAN-.+\.ya?ml$/i;
|
|
9
|
+
const COMPLETE_TASK_STATUSES = new Set(["complete", "completed", "closed", "done", "resolved", "retired"]);
|
|
10
|
+
function isMapping(value) {
|
|
11
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
12
|
+
}
|
|
13
|
+
function normalizeLegacyStatus(status) {
|
|
14
|
+
if (status === "active")
|
|
15
|
+
return "open";
|
|
16
|
+
if (status === "completed")
|
|
17
|
+
return "complete";
|
|
18
|
+
return status;
|
|
19
|
+
}
|
|
20
|
+
function planStatus(data) {
|
|
21
|
+
const header = isMapping(data.header) ? data.header : {};
|
|
22
|
+
return String(firstPresent(header, ["status"], "") || "");
|
|
23
|
+
}
|
|
24
|
+
function hasYamlMetadata(value) {
|
|
25
|
+
if (value === null || typeof value !== "object")
|
|
26
|
+
return false;
|
|
27
|
+
const node = value;
|
|
28
|
+
return node.anchor !== undefined || node.tag !== undefined;
|
|
29
|
+
}
|
|
30
|
+
function hasSafeRange(value, textLength) {
|
|
31
|
+
if (value === null || typeof value !== "object")
|
|
32
|
+
return false;
|
|
33
|
+
const range = value.range;
|
|
34
|
+
if (!Array.isArray(range) || range.length < 2 || range.some((offset) => !Number.isInteger(offset)))
|
|
35
|
+
return false;
|
|
36
|
+
return range[0] >= 0 && range[0] <= range[1] && range[1] <= textLength &&
|
|
37
|
+
(range[2] === undefined || (range[1] <= range[2] && range[2] <= textLength));
|
|
38
|
+
}
|
|
39
|
+
function hasPlainSequenceItemPrefix(text, itemStart) {
|
|
40
|
+
const lineStart = text.lastIndexOf("\n", itemStart - 1) + 1;
|
|
41
|
+
return /^[ \t]*-[ \t]+$/.test(text.slice(lineStart, itemStart));
|
|
42
|
+
}
|
|
43
|
+
function blockScopeItemSources(text) {
|
|
44
|
+
const sources = new Map();
|
|
45
|
+
const document = YAML.parseDocument(text);
|
|
46
|
+
if (!isMap(document.contents))
|
|
47
|
+
return sources;
|
|
48
|
+
const scope = document.contents.get("scope", true);
|
|
49
|
+
if (!isMap(scope))
|
|
50
|
+
return sources;
|
|
51
|
+
for (const field of ["included", "excluded", "deferred"]) {
|
|
52
|
+
const sequence = scope.get(field, true);
|
|
53
|
+
if (!isSeq(sequence))
|
|
54
|
+
continue;
|
|
55
|
+
sequence.items.forEach((item, index) => {
|
|
56
|
+
if (!isMap(item) || item.flow === true || item.items.length !== 1)
|
|
57
|
+
return;
|
|
58
|
+
const [pair] = item.items;
|
|
59
|
+
const { key, value } = pair;
|
|
60
|
+
if (!isScalar(key) || !isScalar(value) || typeof key.value !== "string" || typeof value.value !== "string")
|
|
61
|
+
return;
|
|
62
|
+
if ([item, pair, key, value].some(hasYamlMetadata))
|
|
63
|
+
return;
|
|
64
|
+
if (!hasSafeRange(item, text.length) || !hasSafeRange(key, text.length) || !hasSafeRange(value, text.length))
|
|
65
|
+
return;
|
|
66
|
+
if (key.range[0] < item.range[0] || key.range[1] > item.range[1] || value.range[0] < item.range[0] || value.range[1] > item.range[1])
|
|
67
|
+
return;
|
|
68
|
+
if (!hasPlainSequenceItemPrefix(text, item.range[0]))
|
|
69
|
+
return;
|
|
70
|
+
const sourceText = text.slice(item.range[0], item.range[1]).trimEnd();
|
|
71
|
+
if (sourceText.includes("\n") || sourceText.includes("\r"))
|
|
72
|
+
return;
|
|
73
|
+
sources.set(`${field}:${index}`, {
|
|
74
|
+
source_form: "block_single_pair_mapping",
|
|
75
|
+
source_context: `scope.${field}_sequence_item`,
|
|
76
|
+
source_text: sourceText,
|
|
77
|
+
normalized: `${key.value}: ${value.value}`,
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return sources;
|
|
82
|
+
}
|
|
83
|
+
function normalizePlanDocument(data, archived, blockScopeItems) {
|
|
84
|
+
const header = isMapping(data.header) ? data.header : {};
|
|
85
|
+
const status = planStatus(data);
|
|
86
|
+
const sourceTasks = (Array.isArray(data.entries) ? data.entries : data.tasks);
|
|
87
|
+
const incomplete = sourceTasks.some((task) => !taskIsComplete(task));
|
|
88
|
+
const normalizedStatus = normalizeLegacyStatus(status) === "complete" && incomplete ? "open" : normalizeLegacyStatus(status);
|
|
89
|
+
const taskNormalizations = [];
|
|
90
|
+
const tasks = sourceTasks.map((source, index) => {
|
|
91
|
+
const task = structuredClone(source);
|
|
92
|
+
const legacy = typeof task.id === "string" ? /^T([1-9][0-9]*)$/.exec(task.id) : null;
|
|
93
|
+
const taskNormalization = { index };
|
|
94
|
+
if (legacy && task.number === undefined) {
|
|
95
|
+
task.number = Number(legacy[1]);
|
|
96
|
+
delete task.id;
|
|
97
|
+
if (task.name === undefined && typeof task.title === "string") {
|
|
98
|
+
task.name = task.title;
|
|
99
|
+
delete task.title;
|
|
100
|
+
}
|
|
101
|
+
Object.assign(taskNormalization, { source_id: source.id, source_title: source.title, normalized_number: task.number, normalized_name: task.name });
|
|
102
|
+
}
|
|
103
|
+
const normalizedLists = ["depends_on", "acceptance"].filter((field) => source[field] === undefined || source[field] === null || typeof source[field] === "string");
|
|
104
|
+
if (normalizedLists.length) {
|
|
105
|
+
for (const field of normalizedLists)
|
|
106
|
+
task[field] = typeof source[field] === "string" && source[field] !== "" ? [source[field]] : [];
|
|
107
|
+
taskNormalization.normalized_list_fields = normalizedLists;
|
|
108
|
+
taskNormalization.source_list_forms = Object.fromEntries(normalizedLists.map((field) => [field, source[field] === undefined ? "absent" : source[field] === null ? "null" : source[field] === "" ? "empty_scalar" : "scalar"]));
|
|
109
|
+
}
|
|
110
|
+
if (Array.isArray(task.acceptance)) {
|
|
111
|
+
const acceptanceItems = [];
|
|
112
|
+
task.acceptance = task.acceptance.map((item, acceptanceIndex) => {
|
|
113
|
+
if (!isMapping(item))
|
|
114
|
+
return item;
|
|
115
|
+
const pairs = Object.entries(item);
|
|
116
|
+
if (pairs.length !== 1 || typeof pairs[0][1] !== "string")
|
|
117
|
+
return item;
|
|
118
|
+
const normalized = `${pairs[0][0]}: ${pairs[0][1]}`;
|
|
119
|
+
acceptanceItems.push({ index: acceptanceIndex, source_mapping: item, normalized });
|
|
120
|
+
return normalized;
|
|
121
|
+
});
|
|
122
|
+
if (acceptanceItems.length)
|
|
123
|
+
taskNormalization.acceptance_mapping_items = acceptanceItems;
|
|
124
|
+
}
|
|
125
|
+
if (task.status === "completed") {
|
|
126
|
+
task.status = "complete";
|
|
127
|
+
taskNormalization.status = { original: "completed", normalized: "complete" };
|
|
128
|
+
}
|
|
129
|
+
if (Object.keys(taskNormalization).length > 1)
|
|
130
|
+
taskNormalizations.push(taskNormalization);
|
|
131
|
+
if (Array.isArray(task.depends_on))
|
|
132
|
+
task.depends_on = task.depends_on.map((dependency) => { const match = /^Task ([1-9][0-9]*)$/.exec(String(dependency)); return match ? match[1] : dependency; });
|
|
133
|
+
return task;
|
|
134
|
+
});
|
|
135
|
+
const normalizedData = { ...data, header: { ...header, status: normalizedStatus }, ...(Array.isArray(data.entries) ? { entries: tasks } : { tasks }) };
|
|
136
|
+
const changes = {};
|
|
137
|
+
if (status !== normalizedStatus)
|
|
138
|
+
changes.lifecycle = { original_status: status, normalized_status: normalizedStatus, rule: incomplete ? "completed_with_incomplete_tasks_to_open" : "legacy_status" };
|
|
139
|
+
if (data.scope === undefined || data.scope === null || data.scope === "") {
|
|
140
|
+
normalizedData.scope = { included: [], excluded: [] };
|
|
141
|
+
changes.scope = { source_form: data.scope === undefined ? "absent" : data.scope === null ? "null" : "empty_scalar", normalized: "explicit_empty_lists" };
|
|
142
|
+
}
|
|
143
|
+
else if (isMapping(data.scope)) {
|
|
144
|
+
const scope = structuredClone(data.scope);
|
|
145
|
+
const itemNormalizations = [];
|
|
146
|
+
for (const field of ["included", "excluded", "deferred"]) {
|
|
147
|
+
if (!Array.isArray(scope[field]))
|
|
148
|
+
continue;
|
|
149
|
+
scope[field] = scope[field].map((item, index) => {
|
|
150
|
+
if (Array.isArray(item) && item.length === 1 && typeof item[0] === "string") {
|
|
151
|
+
itemNormalizations.push({ field, index, source_form: "singleton_sequence", source: item, normalized: item[0] });
|
|
152
|
+
return item[0];
|
|
153
|
+
}
|
|
154
|
+
if (isMapping(item)) {
|
|
155
|
+
const pairs = Object.entries(item);
|
|
156
|
+
const source = blockScopeItems.get(`${field}:${index}`);
|
|
157
|
+
if (pairs.length === 1 && typeof pairs[0][1] === "string" && source?.normalized === `${pairs[0][0]}: ${pairs[0][1]}`) {
|
|
158
|
+
const normalized = source.normalized;
|
|
159
|
+
itemNormalizations.push({ field, index, ...source, source: item });
|
|
160
|
+
return normalized;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return item;
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
normalizedData.scope = scope;
|
|
167
|
+
if (itemNormalizations.length)
|
|
168
|
+
changes.scope_list_items = itemNormalizations;
|
|
169
|
+
}
|
|
170
|
+
if (taskNormalizations.length)
|
|
171
|
+
changes.tasks = taskNormalizations;
|
|
172
|
+
return { data: normalizedData, ...(Object.keys(changes).length ? { provenance: { kind: "legacy_plan_normalization", archived, ...changes } } : {}) };
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* A plan archive is valid only when it retains the task list (including an
|
|
176
|
+
* intentionally empty list). This keeps unrelated YAML and malformed plan
|
|
177
|
+
* names from replacing a valid archive during discovery.
|
|
178
|
+
*/
|
|
179
|
+
function isPlanDocument(value) {
|
|
180
|
+
if (!isMapping(value) || !isMapping(value.header))
|
|
181
|
+
return false;
|
|
182
|
+
const entries = Array.isArray(value.entries) ? value.entries : value.tasks;
|
|
183
|
+
return Array.isArray(entries) && entries.every(isMapping);
|
|
184
|
+
}
|
|
185
|
+
function taskIsComplete(task) {
|
|
186
|
+
return COMPLETE_TASK_STATUSES.has(String(task.status ?? "").toLowerCase());
|
|
187
|
+
}
|
|
188
|
+
function inspectionDiagnostic(path, category, message) {
|
|
189
|
+
return { path, category, message };
|
|
190
|
+
}
|
|
191
|
+
function inspectPlanArtifact(artifactPath, archived, bytes) {
|
|
192
|
+
let data;
|
|
193
|
+
let sourceText;
|
|
194
|
+
try {
|
|
195
|
+
sourceText = bytes !== undefined ? bytes.toString("utf8") : fs.readFileSync(artifactPath, "utf8");
|
|
196
|
+
data = loadYamlMapping(sourceText);
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
const message = error.message;
|
|
200
|
+
const category = message === "YAML root must be a mapping" ? "schema" : "parse";
|
|
201
|
+
return { artifact: null, diagnostics: [inspectionDiagnostic(artifactPath, category, message)] };
|
|
202
|
+
}
|
|
203
|
+
if (!isPlanDocument(data)) {
|
|
204
|
+
return {
|
|
205
|
+
artifact: null,
|
|
206
|
+
diagnostics: [
|
|
207
|
+
inspectionDiagnostic(artifactPath, "schema", "plan requires a header mapping and a tasks or entries array of task mappings"),
|
|
208
|
+
],
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
const status = planStatus(data);
|
|
212
|
+
if (!["open", "complete", "active", "completed"].includes(status)) {
|
|
213
|
+
return {
|
|
214
|
+
artifact: null,
|
|
215
|
+
diagnostics: [
|
|
216
|
+
inspectionDiagnostic(artifactPath, "lifecycle", `plan header.status must be open or complete; received ${status || "missing"}`),
|
|
217
|
+
],
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
const diagnostics = [];
|
|
221
|
+
if (status === "active" || status === "completed") {
|
|
222
|
+
diagnostics.push(inspectionDiagnostic(artifactPath, "legacy", `legacy plan status ${status} normalized to ${normalizeLegacyStatus(status)}`));
|
|
223
|
+
}
|
|
224
|
+
const sourceTasks = (Array.isArray(data.entries) ? data.entries : data.tasks);
|
|
225
|
+
if (normalizeLegacyStatus(status) === "complete" && sourceTasks.some((task) => !taskIsComplete(task))) {
|
|
226
|
+
diagnostics.push(inspectionDiagnostic(artifactPath, "legacy", "completed plan with incomplete tasks normalized to open"));
|
|
227
|
+
}
|
|
228
|
+
if (Array.isArray(data.entries)) {
|
|
229
|
+
diagnostics.push(inspectionDiagnostic(artifactPath, "legacy", "legacy entries task shape is read compatibly"));
|
|
230
|
+
}
|
|
231
|
+
const normalized = normalizePlanDocument(data, archived, blockScopeItemSources(sourceText));
|
|
232
|
+
return { artifact: { path: artifactPath, data: normalized.data, archived, ...(normalized.provenance ? { migrationProvenance: normalized.provenance } : {}) }, diagnostics };
|
|
233
|
+
}
|
|
234
|
+
export function planDocumentParts(data) {
|
|
235
|
+
const legacyEntries = Array.isArray(data.entries);
|
|
236
|
+
const header = isMapping(data.header) ? data.header : {};
|
|
237
|
+
const rawTasks = legacyEntries ? asList(data.entries) : asList(data.tasks);
|
|
238
|
+
const tasks = rawTasks.filter((task) => isMapping(task));
|
|
239
|
+
return {
|
|
240
|
+
header,
|
|
241
|
+
tasks,
|
|
242
|
+
status: normalizeLegacyStatus(String(firstPresent(header, ["status"], "") || "")),
|
|
243
|
+
title: String(firstPresent(header, ["title"], data.title ?? "") || ""),
|
|
244
|
+
created: String(firstPresent(header, ["created"], data.created ?? "") || ""),
|
|
245
|
+
legacyEntries,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Discover the active plan and typed-writer archives. The active path is
|
|
250
|
+
* schema-resolved; its sibling `archive/` directory is the writer-owned
|
|
251
|
+
* history location. Callers with inspected sources can pin active and archive
|
|
252
|
+
* bytes, or pass null to exclude an unsafe active path without following it.
|
|
253
|
+
*/
|
|
254
|
+
export function discoverPlanArtifacts(activePath, options) {
|
|
255
|
+
const archiveDirectory = path.join(path.dirname(activePath), "archive");
|
|
256
|
+
const activeInspection = options
|
|
257
|
+
? options.activeBytes === null
|
|
258
|
+
? { artifact: null, diagnostics: [] }
|
|
259
|
+
: inspectPlanArtifact(activePath, false, options.activeBytes)
|
|
260
|
+
: fs.existsSync(activePath)
|
|
261
|
+
? inspectPlanArtifact(activePath, false)
|
|
262
|
+
: { artifact: null, diagnostics: [] };
|
|
263
|
+
const active = activeInspection.artifact;
|
|
264
|
+
const archived = [];
|
|
265
|
+
const invalidArchivePaths = [];
|
|
266
|
+
const diagnostics = [...activeInspection.diagnostics];
|
|
267
|
+
let archiveSources = [];
|
|
268
|
+
if (options?.archiveBytes) {
|
|
269
|
+
archiveSources = [...options.archiveBytes.entries()]
|
|
270
|
+
.filter(([archivePath]) => path.dirname(archivePath) === archiveDirectory && PLAN_ARCHIVE_FILE.test(path.basename(archivePath)))
|
|
271
|
+
.sort(([left], [right]) => left.localeCompare(right));
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
let names = [];
|
|
275
|
+
try {
|
|
276
|
+
names = fs.readdirSync(archiveDirectory);
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
// A missing archive directory is the normal state before the first archive.
|
|
280
|
+
}
|
|
281
|
+
archiveSources = names
|
|
282
|
+
.filter((candidate) => PLAN_ARCHIVE_FILE.test(candidate))
|
|
283
|
+
.sort()
|
|
284
|
+
.flatMap((name) => {
|
|
285
|
+
const archivePath = path.join(archiveDirectory, name);
|
|
286
|
+
try {
|
|
287
|
+
return fs.statSync(archivePath).isFile() ? [[archivePath, undefined]] : [];
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
return [];
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
for (const [archivePath, bytes] of archiveSources) {
|
|
295
|
+
const inspection = inspectPlanArtifact(archivePath, true, bytes);
|
|
296
|
+
diagnostics.push(...inspection.diagnostics);
|
|
297
|
+
if (inspection.artifact)
|
|
298
|
+
archived.push(inspection.artifact);
|
|
299
|
+
else
|
|
300
|
+
invalidArchivePaths.push(archivePath);
|
|
301
|
+
}
|
|
302
|
+
// Lifecycle migration updates bytes and therefore mtimes. Persisted creation
|
|
303
|
+
// dates, followed by the immutable path, keep historical order stable.
|
|
304
|
+
archived.sort((a, b) => {
|
|
305
|
+
const createdDelta = planDocumentParts(b.data).created.localeCompare(planDocumentParts(a.data).created);
|
|
306
|
+
return createdDelta === 0 ? b.path.localeCompare(a.path) : createdDelta;
|
|
307
|
+
});
|
|
308
|
+
const artifacts = [...(active ? [active] : []), ...archived];
|
|
309
|
+
const resolved = artifacts.flatMap((artifact) => {
|
|
310
|
+
try {
|
|
311
|
+
return [{ artifact, ...resolvePlanIdentity(artifact.data) }];
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
diagnostics.push(inspectionDiagnostic(artifact.path, "identity", error.message));
|
|
315
|
+
return [];
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
const identities = resolved.map((identity) => {
|
|
319
|
+
const matching = resolved.filter((candidate) => candidate.stableId === identity.stableId);
|
|
320
|
+
const provenancePaths = matching.map((candidate) => candidate.artifact.path).sort();
|
|
321
|
+
const ambiguous = new Set(matching.map((candidate) => candidate.canonicalJson)).size > 1;
|
|
322
|
+
if (ambiguous) {
|
|
323
|
+
diagnostics.push(inspectionDiagnostic(identity.artifact.path, "identity", `plan identity ${identity.stableId} is ambiguous across ${provenancePaths.join(", ")}`));
|
|
324
|
+
}
|
|
325
|
+
return { ...identity, ambiguous, provenancePaths };
|
|
326
|
+
});
|
|
327
|
+
return { activePath, archiveDirectory, active, archived, invalidArchivePaths, diagnostics, identities };
|
|
328
|
+
}
|
|
329
|
+
export function planCatalogEntry(artifact, activePath, identity) {
|
|
330
|
+
const parts = planDocumentParts(artifact.data);
|
|
331
|
+
const active = artifact.path === activePath;
|
|
332
|
+
return {
|
|
333
|
+
path: artifact.path,
|
|
334
|
+
...(identity ? { stable_id: identity.stableId } : {}),
|
|
335
|
+
addressable: identity ? !identity.ambiguous : false,
|
|
336
|
+
active,
|
|
337
|
+
archived: !active,
|
|
338
|
+
title: parts.title,
|
|
339
|
+
status: parts.status,
|
|
340
|
+
created: parts.created,
|
|
341
|
+
task_count: parts.tasks.length,
|
|
342
|
+
compatibility: identity?.ambiguous ? "degraded" : identity?.persisted ? "complete" : "degraded",
|
|
343
|
+
provenance: {
|
|
344
|
+
storage: active ? "active_plan_file" : "immutable_plan_archive",
|
|
345
|
+
path: artifact.path,
|
|
346
|
+
lifecycle_position: active ? "active" : "archived",
|
|
347
|
+
...(identity && identity.provenancePaths.length > 1 ? { mirrored_paths: identity.provenancePaths } : {}),
|
|
348
|
+
},
|
|
349
|
+
};
|
|
350
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { artifactPath } from "./appContext.js";
|
|
2
|
+
import { asList, loadArtifact } from "./stateQuery.js";
|
|
3
|
+
/**
|
|
4
|
+
* These phrases are the stable progress-to-task joins for the completed
|
|
5
|
+
* lifecycle plan. They intentionally match task-specific progress language,
|
|
6
|
+
* rather than every cycle that happens to mention a shared runtime concept.
|
|
7
|
+
*/
|
|
8
|
+
const LIFECYCLE_PROGRESS_MATCHES = {
|
|
9
|
+
"1": "canonical runtime lifecycle projection for task 1",
|
|
10
|
+
"2": "defined default preview and explicit apply semantics",
|
|
11
|
+
"3": "task 3 ownership-safe repair",
|
|
12
|
+
"4": "drove project integration from the canonical runtime lifecycle projection",
|
|
13
|
+
"5": "surface bounded lifecycle attention rows",
|
|
14
|
+
"6": "verified runtime lifecycle selectors, ownership safety, preview purity",
|
|
15
|
+
"7": "verified task 7 consumer and distribution parity",
|
|
16
|
+
"8": "synchronized packages/cli/package.json dev.17",
|
|
17
|
+
};
|
|
18
|
+
function isMapping(value) {
|
|
19
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
20
|
+
}
|
|
21
|
+
function hasRecordedEvidence(value) {
|
|
22
|
+
if (Array.isArray(value))
|
|
23
|
+
return value.some((item) => hasRecordedEvidence(item));
|
|
24
|
+
if (value !== null && typeof value === "object")
|
|
25
|
+
return Object.keys(value).length > 0;
|
|
26
|
+
return value !== null && value !== undefined && String(value).trim().length > 0;
|
|
27
|
+
}
|
|
28
|
+
function cycleNumber(value) {
|
|
29
|
+
if (typeof value === "number" && Number.isInteger(value))
|
|
30
|
+
return value;
|
|
31
|
+
if (typeof value === "string" && value.trim())
|
|
32
|
+
return /^\d+$/.test(value.trim()) ? Number(value) : value.trim();
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
function progressEvidenceRecords(schemas) {
|
|
36
|
+
const info = schemas.progress;
|
|
37
|
+
if (!info)
|
|
38
|
+
return [];
|
|
39
|
+
const progressPath = artifactPath(info, "progress");
|
|
40
|
+
const data = loadArtifact(progressPath);
|
|
41
|
+
if (!isMapping(data))
|
|
42
|
+
return [];
|
|
43
|
+
const records = [];
|
|
44
|
+
for (const raw of asList(data.cycles)) {
|
|
45
|
+
if (!isMapping(raw))
|
|
46
|
+
continue;
|
|
47
|
+
const number = cycleNumber(raw.number);
|
|
48
|
+
const what = String(raw.what ?? "").trim();
|
|
49
|
+
if (number === null || !what)
|
|
50
|
+
continue;
|
|
51
|
+
const verified = String(raw.verified ?? "").trim();
|
|
52
|
+
records.push({
|
|
53
|
+
cycleNumber: number,
|
|
54
|
+
artifactPath: progressPath,
|
|
55
|
+
field: verified ? "verified" : "what",
|
|
56
|
+
detail: verified || what,
|
|
57
|
+
matchText: what.toLowerCase(),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
for (const raw of asList(data.archive)) {
|
|
61
|
+
if (!isMapping(raw))
|
|
62
|
+
continue;
|
|
63
|
+
const summary = String(raw.summary ?? "").trim();
|
|
64
|
+
const match = /^Cycle\s+(\d+)\b/i.exec(summary);
|
|
65
|
+
if (!match || !summary)
|
|
66
|
+
continue;
|
|
67
|
+
records.push({
|
|
68
|
+
cycleNumber: Number(match[1]),
|
|
69
|
+
artifactPath: progressPath,
|
|
70
|
+
field: "summary",
|
|
71
|
+
detail: summary,
|
|
72
|
+
matchText: summary.toLowerCase(),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return records;
|
|
76
|
+
}
|
|
77
|
+
function progressMatch(task, records) {
|
|
78
|
+
const number = String(task.number ?? "");
|
|
79
|
+
const phrase = LIFECYCLE_PROGRESS_MATCHES[number];
|
|
80
|
+
if (!phrase)
|
|
81
|
+
return null;
|
|
82
|
+
const matches = records
|
|
83
|
+
.filter((record) => record.matchText.includes(phrase))
|
|
84
|
+
.sort((a, b) => {
|
|
85
|
+
const aNumber = typeof a.cycleNumber === "number" ? a.cycleNumber : Number.MAX_SAFE_INTEGER;
|
|
86
|
+
const bNumber = typeof b.cycleNumber === "number" ? b.cycleNumber : Number.MAX_SAFE_INTEGER;
|
|
87
|
+
return aNumber - bNumber || a.detail.localeCompare(b.detail);
|
|
88
|
+
});
|
|
89
|
+
return matches.length > 0 ? { record: matches[0], phrase } : null;
|
|
90
|
+
}
|
|
91
|
+
function supportsLifecycleProgressJoin(artifact) {
|
|
92
|
+
const header = isMapping(artifact.data.header) ? artifact.data.header : {};
|
|
93
|
+
const title = String(header.title ?? artifact.data.title ?? "").toLowerCase();
|
|
94
|
+
return title.includes("runtime lifecycle");
|
|
95
|
+
}
|
|
96
|
+
function progressProvenance(match, task) {
|
|
97
|
+
return {
|
|
98
|
+
source_family: "progress",
|
|
99
|
+
source_kind: match.record.field === "summary" ? "typed_writer_archive" : "typed_writer_cycle",
|
|
100
|
+
artifact_path: match.record.artifactPath,
|
|
101
|
+
cycle_number: match.record.cycleNumber,
|
|
102
|
+
field: match.record.field,
|
|
103
|
+
task_number: task.number ?? null,
|
|
104
|
+
deterministic_match: match.phrase,
|
|
105
|
+
detail: match.record.detail,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function planProvenance(planPath, task) {
|
|
109
|
+
return {
|
|
110
|
+
source_family: "plan",
|
|
111
|
+
source_kind: "immutable_archive",
|
|
112
|
+
artifact_path: planPath,
|
|
113
|
+
field: `tasks[${String(task.number ?? "?")}].evidence`,
|
|
114
|
+
task_number: task.number ?? null,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Project evidence into the read-only state response. Existing plan evidence
|
|
119
|
+
* remains intact; missing evidence is resolved only through a deterministic
|
|
120
|
+
* join to typed progress cycles or compacted writer summaries.
|
|
121
|
+
*/
|
|
122
|
+
export function resolvePlanTaskEvidence(artifact, tasks, schemas) {
|
|
123
|
+
const records = supportsLifecycleProgressJoin(artifact) ? progressEvidenceRecords(schemas) : [];
|
|
124
|
+
const sources = new Set();
|
|
125
|
+
let complete = true;
|
|
126
|
+
const resolved = tasks.map((task) => {
|
|
127
|
+
const stored = hasRecordedEvidence(task.evidence);
|
|
128
|
+
const match = stored ? null : progressMatch(task, records);
|
|
129
|
+
const provenance = [];
|
|
130
|
+
let evidence = task.evidence;
|
|
131
|
+
if (stored) {
|
|
132
|
+
provenance.push(planProvenance(artifact.path, task));
|
|
133
|
+
sources.add("plan");
|
|
134
|
+
}
|
|
135
|
+
else if (match) {
|
|
136
|
+
evidence = [{
|
|
137
|
+
source: "progress",
|
|
138
|
+
cycle_number: match.record.cycleNumber,
|
|
139
|
+
field: match.record.field,
|
|
140
|
+
detail: match.record.detail,
|
|
141
|
+
}];
|
|
142
|
+
provenance.push(progressProvenance(match, task));
|
|
143
|
+
sources.add("progress");
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
evidence = [];
|
|
147
|
+
complete = false;
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
...task,
|
|
151
|
+
evidence,
|
|
152
|
+
evidence_status: hasRecordedEvidence(evidence) ? "present" : "missing",
|
|
153
|
+
evidence_provenance: provenance,
|
|
154
|
+
};
|
|
155
|
+
});
|
|
156
|
+
return { tasks: resolved, complete, sources: [...sources].sort() };
|
|
157
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { entityListFamily } from "../state/entityRetrievalHelp.js";
|
|
2
|
+
import { sourceProvenance } from "./capabilityContext/shared.js";
|
|
3
|
+
import { asList } from "./stateQuery.js";
|
|
4
|
+
import { preCutoverCommand } from "./preCutoverCommand.js";
|
|
5
|
+
const PLAN_LIST_COMMAND = preCutoverCommand(`state ${entityListFamily("plans").commandTokens.join(" ")} list --format json`);
|
|
6
|
+
function diagnosticEntries(value) {
|
|
7
|
+
return asList(value).filter((entry) => Boolean(entry && typeof entry === "object" && !Array.isArray(entry)));
|
|
8
|
+
}
|
|
9
|
+
/** Shared lifecycle health projection for status and plan-consuming capabilities. */
|
|
10
|
+
export function planLifecycleState(plan) {
|
|
11
|
+
const diagnostics = diagnosticEntries(plan.diagnostics);
|
|
12
|
+
const degradedDiagnostics = diagnostics.filter((diagnostic) => diagnostic.category !== "legacy");
|
|
13
|
+
const exists = Boolean(plan.exists);
|
|
14
|
+
const active = plan.active === true;
|
|
15
|
+
const activePath = typeof plan.active_path === "string" ? plan.active_path : null;
|
|
16
|
+
const currentDiagnostics = activePath
|
|
17
|
+
? degradedDiagnostics.filter((diagnostic) => diagnostic.path === activePath)
|
|
18
|
+
: degradedDiagnostics;
|
|
19
|
+
const currentPlanDegraded = currentDiagnostics.length > 0;
|
|
20
|
+
const status = degradedDiagnostics.length > 0 ? "degraded" : !exists ? "unavailable" : active ? "available" : "history_only";
|
|
21
|
+
return {
|
|
22
|
+
status,
|
|
23
|
+
diagnostic_count: degradedDiagnostics.length,
|
|
24
|
+
diagnostics: degradedDiagnostics,
|
|
25
|
+
current_plan_degraded: currentPlanDegraded,
|
|
26
|
+
execution_eligible: active && !currentPlanDegraded,
|
|
27
|
+
source_provenance: sourceProvenance("plan", PLAN_LIST_COMMAND, "source.diagnostics"),
|
|
28
|
+
caveats: status === "degraded"
|
|
29
|
+
? [
|
|
30
|
+
currentPlanDegraded
|
|
31
|
+
? "Current plan lifecycle data is degraded; executable plan work is withheld until it is repaired."
|
|
32
|
+
: "Historical plan lifecycle data is degraded; archived plans remain non-executable.",
|
|
33
|
+
]
|
|
34
|
+
: [],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const indexes = new WeakMap();
|
|
2
|
+
/** Retain the complete canonical task graph for in-process capability projections. */
|
|
3
|
+
export function rememberPlanTaskIndex(plan, tasks) {
|
|
4
|
+
indexes.set(plan, tasks);
|
|
5
|
+
}
|
|
6
|
+
/** Public plan projections remain bounded; orchestration reads this exact internal graph. */
|
|
7
|
+
export function planTaskIndex(plan) {
|
|
8
|
+
return indexes.get(plan) ?? (Array.isArray(plan.tasks)
|
|
9
|
+
? plan.tasks.filter((task) => Boolean(task) && typeof task === "object" && !Array.isArray(task))
|
|
10
|
+
: []);
|
|
11
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { CANONICAL_DEVELOPMENT_CLI } from "../core/developmentChannel.js";
|
|
2
|
+
export const PRE_CUTOVER_CLI = CANONICAL_DEVELOPMENT_CLI;
|
|
3
|
+
export function assertPreCutoverCommand(command) {
|
|
4
|
+
if (!command.startsWith(`${PRE_CUTOVER_CLI} `) || command.includes("agentera@latest")) {
|
|
5
|
+
throw new Error(`pre-cutover v3 command must use ${PRE_CUTOVER_CLI}: ${command}`);
|
|
6
|
+
}
|
|
7
|
+
return command;
|
|
8
|
+
}
|
|
9
|
+
export function preCutoverCommand(argumentsText) {
|
|
10
|
+
if (!argumentsText.trim() || /(?:^|\s)(?:npx|agentera(?:@\S+)?)(?:\s|$)/.test(argumentsText)) {
|
|
11
|
+
throw new Error(`pre-cutover command arguments must not select an executable or channel: ${argumentsText}`);
|
|
12
|
+
}
|
|
13
|
+
return assertPreCutoverCommand(`${PRE_CUTOVER_CLI} ${argumentsText}`);
|
|
14
|
+
}
|
|
15
|
+
export function preCutoverCommandFromBare(command) {
|
|
16
|
+
if (!command.startsWith("agentera ")) {
|
|
17
|
+
throw new Error(`expected a bare Agentera command before pre-cutover channel binding: ${command}`);
|
|
18
|
+
}
|
|
19
|
+
return preCutoverCommand(command.slice("agentera ".length));
|
|
20
|
+
}
|
|
21
|
+
const BARE_V3_COMMAND = /(?<![\w@-])agentera (?=(?:prime|doctor|upgrade|route|state|schema|check|report)\b)/g;
|
|
22
|
+
/** Bind every executable Agentera command in a pre-cutover instruction body. */
|
|
23
|
+
export function preCutoverInstructionBody(body) {
|
|
24
|
+
if (/\bagentera@latest\b/.test(body) || /\bnpx\s+(?:-y\s+)?agentera\s/.test(body)) {
|
|
25
|
+
throw new Error(`pre-cutover instruction body selects a bare or stable Agentera executable`);
|
|
26
|
+
}
|
|
27
|
+
const bound = body.replace(BARE_V3_COMMAND, `${PRE_CUTOVER_CLI} `);
|
|
28
|
+
if (BARE_V3_COMMAND.test(bound)) {
|
|
29
|
+
throw new Error(`pre-cutover instruction body retains a bare Agentera command`);
|
|
30
|
+
}
|
|
31
|
+
return bound;
|
|
32
|
+
}
|
package/dist/cli/prime-blob.js
CHANGED
|
@@ -1,3 +1,71 @@
|
|
|
1
|
-
|
|
2
|
-
export const PRIME_BLOB =
|
|
3
|
-
|
|
1
|
+
import { preCutoverInstructionBody } from "./preCutoverCommand.js";
|
|
2
|
+
export const PRIME_BLOB = preCutoverInstructionBody([
|
|
3
|
+
"# agentera priming guide",
|
|
4
|
+
"",
|
|
5
|
+
"## Routing: agentera vs native tools",
|
|
6
|
+
"",
|
|
7
|
+
"Use the top-level state-command namespace for routine questions about project state.",
|
|
8
|
+
"Use native tools (read, grep, glob, edit, bash) for source code operations.",
|
|
9
|
+
"",
|
|
10
|
+
"Agentera queries return compact answers from structured state. Do NOT read",
|
|
11
|
+
"raw YAML artifacts directly. The CLI is the seam between agent and state.",
|
|
12
|
+
"",
|
|
13
|
+
"For supported artifact mutations, use the typed state writer instead of native",
|
|
14
|
+
"file edits. Discover the live fields and examples before constructing a write:",
|
|
15
|
+
" agentera state <artifact> explain --format json",
|
|
16
|
+
" agentera state <artifact> explain --verb <verb> --format json",
|
|
17
|
+
"",
|
|
18
|
+
"Supported state commands:",
|
|
19
|
+
" agentera prime # Composite orientation briefing",
|
|
20
|
+
" agentera prime --guidance # Print this guide",
|
|
21
|
+
" agentera state decisions [--topic TOPIC] # Decision log",
|
|
22
|
+
" agentera state health [--dimension DIM] # Latest health audit",
|
|
23
|
+
" agentera state todo [--severity LEVEL] # TODO summary",
|
|
24
|
+
" agentera state plan # Plans, task evidence + provenance",
|
|
25
|
+
" agentera state progress [--limit N] # Recent cycle summary",
|
|
26
|
+
" agentera state docs # Docs mappings + stale docs",
|
|
27
|
+
" agentera state objective # Active optimize objective",
|
|
28
|
+
" agentera state experiments # Active optimize experiments",
|
|
29
|
+
" agentera check lint --artifact PLAN.md --file plan.yaml # Optional draft prose preview; the writer validates published bytes",
|
|
30
|
+
" agentera state query --list-artifacts # Discover advanced schema names",
|
|
31
|
+
" agentera state query <artifact-name> # Advanced custom artifact query",
|
|
32
|
+
"",
|
|
33
|
+
"Supported typed writes:",
|
|
34
|
+
" agentera state progress append ... # Record verified cycle evidence",
|
|
35
|
+
" agentera state decisions explain --format json # Discover decision record operations",
|
|
36
|
+
" agentera state plan explain --format json # Discover plan record operations",
|
|
37
|
+
" plan create ordinals are atomic-input symbols only; published plan/task identities are bare ten-letter IDs",
|
|
38
|
+
" agentera state health append --input PATH # Record one complete audit",
|
|
39
|
+
" agentera state experiments publish --objective ID --input PATH # Publish one validated experiment",
|
|
40
|
+
" Add --dry-run to preview any mutation without publishing it.",
|
|
41
|
+
"",
|
|
42
|
+
"When to use agentera:",
|
|
43
|
+
' - "What did we decide about X?" → agentera state decisions --topic X',
|
|
44
|
+
' - "How\'s the codebase health?" → agentera state health',
|
|
45
|
+
' - "What\'s the coupling grade?" → agentera state health --dimension coupling_health',
|
|
46
|
+
' - "Any critical open issues?" → agentera state todo --severity critical',
|
|
47
|
+
" - Recording supported artifact state → agentera state <artifact> explain",
|
|
48
|
+
"",
|
|
49
|
+
"When to use native tools:",
|
|
50
|
+
" - Reading or editing source code → native read/edit/grep",
|
|
51
|
+
" - Searching files → native glob/grep",
|
|
52
|
+
" - Running commands → native bash",
|
|
53
|
+
" - Browsing the web → native fetch",
|
|
54
|
+
"",
|
|
55
|
+
"## Recovery: stale or missing artifacts",
|
|
56
|
+
"",
|
|
57
|
+
"If `agentera <state>` returns empty:",
|
|
58
|
+
" 1. The artifact may not exist yet (no data has been written to it).",
|
|
59
|
+
" 2. Run without filters to see all available data.",
|
|
60
|
+
" 3. If data is stale, the producing capability needs to run again.",
|
|
61
|
+
"",
|
|
62
|
+
"If entity state is corrupted:",
|
|
63
|
+
" 1. Run `agentera check validate state --format json` for exact diagnostics.",
|
|
64
|
+
" 2. Use the reported bare ID with `agentera state <artifact> get --id ID --format json`.",
|
|
65
|
+
" 3. Follow the validator recovery; do not edit writer-owned entity files directly.",
|
|
66
|
+
"",
|
|
67
|
+
"If schemas are missing:",
|
|
68
|
+
" 1. Run `agentera schema --format json`.",
|
|
69
|
+
" 2. Make sure Agentera's app files exist at the reported `managedAppRoot` path.",
|
|
70
|
+
" 3. Run `agentera doctor` for a plain-language repair preview.",
|
|
71
|
+
].join("\n") + "\n");
|