agentera 3.0.0-dev.5 → 3.0.0-dev.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +119 -22
- package/bundle/CHANGELOG.md +1351 -0
- package/bundle/DESIGN.md +229 -0
- package/bundle/LICENSE +201 -0
- package/bundle/README.md +143 -0
- package/bundle/UPGRADE.md +236 -0
- package/bundle/extract-corpus-parity.json +21 -0
- package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
- package/bundle/references/adapters/package-publication.json +437 -0
- package/bundle/references/adapters/package-registry.yaml +435 -189
- package/bundle/references/adapters/package-surface-characterization.md +66 -35
- package/bundle/references/adapters/runtime-lifecycle-adapters.yaml +74 -0
- package/bundle/references/adapters/runtime-lifecycle-authority.yaml +62 -0
- package/bundle/references/adapters/runtime-lifecycle-operation-contract.yaml +84 -0
- package/bundle/references/adapters/runtime-retired-resources.yaml +333 -0
- package/bundle/references/analysis/evidence-tier-authority.yaml +518 -0
- package/bundle/references/analysis/verification-policy.yaml +191 -0
- package/bundle/references/artifacts/artifact-registry-interface-model.yaml +20 -10
- package/bundle/references/artifacts/glossary-entry-contract.yaml +1254 -0
- package/bundle/references/artifacts/state-storage-authority.yaml +3022 -0
- package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
- package/bundle/references/cli/app-lifecycle-vocabulary.yaml +7 -8
- package/bundle/references/cli/capability-instruction-contract.yaml +11 -14
- package/bundle/references/cli/hybrid-route-contract.yaml +438 -0
- package/bundle/references/cli/routing-model.md +155 -0
- package/bundle/references/cli/trigger-schema-enrichment.md +147 -0
- package/bundle/references/cli/update-channels.yaml +19 -1
- package/bundle/references/cli/vocabulary-index.yaml +20 -17
- package/bundle/references/cli/vocabulary.md +326 -361
- package/bundle/references/meta/retained-reference-authority.yaml +151 -0
- package/bundle/registry.json +13 -13
- package/bundle/skills/agentera/SKILL.md +224 -422
- package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +84 -0
- package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/exit.yaml +2 -2
- package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +25 -0
- package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/validation.yaml +37 -18
- package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +102 -0
- package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/exit.yaml +6 -5
- package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +27 -0
- package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +176 -0
- package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/artifacts.yaml +12 -12
- package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/exit.yaml +5 -5
- package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +16 -0
- package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/validation.yaml +7 -7
- package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +51 -0
- package/bundle/skills/agentera/capabilities/{resonera → discuss}/schemas/exit.yaml +2 -2
- package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +20 -0
- package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +144 -0
- package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +80 -0
- package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +16 -0
- package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/validation.yaml +18 -18
- package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/artifacts.yaml +18 -18
- package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/exit.yaml +2 -2
- package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +16 -0
- package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/validation.yaml +9 -9
- package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +76 -0
- package/bundle/skills/agentera/capabilities/{orkestrera → orchestrate}/schemas/exit.yaml +9 -7
- package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +23 -0
- package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +121 -0
- package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +66 -0
- package/bundle/skills/agentera/capabilities/{planera → plan}/schemas/exit.yaml +2 -2
- package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +23 -0
- package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +121 -0
- package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +23 -0
- package/bundle/skills/agentera/capabilities/{profilera → profile}/schemas/exit.yaml +6 -5
- package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +20 -0
- package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +115 -0
- package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +24 -0
- package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +16 -0
- package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/validation.yaml +2 -2
- package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +73 -0
- package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +22 -0
- package/bundle/skills/agentera/capabilities/{hej → status}/schemas/validation.yaml +5 -5
- package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/artifacts.yaml +16 -16
- package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/exit.yaml +7 -6
- package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +23 -0
- package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/validation.yaml +18 -20
- package/bundle/skills/agentera/capability_schema_contract.yaml +178 -34
- package/bundle/skills/agentera/protocol.yaml +31 -31
- package/bundle/skills/agentera/route-phrases.yaml +81 -0
- package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +5 -4
- package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +39 -21
- package/bundle/skills/agentera/schemas/artifacts/design.yaml +5 -4
- package/bundle/skills/agentera/schemas/artifacts/docs.yaml +15 -19
- package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +145 -14
- package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +82 -0
- package/bundle/skills/agentera/schemas/artifacts/health.yaml +58 -21
- package/bundle/skills/agentera/schemas/artifacts/objective.yaml +22 -8
- package/bundle/skills/agentera/schemas/artifacts/plan.yaml +458 -36
- package/bundle/skills/agentera/schemas/artifacts/progress.yaml +128 -17
- package/bundle/skills/agentera/schemas/artifacts/todo.yaml +342 -42
- package/bundle/skills/agentera/schemas/artifacts/vision.yaml +3 -3
- package/dist/analytics/extractCorpus/cli.js +190 -0
- package/dist/analytics/extractCorpus/copilotSessions.js +275 -0
- package/dist/analytics/extractCorpus/core.js +392 -0
- package/dist/analytics/extractCorpus/corpus.js +167 -0
- package/dist/analytics/extractCorpus/coverageAudit.js +260 -0
- package/dist/analytics/extractCorpus/cursorSessions.js +425 -0
- package/dist/analytics/extractCorpus/evidenceTiers.js +603 -0
- package/dist/analytics/extractCorpus/extractCorpusParity.js +105 -0
- package/dist/analytics/extractCorpus/filesystemSources.js +118 -0
- package/dist/analytics/extractCorpus/index.js +14 -0
- package/dist/analytics/extractCorpus/jsonlSessions.js +204 -0
- package/dist/analytics/extractCorpus/sqliteCaps.js +43 -0
- package/dist/analytics/extractCorpus/sqliteSessions.js +367 -0
- package/dist/analytics/extractCorpus/tierReader.js +108 -0
- package/dist/analytics/extractCorpus.js +2 -1791
- package/dist/analytics/glossaryAdviceResolution.js +166 -0
- package/dist/analytics/glossaryInputAcquisition.js +319 -0
- package/dist/analytics/personalGlossaryAdmission.js +133 -0
- package/dist/analytics/personalGlossaryProfile.js +219 -0
- package/dist/analytics/profileSignals.js +211 -0
- package/dist/analytics/usageStats.js +169 -42
- package/dist/audit/terminologyDrift.js +281 -0
- package/dist/bin/agentera.js +3 -2
- package/dist/capabilities/audit/instructions.js +16 -0
- package/dist/capabilities/build/instructions.js +56 -0
- package/dist/capabilities/design/instructions.js +4 -0
- package/dist/capabilities/discuss/instructions.js +29 -0
- package/dist/capabilities/document/instructions.js +11 -0
- package/dist/capabilities/index.js +29 -27
- package/dist/capabilities/optimize/instructions.js +14 -0
- package/dist/capabilities/orchestrate/instructions.js +42 -0
- package/dist/capabilities/plan/instructions.js +33 -0
- package/dist/capabilities/profile/instructions.js +70 -0
- package/dist/capabilities/research/instructions.js +5 -0
- package/dist/capabilities/status/instructions.js +15 -0
- package/dist/capabilities/status/startupInstructions.js +34 -0
- package/dist/capabilities/vision/instructions.js +4 -0
- package/dist/cli/appContext.js +30 -24
- package/dist/cli/argvalidate.js +0 -1
- package/dist/cli/capabilityContext/benchmark.js +565 -0
- package/dist/cli/capabilityContext/bespoke.js +44 -0
- package/dist/cli/capabilityContext/build.js +242 -0
- package/dist/cli/capabilityContext/closeout.js +233 -0
- package/dist/cli/capabilityContext/contract.js +179 -0
- package/dist/cli/capabilityContext/evidence.js +463 -0
- package/dist/cli/capabilityContext/index.js +3 -0
- package/dist/cli/capabilityContext/orchestration.js +131 -0
- package/dist/cli/capabilityContext/planState.js +260 -0
- package/dist/cli/capabilityContext/progress.js +142 -0
- package/dist/cli/capabilityContext/projectVerification.js +409 -0
- package/dist/cli/capabilityContext/shared.js +83 -0
- package/dist/cli/capabilityContext/slim.js +152 -0
- package/dist/cli/capabilityContext/startup.js +150 -0
- package/dist/cli/capabilityContext/startupAggregation.js +68 -0
- package/dist/cli/capabilityContext/types.js +56 -0
- package/dist/cli/capabilityContext.js +1 -2487
- package/dist/cli/commands/appHome.js +22 -0
- package/dist/cli/commands/capability.js +4 -4
- package/dist/cli/commands/compact.js +164 -14
- package/dist/cli/commands/doctor.js +122 -97
- package/dist/cli/commands/durability.js +81 -0
- package/dist/cli/commands/glossaryAdvice.js +138 -0
- package/dist/cli/commands/lint.js +26 -44
- package/dist/cli/commands/personalGlossary.js +176 -0
- package/dist/cli/commands/prime/briefOrientation.js +747 -0
- package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
- package/dist/cli/commands/prime/bundleStatus.js +190 -0
- package/dist/cli/commands/prime/collectEntityOrientation.js +326 -0
- package/dist/cli/commands/prime/collectOrientationState.js +212 -0
- package/dist/cli/commands/prime/orientationOutput.js +399 -0
- package/dist/cli/commands/prime/types.js +1 -0
- package/dist/cli/commands/prime/v1Migration.js +38 -0
- package/dist/cli/commands/prime.js +80 -558
- package/dist/cli/commands/profileGrounding.js +55 -0
- package/dist/cli/commands/query.js +78 -53
- package/dist/cli/commands/report.js +96 -25
- package/dist/cli/commands/route.js +142 -0
- package/dist/cli/commands/schema.js +266 -143
- package/dist/cli/commands/state/decisions.js +387 -0
- package/dist/cli/commands/state/docs.js +70 -0
- package/dist/cli/commands/state/experimentRecords.js +151 -0
- package/dist/cli/commands/state/experiments.js +14 -0
- package/dist/cli/commands/state/get.js +129 -0
- package/dist/cli/commands/state/health.js +14 -0
- package/dist/cli/commands/state/index.js +16 -0
- package/dist/cli/commands/state/list.js +194 -0
- package/dist/cli/commands/state/objective.js +25 -0
- package/dist/cli/commands/state/plan.js +14 -0
- package/dist/cli/commands/state/planTasks.js +154 -0
- package/dist/cli/commands/state/plans.js +154 -0
- package/dist/cli/commands/state/progress.js +13 -0
- package/dist/cli/commands/state/shared.js +14 -0
- package/dist/cli/commands/state/todo.js +42 -0
- package/dist/cli/commands/state/write.js +430 -0
- package/dist/cli/commands/upgrade.js +146 -5
- package/dist/cli/commands/upgradeVerify.js +118 -0
- package/dist/cli/commands/validate.js +272 -223
- package/dist/cli/commands/verify.js +24 -9
- package/dist/cli/contracts/bundleStatus.js +1 -0
- package/dist/cli/contracts/orientationState.js +1 -0
- package/dist/cli/dispatch/argvParser.js +32 -0
- package/dist/cli/dispatch/check.js +372 -0
- package/dist/cli/dispatch/commands.js +27 -0
- package/dist/cli/dispatch/index.js +207 -0
- package/dist/cli/dispatch/lifecycle.js +652 -0
- package/dist/cli/dispatch/prime.js +139 -0
- package/dist/cli/dispatch/projections.js +17 -0
- package/dist/cli/dispatch/shared.js +63 -0
- package/dist/cli/dispatch/state.js +140 -0
- package/dist/cli/dispatch.js +1 -1294
- package/dist/cli/errors.js +16 -17
- package/dist/cli/help.js +394 -43
- package/dist/cli/migrationRequired.js +87 -0
- package/dist/cli/orientation/attention.js +61 -0
- package/dist/cli/orientation/corpusCoverage.js +102 -0
- package/dist/cli/orientation.js +438 -170
- package/dist/cli/planArtifacts.js +350 -0
- package/dist/cli/planEvidence.js +157 -0
- package/dist/cli/planLifecycleState.js +36 -0
- package/dist/cli/planTaskIndex.js +11 -0
- package/dist/cli/preCutoverCommand.js +32 -0
- package/dist/cli/prime-blob.js +71 -3
- package/dist/cli/profileAcquisition.js +167 -0
- package/dist/cli/startupCompletenessContract.js +59 -0
- package/dist/cli/stateQuery.js +56 -14
- package/dist/cli/structured.js +0 -1
- package/dist/cli/todoMarkdown.js +25 -12
- package/dist/cli/todoReadinessSelection.js +192 -0
- package/dist/cli/todoSeverity.js +18 -0
- package/dist/core/atomicWriter.js +20 -0
- package/dist/core/developmentChannel.js +1 -0
- package/dist/core/developmentInvocation.js +374 -0
- package/dist/core/difflib.js +0 -1
- package/dist/core/envPaths.js +20 -0
- package/dist/core/jsonValue.js +5 -0
- package/dist/core/paths.js +0 -1
- package/dist/core/pyjson.js +67 -3
- package/dist/core/shell.js +4 -0
- package/dist/core/skillIdentity.js +23 -0
- package/dist/core/sourceRoot.js +9 -12
- package/dist/core/text.js +10 -0
- package/dist/core/toml.js +0 -1
- package/dist/core/yaml.js +8 -1
- package/dist/eval/evalSkills.js +30 -26
- package/dist/eval/hybridRouteEvaluation.js +155 -0
- package/dist/eval/semanticEval.js +43 -20
- package/dist/eval/semanticFixtures.js +16 -5
- package/dist/hooks/common.js +11 -79
- package/dist/hooks/compaction/apply.js +446 -0
- package/dist/hooks/compaction/dryRun.js +184 -0
- package/dist/hooks/compaction/index.js +22 -0
- package/dist/hooks/compaction/parse.js +325 -0
- package/dist/hooks/compaction/retention.js +202 -0
- package/dist/hooks/compaction/status.js +360 -0
- package/dist/hooks/compaction/types.js +5 -0
- package/dist/hooks/validateArtifact/agentFacing.js +9 -0
- package/dist/hooks/validateArtifact/index.js +92 -0
- package/dist/hooks/validateArtifact/markdown.js +145 -0
- package/dist/hooks/validateArtifact/schema.js +546 -0
- package/dist/hooks/validateArtifact/traversal.js +107 -0
- package/dist/hooks/validateArtifact/violations.js +107 -0
- package/dist/migrate/v2HandoffManifest.js +452 -0
- package/dist/registries/activationContract.js +2 -0
- package/dist/registries/activationTuples.js +107 -0
- package/dist/registries/artifactProtocolIds.js +78 -0
- package/dist/registries/artifactRegistry.js +224 -63
- package/dist/registries/artifactSchemaProjection.js +45 -0
- package/dist/registries/capabilityContract.js +129 -2
- package/dist/registries/evaluatorHandoffContract.js +2 -3
- package/dist/registries/evidenceTierContract.js +371 -0
- package/dist/registries/glossaryAdviceContract.js +79 -0
- package/dist/registries/glossaryCaveatContract.js +67 -0
- package/dist/registries/glossaryConsumerContractValidation.js +787 -0
- package/dist/registries/glossaryEntryContract.js +757 -0
- package/dist/registries/glossaryTermIdentity.js +17 -0
- package/dist/registries/glossaryTermOccurrence.js +20 -0
- package/dist/registries/hybridRoute.js +274 -0
- package/dist/registries/hybridRouteReceipt.js +221 -0
- package/dist/registries/packagePublication.js +229 -0
- package/dist/registries/packageRegistry.js +187 -211
- package/dist/registries/todoReadinessContract.js +448 -0
- package/dist/registries/triggerLoader.js +174 -0
- package/dist/registries/verbosityBudgetContract.js +205 -0
- package/dist/release/releaseMetadata.js +385 -0
- package/dist/runtime/lifecycleAdapterContract.js +457 -0
- package/dist/runtime/lifecycleAdapters.js +777 -0
- package/dist/runtime/lifecycleAuthority.js +453 -0
- package/dist/runtime/lifecycleOperationContract.js +123 -0
- package/dist/runtime/lifecycleOperations.js +634 -0
- package/dist/runtime/lifecycleOwnershipJournal.js +622 -0
- package/dist/runtime/lifecyclePublication.js +415 -0
- package/dist/runtime/lifecycleSnapshot.js +438 -0
- package/dist/runtime/nativeResourceCleanup.js +502 -0
- package/dist/setup/opencode.js +20 -0
- package/dist/setup/opencodeConstants.js +1 -0
- package/dist/setup/sharedSkill.js +45 -0
- package/dist/setup/smokeChecks.js +21 -82
- package/dist/state/archiveDiscovery.js +580 -0
- package/dist/state/archivePublication.js +225 -0
- package/dist/state/archiveRecovery.js +237 -0
- package/dist/state/archiveReplay.js +53 -0
- package/dist/state/canonicalMigrationRecord.js +36 -0
- package/dist/state/changelog.js +221 -0
- package/dist/state/decisionEntities.js +367 -0
- package/dist/state/decisionLegacyValidation.js +215 -0
- package/dist/state/decisionMigrationProvenance.js +199 -0
- package/dist/state/decisionOverlay.js +254 -0
- package/dist/state/decisionRevision.js +256 -0
- package/dist/state/decisionRevisionMigration.js +89 -0
- package/dist/state/directRetrieval.js +323 -0
- package/dist/state/durability.js +324 -0
- package/dist/state/entityCutover.js +459 -0
- package/dist/state/entityCutoverGit.js +127 -0
- package/dist/state/entityGlossaryAuthority.js +13 -0
- package/dist/state/entityListProjection.js +187 -0
- package/dist/state/entityListRuntimeRegistry.js +85 -0
- package/dist/state/entityMigrationCausality.js +97 -0
- package/dist/state/entityMigrationIdentity.js +5 -0
- package/dist/state/entityMigrationPreview.js +846 -0
- package/dist/state/entityMigrationTodo.js +133 -0
- package/dist/state/entityPublicationContext.js +806 -0
- package/dist/state/entityRetrievalHelp.js +506 -0
- package/dist/state/entityStorage.js +899 -0
- package/dist/state/exactReplacementRecovery.js +18 -0
- package/dist/state/experimentArchive.js +63 -0
- package/dist/state/experimentIdentity.js +202 -0
- package/dist/state/healthEntities.js +262 -0
- package/dist/state/healthEntityValidation.js +18 -0
- package/dist/state/healthRepair.js +69 -0
- package/dist/state/installRoot.js +64 -25
- package/dist/state/legacyEntityCutoverEvidence.js +65 -0
- package/dist/state/legacyIdentity.js +47 -0
- package/dist/state/legacySummaryRecord.js +6 -0
- package/dist/state/listAccounting.js +54 -0
- package/dist/state/listClassification.js +17 -0
- package/dist/state/listCursor.js +42 -0
- package/dist/state/listRetrieval.js +781 -0
- package/dist/state/migrationSourceBinding.js +30 -0
- package/dist/state/objectiveExperimentEntities.js +322 -0
- package/dist/state/planEntities.js +982 -0
- package/dist/state/planIdentity.js +47 -0
- package/dist/state/planLineageValidation.js +52 -0
- package/dist/state/planReplacementTransaction.js +475 -0
- package/dist/state/planRetrieval.js +313 -0
- package/dist/state/planTaskRetrieval.js +294 -0
- package/dist/state/progressEntities.js +512 -0
- package/dist/state/progressGlossaryCaveat.js +168 -0
- package/dist/state/progressPublicationOrder.js +19 -0
- package/dist/state/projectRoot.js +62 -0
- package/dist/state/projectionPolicy.js +190 -0
- package/dist/state/retrievalAuthority.js +156 -0
- package/dist/state/safeProjectFile.js +155 -0
- package/dist/state/startupAnalysis/benchmark.js +432 -0
- package/dist/state/startupAnalysis/contract.js +160 -0
- package/dist/state/startupAnalysis/helpers.js +286 -0
- package/dist/state/startupAnalysis/index.js +6 -0
- package/dist/state/startupAnalysis/metrics.js +340 -0
- package/dist/state/startupAnalysis/records.js +198 -0
- package/dist/state/startupAnalysis/report.js +111 -0
- package/dist/state/startupAnalysis/threshold.js +512 -0
- package/dist/state/startupAnalysis.js +2 -1953
- package/dist/state/startupProjection.js +499 -0
- package/dist/state/stateMode.js +85 -0
- package/dist/state/stateStorageAuthority.js +47 -0
- package/dist/state/summaryEntityRead.js +25 -0
- package/dist/state/summaryMigrationProvenance.js +66 -0
- package/dist/state/summarySourceRowAuthority.js +36 -0
- package/dist/state/todoActivationSafety.js +58 -0
- package/dist/state/todoDocsEntities.js +1069 -0
- package/dist/state/todoDocsEntityValidation.js +158 -0
- package/dist/state/todoMarkdownProjection.js +51 -0
- package/dist/state/todoReconciliationActivation.js +140 -0
- package/dist/state/todoReconciliationInspection.js +169 -0
- package/dist/state/todoReconciliationRepair.js +170 -0
- package/dist/state/todoReconciliationTransaction.js +582 -0
- package/dist/state/write/assign.js +20 -0
- package/dist/state/write/candidateMutation.js +269 -0
- package/dist/state/write/errors.js +11 -0
- package/dist/state/write/experimentPublication.js +192 -0
- package/dist/state/write/explain.js +363 -0
- package/dist/state/write/fields.js +61 -0
- package/dist/state/write/glossaryPublication.js +263 -0
- package/dist/state/write/grammar.js +285 -0
- package/dist/state/write/helpers.js +29 -0
- package/dist/state/write/index.js +12 -0
- package/dist/state/write/input.js +367 -0
- package/dist/state/write/lock.js +837 -0
- package/dist/state/write/mutation.js +234 -0
- package/dist/state/write/operations.js +170 -0
- package/dist/state/write/planEvaluation.js +128 -0
- package/dist/state/write/planPublication.js +179 -0
- package/dist/state/write/runtimeOperations.js +144 -0
- package/dist/state/write/serialize.js +1 -0
- package/dist/state/write/transaction.js +52 -0
- package/dist/state/write/validate.js +7 -0
- package/dist/upgrade/appContentRefresh.js +383 -0
- package/dist/upgrade/appModel.js +8 -7
- package/dist/upgrade/atomicWriter.js +1 -0
- package/dist/upgrade/bundleEvidence.js +33 -0
- package/dist/upgrade/channels.js +12 -8
- package/dist/upgrade/compatibility.js +56 -21
- package/dist/upgrade/doctor.js +197 -192
- package/dist/upgrade/doctorClassifier.js +187 -0
- package/dist/upgrade/installedHooksRetirement.js +196 -0
- package/dist/upgrade/legacyAgentCleanup.js +282 -0
- package/dist/upgrade/lifecycleUpgrade.js +113 -0
- package/dist/upgrade/migrateArtifactsV2ToV3.js +367 -149
- package/dist/upgrade/migrationPublication.js +122 -0
- package/dist/upgrade/nextMajorDoctor.js +42 -8
- package/dist/upgrade/npxPlatformStatus.js +22 -0
- package/dist/upgrade/projectIntegration.js +145 -187
- package/dist/upgrade/projectIntegrationDecision.js +50 -0
- package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
- package/dist/upgrade/runtimeMigration.js +273 -363
- package/dist/upgrade/upgradeCommands.js +14 -1
- package/dist/upgrade/upgradeLock.js +85 -0
- package/dist/upgrade/upgradeOrchestrator.js +263 -59
- package/dist/upgrade/v3CapabilitySurface.js +14 -0
- package/dist/upgrade/versionResolution.js +8 -1
- package/dist/validate/activationArtifactEvidence.js +844 -0
- package/dist/validate/activationConjunction.js +816 -0
- package/dist/validate/activationEvidenceManifest.js +515 -0
- package/dist/validate/activationPackageSemantics.js +29 -0
- package/dist/validate/appHomeContract.js +5 -11
- package/dist/validate/bootstrapAuthority.js +44 -0
- package/dist/validate/capability.js +133 -12
- package/dist/validate/crossCapability.js +15 -10
- package/dist/validate/retainedReferenceAuthority.js +879 -0
- package/dist/validate/selfAudit.js +73 -37
- package/dist/validate/v1LegacyCruft.js +131 -0
- package/dist/validate/vocabularyAuthority.js +303 -0
- package/package.json +53 -27
- package/bundle/references/adapters/cursor.md +0 -213
- package/bundle/references/adapters/opencode.md +0 -530
- package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
- package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
- package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
- package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -548
- package/bundle/references/adapters/runtime-feature-parity.md +0 -189
- package/bundle/references/analysis/benchmark.md +0 -267
- package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
- package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
- package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -355
- package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -278
- package/bundle/references/cli/capability-tool-classification.yaml +0 -53
- package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
- package/bundle/references/meta/documentation-inventory.md +0 -43
- package/bundle/references/v1-section-mapping.md +0 -47
- package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
- package/bundle/skills/agentera/agents/dokumentera.toml +0 -6
- package/bundle/skills/agentera/agents/hej.toml +0 -6
- package/bundle/skills/agentera/agents/inspektera.toml +0 -6
- package/bundle/skills/agentera/agents/inspirera.toml +0 -6
- package/bundle/skills/agentera/agents/optimera.toml +0 -6
- package/bundle/skills/agentera/agents/orkestrera.toml +0 -6
- package/bundle/skills/agentera/agents/planera.toml +0 -6
- package/bundle/skills/agentera/agents/profilera.toml +0 -6
- package/bundle/skills/agentera/agents/realisera.toml +0 -6
- package/bundle/skills/agentera/agents/resonera.toml +0 -6
- package/bundle/skills/agentera/agents/visionera.toml +0 -6
- package/bundle/skills/agentera/agents/visualisera.toml +0 -6
- package/bundle/skills/agentera/capabilities/dokumentera/schemas/artifacts.yaml +0 -73
- package/bundle/skills/agentera/capabilities/dokumentera/schemas/triggers.yaml +0 -35
- package/bundle/skills/agentera/capabilities/hej/schemas/artifacts.yaml +0 -69
- package/bundle/skills/agentera/capabilities/hej/schemas/triggers.yaml +0 -58
- package/bundle/skills/agentera/capabilities/inspektera/schemas/artifacts.yaml +0 -76
- package/bundle/skills/agentera/capabilities/inspektera/schemas/triggers.yaml +0 -38
- package/bundle/skills/agentera/capabilities/inspirera/schemas/artifacts.yaml +0 -24
- package/bundle/skills/agentera/capabilities/inspirera/schemas/triggers.yaml +0 -34
- package/bundle/skills/agentera/capabilities/optimera/schemas/triggers.yaml +0 -39
- package/bundle/skills/agentera/capabilities/orkestrera/schemas/artifacts.yaml +0 -64
- package/bundle/skills/agentera/capabilities/orkestrera/schemas/triggers.yaml +0 -42
- package/bundle/skills/agentera/capabilities/orkestrera/schemas/validation.yaml +0 -120
- package/bundle/skills/agentera/capabilities/planera/schemas/artifacts.yaml +0 -62
- package/bundle/skills/agentera/capabilities/planera/schemas/triggers.yaml +0 -34
- package/bundle/skills/agentera/capabilities/planera/schemas/validation.yaml +0 -61
- package/bundle/skills/agentera/capabilities/profilera/schemas/artifacts.yaml +0 -18
- package/bundle/skills/agentera/capabilities/profilera/schemas/triggers.yaml +0 -45
- package/bundle/skills/agentera/capabilities/profilera/schemas/validation.yaml +0 -57
- package/bundle/skills/agentera/capabilities/realisera/schemas/artifacts.yaml +0 -80
- package/bundle/skills/agentera/capabilities/realisera/schemas/triggers.yaml +0 -39
- package/bundle/skills/agentera/capabilities/realisera/schemas/validation.yaml +0 -110
- package/bundle/skills/agentera/capabilities/resonera/schemas/artifacts.yaml +0 -47
- package/bundle/skills/agentera/capabilities/resonera/schemas/triggers.yaml +0 -46
- package/bundle/skills/agentera/capabilities/resonera/schemas/validation.yaml +0 -77
- package/bundle/skills/agentera/capabilities/visionera/schemas/triggers.yaml +0 -41
- package/bundle/skills/agentera/capabilities/visualisera/schemas/triggers.yaml +0 -33
- package/bundle/skills/agentera/references/contract.md +0 -1039
- package/bundle/skills/hej/.claude-plugin/plugin.json +0 -6
- package/bundle/skills/hej/SKILL.md +0 -69
- package/bundle/skills/hej/agents/hej.toml +0 -11
- package/bundle/skills/hej/agents/openai.yaml +0 -8
- package/dist/analytics/extractCorpus.js.map +0 -1
- package/dist/analytics/usageStats.js.map +0 -1
- package/dist/bin/agentera.js.map +0 -1
- package/dist/capabilities/dokumentera/instructions.js +0 -6
- package/dist/capabilities/dokumentera/instructions.js.map +0 -1
- package/dist/capabilities/hej/instructions.js +0 -6
- package/dist/capabilities/hej/instructions.js.map +0 -1
- package/dist/capabilities/index.js.map +0 -1
- package/dist/capabilities/inspektera/instructions.js +0 -6
- package/dist/capabilities/inspektera/instructions.js.map +0 -1
- package/dist/capabilities/inspirera/instructions.js +0 -6
- package/dist/capabilities/inspirera/instructions.js.map +0 -1
- package/dist/capabilities/optimera/instructions.js +0 -6
- package/dist/capabilities/optimera/instructions.js.map +0 -1
- package/dist/capabilities/orkestrera/instructions.js +0 -6
- package/dist/capabilities/orkestrera/instructions.js.map +0 -1
- package/dist/capabilities/planera/instructions.js +0 -6
- package/dist/capabilities/planera/instructions.js.map +0 -1
- package/dist/capabilities/profilera/instructions.js +0 -6
- package/dist/capabilities/profilera/instructions.js.map +0 -1
- package/dist/capabilities/realisera/instructions.js +0 -6
- package/dist/capabilities/realisera/instructions.js.map +0 -1
- package/dist/capabilities/resonera/instructions.js +0 -6
- package/dist/capabilities/resonera/instructions.js.map +0 -1
- package/dist/capabilities/visionera/instructions.js +0 -6
- package/dist/capabilities/visionera/instructions.js.map +0 -1
- package/dist/capabilities/visualisera/instructions.js +0 -6
- package/dist/capabilities/visualisera/instructions.js.map +0 -1
- package/dist/cli/appContext.js.map +0 -1
- package/dist/cli/argvalidate.js.map +0 -1
- package/dist/cli/capabilityContext.js.map +0 -1
- package/dist/cli/commands/capability.js.map +0 -1
- package/dist/cli/commands/compact.js.map +0 -1
- package/dist/cli/commands/doctor.js.map +0 -1
- package/dist/cli/commands/lint.js.map +0 -1
- package/dist/cli/commands/prime.js.map +0 -1
- package/dist/cli/commands/query.js.map +0 -1
- package/dist/cli/commands/report.js.map +0 -1
- package/dist/cli/commands/schema.js.map +0 -1
- package/dist/cli/commands/state.js +0 -1023
- package/dist/cli/commands/state.js.map +0 -1
- package/dist/cli/commands/upgrade.js.map +0 -1
- package/dist/cli/commands/validate.js.map +0 -1
- package/dist/cli/commands/verify.js.map +0 -1
- package/dist/cli/dispatch.js.map +0 -1
- package/dist/cli/errors.js.map +0 -1
- package/dist/cli/help.js.map +0 -1
- package/dist/cli/orientation.js.map +0 -1
- package/dist/cli/prime-blob.js.map +0 -1
- package/dist/cli/stateQuery.js.map +0 -1
- package/dist/cli/structured.js.map +0 -1
- package/dist/cli/todoMarkdown.js.map +0 -1
- package/dist/core/difflib.js.map +0 -1
- package/dist/core/paths.js.map +0 -1
- package/dist/core/pyjson.js.map +0 -1
- package/dist/core/sourceRoot.js.map +0 -1
- package/dist/core/toml.js.map +0 -1
- package/dist/core/yaml.js.map +0 -1
- package/dist/eval/evalSkills.js.map +0 -1
- package/dist/eval/semanticEval.js.map +0 -1
- package/dist/eval/semanticFixtures.js.map +0 -1
- package/dist/hooks/common.js.map +0 -1
- package/dist/hooks/compaction.js +0 -935
- package/dist/hooks/compaction.js.map +0 -1
- package/dist/hooks/cursorPreToolUse.js +0 -19
- package/dist/hooks/cursorPreToolUse.js.map +0 -1
- package/dist/hooks/cursorSessionStart.js +0 -71
- package/dist/hooks/cursorSessionStart.js.map +0 -1
- package/dist/hooks/sessionStart.js +0 -209
- package/dist/hooks/sessionStart.js.map +0 -1
- package/dist/hooks/sessionStop.js +0 -212
- package/dist/hooks/sessionStop.js.map +0 -1
- package/dist/hooks/validateArtifact.js +0 -935
- package/dist/hooks/validateArtifact.js.map +0 -1
- package/dist/registries/artifactRegistry.js.map +0 -1
- package/dist/registries/capabilityContract.js.map +0 -1
- package/dist/registries/evaluatorHandoffContract.js.map +0 -1
- package/dist/registries/packageRegistry.js.map +0 -1
- package/dist/registries/runtimeAdapterRegistry.js +0 -315
- package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
- package/dist/setup/codex.js +0 -1197
- package/dist/setup/codex.js.map +0 -1
- package/dist/setup/copilot.js +0 -227
- package/dist/setup/copilot.js.map +0 -1
- package/dist/setup/cursor.js +0 -127
- package/dist/setup/cursor.js.map +0 -1
- package/dist/setup/doctor.js +0 -1297
- package/dist/setup/doctor.js.map +0 -1
- package/dist/setup/smokeChecks.js.map +0 -1
- package/dist/state/installRoot.js.map +0 -1
- package/dist/state/startupAnalysis.js.map +0 -1
- package/dist/upgrade/appModel.js.map +0 -1
- package/dist/upgrade/channels.js.map +0 -1
- package/dist/upgrade/compatibility.js.map +0 -1
- package/dist/upgrade/doctor.js.map +0 -1
- package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -570
- package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
- package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
- package/dist/upgrade/nextMajorDoctor.js.map +0 -1
- package/dist/upgrade/projectIntegration.js.map +0 -1
- package/dist/upgrade/runtimeMigration.js.map +0 -1
- package/dist/upgrade/upgradeCommands.js.map +0 -1
- package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
- package/dist/upgrade/versionResolution.js.map +0 -1
- package/dist/validate/appHomeContract.js.map +0 -1
- package/dist/validate/capability.js.map +0 -1
- package/dist/validate/crossCapability.js.map +0 -1
- package/dist/validate/lifecycleAdapters.js +0 -772
- package/dist/validate/lifecycleAdapters.js.map +0 -1
- package/dist/validate/selfAudit.js.map +0 -1
- /package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/exit.yaml +0 -0
- /package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/exit.yaml +0 -0
- /package/bundle/skills/agentera/capabilities/{hej → status}/schemas/exit.yaml +0 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decision 58 artifact protocol names: one `artifact_id` per artifact in CLI,
|
|
3
|
+
* hooks, validators, and JSON envelopes. Storage paths live here only.
|
|
4
|
+
*/
|
|
5
|
+
export const ARTIFACT_PROTOCOL_PATHS = {
|
|
6
|
+
vision: ".agentera/vision.yaml",
|
|
7
|
+
decisions: ".agentera/decisions.yaml",
|
|
8
|
+
plan: ".agentera/plan.yaml",
|
|
9
|
+
progress: ".agentera/progress.yaml",
|
|
10
|
+
health: ".agentera/health.yaml",
|
|
11
|
+
docs: ".agentera/docs.yaml",
|
|
12
|
+
objective: ".agentera/objective.yaml",
|
|
13
|
+
experiments: ".agentera/experiments.yaml",
|
|
14
|
+
todo: "TODO.md",
|
|
15
|
+
changelog: "CHANGELOG.md",
|
|
16
|
+
design: "DESIGN.md",
|
|
17
|
+
glossary: ".agentera/glossary.yaml",
|
|
18
|
+
};
|
|
19
|
+
export const HUMAN_FACING_ARTIFACT_IDS = new Set(["todo", "changelog", "design"]);
|
|
20
|
+
export const TRACKED_ARTIFACT_IDS = [
|
|
21
|
+
"progress",
|
|
22
|
+
"decisions",
|
|
23
|
+
"plan",
|
|
24
|
+
"health",
|
|
25
|
+
"design",
|
|
26
|
+
"docs",
|
|
27
|
+
"vision",
|
|
28
|
+
"todo",
|
|
29
|
+
"changelog",
|
|
30
|
+
];
|
|
31
|
+
export const VALIDATE_ARTIFACT_PROTOCOL_IDS = [
|
|
32
|
+
"changelog",
|
|
33
|
+
"decisions",
|
|
34
|
+
"design",
|
|
35
|
+
"docs",
|
|
36
|
+
"health",
|
|
37
|
+
"plan",
|
|
38
|
+
"progress",
|
|
39
|
+
"todo",
|
|
40
|
+
"vision",
|
|
41
|
+
"glossary",
|
|
42
|
+
];
|
|
43
|
+
function artifactProtocolStem(input) {
|
|
44
|
+
const lower = input.trim().toLowerCase();
|
|
45
|
+
return lower.endsWith(".md") ? lower.slice(0, -3) : lower;
|
|
46
|
+
}
|
|
47
|
+
export function normalizeArtifactProtocolId(input) {
|
|
48
|
+
const trimmed = input.trim();
|
|
49
|
+
if (trimmed in ARTIFACT_PROTOCOL_PATHS) {
|
|
50
|
+
return trimmed;
|
|
51
|
+
}
|
|
52
|
+
const lower = trimmed.toLowerCase();
|
|
53
|
+
if (lower in ARTIFACT_PROTOCOL_PATHS) {
|
|
54
|
+
return lower;
|
|
55
|
+
}
|
|
56
|
+
const stem = artifactProtocolStem(trimmed);
|
|
57
|
+
if (stem in ARTIFACT_PROTOCOL_PATHS) {
|
|
58
|
+
return stem;
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
export function requireArtifactProtocolId(input, context) {
|
|
63
|
+
const id = normalizeArtifactProtocolId(input);
|
|
64
|
+
if (id === null) {
|
|
65
|
+
const valid = VALIDATE_ARTIFACT_PROTOCOL_IDS.join(", ");
|
|
66
|
+
throw new Error(`unsupported artifact ${JSON.stringify(input)} in ${context}; valid artifact_id values: ${valid}`);
|
|
67
|
+
}
|
|
68
|
+
return id;
|
|
69
|
+
}
|
|
70
|
+
/** Normalize docs.yaml mapping keys to artifact_id. */
|
|
71
|
+
export function normalizeArtifactMappingKeys(mapping) {
|
|
72
|
+
const out = {};
|
|
73
|
+
for (const [key, value] of Object.entries(mapping)) {
|
|
74
|
+
const id = normalizeArtifactProtocolId(key);
|
|
75
|
+
out[id ?? key] = value;
|
|
76
|
+
}
|
|
77
|
+
return out;
|
|
78
|
+
}
|
|
@@ -2,9 +2,11 @@ import fs from "node:fs";
|
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { loadYamlMapping } from "../core/yaml.js";
|
|
5
|
+
import { resolveProfileDirOverride } from "../core/envPaths.js";
|
|
5
6
|
import { resolvePath } from "../core/paths.js";
|
|
6
7
|
import { resolveSourceRoot } from "../core/sourceRoot.js";
|
|
7
8
|
import { resolveCandidate } from "../state/installRoot.js";
|
|
9
|
+
import { ARTIFACT_PROTOCOL_PATHS } from "./artifactProtocolIds.js";
|
|
8
10
|
function sourceRoot() {
|
|
9
11
|
return resolveSourceRoot();
|
|
10
12
|
}
|
|
@@ -36,12 +38,11 @@ export function normalizePath(p) {
|
|
|
36
38
|
s = s.replace(/<objective-name>/g, "<name>");
|
|
37
39
|
return s.trim();
|
|
38
40
|
}
|
|
39
|
-
const CONTROL_CHAR_RE = /[\x00-\x1f\x7f]/;
|
|
40
41
|
const URI_SCHEME_RE = /^[A-Za-z][A-Za-z0-9+.-]*:/;
|
|
41
42
|
const ENCODED_TRAVERSAL_RE = /%(?:2e|2f|5c)/i;
|
|
42
43
|
const WINDOWS_DRIVE_RE = /^[A-Za-z]:[\\/]/;
|
|
43
44
|
function rejectUnsafeArtifactPath(p, artifactId) {
|
|
44
|
-
if (
|
|
45
|
+
if ([...p].some((char) => char.charCodeAt(0) <= 31 || char.charCodeAt(0) === 127)) {
|
|
45
46
|
throw new Error(`artifact '${artifactId}' path contains control characters`);
|
|
46
47
|
}
|
|
47
48
|
if (ENCODED_TRAVERSAL_RE.test(p)) {
|
|
@@ -67,28 +68,141 @@ function projectPath(projectRoot, artifactPath, artifactId) {
|
|
|
67
68
|
}
|
|
68
69
|
return resolved;
|
|
69
70
|
}
|
|
70
|
-
|
|
71
|
-
|
|
71
|
+
export const EXPECTED_ARTIFACT_SCHEMA_VERSION = "1.0.0";
|
|
72
|
+
function readSchemaMeta(file) {
|
|
73
|
+
const meta = loadYaml(file).meta;
|
|
74
|
+
if (!meta || typeof meta !== "object" || Array.isArray(meta)) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
return meta;
|
|
78
|
+
}
|
|
79
|
+
function warnMalformedSchemaMeta(name) {
|
|
80
|
+
process.stderr.write(`warning: artifact schema ${name} is missing meta; expected v3 schema version ${EXPECTED_ARTIFACT_SCHEMA_VERSION}\n`);
|
|
81
|
+
}
|
|
82
|
+
function warnSchemaVersionMismatch(meta, name) {
|
|
83
|
+
const version = String(meta.version ?? "").trim();
|
|
84
|
+
if (!version || version !== EXPECTED_ARTIFACT_SCHEMA_VERSION) {
|
|
85
|
+
const reported = version || "(missing)";
|
|
86
|
+
process.stderr.write(`warning: artifact schema ${name} version ${reported} does not match expected v3 schema version ${EXPECTED_ARTIFACT_SCHEMA_VERSION}\n`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function listSchemaFiles(dir) {
|
|
72
90
|
if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) {
|
|
73
|
-
return
|
|
91
|
+
return [];
|
|
74
92
|
}
|
|
75
|
-
|
|
93
|
+
return fs
|
|
76
94
|
.readdirSync(dir)
|
|
77
95
|
.filter((name) => name.endsWith(".yaml"))
|
|
78
96
|
.sort();
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Full schema-meta index over an artifact schemas directory. Emits malformed-meta
|
|
100
|
+
* and version-mismatch warnings for every schema file; the full loader relies on
|
|
101
|
+
* this strict coverage to surface drift across the whole identity set.
|
|
102
|
+
*/
|
|
103
|
+
function schemaMetas(dir) {
|
|
104
|
+
const metas = new Map();
|
|
105
|
+
for (const name of listSchemaFiles(dir)) {
|
|
106
|
+
const meta = readSchemaMeta(path.join(dir, name));
|
|
107
|
+
if (!meta) {
|
|
108
|
+
warnMalformedSchemaMeta(name);
|
|
82
109
|
continue;
|
|
83
110
|
}
|
|
84
|
-
|
|
85
|
-
const artifactId = String(
|
|
111
|
+
warnSchemaVersionMismatch(meta, name);
|
|
112
|
+
const artifactId = String(meta.name ?? "").trim();
|
|
86
113
|
if (artifactId) {
|
|
87
|
-
metas.set(artifactId,
|
|
114
|
+
metas.set(artifactId, meta);
|
|
88
115
|
}
|
|
89
116
|
}
|
|
90
117
|
return metas;
|
|
91
118
|
}
|
|
119
|
+
/**
|
|
120
|
+
* Targeted schema-meta lookup for a single artifact identity. Walks the schemas
|
|
121
|
+
* directory only to find the file whose `meta.name` matches `artifactId`, and
|
|
122
|
+
* emits warnings only for that schema. Unrelated malformed or version-mismatched
|
|
123
|
+
* schemas in the same directory stay silent so callers resolving a single
|
|
124
|
+
* identity (e.g. `profile`) don't fan out noise across the required-identity set.
|
|
125
|
+
*/
|
|
126
|
+
function loadSchemaMetaForArtifact(dir, artifactId) {
|
|
127
|
+
for (const name of listSchemaFiles(dir)) {
|
|
128
|
+
let meta;
|
|
129
|
+
try {
|
|
130
|
+
meta = readSchemaMeta(path.join(dir, name));
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (!meta)
|
|
136
|
+
continue;
|
|
137
|
+
if (String(meta.name ?? "").trim() !== artifactId)
|
|
138
|
+
continue;
|
|
139
|
+
warnSchemaVersionMismatch(meta, name);
|
|
140
|
+
return meta;
|
|
141
|
+
}
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
function findRequiredIdentity(model, artifactId) {
|
|
145
|
+
const identities = (model.required_artifact_identities ?? {});
|
|
146
|
+
for (const [scope, identityList] of Object.entries(identities)) {
|
|
147
|
+
if (!Array.isArray(identityList))
|
|
148
|
+
continue;
|
|
149
|
+
for (const identity of identityList) {
|
|
150
|
+
if (!identity || typeof identity !== "object" || Array.isArray(identity))
|
|
151
|
+
continue;
|
|
152
|
+
const id = identity;
|
|
153
|
+
if (String(id.artifact_id ?? "").trim() === artifactId) {
|
|
154
|
+
return { scope, identity: id };
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
function findSpecialCase(model, artifactId) {
|
|
161
|
+
const specialCases = (model.explicit_special_cases ?? []);
|
|
162
|
+
for (const special of specialCases) {
|
|
163
|
+
if (!special || typeof special !== "object" || Array.isArray(special))
|
|
164
|
+
continue;
|
|
165
|
+
const sp = special;
|
|
166
|
+
if (String(sp.artifact_id ?? "").trim() === artifactId) {
|
|
167
|
+
return sp;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
function buildRequiredRecord(scope, identity, meta) {
|
|
173
|
+
const template = identity.path_template;
|
|
174
|
+
return {
|
|
175
|
+
artifactId: String(identity.artifact_id ?? "").trim(),
|
|
176
|
+
displayName: String(identity.display_name ?? "").trim(),
|
|
177
|
+
defaultPath: normalizePath(String(identity.default_path ?? meta.path ?? "")),
|
|
178
|
+
producers: asSet(meta.producer),
|
|
179
|
+
consumers: asSet(meta.consumers),
|
|
180
|
+
artifactType: String(meta.artifact_type ?? "").trim(),
|
|
181
|
+
scope: String(scope),
|
|
182
|
+
pathTemplate: template && typeof template === "object" && !Array.isArray(template)
|
|
183
|
+
? template
|
|
184
|
+
: null,
|
|
185
|
+
docsYamlCanOverridePath: true,
|
|
186
|
+
implementationStatus: String(meta.implementation_status ?? "implemented").trim(),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
function buildSpecialCaseRecord(sp) {
|
|
190
|
+
const template = sp.path_template;
|
|
191
|
+
return {
|
|
192
|
+
artifactId: String(sp.artifact_id ?? "").trim(),
|
|
193
|
+
displayName: String(sp.display_name ?? "").trim(),
|
|
194
|
+
defaultPath: normalizePath(String(sp.default_path ?? "")),
|
|
195
|
+
producers: asSet(sp.producers),
|
|
196
|
+
consumers: asSet(sp.consumers),
|
|
197
|
+
artifactType: String(sp.artifact_type ?? "").trim(),
|
|
198
|
+
scope: String(sp.scope ?? "").trim(),
|
|
199
|
+
pathTemplate: template && typeof template === "object" && !Array.isArray(template)
|
|
200
|
+
? template
|
|
201
|
+
: null,
|
|
202
|
+
docsYamlCanOverridePath: Boolean(sp.docs_yaml_can_override_path),
|
|
203
|
+
implementationStatus: String(sp.implementation_status ?? "implemented").trim(),
|
|
204
|
+
};
|
|
205
|
+
}
|
|
92
206
|
export function loadArtifactRegistry(artifactSchemasDirPath = artifactSchemasDir(), registryModelPathArg = registryModelPath()) {
|
|
93
207
|
const model = loadYaml(registryModelPathArg);
|
|
94
208
|
const metas = schemaMetas(artifactSchemasDirPath);
|
|
@@ -104,24 +218,15 @@ export function loadArtifactRegistry(artifactSchemasDirPath = artifactSchemasDir
|
|
|
104
218
|
}
|
|
105
219
|
const id = identity;
|
|
106
220
|
const artifactId = String(id.artifact_id ?? "").trim();
|
|
221
|
+
if (!artifactId) {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
107
224
|
const meta = metas.get(artifactId);
|
|
108
|
-
if (!
|
|
225
|
+
if (!meta) {
|
|
226
|
+
process.stderr.write(`warning: required artifact identity '${artifactId}' has no matching schema file in ${artifactSchemasDirPath}\n`);
|
|
109
227
|
continue;
|
|
110
228
|
}
|
|
111
|
-
|
|
112
|
-
records.set(artifactId, {
|
|
113
|
-
artifactId,
|
|
114
|
-
displayName: String(id.display_name ?? "").trim(),
|
|
115
|
-
defaultPath: normalizePath(String(id.default_path ?? meta.path ?? "")),
|
|
116
|
-
producers: asSet(meta.producer),
|
|
117
|
-
consumers: asSet(meta.consumers),
|
|
118
|
-
artifactType: String(meta.artifact_type ?? "").trim(),
|
|
119
|
-
scope: String(scope),
|
|
120
|
-
pathTemplate: template && typeof template === "object" && !Array.isArray(template)
|
|
121
|
-
? template
|
|
122
|
-
: null,
|
|
123
|
-
docsYamlCanOverridePath: true,
|
|
124
|
-
});
|
|
229
|
+
records.set(artifactId, buildRequiredRecord(scope, id, meta));
|
|
125
230
|
}
|
|
126
231
|
}
|
|
127
232
|
const specialCases = (model.explicit_special_cases ?? []);
|
|
@@ -134,73 +239,129 @@ export function loadArtifactRegistry(artifactSchemasDirPath = artifactSchemasDir
|
|
|
134
239
|
if (!artifactId) {
|
|
135
240
|
continue;
|
|
136
241
|
}
|
|
137
|
-
|
|
138
|
-
records.set(artifactId, {
|
|
139
|
-
artifactId,
|
|
140
|
-
displayName: String(sp.display_name ?? "").trim(),
|
|
141
|
-
defaultPath: normalizePath(String(sp.default_path ?? "")),
|
|
142
|
-
producers: asSet(sp.producers),
|
|
143
|
-
consumers: asSet(sp.consumers),
|
|
144
|
-
artifactType: String(sp.artifact_type ?? "").trim(),
|
|
145
|
-
scope: String(sp.scope ?? "").trim(),
|
|
146
|
-
pathTemplate: template && typeof template === "object" && !Array.isArray(template)
|
|
147
|
-
? template
|
|
148
|
-
: null,
|
|
149
|
-
docsYamlCanOverridePath: Boolean(sp.docs_yaml_can_override_path),
|
|
150
|
-
});
|
|
242
|
+
records.set(artifactId, buildSpecialCaseRecord(sp));
|
|
151
243
|
}
|
|
152
244
|
return records;
|
|
153
245
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
246
|
+
/**
|
|
247
|
+
* Targeted lookup of a single artifact record. Resolves against the same
|
|
248
|
+
* model/schema authority as `loadArtifactRegistry` but inspects only the
|
|
249
|
+
* requested identity, so a special case such as `profile` loads without
|
|
250
|
+
* walking or warning about unrelated required schemas. A requested required
|
|
251
|
+
* identity still warns and returns `undefined` when its matching schema file is
|
|
252
|
+
* missing from the schemas directory.
|
|
253
|
+
*/
|
|
254
|
+
export function loadArtifactRecord(artifactId, artifactSchemasDirPath = artifactSchemasDir(), registryModelPathArg = registryModelPath()) {
|
|
255
|
+
const model = loadYaml(registryModelPathArg);
|
|
256
|
+
const specialCase = findSpecialCase(model, artifactId);
|
|
257
|
+
if (specialCase) {
|
|
258
|
+
return buildSpecialCaseRecord(specialCase);
|
|
259
|
+
}
|
|
260
|
+
const required = findRequiredIdentity(model, artifactId);
|
|
261
|
+
if (!required) {
|
|
262
|
+
return undefined;
|
|
158
263
|
}
|
|
264
|
+
const meta = loadSchemaMetaForArtifact(artifactSchemasDirPath, artifactId);
|
|
265
|
+
if (!meta) {
|
|
266
|
+
process.stderr.write(`warning: required artifact identity '${artifactId}' has no matching schema file in ${artifactSchemasDirPath}\n`);
|
|
267
|
+
return undefined;
|
|
268
|
+
}
|
|
269
|
+
return buildRequiredRecord(required.scope, required.identity, meta);
|
|
270
|
+
}
|
|
271
|
+
export function docsPathOverridesFromBytes(bytes, strict = false) {
|
|
159
272
|
let data;
|
|
160
273
|
try {
|
|
161
|
-
data = loadYamlMapping(
|
|
274
|
+
data = loadYamlMapping(bytes.toString());
|
|
162
275
|
}
|
|
163
276
|
catch (exc) {
|
|
277
|
+
if (strict)
|
|
278
|
+
throw new Error(`failed to load docs path overrides: ${exc.message}`);
|
|
164
279
|
process.stderr.write(`warning: failed to load docs path overrides: ${exc.message}\n`);
|
|
165
280
|
return {};
|
|
166
281
|
}
|
|
167
282
|
const mapping = data.mapping;
|
|
168
283
|
if (!Array.isArray(mapping)) {
|
|
284
|
+
if (strict && mapping !== undefined)
|
|
285
|
+
throw new Error("failed to load docs path overrides: mapping must be a list");
|
|
169
286
|
return {};
|
|
170
287
|
}
|
|
171
288
|
const overrides = {};
|
|
172
289
|
for (const entry of mapping) {
|
|
173
290
|
if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
|
|
291
|
+
if (strict)
|
|
292
|
+
throw new Error("failed to load docs path overrides: every mapping entry must be a mapping");
|
|
174
293
|
continue;
|
|
175
294
|
}
|
|
176
295
|
const e = entry;
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
if (
|
|
180
|
-
overrides
|
|
181
|
-
}
|
|
296
|
+
if (typeof e.artifact === "string" && typeof e.path === "string")
|
|
297
|
+
overrides[e.artifact] = e.path;
|
|
298
|
+
else if (strict)
|
|
299
|
+
throw new Error("failed to load docs path overrides: every mapping entry requires string artifact and path fields");
|
|
182
300
|
}
|
|
183
301
|
return overrides;
|
|
184
302
|
}
|
|
185
|
-
export function
|
|
303
|
+
export function loadDocsPathOverrides(projectRoot, strict = false) {
|
|
304
|
+
const docsPath = path.join(projectRoot, ARTIFACT_PROTOCOL_PATHS.docs);
|
|
305
|
+
if (!fs.existsSync(docsPath)) {
|
|
306
|
+
return {};
|
|
307
|
+
}
|
|
308
|
+
let bytes;
|
|
309
|
+
try {
|
|
310
|
+
bytes = fs.readFileSync(docsPath);
|
|
311
|
+
}
|
|
312
|
+
catch (exc) {
|
|
313
|
+
if (strict)
|
|
314
|
+
throw new Error(`failed to load docs path overrides: ${exc.message}`);
|
|
315
|
+
process.stderr.write(`warning: failed to load docs path overrides: ${exc.message}\n`);
|
|
316
|
+
return {};
|
|
317
|
+
}
|
|
318
|
+
return docsPathOverridesFromBytes(bytes, strict);
|
|
319
|
+
}
|
|
320
|
+
function nearestExistingAncestor(p) {
|
|
321
|
+
let current = p;
|
|
322
|
+
while (!fs.existsSync(current)) {
|
|
323
|
+
const parent = path.dirname(current);
|
|
324
|
+
if (parent === current)
|
|
325
|
+
break;
|
|
326
|
+
current = parent;
|
|
327
|
+
}
|
|
328
|
+
return fs.realpathSync.native(current);
|
|
329
|
+
}
|
|
330
|
+
export function assertRealpathBoundary(projectRoot, artifactPath, artifactId) {
|
|
331
|
+
const projectReal = nearestExistingAncestor(resolvePath(projectRoot));
|
|
332
|
+
const ancestorReal = nearestExistingAncestor(artifactPath);
|
|
333
|
+
const rel = path.relative(projectReal, ancestorReal);
|
|
334
|
+
if (rel !== "" && (rel.startsWith("..") || path.isAbsolute(rel))) {
|
|
335
|
+
throw new Error(`artifact '${artifactId}' path escapes the project boundary`);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
export function resolveArtifactPath(record, projectRoot, activeObjectiveNameOrOptions = null, env = process.env) {
|
|
339
|
+
const options = typeof activeObjectiveNameOrOptions === "object" && activeObjectiveNameOrOptions !== null
|
|
340
|
+
? activeObjectiveNameOrOptions
|
|
341
|
+
: { activeObjectiveName: activeObjectiveNameOrOptions };
|
|
342
|
+
const activeObjectiveName = options.activeObjectiveName ?? null;
|
|
186
343
|
let artifactPath = record.defaultPath;
|
|
187
|
-
const overrides = loadDocsPathOverrides(projectRoot);
|
|
344
|
+
const overrides = options.docsPathOverrides ?? loadDocsPathOverrides(projectRoot, options.strictWrite === true);
|
|
188
345
|
if (record.docsYamlCanOverridePath && record.displayName in overrides) {
|
|
189
346
|
artifactPath = overrides[record.displayName];
|
|
190
347
|
}
|
|
191
348
|
if (artifactPath.includes("<name>") && activeObjectiveName) {
|
|
192
349
|
artifactPath = artifactPath.replace(/<name>/g, activeObjectiveName);
|
|
193
350
|
}
|
|
194
|
-
const
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
351
|
+
const profileDirPrefixes = ["$AGENTERA_PROFILE_DIR/", "$PROFILERA_PROFILE_DIR/"];
|
|
352
|
+
for (const prefix of profileDirPrefixes) {
|
|
353
|
+
if (artifactPath.startsWith(prefix)) {
|
|
354
|
+
const suffix = artifactPath.slice(prefix.length);
|
|
355
|
+
const explicit = resolveProfileDirOverride(env);
|
|
356
|
+
if (explicit) {
|
|
357
|
+
return path.join(explicit, suffix);
|
|
358
|
+
}
|
|
359
|
+
const [base] = resolveCandidate(null, { env, home: os.homedir() });
|
|
360
|
+
return path.join(base, suffix);
|
|
200
361
|
}
|
|
201
|
-
const [base] = resolveCandidate(null, { env, home: os.homedir() });
|
|
202
|
-
return path.join(base, suffix);
|
|
203
362
|
}
|
|
204
|
-
|
|
363
|
+
const resolved = projectPath(projectRoot, artifactPath, record.artifactId);
|
|
364
|
+
if (options.strictWrite)
|
|
365
|
+
assertRealpathBoundary(projectRoot, resolved, record.artifactId);
|
|
366
|
+
return resolved;
|
|
205
367
|
}
|
|
206
|
-
//# sourceMappingURL=artifactRegistry.js.map
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
const FIELD_SKIP = new Set([
|
|
2
|
+
"meta",
|
|
3
|
+
"GROUP_PREFIXES",
|
|
4
|
+
"BUDGET",
|
|
5
|
+
"COMPACTION",
|
|
6
|
+
"VALIDATION",
|
|
7
|
+
"ARCHIVE",
|
|
8
|
+
"CONVENTION",
|
|
9
|
+
"CONVENTIONS",
|
|
10
|
+
]);
|
|
11
|
+
function mapping(value) {
|
|
12
|
+
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
13
|
+
}
|
|
14
|
+
export function artifactSchemaFieldDescription(entry, group) {
|
|
15
|
+
return {
|
|
16
|
+
id: entry.id ?? null,
|
|
17
|
+
group,
|
|
18
|
+
field: entry.field ?? null,
|
|
19
|
+
...(typeof entry.path === "string" ? { path: entry.path } : {}),
|
|
20
|
+
type: entry.type ?? "unknown",
|
|
21
|
+
required: "required" in entry ? entry.required : "unknown",
|
|
22
|
+
format: entry.format ?? null,
|
|
23
|
+
validation: entry.validation ?? [],
|
|
24
|
+
...(entry.accepted_forms !== undefined ? { accepted_forms: structuredClone(entry.accepted_forms) } : {}),
|
|
25
|
+
...(entry.normalization !== undefined ? { normalization: structuredClone(entry.normalization) } : {}),
|
|
26
|
+
...(entry.write_operations !== undefined ? { write_operations: structuredClone(entry.write_operations) } : {}),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export function describeArtifactSchemaFields(schema) {
|
|
30
|
+
const fields = [];
|
|
31
|
+
for (const [group, value] of Object.entries(schema)) {
|
|
32
|
+
if (FIELD_SKIP.has(group) || !mapping(value))
|
|
33
|
+
continue;
|
|
34
|
+
for (const entry of Object.values(value)) {
|
|
35
|
+
if (mapping(entry) && "field" in entry)
|
|
36
|
+
fields.push(artifactSchemaFieldDescription(entry, group));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return fields;
|
|
40
|
+
}
|
|
41
|
+
export function artifactSchemaFieldsForOperation(schema, verb) {
|
|
42
|
+
if (!schema)
|
|
43
|
+
return [];
|
|
44
|
+
return describeArtifactSchemaFields(schema).filter((field) => Array.isArray(field.write_operations) && field.write_operations.includes(verb));
|
|
45
|
+
}
|
|
@@ -11,6 +11,7 @@ export const BOOTSTRAP_RULE_SECTIONS = [
|
|
|
11
11
|
"FIELD_RULES",
|
|
12
12
|
"PRIMITIVE_REFERENCE_FIELDS",
|
|
13
13
|
"ROUTE_ALIASES",
|
|
14
|
+
"TRIGGER_ENRICHMENT",
|
|
14
15
|
];
|
|
15
16
|
export class ContractBootstrapError extends Error {
|
|
16
17
|
errors;
|
|
@@ -26,7 +27,7 @@ function isMapping(value) {
|
|
|
26
27
|
export function loadCapabilitySchemaContract(contractPath) {
|
|
27
28
|
let data;
|
|
28
29
|
try {
|
|
29
|
-
data = loadYamlMapping(fs.readFileSync(contractPath, "utf8"));
|
|
30
|
+
data = loadYamlMapping(fs.readFileSync(contractPath, "utf8")); // cast: YAML parse IO boundary
|
|
30
31
|
}
|
|
31
32
|
catch (exc) {
|
|
32
33
|
throw new ContractBootstrapError([
|
|
@@ -100,8 +101,47 @@ export function buildCapabilitySchemaContract(data, contractPath) {
|
|
|
100
101
|
capability: entry.capability,
|
|
101
102
|
})),
|
|
102
103
|
},
|
|
104
|
+
triggerEnrichment: buildTriggerEnrichmentRules(data),
|
|
103
105
|
};
|
|
104
106
|
}
|
|
107
|
+
function buildTriggerEnrichmentRules(data) {
|
|
108
|
+
const enrichment = data.TRIGGER_ENRICHMENT;
|
|
109
|
+
const fields = enrichment.fields;
|
|
110
|
+
const primaryAliases = data.ROUTE_ALIASES.primary_aliases;
|
|
111
|
+
const allowedCapabilityIds = primaryAliases.map((entry) => entry.capability);
|
|
112
|
+
return {
|
|
113
|
+
spec: enrichment.spec,
|
|
114
|
+
fields: Object.fromEntries(Object.entries(fields).map(([name, raw]) => [name, buildEnrichmentFieldRule(raw)])),
|
|
115
|
+
allowedCapabilityIds,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function buildEnrichmentFieldRule(raw) {
|
|
119
|
+
const rule = {
|
|
120
|
+
type: raw.type,
|
|
121
|
+
required: Boolean(raw.required),
|
|
122
|
+
default: raw.default,
|
|
123
|
+
};
|
|
124
|
+
if (typeof raw.min === "number")
|
|
125
|
+
rule.min = raw.min;
|
|
126
|
+
if (typeof raw.max === "number")
|
|
127
|
+
rule.max = raw.max;
|
|
128
|
+
if (raw.each_must_be_valid_regex === true)
|
|
129
|
+
rule.eachMustBeValidRegex = true;
|
|
130
|
+
if (isMapping(raw.entries)) {
|
|
131
|
+
const entries = {};
|
|
132
|
+
for (const [entryName, entryRaw] of Object.entries(raw.entries)) {
|
|
133
|
+
const e = entryRaw;
|
|
134
|
+
entries[entryName] = {
|
|
135
|
+
type: e.type,
|
|
136
|
+
required: Boolean(e.required),
|
|
137
|
+
nonEmpty: e.non_empty === true,
|
|
138
|
+
enumSource: typeof e.enum_source === "string" ? e.enum_source : "",
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
rule.entries = entries;
|
|
142
|
+
}
|
|
143
|
+
return rule;
|
|
144
|
+
}
|
|
105
145
|
function requiredGroupsOf(data, sourceLabel, errors) {
|
|
106
146
|
const groups = data.REQUIRED_GROUPS;
|
|
107
147
|
if (!Array.isArray(groups) ||
|
|
@@ -154,6 +194,7 @@ function checkRuleSections(data, sourceLabel, errors) {
|
|
|
154
194
|
checkTriggerPriorityRules(data, sourceLabel, errors);
|
|
155
195
|
checkPrimitiveReferenceRules(data, sourceLabel, errors);
|
|
156
196
|
checkRouteAliasRules(data, sourceLabel, errors);
|
|
197
|
+
checkTriggerEnrichmentRules(data, sourceLabel, errors);
|
|
157
198
|
}
|
|
158
199
|
function checkDirectoryRules(data, sourceLabel, errors) {
|
|
159
200
|
const directory = data.DIRECTORY_REQUIREMENTS;
|
|
@@ -308,4 +349,90 @@ function checkSelfGroups(data, sourceLabel, requiredGroups, errors) {
|
|
|
308
349
|
}
|
|
309
350
|
}
|
|
310
351
|
}
|
|
311
|
-
|
|
352
|
+
/**
|
|
353
|
+
* Required integer range field inside TRIGGER_ENRICHMENT compatibility rules.
|
|
354
|
+
*/
|
|
355
|
+
function checkEnrichmentIntegerField(value, label, sourceLabel, errors) {
|
|
356
|
+
if (typeof value !== "number" || !Number.isInteger(value) || value < 0 || value > 100) {
|
|
357
|
+
errors.push(`bootstrap [error]: ${label} in ${sourceLabel} must be an integer in range 0..100`);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
function checkTriggerEnrichmentRules(data, sourceLabel, errors) {
|
|
361
|
+
const enrichment = data.TRIGGER_ENRICHMENT;
|
|
362
|
+
if (!isMapping(enrichment)) {
|
|
363
|
+
errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT in ${sourceLabel} must be present as a mapping`);
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
if (typeof enrichment.spec !== "string" || !enrichment.spec) {
|
|
367
|
+
errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.spec in ${sourceLabel} must be a non-empty string`);
|
|
368
|
+
}
|
|
369
|
+
const fields = enrichment.fields;
|
|
370
|
+
if (!isMapping(fields)) {
|
|
371
|
+
errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields in ${sourceLabel} must be a mapping`);
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
// Legacy fields remain shape-validated for compatibility, but are not
|
|
375
|
+
// carried into the active semantic trigger model.
|
|
376
|
+
const expected = {
|
|
377
|
+
patterns: "list_of_strings",
|
|
378
|
+
confidence_threshold: "integer",
|
|
379
|
+
borderline_band: "integer",
|
|
380
|
+
patterns_regex: "list_of_strings",
|
|
381
|
+
disambiguates_against: "list_of_mappings",
|
|
382
|
+
};
|
|
383
|
+
for (const [fieldName, expectedType] of Object.entries(expected)) {
|
|
384
|
+
if (!isMapping(fields[fieldName])) {
|
|
385
|
+
errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.${fieldName} in ${sourceLabel} must be a mapping`);
|
|
386
|
+
continue;
|
|
387
|
+
}
|
|
388
|
+
if (fields[fieldName].type !== expectedType) {
|
|
389
|
+
errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.${fieldName}.type in ${sourceLabel} must be ${expectedType}`);
|
|
390
|
+
}
|
|
391
|
+
if (fields[fieldName].required !== false) {
|
|
392
|
+
errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.${fieldName}.required in ${sourceLabel} must be false (enrichment is opt-in)`);
|
|
393
|
+
}
|
|
394
|
+
const min = fields[fieldName].min;
|
|
395
|
+
const max = fields[fieldName].max;
|
|
396
|
+
if (expectedType === "integer") {
|
|
397
|
+
if (typeof min !== "number" || min !== 0) {
|
|
398
|
+
errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.${fieldName}.min in ${sourceLabel} must be 0`);
|
|
399
|
+
}
|
|
400
|
+
if (typeof max !== "number" || max !== 100) {
|
|
401
|
+
errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.${fieldName}.max in ${sourceLabel} must be 100`);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
if (fieldName === "patterns_regex" && fields[fieldName].each_must_be_valid_regex !== true) {
|
|
405
|
+
errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.${fieldName}.each_must_be_valid_regex in ${sourceLabel} must be true`);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
// disambiguates_against.entries capability/hint shape
|
|
409
|
+
const disambig = isMapping(fields.disambiguates_against) ? fields.disambiguates_against : null;
|
|
410
|
+
const entriesList = disambig && isMapping(disambig.entries) ? disambig.entries : null;
|
|
411
|
+
if (disambig && !entriesList) {
|
|
412
|
+
errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.disambiguates_against.entries in ${sourceLabel} must be a mapping`);
|
|
413
|
+
}
|
|
414
|
+
if (entriesList) {
|
|
415
|
+
if (!isMapping(entriesList.capability)) {
|
|
416
|
+
errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.disambiguates_against.entries.capability in ${sourceLabel} must be a mapping`);
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
if (entriesList.capability.required !== true) {
|
|
420
|
+
errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.disambiguates_against.entries.capability.required in ${sourceLabel} must be true`);
|
|
421
|
+
}
|
|
422
|
+
if (entriesList.capability.enum_source !== "ROUTE_ALIASES.primary_aliases.capability") {
|
|
423
|
+
errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.disambiguates_against.entries.capability.enum_source in ${sourceLabel} must be ROUTE_ALIASES.primary_aliases.capability`);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
if (!isMapping(entriesList.hint)) {
|
|
427
|
+
errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.disambiguates_against.entries.hint in ${sourceLabel} must be a mapping`);
|
|
428
|
+
}
|
|
429
|
+
else {
|
|
430
|
+
if (entriesList.hint.required !== true) {
|
|
431
|
+
errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.disambiguates_against.entries.hint.required in ${sourceLabel} must be true`);
|
|
432
|
+
}
|
|
433
|
+
if (entriesList.hint.non_empty !== true) {
|
|
434
|
+
errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.disambiguates_against.entries.hint.non_empty in ${sourceLabel} must be true`);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}
|