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
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
|
-
import os from "node:os";
|
|
3
2
|
import path from "node:path";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
4
|
import { isFile, pathExists, resolvePath } from "../core/paths.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { resolveUpdateChannel } from "./channels.js";
|
|
5
|
+
import { hasManagedMarker, opencodeConfigDir, } from "../setup/opencode.js";
|
|
6
|
+
import { OPENCODE_SKILL_NAMES } from "../setup/opencodeConstants.js";
|
|
7
|
+
import { doctorRoots } from "./appModel.js";
|
|
8
|
+
import { bindMigrationResource, removeBoundMigrationResource, verifyBoundMigrationResource, } from "./migrationPublication.js";
|
|
10
9
|
const PYTHON_MANAGED_PATTERNS = [
|
|
11
10
|
/hooks\/validate_artifact\.py/,
|
|
11
|
+
/hooks\/cursor_session_start\.py/,
|
|
12
|
+
/hooks\/cursor_pre_tool_use\.py/,
|
|
13
|
+
/hooks\/cursor_session_stop\.py/,
|
|
14
|
+
/hooks\/session_start\.py/,
|
|
15
|
+
/hooks\/session_stop\.py/,
|
|
12
16
|
/\buv run\b/,
|
|
13
17
|
/\buvx\b/,
|
|
14
18
|
/scripts\/agentera/,
|
|
@@ -17,14 +21,6 @@ const PYTHON_MANAGED_PATTERNS = [
|
|
|
17
21
|
/cursor_pre_tool_use\.py/,
|
|
18
22
|
/cursor_session_stop\.py/,
|
|
19
23
|
];
|
|
20
|
-
const RUNTIME_MIGRATION_ACTIONS = new Set([
|
|
21
|
-
"rewire-runtime",
|
|
22
|
-
"retire-hooks",
|
|
23
|
-
"copy-plugin",
|
|
24
|
-
"copy-agent",
|
|
25
|
-
"copy-command",
|
|
26
|
-
"link-skill",
|
|
27
|
-
]);
|
|
28
24
|
export function projectHasProjectLevelRuntimeHooks(project) {
|
|
29
25
|
const root = resolvePath(project);
|
|
30
26
|
const candidates = [
|
|
@@ -36,334 +32,234 @@ export function projectHasProjectLevelRuntimeHooks(project) {
|
|
|
36
32
|
return candidates.some((candidate) => isFile(candidate) || pathExists(candidate));
|
|
37
33
|
}
|
|
38
34
|
const OPENCODE_COMMAND_NAMES = ["agentera"];
|
|
39
|
-
const OPENCODE_SKILL_NAMES = ["agentera", "hej"];
|
|
40
|
-
const CURSOR_AGENT_MARKER = "<!-- agentera: managed -->";
|
|
41
|
-
export function resolveNpxHookCommands(ctx) {
|
|
42
|
-
const env = ctx.env ?? process.env;
|
|
43
|
-
const home = ctx.home ?? env.HOME ?? os.homedir();
|
|
44
|
-
const sourceRoot = ctx.sourceRoot ?? resolveSourceRoot(env);
|
|
45
|
-
const channel = resolveUpdateChannel({
|
|
46
|
-
channel: ctx.channel ?? null,
|
|
47
|
-
env,
|
|
48
|
-
home,
|
|
49
|
-
sourceRoot,
|
|
50
|
-
});
|
|
51
|
-
const cliEntrypoint = channel.updateCommand.trim();
|
|
52
|
-
return {
|
|
53
|
-
cliEntrypoint,
|
|
54
|
-
validate: `${cliEntrypoint} hook validate-artifact`,
|
|
55
|
-
cursorSessionStart: `${cliEntrypoint} hook cursor-session-start`,
|
|
56
|
-
cursorSessionStop: `${cliEntrypoint} hook session-stop`,
|
|
57
|
-
cursorPreTool: `${cliEntrypoint} hook cursor-pre-tool-use`,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
35
|
export function textUsesPythonManagedEntrypoint(text) {
|
|
61
36
|
if (/AGENTERA_HOME\s*=/.test(text)) {
|
|
62
37
|
return true;
|
|
63
38
|
}
|
|
64
39
|
return PYTHON_MANAGED_PATTERNS.some((pattern) => pattern.test(text));
|
|
65
40
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
41
|
+
const RETIRED_NPX_HOOK = /\bnpx\s+-y\s+agentera(?:@(?:next|latest))?\s+hook\s+/;
|
|
42
|
+
const V2_AGENTERA_HOOK = /(?:\buv(?:x|\s+run)\b[^"'\n]*(?:\$\{(?:AGENTERA_HOME|PLUGIN_ROOT)\}|hooks\/)\/[^"'\n]*\.py|\$\{AGENTERA_HOME\}\/(?:app\/scripts|(?:app\/)?hooks)\/[^"'\n]*\.py)/;
|
|
43
|
+
function retiredHookCommands(value, commands = []) {
|
|
44
|
+
if (Array.isArray(value)) {
|
|
45
|
+
for (const entry of value)
|
|
46
|
+
retiredHookCommands(entry, commands);
|
|
72
47
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
if (runtime === "codex") {
|
|
81
|
-
next = next.replace(/AGENTERA_HOME\s*=\s*"[^"]*"/g, "");
|
|
82
|
-
next = next.replace(/AGENTERA_HOME\s*=\s*'[^']*'/g, "");
|
|
83
|
-
next = next.replace(/set\s*=\s*\{\s*,/g, "set = {");
|
|
84
|
-
next = next.replace(/,\s*,/g, ",");
|
|
85
|
-
next = next.replace(/,\s*\}/g, " }");
|
|
86
|
-
next = next.replace(/set\s*=\s*\{\s*\}/g, "set = { }");
|
|
48
|
+
else if (value !== null && typeof value === "object") {
|
|
49
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
50
|
+
if (key === "command" && typeof entry === "string")
|
|
51
|
+
commands.push(entry);
|
|
52
|
+
else
|
|
53
|
+
retiredHookCommands(entry, commands);
|
|
54
|
+
}
|
|
87
55
|
}
|
|
88
|
-
return
|
|
56
|
+
return commands;
|
|
89
57
|
}
|
|
90
|
-
function
|
|
91
|
-
|
|
92
|
-
|
|
58
|
+
function isRetiredAgenteraHookCommand(command) {
|
|
59
|
+
return V2_AGENTERA_HOOK.test(command) || RETIRED_NPX_HOOK.test(command);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Native hook files have no durable per-entry ownership record. Remove only a
|
|
63
|
+
* file whose every command is a retired Agentera invocation; mixed files are
|
|
64
|
+
* preserved for the owner to review rather than surgically rewritten.
|
|
65
|
+
*/
|
|
66
|
+
export function wholeResourceProvesV2HookOwnership(text) {
|
|
67
|
+
let document;
|
|
68
|
+
try {
|
|
69
|
+
document = JSON.parse(text);
|
|
93
70
|
}
|
|
94
|
-
|
|
95
|
-
return
|
|
71
|
+
catch {
|
|
72
|
+
return false;
|
|
96
73
|
}
|
|
97
|
-
|
|
74
|
+
const commands = retiredHookCommands(document);
|
|
75
|
+
return commands.length > 0 && commands.every(isRetiredAgenteraHookCommand);
|
|
76
|
+
}
|
|
77
|
+
function textContainsRetiredAgenteraHook(text) {
|
|
78
|
+
return textUsesPythonManagedEntrypoint(text) || RETIRED_NPX_HOOK.test(text);
|
|
98
79
|
}
|
|
99
|
-
function
|
|
80
|
+
function pushRetireHookItem(items, runtime, filePath, allowedRoot) {
|
|
100
81
|
const text = fs.readFileSync(filePath, "utf8");
|
|
101
|
-
|
|
102
|
-
if (!textUsesPythonManagedEntrypoint(text) && !needsBare) {
|
|
103
|
-
if (text.includes(commands.cliEntrypoint)) {
|
|
104
|
-
items.push({
|
|
105
|
-
status: "noop",
|
|
106
|
-
action: "rewire-runtime",
|
|
107
|
-
runtime,
|
|
108
|
-
source: filePath,
|
|
109
|
-
message: "runtime config already references npm self-contained entrypoint",
|
|
110
|
-
});
|
|
111
|
-
}
|
|
82
|
+
if (!textContainsRetiredAgenteraHook(text)) {
|
|
112
83
|
return;
|
|
113
84
|
}
|
|
114
|
-
const
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
status,
|
|
118
|
-
action: "rewire-runtime",
|
|
85
|
+
const item = {
|
|
86
|
+
status: wholeResourceProvesV2HookOwnership(text) ? "pending" : "blocked",
|
|
87
|
+
action: "retire-hooks",
|
|
119
88
|
runtime,
|
|
120
89
|
source: filePath,
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
function hasCursorManagedAgentMarker(text) {
|
|
129
|
-
return text.includes(CURSOR_AGENT_MARKER);
|
|
130
|
-
}
|
|
131
|
-
function copyIfChanged(source, target) {
|
|
132
|
-
if (!isFile(source)) {
|
|
133
|
-
return false;
|
|
90
|
+
message: wholeResourceProvesV2HookOwnership(text)
|
|
91
|
+
? "will remove whole-resource-proven retired Agentera hook"
|
|
92
|
+
: "retired Agentera hook preserved: complete resource ownership is unproven; review and remove it manually",
|
|
93
|
+
};
|
|
94
|
+
if (item.status === "blocked") {
|
|
95
|
+
items.push(item);
|
|
96
|
+
return;
|
|
134
97
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
return false;
|
|
140
|
-
}
|
|
98
|
+
const evidenceError = bindMigrationResource(item, "source", filePath, [allowedRoot], "file");
|
|
99
|
+
if (evidenceError) {
|
|
100
|
+
item.status = "blocked";
|
|
101
|
+
item.message = `retired Agentera hook preserved: ${evidenceError}; review the unsafe path manually`;
|
|
141
102
|
}
|
|
142
|
-
|
|
143
|
-
fs.copyFileSync(source, target);
|
|
144
|
-
return true;
|
|
103
|
+
items.push(item);
|
|
145
104
|
}
|
|
146
|
-
function planCodexItems(items, home,
|
|
147
|
-
const
|
|
148
|
-
|
|
149
|
-
if (isFile(hooksPath)) {
|
|
150
|
-
pushRewireItem(items, "codex", hooksPath, commands);
|
|
151
|
-
}
|
|
152
|
-
if (isFile(configPath)) {
|
|
153
|
-
pushRewireItem(items, "codex", configPath, commands);
|
|
154
|
-
let configText = fs.readFileSync(configPath, "utf8");
|
|
105
|
+
function planCodexItems(items, home, project) {
|
|
106
|
+
for (const root of [project, home]) {
|
|
107
|
+
const hooksPath = path.join(root, ".codex", "hooks", "codex-hooks.json");
|
|
155
108
|
if (isFile(hooksPath)) {
|
|
156
|
-
|
|
157
|
-
}
|
|
158
|
-
const pluginHooks = codexPluginHooksEnabled(configText);
|
|
159
|
-
if (pluginHooks && isFile(hooksPath)) {
|
|
160
|
-
let hooksText;
|
|
161
|
-
try {
|
|
162
|
-
hooksText = fs.readFileSync(hooksPath, "utf8");
|
|
163
|
-
}
|
|
164
|
-
catch {
|
|
165
|
-
hooksText = "";
|
|
166
|
-
}
|
|
167
|
-
if (codexCopiedHooksAreAgenteraOnly(hooksText)) {
|
|
168
|
-
items.push({
|
|
169
|
-
status: "pending",
|
|
170
|
-
action: "retire-hooks",
|
|
171
|
-
runtime: "codex",
|
|
172
|
-
source: hooksPath,
|
|
173
|
-
target: configPath,
|
|
174
|
-
message: "will remove Agentera-owned copied Codex hooks because plugin hooks are enabled",
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
else if (hooksText.includes("validate_artifact") || hooksText.includes("hook validate-artifact")) {
|
|
178
|
-
items.push({
|
|
179
|
-
status: force ? "pending" : "blocked",
|
|
180
|
-
action: "retire-hooks",
|
|
181
|
-
runtime: "codex",
|
|
182
|
-
source: hooksPath,
|
|
183
|
-
target: configPath,
|
|
184
|
-
message: "plugin hooks are enabled, but copied hook target needs manual review before retirement",
|
|
185
|
-
});
|
|
186
|
-
}
|
|
109
|
+
pushRetireHookItem(items, "codex", hooksPath, root);
|
|
187
110
|
}
|
|
188
111
|
}
|
|
189
112
|
}
|
|
190
|
-
function planCursorItems(items, home, project
|
|
191
|
-
for (const hooksPath of [
|
|
192
|
-
path.join(project, ".cursor", "hooks.json"),
|
|
193
|
-
path.join(home, ".cursor", "hooks.json"),
|
|
113
|
+
function planCursorItems(items, home, project) {
|
|
114
|
+
for (const [root, hooksPath] of [
|
|
115
|
+
[project, path.join(project, ".cursor", "hooks.json")],
|
|
116
|
+
[home, path.join(home, ".cursor", "hooks.json")],
|
|
194
117
|
]) {
|
|
195
118
|
if (isFile(hooksPath)) {
|
|
196
|
-
|
|
119
|
+
pushRetireHookItem(items, "cursor", hooksPath, root);
|
|
197
120
|
}
|
|
198
121
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
122
|
+
}
|
|
123
|
+
function symlinkOwnership(linkPath, managedSkillsRoot) {
|
|
124
|
+
let stat;
|
|
125
|
+
let target;
|
|
126
|
+
try {
|
|
127
|
+
stat = fs.lstatSync(linkPath);
|
|
128
|
+
if (!stat.isSymbolicLink())
|
|
129
|
+
return null;
|
|
130
|
+
target = fs.readlinkSync(linkPath);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
const resolvedTarget = path.resolve(path.dirname(linkPath), target);
|
|
136
|
+
const relative = path.relative(managedSkillsRoot, resolvedTarget);
|
|
137
|
+
if (relative === "" || relative.startsWith("..") || path.isAbsolute(relative))
|
|
138
|
+
return null;
|
|
139
|
+
return {
|
|
140
|
+
kind: "managed-app-symlink",
|
|
141
|
+
identity: `${stat.dev}:${stat.ino}`,
|
|
142
|
+
fingerprint: `sha256:${createHash("sha256").update(target).digest("hex")}`,
|
|
143
|
+
root: managedSkillsRoot,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
export function planStaleCommandCleanupItems(ctx, items) {
|
|
147
|
+
const env = ctx.env ?? process.env;
|
|
148
|
+
const home = resolvePath(ctx.home);
|
|
149
|
+
const commandsDir = path.join(opencodeConfigDir(home, env), "commands");
|
|
150
|
+
if (!pathExists(commandsDir) || !fs.statSync(commandsDir).isDirectory()) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const currentNames = new Set(OPENCODE_COMMAND_NAMES);
|
|
154
|
+
for (const entry of fs.readdirSync(commandsDir)) {
|
|
155
|
+
if (!entry.endsWith(".md")) {
|
|
156
|
+
continue;
|
|
225
157
|
}
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
runtime: "cursor",
|
|
250
|
-
source: src,
|
|
251
|
-
target: dst,
|
|
252
|
-
message: "will refresh stale managed Cursor capability agent",
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
}
|
|
158
|
+
const filePath = path.join(commandsDir, entry);
|
|
159
|
+
if (!isFile(filePath)) {
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
const body = fs.readFileSync(filePath, "utf8");
|
|
163
|
+
if (!hasManagedMarker(body)) {
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
const name = entry.slice(0, -3);
|
|
167
|
+
if (currentNames.has(name)) {
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
const item = {
|
|
171
|
+
status: "pending",
|
|
172
|
+
action: "remove-stale-command",
|
|
173
|
+
runtime: "opencode",
|
|
174
|
+
source: filePath,
|
|
175
|
+
message: `will remove stale managed command ${path.basename(filePath)}`,
|
|
176
|
+
};
|
|
177
|
+
const evidenceError = bindMigrationResource(item, "source", filePath, [home], "file");
|
|
178
|
+
if (evidenceError) {
|
|
179
|
+
item.status = "blocked";
|
|
180
|
+
item.message = `stale command preserved: ${evidenceError}; review the unsafe path manually`;
|
|
256
181
|
}
|
|
182
|
+
items.push(item);
|
|
257
183
|
}
|
|
258
184
|
}
|
|
259
|
-
function
|
|
260
|
-
const
|
|
261
|
-
const
|
|
262
|
-
const
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
185
|
+
export function planStaleSkillCleanupItems(ctx, items) {
|
|
186
|
+
const env = ctx.env ?? process.env;
|
|
187
|
+
const home = resolvePath(ctx.home);
|
|
188
|
+
const skillsDir = path.join(opencodeConfigDir(home, env), "skills");
|
|
189
|
+
let skillsDirectory;
|
|
190
|
+
try {
|
|
191
|
+
skillsDirectory = fs.lstatSync(skillsDir);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (!skillsDirectory.isDirectory()) {
|
|
267
197
|
items.push({
|
|
268
|
-
status:
|
|
269
|
-
action: "
|
|
198
|
+
status: "blocked",
|
|
199
|
+
action: "remove-stale-skill",
|
|
270
200
|
runtime: "opencode",
|
|
271
|
-
source:
|
|
272
|
-
|
|
273
|
-
message: needsCopy
|
|
274
|
-
? "will copy current Agentera OpenCode plugin to native plugin path"
|
|
275
|
-
: "OpenCode plugin already current at native plugin path",
|
|
201
|
+
source: skillsDir,
|
|
202
|
+
message: `preserved ${skillsDir}: the legacy skills path is not a real directory; replace the unsafe path or review it manually`,
|
|
276
203
|
});
|
|
204
|
+
return;
|
|
277
205
|
}
|
|
278
|
-
const
|
|
279
|
-
const
|
|
280
|
-
for (const
|
|
281
|
-
const
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
message: needsCopy ? "will sync managed OpenCode command" : "OpenCode managed command already current",
|
|
293
|
-
});
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
const agentsSourceDir = path.join(sourceRoot, ".opencode", "agents");
|
|
297
|
-
const agentsTargetDir = path.join(configDir, "agents");
|
|
298
|
-
if (pathExists(agentsSourceDir)) {
|
|
299
|
-
for (const entry of fs.readdirSync(agentsSourceDir)) {
|
|
300
|
-
if (!entry.endsWith(".md"))
|
|
301
|
-
continue;
|
|
302
|
-
const src = path.join(agentsSourceDir, entry);
|
|
303
|
-
const dst = path.join(agentsTargetDir, entry);
|
|
304
|
-
const needsCopy = !isFile(dst) || !fs.readFileSync(src).equals(fs.readFileSync(dst));
|
|
305
|
-
items.push({
|
|
306
|
-
status: needsCopy ? "pending" : "noop",
|
|
307
|
-
action: "copy-agent",
|
|
308
|
-
runtime: "opencode",
|
|
309
|
-
source: src,
|
|
310
|
-
target: dst,
|
|
311
|
-
message: needsCopy ? "will copy managed OpenCode capability agent" : "OpenCode agent already current",
|
|
312
|
-
});
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
const skillsSourceRoot = path.join(sourceRoot, "skills");
|
|
316
|
-
const skillsTargetDir = path.join(configDir, "skills");
|
|
317
|
-
for (const name of OPENCODE_SKILL_NAMES) {
|
|
318
|
-
const src = path.join(skillsSourceRoot, name);
|
|
319
|
-
const dst = path.join(skillsTargetDir, name);
|
|
320
|
-
if (!isFile(path.join(src, "SKILL.md"))) {
|
|
206
|
+
const requiredNames = new Set(OPENCODE_SKILL_NAMES);
|
|
207
|
+
const managedSkillsRoot = path.join(doctorRoots(resolvePath(ctx.appHome)).activeBundleRoot, "skills");
|
|
208
|
+
for (const entry of fs.readdirSync(skillsDir, { withFileTypes: true })) {
|
|
209
|
+
const linkPath = path.join(skillsDir, entry.name);
|
|
210
|
+
if (!entry.isSymbolicLink()) {
|
|
211
|
+
if (requiredNames.has(entry.name)) {
|
|
212
|
+
items.push({
|
|
213
|
+
status: "blocked",
|
|
214
|
+
action: "remove-stale-skill",
|
|
215
|
+
runtime: "opencode",
|
|
216
|
+
source: linkPath,
|
|
217
|
+
message: `preserved ${linkPath}: name and directory shape do not prove Agentera ownership; review and remove it manually if appropriate`,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
321
220
|
continue;
|
|
322
221
|
}
|
|
323
|
-
|
|
222
|
+
let linkTarget;
|
|
223
|
+
try {
|
|
224
|
+
linkTarget = fs.readlinkSync(linkPath);
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
324
227
|
items.push({
|
|
325
|
-
status: "
|
|
326
|
-
action: "
|
|
228
|
+
status: "blocked",
|
|
229
|
+
action: "remove-stale-skill",
|
|
327
230
|
runtime: "opencode",
|
|
328
|
-
source:
|
|
329
|
-
|
|
330
|
-
message: "will create OpenCode skill link",
|
|
231
|
+
source: linkPath,
|
|
232
|
+
message: `preserved ${linkPath}: the symlink target could not be inspected; review the unsafe resource manually`,
|
|
331
233
|
});
|
|
332
234
|
continue;
|
|
333
235
|
}
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
if (
|
|
236
|
+
const ownership = symlinkOwnership(linkPath, managedSkillsRoot);
|
|
237
|
+
if (!ownership) {
|
|
238
|
+
if (requiredNames.has(entry.name) || linkTarget.toLowerCase().includes("agentera")) {
|
|
337
239
|
items.push({
|
|
338
240
|
status: "blocked",
|
|
339
|
-
action: "
|
|
340
|
-
runtime: "opencode",
|
|
341
|
-
source: src,
|
|
342
|
-
target: dst,
|
|
343
|
-
message: "OpenCode skill path is user-owned; manual review required",
|
|
344
|
-
});
|
|
345
|
-
}
|
|
346
|
-
else if (path.resolve(path.dirname(dst), linkTarget) !== path.resolve(src)) {
|
|
347
|
-
items.push({
|
|
348
|
-
status: "pending",
|
|
349
|
-
action: "link-skill",
|
|
241
|
+
action: "remove-stale-skill",
|
|
350
242
|
runtime: "opencode",
|
|
351
|
-
source:
|
|
352
|
-
|
|
353
|
-
message: "will update stale Agentera-managed OpenCode skill link",
|
|
243
|
+
source: linkPath,
|
|
244
|
+
message: `preserved ${linkPath}: skill name or target text does not prove Agentera ownership; confirm ownership and remove it manually if appropriate`,
|
|
354
245
|
});
|
|
355
246
|
}
|
|
247
|
+
continue;
|
|
356
248
|
}
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
249
|
+
const item = {
|
|
250
|
+
status: "pending",
|
|
251
|
+
action: "remove-stale-skill",
|
|
252
|
+
runtime: "opencode",
|
|
253
|
+
source: linkPath,
|
|
254
|
+
ownership,
|
|
255
|
+
message: `will remove v2 app-owned OpenCode skill symlink ${entry.name}`,
|
|
256
|
+
};
|
|
257
|
+
const evidenceError = bindMigrationResource(item, "source", linkPath, [home], "symlink");
|
|
258
|
+
if (evidenceError) {
|
|
259
|
+
item.status = "blocked";
|
|
260
|
+
item.message = `legacy skill preserved: ${evidenceError}; review the unsafe path manually`;
|
|
366
261
|
}
|
|
262
|
+
items.push(item);
|
|
367
263
|
}
|
|
368
264
|
}
|
|
369
265
|
function walkJsonHookFiles(dir) {
|
|
@@ -386,10 +282,10 @@ function walkJsonHookFiles(dir) {
|
|
|
386
282
|
walk(dir);
|
|
387
283
|
return out;
|
|
388
284
|
}
|
|
389
|
-
function planCopilotItems(items, project
|
|
285
|
+
function planCopilotItems(items, project) {
|
|
390
286
|
const hooksDir = path.join(project, ".github", "hooks");
|
|
391
287
|
for (const hookFile of walkJsonHookFiles(hooksDir)) {
|
|
392
|
-
|
|
288
|
+
pushRetireHookItem(items, "copilot", hookFile, project);
|
|
393
289
|
}
|
|
394
290
|
if (!items.some((item) => item.runtime === "copilot")) {
|
|
395
291
|
items.push({
|
|
@@ -400,103 +296,133 @@ function planCopilotItems(items, project, commands) {
|
|
|
400
296
|
});
|
|
401
297
|
}
|
|
402
298
|
}
|
|
403
|
-
function planEnvRuntimeNoops(items, runtime, message) {
|
|
404
|
-
if (!items.some((item) => item.runtime === runtime)) {
|
|
405
|
-
items.push({ status: "noop", action: "configure", runtime, message });
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
299
|
export function planRuntimeMigrationItems(ctx) {
|
|
300
|
+
if (!ctx.env) {
|
|
301
|
+
throw new Error("MigrationContext.env is required for runtime migration planning; pass sandboxMigrationEnv(home, sourceRoot) in tests or an explicit env in callers.");
|
|
302
|
+
}
|
|
409
303
|
const home = resolvePath(ctx.home);
|
|
410
304
|
const project = resolvePath(ctx.project);
|
|
411
|
-
const env = ctx.env
|
|
412
|
-
const sourceRoot = resolvePath(ctx.sourceRoot ?? resolveSourceRoot(env));
|
|
413
|
-
const commands = resolveNpxHookCommands({ ...ctx, home, env, sourceRoot });
|
|
305
|
+
const env = ctx.env;
|
|
414
306
|
const items = [];
|
|
415
|
-
planCodexItems(items, home,
|
|
416
|
-
planCursorItems(items, home, project
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
planEnvRuntimeNoops(items, "cursor-agent", "Cursor Agent CLI inherits workspace Cursor hooks; no separate managed install surface");
|
|
421
|
-
void loadRegistry();
|
|
307
|
+
planCodexItems(items, home, project);
|
|
308
|
+
planCursorItems(items, home, project);
|
|
309
|
+
planStaleCommandCleanupItems(ctx, items);
|
|
310
|
+
planStaleSkillCleanupItems(ctx, items);
|
|
311
|
+
planCopilotItems(items, project);
|
|
422
312
|
return items;
|
|
423
313
|
}
|
|
424
|
-
|
|
314
|
+
const RUNTIME_MIGRATION_ACTIONS = new Set([
|
|
315
|
+
"retire-hooks",
|
|
316
|
+
"remove-stale-command",
|
|
317
|
+
"remove-stale-skill",
|
|
318
|
+
]);
|
|
319
|
+
function isRuntimeMigrationAction(action) {
|
|
320
|
+
return RUNTIME_MIGRATION_ACTIONS.has(action);
|
|
321
|
+
}
|
|
322
|
+
export function applyRuntimeMigrationItem(item) {
|
|
425
323
|
if (item.status !== "pending") {
|
|
426
324
|
return;
|
|
427
325
|
}
|
|
428
326
|
try {
|
|
429
327
|
switch (item.action) {
|
|
430
|
-
case "
|
|
431
|
-
if (!item.
|
|
328
|
+
case "retire-hooks": {
|
|
329
|
+
if (!item.source) {
|
|
432
330
|
item.status = "failed";
|
|
433
|
-
item.message = "
|
|
331
|
+
item.message = "retire-hooks missing source";
|
|
434
332
|
return;
|
|
435
333
|
}
|
|
436
|
-
|
|
334
|
+
verifyBoundMigrationResource(item, "source");
|
|
335
|
+
removeBoundMigrationResource(item, "source");
|
|
437
336
|
item.status = "applied";
|
|
438
|
-
item.message = "
|
|
337
|
+
item.message = "retired whole-resource-proven Agentera hook";
|
|
439
338
|
break;
|
|
440
339
|
}
|
|
441
|
-
case "
|
|
442
|
-
|
|
443
|
-
case "copy-command": {
|
|
444
|
-
if (!item.source || !item.target) {
|
|
340
|
+
case "remove-stale-command": {
|
|
341
|
+
if (!item.source) {
|
|
445
342
|
item.status = "failed";
|
|
446
|
-
item.message =
|
|
343
|
+
item.message = "remove-stale-command missing source";
|
|
447
344
|
return;
|
|
448
345
|
}
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
break;
|
|
453
|
-
}
|
|
454
|
-
case "link-skill": {
|
|
455
|
-
if (!item.source || !item.target) {
|
|
456
|
-
item.status = "failed";
|
|
457
|
-
item.message = "link-skill missing source or target";
|
|
458
|
-
return;
|
|
346
|
+
if (!pathExists(item.source)) {
|
|
347
|
+
item.status = "noop";
|
|
348
|
+
item.message = `stale command already absent at ${item.source}`;
|
|
459
349
|
}
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
350
|
+
else {
|
|
351
|
+
removeBoundMigrationResource(item, "source");
|
|
352
|
+
item.status = "applied";
|
|
353
|
+
item.message = `removed stale managed command ${path.basename(item.source)}`;
|
|
463
354
|
}
|
|
464
|
-
fs.symlinkSync(item.source, item.target);
|
|
465
|
-
item.status = "applied";
|
|
466
|
-
item.message = "OpenCode skill link created";
|
|
467
355
|
break;
|
|
468
356
|
}
|
|
469
|
-
case "
|
|
357
|
+
case "remove-stale-skill": {
|
|
470
358
|
if (!item.source) {
|
|
471
359
|
item.status = "failed";
|
|
472
|
-
item.message = "
|
|
360
|
+
item.message = "remove-stale-skill missing source";
|
|
473
361
|
return;
|
|
474
362
|
}
|
|
475
|
-
|
|
476
|
-
fs.
|
|
363
|
+
try {
|
|
364
|
+
const stat = fs.lstatSync(item.source);
|
|
365
|
+
if (stat.isSymbolicLink()) {
|
|
366
|
+
const target = fs.readlinkSync(item.source);
|
|
367
|
+
const identity = `${stat.dev}:${stat.ino}`;
|
|
368
|
+
const fingerprint = `sha256:${createHash("sha256").update(target).digest("hex")}`;
|
|
369
|
+
const resolvedTarget = path.resolve(path.dirname(item.source), target);
|
|
370
|
+
const relative = item.ownership?.root
|
|
371
|
+
? path.relative(item.ownership.root, resolvedTarget)
|
|
372
|
+
: "..";
|
|
373
|
+
if (item.ownership?.kind !== "managed-app-symlink"
|
|
374
|
+
|| item.ownership.identity !== identity
|
|
375
|
+
|| item.ownership.fingerprint !== fingerprint
|
|
376
|
+
|| relative === ""
|
|
377
|
+
|| relative.startsWith("..")
|
|
378
|
+
|| path.isAbsolute(relative)) {
|
|
379
|
+
item.status = "blocked";
|
|
380
|
+
item.message = `preserved ${item.source}: authoritative symlink ownership changed or is missing; rerun migration and review the resource`;
|
|
381
|
+
break;
|
|
382
|
+
}
|
|
383
|
+
removeBoundMigrationResource(item, "source");
|
|
384
|
+
item.status = "applied";
|
|
385
|
+
item.message = `removed stale skill symlink ${path.basename(item.source)}`;
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
item.status = "blocked";
|
|
389
|
+
item.message = `preserved ${item.source}: only a fingerprinted v2 app-owned symlink is eligible; review it manually`;
|
|
390
|
+
}
|
|
477
391
|
}
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
392
|
+
catch (error) {
|
|
393
|
+
if (error.code === "ENOENT") {
|
|
394
|
+
item.status = "noop";
|
|
395
|
+
item.message = "stale skill already absent";
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
item.status = "failed";
|
|
399
|
+
item.message = `remove-stale-skill failed: ${error.message}`;
|
|
400
|
+
}
|
|
482
401
|
}
|
|
483
|
-
item.status = "applied";
|
|
484
|
-
item.message = "retired Agentera-owned copied Codex hooks";
|
|
485
402
|
break;
|
|
486
403
|
}
|
|
487
404
|
default:
|
|
405
|
+
item.status = "failed";
|
|
406
|
+
item.message = `unsupported runtime migration action: ${item.action}`;
|
|
488
407
|
break;
|
|
489
408
|
}
|
|
490
409
|
}
|
|
491
410
|
catch (exc) {
|
|
492
|
-
item.status = "
|
|
493
|
-
item.message = `${item.action}
|
|
411
|
+
item.status = "blocked";
|
|
412
|
+
item.message = `${item.action} preserved the resource: ${exc.message}; rerun migration and review it manually`;
|
|
494
413
|
}
|
|
495
414
|
}
|
|
496
|
-
export function applyRuntimeMigrationItems(items,
|
|
497
|
-
const commands = resolveNpxHookCommands(ctx);
|
|
415
|
+
export function applyRuntimeMigrationItems(items, _ctx) {
|
|
498
416
|
for (const item of items) {
|
|
499
|
-
|
|
417
|
+
if (item.status !== "pending") {
|
|
418
|
+
continue;
|
|
419
|
+
}
|
|
420
|
+
if (isRuntimeMigrationAction(item.action)) {
|
|
421
|
+
applyRuntimeMigrationItem(item);
|
|
422
|
+
}
|
|
423
|
+
else {
|
|
424
|
+
item.status = "failed";
|
|
425
|
+
item.message = `unsupported runtime migration action: ${item.action}`;
|
|
426
|
+
}
|
|
500
427
|
}
|
|
501
428
|
}
|
|
502
|
-
//# sourceMappingURL=runtimeMigration.js.map
|