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,205 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { loadYamlMappingFile } from "../core/yaml.js";
|
|
3
|
+
import { resolveSourceRoot } from "../core/sourceRoot.js";
|
|
4
|
+
import { ARTIFACT_PROTOCOL_PATHS, normalizeArtifactProtocolId, } from "./artifactProtocolIds.js";
|
|
5
|
+
export class VerbosityBudgetContractError extends Error {
|
|
6
|
+
constructor(message) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = "VerbosityBudgetContractError";
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function verbosityBudgetAuthorityPath() {
|
|
12
|
+
return path.join(resolveSourceRoot(), "references", "artifacts", "verbosity-budget-authority.yaml");
|
|
13
|
+
}
|
|
14
|
+
function mapping(value) {
|
|
15
|
+
return value !== null && typeof value === "object" && !Array.isArray(value)
|
|
16
|
+
? value
|
|
17
|
+
: null;
|
|
18
|
+
}
|
|
19
|
+
function positiveNumber(value) {
|
|
20
|
+
return typeof value === "number" && Number.isFinite(value) && value > 0;
|
|
21
|
+
}
|
|
22
|
+
function readMapping(filePath, label) {
|
|
23
|
+
try {
|
|
24
|
+
return loadYamlMappingFile(filePath);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
throw new VerbosityBudgetContractError(`${label} ${filePath} is unreadable or malformed: ${error.message}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function loadContract(contractPath) {
|
|
31
|
+
const contract = readMapping(contractPath, "verbosity budget authority");
|
|
32
|
+
if (contract.schema_version !== "agentera.verbosityBudgetAuthority.v1") {
|
|
33
|
+
throw new VerbosityBudgetContractError(`verbosity budget authority ${contractPath} has unsupported schema_version`);
|
|
34
|
+
}
|
|
35
|
+
const authority = mapping(contract.authority);
|
|
36
|
+
const scope = mapping(contract.scope);
|
|
37
|
+
const supported = scope?.supported_artifacts;
|
|
38
|
+
if (!authority || typeof authority.schema_directory !== "string" || !Array.isArray(supported)) {
|
|
39
|
+
throw new VerbosityBudgetContractError(`verbosity budget authority ${contractPath} must declare authority.schema_directory and scope.supported_artifacts`);
|
|
40
|
+
}
|
|
41
|
+
const schemaDirectory = path.resolve(path.dirname(contractPath), authority.schema_directory);
|
|
42
|
+
const owners = new Map();
|
|
43
|
+
for (const raw of supported) {
|
|
44
|
+
const entry = mapping(raw);
|
|
45
|
+
const artifactId = entry?.artifact_id;
|
|
46
|
+
const schema = entry?.schema;
|
|
47
|
+
if (typeof artifactId !== "string" || normalizeArtifactProtocolId(artifactId) !== artifactId) {
|
|
48
|
+
throw new VerbosityBudgetContractError(`verbosity budget authority ${contractPath} contains an invalid artifact_id`);
|
|
49
|
+
}
|
|
50
|
+
if (typeof schema !== "string" || !schema.endsWith(".yaml") || path.basename(schema) !== schema) {
|
|
51
|
+
throw new VerbosityBudgetContractError(`verbosity budget authority ${contractPath} contains an invalid schema owner for ${artifactId}`);
|
|
52
|
+
}
|
|
53
|
+
if (owners.has(artifactId)) {
|
|
54
|
+
throw new VerbosityBudgetContractError(`verbosity budget authority ${contractPath} declares ambiguous owners for ${artifactId}`);
|
|
55
|
+
}
|
|
56
|
+
owners.set(artifactId, {
|
|
57
|
+
artifactId,
|
|
58
|
+
authorityPath: contractPath,
|
|
59
|
+
schemaPath: path.join(schemaDirectory, schema),
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
if (owners.size === 0) {
|
|
63
|
+
throw new VerbosityBudgetContractError(`verbosity budget authority ${contractPath} declares no supported artifacts`);
|
|
64
|
+
}
|
|
65
|
+
return { contractPath, owners };
|
|
66
|
+
}
|
|
67
|
+
function protocolIdForOwner(input) {
|
|
68
|
+
const normalized = normalizeArtifactProtocolId(input);
|
|
69
|
+
if (normalized)
|
|
70
|
+
return normalized;
|
|
71
|
+
const comparable = input.trim().replaceAll("\\", "/").toLowerCase();
|
|
72
|
+
for (const [artifactId, artifactPath] of Object.entries(ARTIFACT_PROTOCOL_PATHS)) {
|
|
73
|
+
const canonicalPath = artifactPath.toLowerCase();
|
|
74
|
+
if (comparable === canonicalPath || comparable === path.posix.basename(canonicalPath)) {
|
|
75
|
+
return artifactId;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
export function resolveVerbosityBudgetOwner(artifact, contractPath = verbosityBudgetAuthorityPath()) {
|
|
81
|
+
const contract = loadContract(contractPath);
|
|
82
|
+
const artifactId = protocolIdForOwner(artifact);
|
|
83
|
+
const owner = artifactId ? contract.owners.get(artifactId) : undefined;
|
|
84
|
+
if (!owner) {
|
|
85
|
+
throw new VerbosityBudgetContractError(`unsupported artifact ${JSON.stringify(artifact)} in verbosity budget authority; ` +
|
|
86
|
+
`valid artifact_id values: ${[...contract.owners.keys()].sort().join(", ")}`);
|
|
87
|
+
}
|
|
88
|
+
return owner;
|
|
89
|
+
}
|
|
90
|
+
function invalidDimension(scope, declarationId, error) {
|
|
91
|
+
return {
|
|
92
|
+
scope,
|
|
93
|
+
classification: "invalid_declaration",
|
|
94
|
+
unit: null,
|
|
95
|
+
limit: null,
|
|
96
|
+
declarationId,
|
|
97
|
+
error,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function classifyDeclaration(raw, index) {
|
|
101
|
+
const declaration = mapping(raw);
|
|
102
|
+
if (!declaration)
|
|
103
|
+
return invalidDimension(`<entry:${index}>`, null, "budget declaration must be a mapping");
|
|
104
|
+
const scope = typeof declaration.scope === "string" && declaration.scope.trim()
|
|
105
|
+
? declaration.scope.trim()
|
|
106
|
+
: `<entry:${index}>`;
|
|
107
|
+
const declarationId = typeof declaration.id === "string" ? declaration.id : null;
|
|
108
|
+
if (scope.startsWith("<entry:")) {
|
|
109
|
+
return invalidDimension(scope, declarationId, "budget declaration must define a non-empty scope");
|
|
110
|
+
}
|
|
111
|
+
const hasWords = Object.hasOwn(declaration, "max_words");
|
|
112
|
+
const hasTokens = Object.hasOwn(declaration, "token_budget");
|
|
113
|
+
if (Number(hasWords) + Number(hasTokens) !== 1) {
|
|
114
|
+
return invalidDimension(scope, declarationId, "budget declaration must define exactly one of max_words or token_budget");
|
|
115
|
+
}
|
|
116
|
+
if (hasWords) {
|
|
117
|
+
if (declaration.max_words === null) {
|
|
118
|
+
return { scope, classification: "explicit_no_limit", unit: "words", limit: null, declarationId };
|
|
119
|
+
}
|
|
120
|
+
if (positiveNumber(declaration.max_words)) {
|
|
121
|
+
return {
|
|
122
|
+
scope,
|
|
123
|
+
classification: "numeric_limit",
|
|
124
|
+
unit: "words",
|
|
125
|
+
limit: declaration.max_words,
|
|
126
|
+
declarationId,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
return invalidDimension(scope, declarationId, "max_words must be a positive number or null");
|
|
130
|
+
}
|
|
131
|
+
if (positiveNumber(declaration.token_budget)) {
|
|
132
|
+
return {
|
|
133
|
+
scope,
|
|
134
|
+
classification: "non_word_unit",
|
|
135
|
+
unit: "tokens",
|
|
136
|
+
limit: declaration.token_budget,
|
|
137
|
+
declarationId,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
return invalidDimension(scope, declarationId, "token_budget must be a positive number");
|
|
141
|
+
}
|
|
142
|
+
function isNonVerbosityBudgetEntry(raw) {
|
|
143
|
+
const declaration = mapping(raw);
|
|
144
|
+
return Boolean(declaration &&
|
|
145
|
+
typeof declaration.rule === "string" &&
|
|
146
|
+
!Object.hasOwn(declaration, "max_words") &&
|
|
147
|
+
!Object.hasOwn(declaration, "token_budget"));
|
|
148
|
+
}
|
|
149
|
+
export function inspectArtifactVerbosityBudget(artifact, contractPath = verbosityBudgetAuthorityPath()) {
|
|
150
|
+
const owner = resolveVerbosityBudgetOwner(artifact, contractPath);
|
|
151
|
+
let schema;
|
|
152
|
+
try {
|
|
153
|
+
schema = readMapping(owner.schemaPath, `verbosity budget owner for ${owner.artifactId}`);
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
return {
|
|
157
|
+
...owner,
|
|
158
|
+
dimensions: [invalidDimension("<authority>", null, error.message)],
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
const budget = mapping(schema.BUDGET);
|
|
162
|
+
if (!budget || Object.keys(budget).length === 0) {
|
|
163
|
+
return {
|
|
164
|
+
...owner,
|
|
165
|
+
dimensions: [invalidDimension("<authority>", null, "owning schema must define a non-empty BUDGET mapping")],
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
const dimensions = Object.entries(budget)
|
|
169
|
+
.filter(([, declaration]) => !isNonVerbosityBudgetEntry(declaration))
|
|
170
|
+
.map(([index, declaration]) => classifyDeclaration(declaration, index));
|
|
171
|
+
if (dimensions.length === 0) {
|
|
172
|
+
return {
|
|
173
|
+
...owner,
|
|
174
|
+
dimensions: [invalidDimension("<authority>", null, "owning schema defines no verbosity budget declarations")],
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
const counts = new Map();
|
|
178
|
+
for (const dimension of dimensions)
|
|
179
|
+
counts.set(dimension.scope, (counts.get(dimension.scope) ?? 0) + 1);
|
|
180
|
+
return {
|
|
181
|
+
...owner,
|
|
182
|
+
dimensions: dimensions.map((dimension) => (counts.get(dimension.scope) ?? 0) > 1
|
|
183
|
+
? invalidDimension(dimension.scope, dimension.declarationId, `duplicate budget scope ${dimension.scope}`)
|
|
184
|
+
: dimension),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
export function validateVerbosityBudgetContract(contractPath = verbosityBudgetAuthorityPath()) {
|
|
188
|
+
let contract;
|
|
189
|
+
try {
|
|
190
|
+
contract = loadContract(contractPath);
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
return [error.message];
|
|
194
|
+
}
|
|
195
|
+
const errors = [];
|
|
196
|
+
for (const artifactId of contract.owners.keys()) {
|
|
197
|
+
const inspected = inspectArtifactVerbosityBudget(artifactId, contractPath);
|
|
198
|
+
for (const dimension of inspected.dimensions) {
|
|
199
|
+
if (dimension.classification === "invalid_declaration") {
|
|
200
|
+
errors.push(`${artifactId}:${dimension.scope}: ${dimension.error}`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return errors;
|
|
205
|
+
}
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { spawnSync } from "node:child_process";
|
|
4
|
+
import { isDeepStrictEqual } from "node:util";
|
|
5
|
+
import { resolvePath } from "../core/paths.js";
|
|
6
|
+
import { resolveSourceRoot } from "../core/sourceRoot.js";
|
|
7
|
+
import { loadYamlMappingFile } from "../core/yaml.js";
|
|
8
|
+
export const RELEASE_METADATA_AUTHORITY_FILES = [
|
|
9
|
+
"registry.json",
|
|
10
|
+
"packages/cli/package.json",
|
|
11
|
+
"references/cli/update-channels.yaml",
|
|
12
|
+
];
|
|
13
|
+
export const RELEASE_METADATA_ADVISORY_FILES = [
|
|
14
|
+
"packages/cli/bundle/.agentera-npx-bundle.json",
|
|
15
|
+
];
|
|
16
|
+
export const RELEASE_PROVENANCE_PATHS = [
|
|
17
|
+
"packages/cli/src",
|
|
18
|
+
"packages/cli/scripts",
|
|
19
|
+
"packages/cli/README.md",
|
|
20
|
+
"packages/cli/tsconfig.json",
|
|
21
|
+
"skills",
|
|
22
|
+
"references",
|
|
23
|
+
"README.md",
|
|
24
|
+
"UPGRADE.md",
|
|
25
|
+
"CHANGELOG.md",
|
|
26
|
+
"DESIGN.md",
|
|
27
|
+
"LICENSE",
|
|
28
|
+
"registry.json",
|
|
29
|
+
"fixtures/routing/hybrid-corpus.yaml",
|
|
30
|
+
];
|
|
31
|
+
export const RELEASE_PROVENANCE_EXCLUSIONS = [
|
|
32
|
+
"packages/cli/src/release/releaseMetadata.ts",
|
|
33
|
+
"references/adapters/package-surface-characterization.md",
|
|
34
|
+
];
|
|
35
|
+
export const STABLE_SHIM_PROVENANCE_PATHS = [
|
|
36
|
+
"packages/cli/shim/bin",
|
|
37
|
+
"packages/cli/shim/lib",
|
|
38
|
+
"packages/cli/shim/README.md",
|
|
39
|
+
"packages/cli/shim/LICENSE",
|
|
40
|
+
];
|
|
41
|
+
const SEMVER_CORE_RE = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;
|
|
42
|
+
const SEMVER_STRICT_RE = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;
|
|
43
|
+
const PRE_RELEASE_RE = /-(.+)$/;
|
|
44
|
+
const GIT_REF_HEX_RE = /^[0-9a-f]{40}$/i;
|
|
45
|
+
function rootDefault() {
|
|
46
|
+
return resolveSourceRoot();
|
|
47
|
+
}
|
|
48
|
+
function readJson(pathname) {
|
|
49
|
+
try {
|
|
50
|
+
return JSON.parse(fs.readFileSync(pathname, "utf8"));
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function runGit(root, args) {
|
|
57
|
+
return spawnSync("git", ["-C", root, ...args], {
|
|
58
|
+
encoding: "utf8",
|
|
59
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function normalizedPackageMetadata(value) {
|
|
63
|
+
const normalized = structuredClone(value);
|
|
64
|
+
delete normalized.version;
|
|
65
|
+
if (normalized.agentera && typeof normalized.agentera === "object" && !Array.isArray(normalized.agentera)) {
|
|
66
|
+
delete normalized.agentera.gitRef;
|
|
67
|
+
}
|
|
68
|
+
return normalized;
|
|
69
|
+
}
|
|
70
|
+
function validateGitRefProvenance(root, gitRef) {
|
|
71
|
+
const inside = runGit(root, ["rev-parse", "--is-inside-work-tree"]);
|
|
72
|
+
if (inside.status !== 0 || String(inside.stdout).trim() !== "true")
|
|
73
|
+
return [];
|
|
74
|
+
const commit = runGit(root, ["cat-file", "-e", `${gitRef}^{commit}`]);
|
|
75
|
+
if (commit.status !== 0) {
|
|
76
|
+
return [`packages/cli/package.json: agentera.gitRef ${JSON.stringify(gitRef)} is not a commit in the local repository`];
|
|
77
|
+
}
|
|
78
|
+
const pathspec = [
|
|
79
|
+
...RELEASE_PROVENANCE_PATHS,
|
|
80
|
+
...RELEASE_PROVENANCE_EXCLUSIONS.map((entry) => `:(exclude)${entry}`),
|
|
81
|
+
];
|
|
82
|
+
const diff = runGit(root, ["diff", "--quiet", gitRef, "--", ...pathspec]);
|
|
83
|
+
if (diff.status !== 0) {
|
|
84
|
+
if (diff.status === 1) {
|
|
85
|
+
return [
|
|
86
|
+
`packages/cli/package.json: agentera.gitRef ${JSON.stringify(gitRef)} does not match the governed package source tree; ` +
|
|
87
|
+
"select the last substantive package-source commit, excluding approved release metadata",
|
|
88
|
+
];
|
|
89
|
+
}
|
|
90
|
+
return [`packages/cli/package.json: unable to compare agentera.gitRef ${JSON.stringify(gitRef)} with the governed package source tree`];
|
|
91
|
+
}
|
|
92
|
+
const status = runGit(root, ["status", "--porcelain=v1", "--untracked-files=all", "--", ...pathspec]);
|
|
93
|
+
if (status.status !== 0 || String(status.stdout).trim() !== "") {
|
|
94
|
+
return [
|
|
95
|
+
"packages/cli/package.json: governed package source has uncommitted or untracked changes outside approved release metadata",
|
|
96
|
+
];
|
|
97
|
+
}
|
|
98
|
+
const selectedPackage = runGit(root, ["show", `${gitRef}:packages/cli/package.json`]);
|
|
99
|
+
const currentPackage = readPackageJson(root);
|
|
100
|
+
try {
|
|
101
|
+
const selected = JSON.parse(String(selectedPackage.stdout));
|
|
102
|
+
if (selectedPackage.status !== 0 ||
|
|
103
|
+
currentPackage === null ||
|
|
104
|
+
!isDeepStrictEqual(normalizedPackageMetadata(selected), normalizedPackageMetadata(currentPackage))) {
|
|
105
|
+
return [
|
|
106
|
+
`packages/cli/package.json: package contract differs from agentera.gitRef ${JSON.stringify(gitRef)} ` +
|
|
107
|
+
"outside the permitted version and gitRef fields",
|
|
108
|
+
];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return [`packages/cli/package.json: unable to read package contract from agentera.gitRef ${JSON.stringify(gitRef)}`];
|
|
113
|
+
}
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
export function validateStableShimGitRefProvenance(root, gitRef) {
|
|
117
|
+
const manifestPath = "packages/cli/shim/package.json";
|
|
118
|
+
const inside = runGit(root, ["rev-parse", "--is-inside-work-tree"]);
|
|
119
|
+
if (inside.status !== 0 || String(inside.stdout).trim() !== "true")
|
|
120
|
+
return [];
|
|
121
|
+
const commit = runGit(root, ["cat-file", "-e", `${gitRef}^{commit}`]);
|
|
122
|
+
if (commit.status !== 0) {
|
|
123
|
+
return [`${manifestPath}: agentera.gitRef ${JSON.stringify(gitRef)} is not a commit in the local repository`];
|
|
124
|
+
}
|
|
125
|
+
const diff = runGit(root, ["diff", "--quiet", gitRef, "--", ...STABLE_SHIM_PROVENANCE_PATHS]);
|
|
126
|
+
if (diff.status !== 0) {
|
|
127
|
+
return [
|
|
128
|
+
`${manifestPath}: agentera.gitRef ${JSON.stringify(gitRef)} does not match the stable shim packaged inputs; ` +
|
|
129
|
+
"select the last substantive shim-source commit",
|
|
130
|
+
];
|
|
131
|
+
}
|
|
132
|
+
const status = runGit(root, [
|
|
133
|
+
"status",
|
|
134
|
+
"--porcelain=v1",
|
|
135
|
+
"--untracked-files=all",
|
|
136
|
+
"--",
|
|
137
|
+
manifestPath,
|
|
138
|
+
...STABLE_SHIM_PROVENANCE_PATHS,
|
|
139
|
+
]);
|
|
140
|
+
if (status.status !== 0 || String(status.stdout).trim() !== "") {
|
|
141
|
+
return [
|
|
142
|
+
`${manifestPath}: stable shim packaged inputs have uncommitted or untracked changes outside approved release metadata`,
|
|
143
|
+
];
|
|
144
|
+
}
|
|
145
|
+
const selected = runGit(root, ["show", `${gitRef}:${manifestPath}`]);
|
|
146
|
+
const current = readJson(path.join(root, manifestPath));
|
|
147
|
+
try {
|
|
148
|
+
const selectedManifest = JSON.parse(String(selected.stdout));
|
|
149
|
+
if (selected.status !== 0 ||
|
|
150
|
+
current === null ||
|
|
151
|
+
!isDeepStrictEqual(normalizedPackageMetadata(selectedManifest), normalizedPackageMetadata(current))) {
|
|
152
|
+
return [
|
|
153
|
+
`${manifestPath}: package contract differs from agentera.gitRef ${JSON.stringify(gitRef)} ` +
|
|
154
|
+
"outside the permitted version and gitRef fields",
|
|
155
|
+
];
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return [`${manifestPath}: unable to read package contract from agentera.gitRef ${JSON.stringify(gitRef)}`];
|
|
160
|
+
}
|
|
161
|
+
return [];
|
|
162
|
+
}
|
|
163
|
+
function readRegistryVersion(root) {
|
|
164
|
+
const source = "registry.json";
|
|
165
|
+
const data = readJson(path.join(root, source));
|
|
166
|
+
if (data === null) {
|
|
167
|
+
return { version: null, source };
|
|
168
|
+
}
|
|
169
|
+
const skills = data.skills;
|
|
170
|
+
if (!Array.isArray(skills) || skills.length === 0) {
|
|
171
|
+
return { version: null, source };
|
|
172
|
+
}
|
|
173
|
+
const first = skills[0];
|
|
174
|
+
if (!first || typeof first !== "object") {
|
|
175
|
+
return { version: null, source };
|
|
176
|
+
}
|
|
177
|
+
const version = first.version;
|
|
178
|
+
return { version: typeof version === "string" ? version : null, source };
|
|
179
|
+
}
|
|
180
|
+
function readPackageJson(root) {
|
|
181
|
+
const candidate = path.join(root, "packages/cli/package.json");
|
|
182
|
+
if (!fs.existsSync(candidate)) {
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
return readJson(candidate);
|
|
186
|
+
}
|
|
187
|
+
function readUpdateChannels(root) {
|
|
188
|
+
const candidate = path.join(root, "references/cli/update-channels.yaml");
|
|
189
|
+
if (!fs.existsSync(candidate)) {
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
try {
|
|
193
|
+
return loadYamlMappingFile(candidate); // cast: YAML parse IO boundary
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
function readBundleSentinel(root) {
|
|
200
|
+
const source = "packages/cli/bundle/.agentera-npx-bundle.json";
|
|
201
|
+
const candidate = path.join(root, source);
|
|
202
|
+
if (!fs.existsSync(candidate)) {
|
|
203
|
+
return { version: null, source };
|
|
204
|
+
}
|
|
205
|
+
const data = readJson(candidate);
|
|
206
|
+
if (data === null) {
|
|
207
|
+
return { version: null, source };
|
|
208
|
+
}
|
|
209
|
+
const version = data.suiteVersion;
|
|
210
|
+
return { version: typeof version === "string" ? version : null, source };
|
|
211
|
+
}
|
|
212
|
+
/** Parse `X.Y.Z` core (ignore pre-release and build metadata). */
|
|
213
|
+
export function parseSemverCore(version) {
|
|
214
|
+
const match = SEMVER_CORE_RE.exec(version);
|
|
215
|
+
if (!match) {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
const core = `${match[1]}.${match[2]}.${match[3]}`;
|
|
219
|
+
const preMatch = PRE_RELEASE_RE.exec(version);
|
|
220
|
+
return { core, preRelease: preMatch ? preMatch[1] : null };
|
|
221
|
+
}
|
|
222
|
+
function pickChannelDefaults(authority) {
|
|
223
|
+
if (authority === null) {
|
|
224
|
+
return { development: null, stable: null };
|
|
225
|
+
}
|
|
226
|
+
const versionResolution = authority.version_resolution;
|
|
227
|
+
const latestOnChannel = versionResolution?.latest_on_channel;
|
|
228
|
+
const defaults = (latestOnChannel?.offline_defaults ?? {});
|
|
229
|
+
return {
|
|
230
|
+
development: typeof defaults.development === "string" ? defaults.development : null,
|
|
231
|
+
stable: typeof defaults.stable === "string" ? defaults.stable : null,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
export function readReleaseMetadata(root = rootDefault()) {
|
|
235
|
+
const resolved = resolvePath(root);
|
|
236
|
+
const registry = readRegistryVersion(resolved);
|
|
237
|
+
const pkg = readPackageJson(resolved);
|
|
238
|
+
const channels = readUpdateChannels(resolved);
|
|
239
|
+
const bundle = readBundleSentinel(resolved);
|
|
240
|
+
const topVersion = pkg && typeof pkg.version === "string" ? pkg.version : null;
|
|
241
|
+
const agenteraBlock = pkg && typeof pkg.agentera === "object" && pkg.agentera !== null
|
|
242
|
+
? pkg.agentera
|
|
243
|
+
: null;
|
|
244
|
+
const suiteVersion = agenteraBlock && typeof agenteraBlock.suiteVersion === "string"
|
|
245
|
+
? agenteraBlock.suiteVersion
|
|
246
|
+
: null;
|
|
247
|
+
const gitRef = agenteraBlock && typeof agenteraBlock.gitRef === "string"
|
|
248
|
+
? agenteraBlock.gitRef
|
|
249
|
+
: null;
|
|
250
|
+
const { development, stable } = pickChannelDefaults(channels);
|
|
251
|
+
return {
|
|
252
|
+
authoritativeVersion: registry.version,
|
|
253
|
+
authoritativeSource: registry.source,
|
|
254
|
+
packageVersion: topVersion,
|
|
255
|
+
packageSuiteVersion: suiteVersion,
|
|
256
|
+
packageGitRef: gitRef,
|
|
257
|
+
developmentChannelDefault: development,
|
|
258
|
+
stableChannelDefault: stable,
|
|
259
|
+
bundleSuiteVersion: bundle.version,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Validate release-metadata coherence. Returns an empty array when the
|
|
264
|
+
* source-tree version surfaces agree on a single release train.
|
|
265
|
+
*/
|
|
266
|
+
export function validateReleaseMetadata(root = rootDefault(), adapter = "development") {
|
|
267
|
+
if (adapter === "stable") {
|
|
268
|
+
const manifestPath = "packages/cli/shim/package.json";
|
|
269
|
+
const shim = readJson(path.join(resolvePath(root), manifestPath));
|
|
270
|
+
if (shim === null)
|
|
271
|
+
return [`${manifestPath}: missing or unreadable; cannot validate release-metadata`];
|
|
272
|
+
const agentera = shim.agentera;
|
|
273
|
+
const gitRef = agentera && typeof agentera === "object" && !Array.isArray(agentera)
|
|
274
|
+
? agentera.gitRef
|
|
275
|
+
: null;
|
|
276
|
+
if (typeof gitRef !== "string" || !GIT_REF_HEX_RE.test(gitRef)) {
|
|
277
|
+
return [`${manifestPath}: agentera.gitRef must be a 40-character hex SHA for stable shim provenance`];
|
|
278
|
+
}
|
|
279
|
+
return validateStableShimGitRefProvenance(resolvePath(root), gitRef);
|
|
280
|
+
}
|
|
281
|
+
const errors = [];
|
|
282
|
+
const snap = readReleaseMetadata(root);
|
|
283
|
+
const rootLabel = path.basename(resolvePath(root)) || "repo root";
|
|
284
|
+
// 1. registry.json must publish a valid semver `skills[0].version`.
|
|
285
|
+
if (snap.authoritativeVersion === null) {
|
|
286
|
+
errors.push("registry.json: skills[0].version is required for release-metadata validation");
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
const parsed = parseSemverCore(snap.authoritativeVersion);
|
|
290
|
+
if (parsed === null) {
|
|
291
|
+
errors.push(`registry.json: skills[0].version ${JSON.stringify(snap.authoritativeVersion)} is not a valid semver`);
|
|
292
|
+
}
|
|
293
|
+
else if (parsed.preRelease !== null) {
|
|
294
|
+
// registry.json is the suite authority and stays on the released core;
|
|
295
|
+
// pre-release suffixes belong only to packages/cli/package.json.
|
|
296
|
+
errors.push(`registry.json: skills[0].version must be a released core version (no pre-release suffix); got ${JSON.stringify(snap.authoritativeVersion)}`);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// 2. packages/cli/package.json must exist and parse.
|
|
300
|
+
if (snap.packageVersion === null && snap.packageSuiteVersion === null && snap.packageGitRef === null) {
|
|
301
|
+
errors.push("packages/cli/package.json: missing or unreadable; cannot validate release-metadata");
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
// 2a. top-level `version` must be valid semver and share its core with registry.
|
|
305
|
+
if (snap.packageVersion === null) {
|
|
306
|
+
errors.push("packages/cli/package.json: top-level `version` is required");
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
const parsed = parseSemverCore(snap.packageVersion);
|
|
310
|
+
if (parsed === null) {
|
|
311
|
+
errors.push(`packages/cli/package.json: top-level version ${JSON.stringify(snap.packageVersion)} is not a valid semver`);
|
|
312
|
+
}
|
|
313
|
+
else if (snap.authoritativeVersion !== null &&
|
|
314
|
+
parseSemverCore(snap.authoritativeVersion)?.core !== parsed.core) {
|
|
315
|
+
errors.push(`release-metadata divergence: registry.json skills[0].version core is ${JSON.stringify(parseSemverCore(snap.authoritativeVersion)?.core)} ` +
|
|
316
|
+
`but packages/cli/package.json top-level version core is ${JSON.stringify(parsed.core)}; ` +
|
|
317
|
+
`the npm package version must share its major.minor.patch with the registry suite version`);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// 2b. `agentera.suiteVersion` must match registry exactly.
|
|
321
|
+
if (snap.packageSuiteVersion === null) {
|
|
322
|
+
errors.push("packages/cli/package.json: `agentera.suiteVersion` is required");
|
|
323
|
+
}
|
|
324
|
+
else if (snap.authoritativeVersion !== null &&
|
|
325
|
+
snap.packageSuiteVersion !== snap.authoritativeVersion) {
|
|
326
|
+
errors.push(`release-metadata divergence: registry.json skills[0].version is ${JSON.stringify(snap.authoritativeVersion)} ` +
|
|
327
|
+
`but packages/cli/package.json agentera.suiteVersion is ${JSON.stringify(snap.packageSuiteVersion)}; ` +
|
|
328
|
+
`the agentera.suiteVersion mirror must equal the registry version exactly`);
|
|
329
|
+
}
|
|
330
|
+
else if (!SEMVER_STRICT_RE.test(snap.packageSuiteVersion)) {
|
|
331
|
+
errors.push(`packages/cli/package.json: agentera.suiteVersion ${JSON.stringify(snap.packageSuiteVersion)} is not a released core semver`);
|
|
332
|
+
}
|
|
333
|
+
// 2c. `agentera.gitRef` must identify the governed package source tree.
|
|
334
|
+
if (snap.packageGitRef === null || snap.packageGitRef === "") {
|
|
335
|
+
errors.push("packages/cli/package.json: `agentera.gitRef` is required for release-metadata validation");
|
|
336
|
+
}
|
|
337
|
+
else if (!GIT_REF_HEX_RE.test(snap.packageGitRef)) {
|
|
338
|
+
errors.push(`packages/cli/package.json: agentera.gitRef ${JSON.stringify(snap.packageGitRef)} must be a 40-character hex SHA; ` +
|
|
339
|
+
`short SHAs and branch names are not reproducible release references`);
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
errors.push(...validateGitRefProvenance(resolvePath(root), snap.packageGitRef));
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// 3. update-channels.yaml development default must equal the registry version.
|
|
346
|
+
if (snap.developmentChannelDefault === null) {
|
|
347
|
+
errors.push("references/cli/update-channels.yaml: version_resolution.latest_on_channel.offline_defaults.development is required");
|
|
348
|
+
}
|
|
349
|
+
else if (snap.authoritativeVersion !== null &&
|
|
350
|
+
snap.developmentChannelDefault !== snap.authoritativeVersion) {
|
|
351
|
+
errors.push(`release-metadata divergence: registry.json skills[0].version is ${JSON.stringify(snap.authoritativeVersion)} ` +
|
|
352
|
+
`but update-channels.yaml offline_defaults.development is ${JSON.stringify(snap.developmentChannelDefault)}; ` +
|
|
353
|
+
`the development channel default must match the registry version exactly`);
|
|
354
|
+
}
|
|
355
|
+
// 4. Stable channel default is informational on the @next branch; the
|
|
356
|
+
// validator surfaces it so maintainers can confirm the stable line still
|
|
357
|
+
// resolves to its declared 2.x version. A drift on the stable channel
|
|
358
|
+
// alone is not an error here — that lane is owned by the `main` branch
|
|
359
|
+
// compatibility boundary per `references/cli/update-channels.yaml`.
|
|
360
|
+
void snap.stableChannelDefault;
|
|
361
|
+
// 5. Advisory check on the local bundle sentinel.
|
|
362
|
+
if (snap.bundleSuiteVersion !== null) {
|
|
363
|
+
if (snap.authoritativeVersion !== null &&
|
|
364
|
+
snap.bundleSuiteVersion !== snap.authoritativeVersion) {
|
|
365
|
+
errors.push(`release-metadata drift (advisory): packages/cli/bundle/.agentera-npx-bundle.json suiteVersion is ${JSON.stringify(snap.bundleSuiteVersion)} ` +
|
|
366
|
+
`but registry.json skills[0].version is ${JSON.stringify(snap.authoritativeVersion)}; ` +
|
|
367
|
+
`run \`npm run bundle:data\` (or \`pnpm -C packages/cli run bundle:data\`) at ${rootLabel} to refresh the local bundle copy before publishing`);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
return errors;
|
|
371
|
+
}
|
|
372
|
+
export function releaseMetadataMain(opts = {}) {
|
|
373
|
+
const root = resolvePath(opts.root ?? rootDefault());
|
|
374
|
+
const out = opts.out ?? ((line) => process.stdout.write(line + "\n"));
|
|
375
|
+
const err = opts.err ?? ((line) => process.stderr.write(line + "\n"));
|
|
376
|
+
const errors = validateReleaseMetadata(root, opts.adapter);
|
|
377
|
+
if (errors.length > 0) {
|
|
378
|
+
out("release-metadata validation failed:");
|
|
379
|
+
for (const message of errors)
|
|
380
|
+
out(`- ${message}`);
|
|
381
|
+
return 1;
|
|
382
|
+
}
|
|
383
|
+
out("release-metadata ok");
|
|
384
|
+
return 0;
|
|
385
|
+
}
|