agentera 3.0.0-dev.7 → 3.0.0-dev.72
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 +118 -22
- package/bundle/CHANGELOG.md +1361 -0
- package/bundle/DESIGN.md +229 -0
- package/bundle/LICENSE +201 -0
- package/bundle/README.md +143 -0
- package/bundle/UPGRADE.md +252 -0
- package/bundle/extract-corpus-parity.json +2 -4
- package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
- package/bundle/references/adapters/package-publication.json +488 -0
- package/bundle/references/adapters/package-registry.yaml +435 -188
- package/bundle/references/adapters/package-surface-characterization.md +66 -34
- 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 +266 -0
- package/bundle/references/artifacts/artifact-registry-interface-model.yaml +17 -8
- package/bundle/references/artifacts/glossary-entry-contract.yaml +1254 -0
- package/bundle/references/artifacts/state-storage-authority.yaml +3061 -0
- package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
- package/bundle/references/cli/app-lifecycle-vocabulary.yaml +3 -4
- 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 +152 -93
- package/bundle/references/cli/trigger-schema-enrichment.md +57 -46
- package/bundle/references/cli/update-channels.yaml +4 -2
- package/bundle/references/cli/vocabulary-index.yaml +5 -7
- package/bundle/references/cli/vocabulary.md +51 -93
- package/bundle/references/meta/retained-reference-authority.yaml +151 -0
- package/bundle/skills/agentera/SKILL.md +183 -63
- package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +27 -19
- package/bundle/skills/agentera/capabilities/audit/schemas/exit.yaml +2 -2
- package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +13 -35
- package/bundle/skills/agentera/capabilities/audit/schemas/validation.yaml +30 -11
- package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +44 -21
- package/bundle/skills/agentera/capabilities/build/schemas/exit.yaml +8 -6
- package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +14 -36
- package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +95 -21
- package/bundle/skills/agentera/capabilities/design/schemas/artifacts.yaml +6 -6
- package/bundle/skills/agentera/capabilities/design/schemas/exit.yaml +5 -5
- package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +5 -34
- package/bundle/skills/agentera/capabilities/design/schemas/validation.yaml +2 -2
- package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +17 -13
- package/bundle/skills/agentera/capabilities/discuss/schemas/exit.yaml +2 -2
- package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +6 -40
- package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +72 -5
- package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +24 -17
- package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +5 -35
- package/bundle/skills/agentera/capabilities/document/schemas/validation.yaml +13 -13
- package/bundle/skills/agentera/capabilities/optimize/schemas/artifacts.yaml +10 -10
- package/bundle/skills/agentera/capabilities/optimize/schemas/exit.yaml +2 -2
- package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +4 -35
- package/bundle/skills/agentera/capabilities/optimize/schemas/validation.yaml +3 -3
- package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +34 -22
- package/bundle/skills/agentera/capabilities/orchestrate/schemas/exit.yaml +9 -7
- package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +5 -37
- package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +38 -37
- package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +20 -16
- package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +8 -31
- package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +66 -6
- package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +9 -4
- package/bundle/skills/agentera/capabilities/profile/schemas/exit.yaml +4 -4
- package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +8 -37
- package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +61 -3
- package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +6 -6
- package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +5 -29
- package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +13 -12
- package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +7 -49
- package/bundle/skills/agentera/capabilities/vision/schemas/artifacts.yaml +8 -8
- package/bundle/skills/agentera/capabilities/vision/schemas/exit.yaml +7 -6
- package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +7 -39
- package/bundle/skills/agentera/capabilities/vision/schemas/validation.yaml +14 -16
- package/bundle/skills/agentera/capability_schema_contract.yaml +32 -32
- package/bundle/skills/agentera/protocol.yaml +4 -4
- package/bundle/skills/agentera/route-phrases.yaml +81 -0
- package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +1 -0
- package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +30 -12
- package/bundle/skills/agentera/schemas/artifacts/design.yaml +1 -0
- package/bundle/skills/agentera/schemas/artifacts/docs.yaml +7 -12
- package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +140 -9
- package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +82 -0
- package/bundle/skills/agentera/schemas/artifacts/health.yaml +56 -19
- package/bundle/skills/agentera/schemas/artifacts/objective.yaml +18 -4
- package/bundle/skills/agentera/schemas/artifacts/plan.yaml +457 -32
- package/bundle/skills/agentera/schemas/artifacts/progress.yaml +131 -18
- package/bundle/skills/agentera/schemas/artifacts/todo.yaml +302 -7
- package/dist/analytics/extractCorpus/cli.js +52 -11
- package/dist/analytics/extractCorpus/copilotSessions.js +6 -4
- package/dist/analytics/extractCorpus/core.js +40 -12
- package/dist/analytics/extractCorpus/corpus.js +39 -17
- package/dist/analytics/extractCorpus/coverageAudit.js +44 -45
- package/dist/analytics/extractCorpus/cursorSessions.js +6 -4
- package/dist/analytics/extractCorpus/evidenceTiers.js +603 -0
- package/dist/analytics/extractCorpus/extractCorpusParity.js +4 -4
- package/dist/analytics/extractCorpus/filesystemSources.js +1 -5
- package/dist/analytics/extractCorpus/index.js +3 -1
- package/dist/analytics/extractCorpus/jsonlSessions.js +24 -5
- package/dist/analytics/extractCorpus/sqliteCaps.js +0 -1
- package/dist/analytics/extractCorpus/sqliteSessions.js +0 -1
- package/dist/analytics/extractCorpus/tierReader.js +108 -0
- package/dist/analytics/extractCorpus.js +0 -1
- 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 +150 -23
- package/dist/audit/terminologyDrift.js +281 -0
- package/dist/bin/agentera.js +3 -2
- package/dist/capabilities/audit/instructions.js +16 -6
- package/dist/capabilities/build/instructions.js +59 -6
- package/dist/capabilities/design/instructions.js +3 -4
- package/dist/capabilities/discuss/instructions.js +29 -6
- package/dist/capabilities/document/instructions.js +11 -6
- package/dist/capabilities/index.js +16 -14
- package/dist/capabilities/optimize/instructions.js +14 -6
- package/dist/capabilities/orchestrate/instructions.js +42 -6
- package/dist/capabilities/plan/instructions.js +30 -3
- package/dist/capabilities/profile/instructions.js +70 -6
- package/dist/capabilities/research/instructions.js +4 -5
- package/dist/capabilities/status/instructions.js +15 -6
- package/dist/capabilities/status/startupInstructions.js +34 -0
- package/dist/capabilities/vision/instructions.js +3 -5
- package/dist/cli/appContext.js +14 -7
- package/dist/cli/argvalidate.js +0 -1
- package/dist/cli/capabilityContext/benchmark.js +5 -4
- package/dist/cli/capabilityContext/bespoke.js +14 -6
- package/dist/cli/capabilityContext/build.js +116 -42
- package/dist/cli/capabilityContext/closeout.js +30 -27
- package/dist/cli/capabilityContext/contract.js +18 -27
- package/dist/cli/capabilityContext/evidence.js +84 -77
- package/dist/cli/capabilityContext/index.js +0 -1
- package/dist/cli/capabilityContext/orchestration.js +42 -18
- package/dist/cli/capabilityContext/planState.js +89 -96
- package/dist/cli/capabilityContext/progress.js +51 -12
- package/dist/cli/capabilityContext/projectVerification.js +409 -0
- package/dist/cli/capabilityContext/shared.js +9 -20
- package/dist/cli/capabilityContext/slim.js +52 -8
- package/dist/cli/capabilityContext/startup.js +51 -114
- package/dist/cli/capabilityContext/startupAggregation.js +68 -0
- package/dist/cli/capabilityContext/types.js +26 -10
- package/dist/cli/capabilityContext.js +0 -1
- package/dist/cli/commands/appHome.js +0 -1
- package/dist/cli/commands/capability.js +2 -2
- package/dist/cli/commands/compact.js +163 -13
- package/dist/cli/commands/doctor.js +117 -11
- package/dist/cli/commands/durability.js +81 -0
- package/dist/cli/commands/glossaryAdvice.js +138 -0
- package/dist/cli/commands/lint.js +22 -8
- package/dist/cli/commands/personalGlossary.js +176 -0
- package/dist/cli/commands/prime/briefOrientation.js +746 -0
- package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
- package/dist/cli/commands/prime/bundleStatus.js +54 -4
- package/dist/cli/commands/prime/collectEntityOrientation.js +326 -0
- package/dist/cli/commands/prime/collectOrientationState.js +126 -63
- package/dist/cli/commands/prime/orientationOutput.js +267 -56
- package/dist/cli/commands/prime/types.js +0 -1
- package/dist/cli/commands/prime/v1Migration.js +0 -1
- package/dist/cli/commands/prime.js +76 -11
- package/dist/cli/commands/profileGrounding.js +55 -0
- package/dist/cli/commands/query.js +74 -52
- package/dist/cli/commands/report.js +73 -19
- package/dist/cli/commands/route.js +142 -0
- package/dist/cli/commands/schema.js +257 -138
- package/dist/cli/commands/state/decisions.js +40 -56
- package/dist/cli/commands/state/docs.js +58 -85
- package/dist/cli/commands/state/experimentRecords.js +151 -0
- package/dist/cli/commands/state/experiments.js +11 -65
- package/dist/cli/commands/state/get.js +129 -0
- package/dist/cli/commands/state/health.js +11 -113
- package/dist/cli/commands/state/index.js +6 -41
- package/dist/cli/commands/state/list.js +194 -0
- package/dist/cli/commands/state/objective.js +21 -65
- package/dist/cli/commands/state/plan.js +11 -170
- 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 +11 -45
- package/dist/cli/commands/state/shared.js +0 -1
- package/dist/cli/commands/state/todo.js +28 -107
- package/dist/cli/commands/state/write.js +433 -0
- package/dist/cli/commands/upgrade.js +146 -5
- package/dist/cli/commands/upgradeVerify.js +118 -0
- package/dist/cli/commands/validate.js +235 -136
- package/dist/cli/commands/verify.js +23 -8
- package/dist/cli/contracts/bundleStatus.js +0 -1
- package/dist/cli/contracts/orientationState.js +0 -1
- package/dist/cli/dispatch/argvParser.js +0 -1
- package/dist/cli/dispatch/check.js +84 -40
- package/dist/cli/dispatch/commands.js +3 -3
- package/dist/cli/dispatch/index.js +77 -52
- package/dist/cli/dispatch/lifecycle.js +117 -62
- package/dist/cli/dispatch/prime.js +37 -2
- package/dist/cli/dispatch/projections.js +17 -0
- package/dist/cli/dispatch/shared.js +1 -2
- package/dist/cli/dispatch/state.js +62 -66
- package/dist/cli/dispatch.js +0 -1
- package/dist/cli/errors.js +16 -17
- package/dist/cli/help.js +358 -39
- package/dist/cli/migrationRequired.js +122 -0
- package/dist/cli/orientation/attention.js +19 -19
- package/dist/cli/orientation/corpusCoverage.js +32 -1
- package/dist/cli/orientation.js +346 -129
- 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 +11 -8
- package/dist/cli/stateQuery.js +47 -12
- 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 +0 -1
- 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 +0 -1
- package/dist/core/jsonValue.js +0 -1
- package/dist/core/paths.js +0 -1
- package/dist/core/pyjson.js +0 -1
- 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 +13 -14
- package/dist/eval/hybridRouteEvaluation.js +155 -0
- package/dist/eval/semanticEval.js +0 -1
- package/dist/eval/semanticFixtures.js +0 -1
- package/dist/hooks/common.js +3 -56
- package/dist/hooks/compaction/apply.js +224 -47
- package/dist/hooks/compaction/dryRun.js +2 -1
- package/dist/hooks/compaction/index.js +5 -6
- package/dist/hooks/compaction/parse.js +73 -6
- package/dist/hooks/compaction/retention.js +28 -25
- package/dist/hooks/compaction/status.js +145 -26
- package/dist/hooks/compaction/types.js +0 -1
- package/dist/hooks/validateArtifact/agentFacing.js +0 -1
- package/dist/hooks/validateArtifact/index.js +6 -65
- package/dist/hooks/validateArtifact/markdown.js +9 -10
- package/dist/hooks/validateArtifact/schema.js +96 -9
- package/dist/hooks/validateArtifact/traversal.js +12 -11
- package/dist/hooks/validateArtifact/violations.js +5 -3
- package/dist/migrate/v2HandoffManifest.js +8 -3
- package/dist/registries/activationContract.js +2 -0
- package/dist/registries/activationTuples.js +108 -0
- package/dist/registries/artifactProtocolIds.js +2 -1
- package/dist/registries/artifactRegistry.js +207 -60
- package/dist/registries/artifactSchemaProjection.js +45 -0
- package/dist/registries/capabilityContract.js +5 -21
- package/dist/registries/evaluatorHandoffContract.js +0 -1
- 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 +273 -0
- package/dist/registries/packageRegistry.js +184 -209
- package/dist/registries/todoReadinessContract.js +448 -0
- package/dist/registries/triggerLoader.js +7 -44
- package/dist/registries/verbosityBudgetContract.js +205 -0
- package/dist/release/releaseMetadata.js +155 -5
- 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 -13
- package/dist/setup/opencodeConstants.js +1 -0
- package/dist/setup/sharedSkill.js +45 -0
- package/dist/setup/smokeChecks.js +14 -75
- 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 +840 -0
- package/dist/state/entityMigrationTodo.js +133 -0
- package/dist/state/entityPublicationContext.js +859 -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 +15 -7
- 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 +1027 -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/progressWritePolicy.js +33 -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 +70 -9
- package/dist/state/startupAnalysis/contract.js +44 -10
- package/dist/state/startupAnalysis/helpers.js +1 -2
- package/dist/state/startupAnalysis/index.js +0 -1
- package/dist/state/startupAnalysis/metrics.js +0 -1
- package/dist/state/startupAnalysis/records.js +0 -1
- package/dist/state/startupAnalysis/report.js +0 -1
- package/dist/state/startupAnalysis/threshold.js +13 -1
- package/dist/state/startupAnalysis.js +0 -1
- package/dist/state/startupProjection.js +499 -0
- package/dist/state/stateMode.js +222 -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 +1124 -0
- package/dist/state/todoDocsEntityValidation.js +158 -0
- package/dist/state/todoMarkdownProjection.js +51 -0
- package/dist/state/todoReconciliationActivation.js +182 -0
- package/dist/state/todoReconciliationInspection.js +171 -0
- package/dist/state/todoReconciliationRepair.js +318 -0
- package/dist/state/todoReconciliationTransaction.js +595 -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 +377 -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 +391 -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 +146 -0
- package/dist/state/write/serialize.js +1 -0
- package/dist/state/write/transaction.js +57 -0
- package/dist/state/write/validate.js +7 -0
- package/dist/upgrade/appContentRefresh.js +77 -36
- package/dist/upgrade/appModel.js +0 -1
- package/dist/upgrade/atomicWriter.js +1 -0
- package/dist/upgrade/bundleEvidence.js +0 -1
- package/dist/upgrade/channels.js +6 -9
- package/dist/upgrade/compatibility.js +43 -17
- package/dist/upgrade/doctor.js +55 -32
- package/dist/upgrade/doctorClassifier.js +11 -1
- package/dist/upgrade/installedHooksRetirement.js +46 -40
- package/dist/upgrade/legacyAgentCleanup.js +187 -21
- package/dist/upgrade/lifecycleUpgrade.js +113 -0
- package/dist/upgrade/migrateArtifactsV2ToV3.js +334 -64
- package/dist/upgrade/migrationPublication.js +122 -0
- package/dist/upgrade/nextMajorDoctor.js +0 -1
- package/dist/upgrade/npxPlatformStatus.js +0 -1
- package/dist/upgrade/projectIntegration.js +121 -159
- package/dist/upgrade/projectIntegrationDecision.js +42 -85
- package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
- package/dist/upgrade/runtimeMigration.js +262 -453
- 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 +2 -3
- package/dist/upgrade/versionResolution.js +0 -1
- package/dist/validate/activationArtifactEvidence.js +852 -0
- package/dist/validate/activationArtifactEvidenceTypes.js +12 -0
- package/dist/validate/activationConjunction.js +816 -0
- package/dist/validate/activationEvidenceManifest.js +531 -0
- package/dist/validate/activationPackageSemantics.js +29 -0
- package/dist/validate/appHomeContract.js +1 -7
- package/dist/validate/bootstrapAuthority.js +44 -0
- package/dist/validate/capability.js +11 -3
- package/dist/validate/crossCapability.js +14 -9
- package/dist/validate/retainedReferenceAuthority.js +879 -0
- package/dist/validate/selfAudit.js +39 -45
- package/dist/validate/v1LegacyCruft.js +131 -0
- package/dist/validate/vocabularyAuthority.js +8 -8
- package/package.json +41 -13
- package/bundle/references/adapters/cursor.md +0 -214
- 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 -554
- 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 -369
- package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -250
- package/bundle/references/cli/capability-tool-classification.yaml +0 -53
- package/bundle/references/cli/coexistence-probe.yaml +0 -13
- package/bundle/references/cli/parity-expected-actual-template.md +0 -30
- package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
- package/bundle/references/cli/single-name-protocol.yaml +0 -42
- package/bundle/references/cli/upgrade-repair-wording.md +0 -45
- package/bundle/references/cli/v3-handoff-manifest.schema.yaml +0 -98
- package/bundle/references/meta/documentation-inventory.md +0 -49
- package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
- package/bundle/skills/agentera/agents/audit.toml +0 -6
- package/bundle/skills/agentera/agents/build.toml +0 -6
- package/bundle/skills/agentera/agents/design.toml +0 -6
- package/bundle/skills/agentera/agents/discuss.toml +0 -6
- package/bundle/skills/agentera/agents/document.toml +0 -6
- package/bundle/skills/agentera/agents/optimize.toml +0 -6
- package/bundle/skills/agentera/agents/orchestrate.toml +0 -6
- package/bundle/skills/agentera/agents/plan.toml +0 -6
- package/bundle/skills/agentera/agents/profile.toml +0 -6
- package/bundle/skills/agentera/agents/research.toml +0 -6
- package/bundle/skills/agentera/agents/status.toml +0 -6
- package/bundle/skills/agentera/agents/vision.toml +0 -6
- package/bundle/skills/agentera/references/contract.md +0 -1048
- package/dist/analytics/extractCorpus/cli.js.map +0 -1
- package/dist/analytics/extractCorpus/copilotSessions.js.map +0 -1
- package/dist/analytics/extractCorpus/core.js.map +0 -1
- package/dist/analytics/extractCorpus/corpus.js.map +0 -1
- package/dist/analytics/extractCorpus/coverageAudit.js.map +0 -1
- package/dist/analytics/extractCorpus/cursorSessions.js.map +0 -1
- package/dist/analytics/extractCorpus/extractCorpusParity.js.map +0 -1
- package/dist/analytics/extractCorpus/filesystemSources.js.map +0 -1
- package/dist/analytics/extractCorpus/index.js.map +0 -1
- package/dist/analytics/extractCorpus/jsonlSessions.js.map +0 -1
- package/dist/analytics/extractCorpus/sqliteCaps.js.map +0 -1
- package/dist/analytics/extractCorpus/sqliteSessions.js.map +0 -1
- 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/audit/instructions.js.map +0 -1
- package/dist/capabilities/build/instructions.js.map +0 -1
- package/dist/capabilities/design/instructions.js.map +0 -1
- package/dist/capabilities/discuss/instructions.js.map +0 -1
- package/dist/capabilities/document/instructions.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/optimize/instructions.js.map +0 -1
- package/dist/capabilities/orchestrate/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/plan/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/profile/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/research/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/status/instructions.js.map +0 -1
- package/dist/capabilities/vision/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 -5
- 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/benchmark.js.map +0 -1
- package/dist/cli/capabilityContext/bespoke.js.map +0 -1
- package/dist/cli/capabilityContext/build.js.map +0 -1
- package/dist/cli/capabilityContext/closeout.js.map +0 -1
- package/dist/cli/capabilityContext/contract.js.map +0 -1
- package/dist/cli/capabilityContext/evidence.js.map +0 -1
- package/dist/cli/capabilityContext/index.js.map +0 -1
- package/dist/cli/capabilityContext/orchestration.js.map +0 -1
- package/dist/cli/capabilityContext/planState.js.map +0 -1
- package/dist/cli/capabilityContext/progress.js.map +0 -1
- package/dist/cli/capabilityContext/realisera.js +0 -174
- package/dist/cli/capabilityContext/realisera.js.map +0 -1
- package/dist/cli/capabilityContext/shared.js.map +0 -1
- package/dist/cli/capabilityContext/slim.js.map +0 -1
- package/dist/cli/capabilityContext/startup.js.map +0 -1
- package/dist/cli/capabilityContext/types.js.map +0 -1
- package/dist/cli/capabilityContext.js.map +0 -1
- package/dist/cli/commands/appHome.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/bundleStatus.js.map +0 -1
- package/dist/cli/commands/prime/collectOrientationState.js.map +0 -1
- package/dist/cli/commands/prime/orientationOutput.js.map +0 -1
- package/dist/cli/commands/prime/routeOutput.js +0 -50
- package/dist/cli/commands/prime/routeOutput.js.map +0 -1
- package/dist/cli/commands/prime/types.js.map +0 -1
- package/dist/cli/commands/prime/v1Migration.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/decisions.js.map +0 -1
- package/dist/cli/commands/state/docs.js.map +0 -1
- package/dist/cli/commands/state/experiments.js.map +0 -1
- package/dist/cli/commands/state/health.js.map +0 -1
- package/dist/cli/commands/state/index.js.map +0 -1
- package/dist/cli/commands/state/objective.js.map +0 -1
- package/dist/cli/commands/state/plan.js.map +0 -1
- package/dist/cli/commands/state/progress.js.map +0 -1
- package/dist/cli/commands/state/shared.js.map +0 -1
- package/dist/cli/commands/state/todo.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/contracts/bundleStatus.js.map +0 -1
- package/dist/cli/contracts/orientationState.js.map +0 -1
- package/dist/cli/dispatch/argvParser.js.map +0 -1
- package/dist/cli/dispatch/check.js.map +0 -1
- package/dist/cli/dispatch/commands.js.map +0 -1
- package/dist/cli/dispatch/index.js.map +0 -1
- package/dist/cli/dispatch/lifecycle.js.map +0 -1
- package/dist/cli/dispatch/prime.js.map +0 -1
- package/dist/cli/dispatch/shared.js.map +0 -1
- package/dist/cli/dispatch/state.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/attention.js.map +0 -1
- package/dist/cli/orientation/corpusCoverage.js.map +0 -1
- package/dist/cli/orientation.js.map +0 -1
- package/dist/cli/prime-blob.js.map +0 -1
- package/dist/cli/startupCompletenessContract.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/cli/todoSeverity.js.map +0 -1
- package/dist/core/difflib.js.map +0 -1
- package/dist/core/envPaths.js.map +0 -1
- package/dist/core/git.js +0 -43
- package/dist/core/git.js.map +0 -1
- package/dist/core/jsonValue.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/apply.js.map +0 -1
- package/dist/hooks/compaction/dryRun.js.map +0 -1
- package/dist/hooks/compaction/index.js.map +0 -1
- package/dist/hooks/compaction/parse.js.map +0 -1
- package/dist/hooks/compaction/retention.js.map +0 -1
- package/dist/hooks/compaction/status.js.map +0 -1
- package/dist/hooks/compaction/todoResolved.js +0 -137
- package/dist/hooks/compaction/todoResolved.js.map +0 -1
- package/dist/hooks/compaction/types.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 -79
- package/dist/hooks/cursorSessionStart.js.map +0 -1
- package/dist/hooks/sessionStart.js +0 -216
- package/dist/hooks/sessionStart.js.map +0 -1
- package/dist/hooks/sessionStop.js +0 -206
- package/dist/hooks/sessionStop.js.map +0 -1
- package/dist/hooks/todoLayout.js +0 -177
- package/dist/hooks/todoLayout.js.map +0 -1
- package/dist/hooks/validateArtifact/agentFacing.js.map +0 -1
- package/dist/hooks/validateArtifact/index.js.map +0 -1
- package/dist/hooks/validateArtifact/markdown.js.map +0 -1
- package/dist/hooks/validateArtifact/runtime.js +0 -86
- package/dist/hooks/validateArtifact/runtime.js.map +0 -1
- package/dist/hooks/validateArtifact/schema.js.map +0 -1
- package/dist/hooks/validateArtifact/traversal.js.map +0 -1
- package/dist/hooks/validateArtifact/violations.js.map +0 -1
- package/dist/hooks/validateArtifact.js +0 -924
- package/dist/hooks/validateArtifact.js.map +0 -1
- package/dist/migrate/v2HandoffManifest.js.map +0 -1
- package/dist/registries/artifactProtocolIds.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 -316
- package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
- package/dist/registries/triggerLoader.js.map +0 -1
- package/dist/release/releaseMetadata.js.map +0 -1
- package/dist/routing/index.js +0 -2
- package/dist/routing/index.js.map +0 -1
- package/dist/routing/routeEngine.js +0 -189
- package/dist/routing/routeEngine.js.map +0 -1
- package/dist/setup/codex/agents.js +0 -96
- package/dist/setup/codex/agents.js.map +0 -1
- package/dist/setup/codex/cli.js +0 -161
- package/dist/setup/codex/cli.js.map +0 -1
- package/dist/setup/codex/configToml.js +0 -639
- package/dist/setup/codex/configToml.js.map +0 -1
- package/dist/setup/codex/constants.js +0 -29
- package/dist/setup/codex/constants.js.map +0 -1
- package/dist/setup/codex/installRoot.js +0 -64
- package/dist/setup/codex/installRoot.js.map +0 -1
- package/dist/setup/codex/state.js +0 -270
- package/dist/setup/codex/state.js.map +0 -1
- package/dist/setup/codex.js +0 -12
- 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 -129
- package/dist/setup/cursor.js.map +0 -1
- package/dist/setup/cursorSurfaces.js +0 -67
- package/dist/setup/cursorSurfaces.js.map +0 -1
- package/dist/setup/doctor/core.js +0 -300
- package/dist/setup/doctor/core.js.map +0 -1
- package/dist/setup/doctor/diagnostics.js +0 -240
- package/dist/setup/doctor/diagnostics.js.map +0 -1
- package/dist/setup/doctor/opencode.js +0 -313
- package/dist/setup/doctor/opencode.js.map +0 -1
- package/dist/setup/doctor/report.js +0 -425
- package/dist/setup/doctor/report.js.map +0 -1
- package/dist/setup/doctor.js +0 -10
- package/dist/setup/doctor.js.map +0 -1
- package/dist/setup/opencode.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/benchmark.js.map +0 -1
- package/dist/state/startupAnalysis/contract.js.map +0 -1
- package/dist/state/startupAnalysis/helpers.js.map +0 -1
- package/dist/state/startupAnalysis/index.js.map +0 -1
- package/dist/state/startupAnalysis/metrics.js.map +0 -1
- package/dist/state/startupAnalysis/records.js.map +0 -1
- package/dist/state/startupAnalysis/report.js.map +0 -1
- package/dist/state/startupAnalysis/threshold.js.map +0 -1
- package/dist/state/startupAnalysis.js.map +0 -1
- package/dist/upgrade/appContentRefresh.js.map +0 -1
- package/dist/upgrade/appModel.js.map +0 -1
- package/dist/upgrade/bundleEvidence.js.map +0 -1
- package/dist/upgrade/channels.js.map +0 -1
- package/dist/upgrade/cliProbe.js +0 -22
- package/dist/upgrade/cliProbe.js.map +0 -1
- package/dist/upgrade/coexistenceProbe.js +0 -107
- package/dist/upgrade/coexistenceProbe.js.map +0 -1
- package/dist/upgrade/compatibility.js.map +0 -1
- package/dist/upgrade/doctor.js.map +0 -1
- package/dist/upgrade/doctorClassifier.js.map +0 -1
- package/dist/upgrade/installedHooksRetirement.js.map +0 -1
- package/dist/upgrade/legacyAgentCleanup.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/npxPlatformStatus.js.map +0 -1
- package/dist/upgrade/projectIntegration.js.map +0 -1
- package/dist/upgrade/projectIntegrationDecision.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/v3CapabilitySurface.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/legacyPythonParity.js +0 -93
- package/dist/validate/lifecycleAdapters/legacyPythonParity.js.map +0 -1
- package/dist/validate/lifecycleAdapters/nodeFormChecks.js +0 -488
- package/dist/validate/lifecycleAdapters/nodeFormChecks.js.map +0 -1
- package/dist/validate/lifecycleAdapters/shared.js +0 -198
- package/dist/validate/lifecycleAdapters/shared.js.map +0 -1
- package/dist/validate/lifecycleAdapters.js +0 -62
- package/dist/validate/lifecycleAdapters.js.map +0 -1
- package/dist/validate/selfAudit.js.map +0 -1
- package/dist/validate/vocabularyAuthority.js.map +0 -1
|
@@ -1,16 +1,11 @@
|
|
|
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 { codexCopiedHooksAreAgenteraOnly, codexPluginHooksEnabled, retireCodexCopiedHookTrust, } from "../setup/codex.js";
|
|
10
|
-
import { hasManagedMarker, opencodeCommandTemplate, opencodeConfigDir, } from "../setup/opencode.js";
|
|
11
|
-
import { resolveUpdateChannel } from "./channels.js";
|
|
12
|
-
import { applyInstalledHooksRetirementItems, planInstalledHooksRetirementItems, textReferencesV2InstalledHooks, } from "./installedHooksRetirement.js";
|
|
13
|
-
import { projectUsesV3CapabilityInstructionModules } from "./v3CapabilitySurface.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";
|
|
14
9
|
const PYTHON_MANAGED_PATTERNS = [
|
|
15
10
|
/hooks\/validate_artifact\.py/,
|
|
16
11
|
/hooks\/cursor_session_start\.py/,
|
|
@@ -26,15 +21,6 @@ const PYTHON_MANAGED_PATTERNS = [
|
|
|
26
21
|
/cursor_pre_tool_use\.py/,
|
|
27
22
|
/cursor_session_stop\.py/,
|
|
28
23
|
];
|
|
29
|
-
const RUNTIME_MIGRATION_ACTIONS = new Set([
|
|
30
|
-
"rewire-runtime",
|
|
31
|
-
"rewire-env-var",
|
|
32
|
-
"retire-hooks",
|
|
33
|
-
"copy-plugin",
|
|
34
|
-
"copy-agent",
|
|
35
|
-
"copy-command",
|
|
36
|
-
"link-skill",
|
|
37
|
-
]);
|
|
38
24
|
export function projectHasProjectLevelRuntimeHooks(project) {
|
|
39
25
|
const root = resolvePath(project);
|
|
40
26
|
const candidates = [
|
|
@@ -46,382 +32,234 @@ export function projectHasProjectLevelRuntimeHooks(project) {
|
|
|
46
32
|
return candidates.some((candidate) => isFile(candidate) || pathExists(candidate));
|
|
47
33
|
}
|
|
48
34
|
const OPENCODE_COMMAND_NAMES = ["agentera"];
|
|
49
|
-
const OPENCODE_SKILL_NAMES = ["agentera", "status"];
|
|
50
|
-
const CURSOR_AGENT_MARKER = "<!-- agentera: managed -->";
|
|
51
|
-
export function resolveNpxHookCommands(ctx) {
|
|
52
|
-
const env = ctx.env ?? process.env;
|
|
53
|
-
const home = ctx.home ?? env.HOME ?? os.homedir();
|
|
54
|
-
const sourceRoot = ctx.sourceRoot ?? resolveSourceRoot(env);
|
|
55
|
-
const channel = resolveUpdateChannel({
|
|
56
|
-
channel: ctx.channel ?? null,
|
|
57
|
-
env,
|
|
58
|
-
home,
|
|
59
|
-
sourceRoot,
|
|
60
|
-
});
|
|
61
|
-
const cliEntrypoint = channel.updateCommand.trim();
|
|
62
|
-
return {
|
|
63
|
-
cliEntrypoint,
|
|
64
|
-
validate: `${cliEntrypoint} hook validate-artifact`,
|
|
65
|
-
cursorSessionStart: `${cliEntrypoint} hook cursor-session-start`,
|
|
66
|
-
cursorSessionStop: `${cliEntrypoint} hook session-stop`,
|
|
67
|
-
cursorPreTool: `${cliEntrypoint} hook cursor-pre-tool-use`,
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
35
|
export function textUsesPythonManagedEntrypoint(text) {
|
|
71
36
|
if (/AGENTERA_HOME\s*=/.test(text)) {
|
|
72
37
|
return true;
|
|
73
38
|
}
|
|
74
39
|
return PYTHON_MANAGED_PATTERNS.some((pattern) => pattern.test(text));
|
|
75
40
|
}
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}
|
|
83
|
-
export function rewireRuntimeText(text, runtime, commands) {
|
|
84
|
-
let next = text;
|
|
85
|
-
next = next.replace(/uv run\s+\\?"?\$\{AGENTERA_HOME\}\/hooks\/validate_artifact\.py\\?"?/g, commands.validate);
|
|
86
|
-
next = next.replace(/uv run\s+\\?"?\$\{AGENTERA_HOME\}\/app\/hooks\/validate_artifact\.py\\?"?/g, commands.validate);
|
|
87
|
-
next = next.replace(/uv run\s+\\?"?\$\{PLUGIN_ROOT\}\/hooks\/validate_artifact\.py\\?"?/g, commands.validate);
|
|
88
|
-
next = next.replace(/uv run\s+hooks\/validate_artifact\.py/g, commands.validate);
|
|
89
|
-
if (next.includes("validate_artifact.py")) {
|
|
90
|
-
next = next.replace(/["']?[^"'\n]*hooks\/validate_artifact\.py[^"'\n]*["']?/g, `"${commands.validate}"`);
|
|
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);
|
|
91
47
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
if (runtime === "codex") {
|
|
100
|
-
next = next.replace(/AGENTERA_HOME\s*=\s*"[^"]*"/g, "");
|
|
101
|
-
next = next.replace(/AGENTERA_HOME\s*=\s*'[^']*'/g, "");
|
|
102
|
-
next = next.replace(/set\s*=\s*\{\s*,/g, "set = {");
|
|
103
|
-
next = next.replace(/,\s*,/g, ",");
|
|
104
|
-
next = next.replace(/,\s*\}/g, " }");
|
|
105
|
-
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
|
+
}
|
|
106
55
|
}
|
|
107
|
-
return
|
|
56
|
+
return commands;
|
|
108
57
|
}
|
|
109
|
-
|
|
110
|
-
return
|
|
58
|
+
function isRetiredAgenteraHookCommand(command) {
|
|
59
|
+
return V2_AGENTERA_HOOK.test(command) || RETIRED_NPX_HOOK.test(command);
|
|
111
60
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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);
|
|
115
70
|
}
|
|
116
|
-
|
|
117
|
-
return
|
|
71
|
+
catch {
|
|
72
|
+
return false;
|
|
118
73
|
}
|
|
119
|
-
|
|
74
|
+
const commands = retiredHookCommands(document);
|
|
75
|
+
return commands.length > 0 && commands.every(isRetiredAgenteraHookCommand);
|
|
120
76
|
}
|
|
121
|
-
function
|
|
122
|
-
|
|
123
|
-
const needsBare = needsChannelNpxRewire(text, commands.cliEntrypoint);
|
|
124
|
-
if (!textUsesPythonManagedEntrypoint(text) && !textReferencesV2InstalledHooks(text) && !needsBare) {
|
|
125
|
-
if (textUsesV3NpmEntrypoint(text)) {
|
|
126
|
-
items.push({
|
|
127
|
-
status: "noop",
|
|
128
|
-
action: "rewire-runtime",
|
|
129
|
-
runtime,
|
|
130
|
-
source: filePath,
|
|
131
|
-
message: "runtime config already references npm self-contained entrypoint",
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
items.push({
|
|
136
|
-
status: "blocked",
|
|
137
|
-
action: "rewire-runtime",
|
|
138
|
-
runtime,
|
|
139
|
-
source: filePath,
|
|
140
|
-
message: "runtime config has neither v2 Python patterns nor v3 npm entrypoint; manual review needed",
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
const newText = rewireRuntimeText(text, runtime, commands);
|
|
146
|
-
const status = newText === text ? "blocked" : "pending";
|
|
147
|
-
items.push({
|
|
148
|
-
status,
|
|
149
|
-
action: "rewire-runtime",
|
|
150
|
-
runtime,
|
|
151
|
-
source: filePath,
|
|
152
|
-
target: filePath,
|
|
153
|
-
newText,
|
|
154
|
-
message: status === "pending"
|
|
155
|
-
? "will rewire runtime config from Python managed app-home to npm self-contained entrypoint"
|
|
156
|
-
: "runtime config uses Python managed paths but could not be rewritten safely",
|
|
157
|
-
});
|
|
77
|
+
function textContainsRetiredAgenteraHook(text) {
|
|
78
|
+
return textUsesPythonManagedEntrypoint(text) || RETIRED_NPX_HOOK.test(text);
|
|
158
79
|
}
|
|
159
|
-
function
|
|
80
|
+
function pushRetireHookItem(items, runtime, filePath, allowedRoot) {
|
|
160
81
|
const text = fs.readFileSync(filePath, "utf8");
|
|
161
|
-
if (!
|
|
82
|
+
if (!textContainsRetiredAgenteraHook(text)) {
|
|
162
83
|
return;
|
|
163
84
|
}
|
|
164
|
-
const
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
status,
|
|
168
|
-
action: "rewire-env-var",
|
|
85
|
+
const item = {
|
|
86
|
+
status: wholeResourceProvesV2HookOwnership(text) ? "pending" : "blocked",
|
|
87
|
+
action: "retire-hooks",
|
|
169
88
|
runtime,
|
|
170
89
|
source: filePath,
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
function hasCursorManagedAgentMarker(text) {
|
|
179
|
-
return text.includes(CURSOR_AGENT_MARKER);
|
|
180
|
-
}
|
|
181
|
-
function copyIfChanged(source, target) {
|
|
182
|
-
if (!isFile(source)) {
|
|
183
|
-
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;
|
|
184
97
|
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
return false;
|
|
190
|
-
}
|
|
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`;
|
|
191
102
|
}
|
|
192
|
-
|
|
193
|
-
fs.copyFileSync(source, target);
|
|
194
|
-
return true;
|
|
103
|
+
items.push(item);
|
|
195
104
|
}
|
|
196
|
-
function planCodexItems(items, home, project
|
|
105
|
+
function planCodexItems(items, home, project) {
|
|
197
106
|
for (const root of [project, home]) {
|
|
198
107
|
const hooksPath = path.join(root, ".codex", "hooks", "codex-hooks.json");
|
|
199
|
-
const configPath = path.join(root, ".codex", "config.toml");
|
|
200
108
|
if (isFile(hooksPath)) {
|
|
201
|
-
|
|
202
|
-
}
|
|
203
|
-
if (isFile(configPath)) {
|
|
204
|
-
pushRewireItem(items, "codex", configPath, commands);
|
|
205
|
-
const configText = fs.readFileSync(configPath, "utf8");
|
|
206
|
-
const pluginHooks = codexPluginHooksEnabled(configText);
|
|
207
|
-
if (pluginHooks && isFile(hooksPath)) {
|
|
208
|
-
let hooksText;
|
|
209
|
-
try {
|
|
210
|
-
hooksText = fs.readFileSync(hooksPath, "utf8");
|
|
211
|
-
}
|
|
212
|
-
catch {
|
|
213
|
-
hooksText = "";
|
|
214
|
-
}
|
|
215
|
-
if (codexCopiedHooksAreAgenteraOnly(hooksText)) {
|
|
216
|
-
items.push({
|
|
217
|
-
status: "pending",
|
|
218
|
-
action: "retire-hooks",
|
|
219
|
-
runtime: "codex",
|
|
220
|
-
source: hooksPath,
|
|
221
|
-
target: configPath,
|
|
222
|
-
message: "will remove Agentera-owned copied Codex hooks because plugin hooks are enabled",
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
else if (hooksText.includes("validate_artifact") || hooksText.includes("hook validate-artifact")) {
|
|
226
|
-
items.push({
|
|
227
|
-
status: force ? "pending" : "blocked",
|
|
228
|
-
action: "retire-hooks",
|
|
229
|
-
runtime: "codex",
|
|
230
|
-
source: hooksPath,
|
|
231
|
-
target: configPath,
|
|
232
|
-
message: "plugin hooks are enabled, but copied hook target needs manual review before retirement",
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
}
|
|
109
|
+
pushRetireHookItem(items, "codex", hooksPath, root);
|
|
236
110
|
}
|
|
237
111
|
}
|
|
238
112
|
}
|
|
239
|
-
function planCursorItems(items, home, project
|
|
240
|
-
for (const hooksPath of [
|
|
241
|
-
path.join(project, ".cursor", "hooks.json"),
|
|
242
|
-
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")],
|
|
243
117
|
]) {
|
|
244
118
|
if (isFile(hooksPath)) {
|
|
245
|
-
|
|
119
|
+
pushRetireHookItem(items, "cursor", hooksPath, root);
|
|
246
120
|
}
|
|
247
121
|
}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
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;
|
|
274
157
|
}
|
|
275
|
-
const
|
|
276
|
-
if (
|
|
277
|
-
|
|
278
|
-
status: "skipped",
|
|
279
|
-
action: "copy-agent",
|
|
280
|
-
runtime: "cursor",
|
|
281
|
-
target: agentsDir,
|
|
282
|
-
message: "v3 capability instruction modules present; in-tree .cursor/agents/ uses prime --context and is not overwritten",
|
|
283
|
-
});
|
|
158
|
+
const filePath = path.join(commandsDir, entry);
|
|
159
|
+
if (!isFile(filePath)) {
|
|
160
|
+
continue;
|
|
284
161
|
}
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
items.push({
|
|
305
|
-
status: "pending",
|
|
306
|
-
action: "copy-agent",
|
|
307
|
-
runtime: "cursor",
|
|
308
|
-
source: src,
|
|
309
|
-
target: dst,
|
|
310
|
-
message: "will refresh stale managed Cursor Agentera agent",
|
|
311
|
-
});
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
}
|
|
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`;
|
|
315
181
|
}
|
|
182
|
+
items.push(item);
|
|
316
183
|
}
|
|
317
184
|
}
|
|
318
|
-
function
|
|
319
|
-
const
|
|
320
|
-
const
|
|
321
|
-
const
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
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()) {
|
|
326
197
|
items.push({
|
|
327
|
-
status:
|
|
328
|
-
action: "
|
|
198
|
+
status: "blocked",
|
|
199
|
+
action: "remove-stale-skill",
|
|
329
200
|
runtime: "opencode",
|
|
330
|
-
source:
|
|
331
|
-
|
|
332
|
-
message: needsCopy
|
|
333
|
-
? "will copy current Agentera OpenCode plugin to native plugin path"
|
|
334
|
-
: "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`,
|
|
335
203
|
});
|
|
204
|
+
return;
|
|
336
205
|
}
|
|
337
|
-
const
|
|
338
|
-
const
|
|
339
|
-
for (const
|
|
340
|
-
const
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
message: needsCopy ? "will sync managed OpenCode command" : "OpenCode managed command already current",
|
|
352
|
-
});
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
const agentsSourceDir = path.join(sourceRoot, ".opencode", "agents");
|
|
356
|
-
const agentsTargetDir = path.join(configDir, "agents");
|
|
357
|
-
const OPENCODE_MANAGED_AGENT = "agentera.md";
|
|
358
|
-
if (pathExists(agentsSourceDir)) {
|
|
359
|
-
const src = path.join(agentsSourceDir, OPENCODE_MANAGED_AGENT);
|
|
360
|
-
if (isFile(src)) {
|
|
361
|
-
const dst = path.join(agentsTargetDir, OPENCODE_MANAGED_AGENT);
|
|
362
|
-
const needsCopy = !isFile(dst) || !fs.readFileSync(src).equals(fs.readFileSync(dst));
|
|
363
|
-
items.push({
|
|
364
|
-
status: needsCopy ? "pending" : "noop",
|
|
365
|
-
action: "copy-agent",
|
|
366
|
-
runtime: "opencode",
|
|
367
|
-
source: src,
|
|
368
|
-
target: dst,
|
|
369
|
-
message: needsCopy ? "will copy managed OpenCode Agentera agent" : "OpenCode Agentera agent already current",
|
|
370
|
-
});
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
const skillsSourceRoot = path.join(sourceRoot, "skills");
|
|
374
|
-
const skillsTargetDir = path.join(configDir, "skills");
|
|
375
|
-
for (const name of OPENCODE_SKILL_NAMES) {
|
|
376
|
-
const src = path.join(skillsSourceRoot, name);
|
|
377
|
-
const dst = path.join(skillsTargetDir, name);
|
|
378
|
-
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
|
+
}
|
|
379
220
|
continue;
|
|
380
221
|
}
|
|
381
|
-
|
|
222
|
+
let linkTarget;
|
|
223
|
+
try {
|
|
224
|
+
linkTarget = fs.readlinkSync(linkPath);
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
382
227
|
items.push({
|
|
383
|
-
status: "
|
|
384
|
-
action: "
|
|
228
|
+
status: "blocked",
|
|
229
|
+
action: "remove-stale-skill",
|
|
385
230
|
runtime: "opencode",
|
|
386
|
-
source:
|
|
387
|
-
|
|
388
|
-
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`,
|
|
389
233
|
});
|
|
390
234
|
continue;
|
|
391
235
|
}
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
if (
|
|
236
|
+
const ownership = symlinkOwnership(linkPath, managedSkillsRoot);
|
|
237
|
+
if (!ownership) {
|
|
238
|
+
if (requiredNames.has(entry.name) || linkTarget.toLowerCase().includes("agentera")) {
|
|
395
239
|
items.push({
|
|
396
240
|
status: "blocked",
|
|
397
|
-
action: "
|
|
398
|
-
runtime: "opencode",
|
|
399
|
-
source: src,
|
|
400
|
-
target: dst,
|
|
401
|
-
message: "OpenCode skill path is user-owned; manual review required",
|
|
402
|
-
});
|
|
403
|
-
}
|
|
404
|
-
else if (path.resolve(path.dirname(dst), linkTarget) !== path.resolve(src)) {
|
|
405
|
-
items.push({
|
|
406
|
-
status: "pending",
|
|
407
|
-
action: "link-skill",
|
|
241
|
+
action: "remove-stale-skill",
|
|
408
242
|
runtime: "opencode",
|
|
409
|
-
source:
|
|
410
|
-
|
|
411
|
-
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`,
|
|
412
245
|
});
|
|
413
246
|
}
|
|
247
|
+
continue;
|
|
414
248
|
}
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
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`;
|
|
424
261
|
}
|
|
262
|
+
items.push(item);
|
|
425
263
|
}
|
|
426
264
|
}
|
|
427
265
|
function walkJsonHookFiles(dir) {
|
|
@@ -444,10 +282,10 @@ function walkJsonHookFiles(dir) {
|
|
|
444
282
|
walk(dir);
|
|
445
283
|
return out;
|
|
446
284
|
}
|
|
447
|
-
function planCopilotItems(items, project
|
|
285
|
+
function planCopilotItems(items, project) {
|
|
448
286
|
const hooksDir = path.join(project, ".github", "hooks");
|
|
449
287
|
for (const hookFile of walkJsonHookFiles(hooksDir)) {
|
|
450
|
-
|
|
288
|
+
pushRetireHookItem(items, "copilot", hookFile, project);
|
|
451
289
|
}
|
|
452
290
|
if (!items.some((item) => item.runtime === "copilot")) {
|
|
453
291
|
items.push({
|
|
@@ -458,37 +296,6 @@ function planCopilotItems(items, project, commands) {
|
|
|
458
296
|
});
|
|
459
297
|
}
|
|
460
298
|
}
|
|
461
|
-
function planEnvRuntimeNoops(items, runtime, message) {
|
|
462
|
-
if (!items.some((item) => item.runtime === runtime)) {
|
|
463
|
-
items.push({ status: "noop", action: "configure", runtime, message });
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
function planEnvVarRewireItems(ctx, items) {
|
|
467
|
-
const home = resolvePath(ctx.home);
|
|
468
|
-
const project = resolvePath(ctx.project);
|
|
469
|
-
const env = ctx.env;
|
|
470
|
-
const configDir = opencodeConfigDir(home, env);
|
|
471
|
-
const candidates = [
|
|
472
|
-
{ runtime: "opencode", filePath: path.join(configDir, "plugins", "agentera.js") },
|
|
473
|
-
{ runtime: "cursor", filePath: path.join(project, ".cursor", "hooks.json") },
|
|
474
|
-
{ runtime: "cursor", filePath: path.join(home, ".cursor", "hooks.json") },
|
|
475
|
-
{ runtime: "codex", filePath: path.join(home, ".codex", "config.toml") },
|
|
476
|
-
{ runtime: "codex", filePath: path.join(home, ".codex", "hooks", "codex-hooks.json") },
|
|
477
|
-
{ runtime: "installed-app", filePath: path.join(project, ".agentera", "docs.yaml") },
|
|
478
|
-
{ runtime: "installed-app", filePath: path.join(ctx.appHome, ".agentera", "docs.yaml") },
|
|
479
|
-
{ runtime: "installed-app", filePath: registryModelPath(ctx.appHome) },
|
|
480
|
-
{ runtime: "installed-app", filePath: registryModelPath(path.join(ctx.appHome, "app")) },
|
|
481
|
-
];
|
|
482
|
-
const hooksDir = path.join(project, ".github", "hooks");
|
|
483
|
-
for (const hookFile of walkJsonHookFiles(hooksDir)) {
|
|
484
|
-
candidates.push({ runtime: "copilot", filePath: hookFile });
|
|
485
|
-
}
|
|
486
|
-
for (const { runtime, filePath } of candidates) {
|
|
487
|
-
if (!isFile(filePath))
|
|
488
|
-
continue;
|
|
489
|
-
pushEnvVarRewireItem(items, runtime, filePath);
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
299
|
export function planRuntimeMigrationItems(ctx) {
|
|
493
300
|
if (!ctx.env) {
|
|
494
301
|
throw new Error("MigrationContext.env is required for runtime migration planning; pass sandboxMigrationEnv(home, sourceRoot) in tests or an explicit env in callers.");
|
|
@@ -496,124 +303,126 @@ export function planRuntimeMigrationItems(ctx) {
|
|
|
496
303
|
const home = resolvePath(ctx.home);
|
|
497
304
|
const project = resolvePath(ctx.project);
|
|
498
305
|
const env = ctx.env;
|
|
499
|
-
const sourceRoot = resolvePath(ctx.sourceRoot ?? resolveSourceRoot(env));
|
|
500
|
-
const commands = resolveNpxHookCommands({ ...ctx, home, env, sourceRoot });
|
|
501
306
|
const items = [];
|
|
502
|
-
planCodexItems(items, home, project
|
|
503
|
-
planCursorItems(items, home, project
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
const hookRetirement = planInstalledHooksRetirementItems(ctx).filter((item) => item.status === "pending");
|
|
508
|
-
if (hookRetirement.length > 0 && items.some((item) => item.action === "rewire-runtime" && item.status === "pending")) {
|
|
509
|
-
items.push(...hookRetirement);
|
|
510
|
-
}
|
|
511
|
-
planEnvRuntimeNoops(items, "claude", "Claude Code plugin installs expose the app home without local config writes; use --update-packages to refresh marketplace surfaces");
|
|
512
|
-
planEnvRuntimeNoops(items, "cursor-agent", "Cursor Agent CLI inherits workspace Cursor hooks; no separate managed install surface");
|
|
513
|
-
void loadRegistry();
|
|
307
|
+
planCodexItems(items, home, project);
|
|
308
|
+
planCursorItems(items, home, project);
|
|
309
|
+
planStaleCommandCleanupItems(ctx, items);
|
|
310
|
+
planStaleSkillCleanupItems(ctx, items);
|
|
311
|
+
planCopilotItems(items, project);
|
|
514
312
|
return items;
|
|
515
313
|
}
|
|
516
|
-
|
|
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) {
|
|
517
323
|
if (item.status !== "pending") {
|
|
518
324
|
return;
|
|
519
325
|
}
|
|
520
326
|
try {
|
|
521
327
|
switch (item.action) {
|
|
522
|
-
case "
|
|
523
|
-
if (!item.
|
|
328
|
+
case "retire-hooks": {
|
|
329
|
+
if (!item.source) {
|
|
524
330
|
item.status = "failed";
|
|
525
|
-
item.message = "
|
|
331
|
+
item.message = "retire-hooks missing source";
|
|
526
332
|
return;
|
|
527
333
|
}
|
|
528
|
-
|
|
334
|
+
verifyBoundMigrationResource(item, "source");
|
|
335
|
+
removeBoundMigrationResource(item, "source");
|
|
529
336
|
item.status = "applied";
|
|
530
|
-
item.message = "
|
|
337
|
+
item.message = "retired whole-resource-proven Agentera hook";
|
|
531
338
|
break;
|
|
532
339
|
}
|
|
533
|
-
case "
|
|
534
|
-
if (!item.
|
|
340
|
+
case "remove-stale-command": {
|
|
341
|
+
if (!item.source) {
|
|
535
342
|
item.status = "failed";
|
|
536
|
-
item.message = "
|
|
343
|
+
item.message = "remove-stale-command missing source";
|
|
537
344
|
return;
|
|
538
345
|
}
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
if (!item.source || !item.target) {
|
|
548
|
-
item.status = "failed";
|
|
549
|
-
item.message = `${item.action} missing source or target`;
|
|
550
|
-
return;
|
|
346
|
+
if (!pathExists(item.source)) {
|
|
347
|
+
item.status = "noop";
|
|
348
|
+
item.message = `stale command already absent at ${item.source}`;
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
removeBoundMigrationResource(item, "source");
|
|
352
|
+
item.status = "applied";
|
|
353
|
+
item.message = `removed stale managed command ${path.basename(item.source)}`;
|
|
551
354
|
}
|
|
552
|
-
copyIfChanged(item.source, item.target);
|
|
553
|
-
item.status = "applied";
|
|
554
|
-
item.message = `applied ${item.action}`;
|
|
555
355
|
break;
|
|
556
356
|
}
|
|
557
|
-
case "
|
|
558
|
-
if (!item.source
|
|
357
|
+
case "remove-stale-skill": {
|
|
358
|
+
if (!item.source) {
|
|
559
359
|
item.status = "failed";
|
|
560
|
-
item.message = "
|
|
360
|
+
item.message = "remove-stale-skill missing source";
|
|
561
361
|
return;
|
|
562
362
|
}
|
|
563
|
-
fs.mkdirSync(path.dirname(item.target), { recursive: true });
|
|
564
|
-
// lstat (not stat): stat follows symlinks and ENOENTs on dangling links; rmSync then fails.
|
|
565
|
-
let targetStat = null;
|
|
566
363
|
try {
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
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)}`;
|
|
575
386
|
}
|
|
576
387
|
else {
|
|
577
|
-
|
|
388
|
+
item.status = "blocked";
|
|
389
|
+
item.message = `preserved ${item.source}: only a fingerprinted v2 app-owned symlink is eligible; review it manually`;
|
|
578
390
|
}
|
|
579
391
|
}
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
return;
|
|
590
|
-
}
|
|
591
|
-
if (isFile(item.source)) {
|
|
592
|
-
fs.rmSync(item.source, { force: true });
|
|
593
|
-
}
|
|
594
|
-
if (item.target && isFile(item.target)) {
|
|
595
|
-
const configText = fs.readFileSync(item.target, "utf8");
|
|
596
|
-
const next = retireCodexCopiedHookTrust(configText, item.source);
|
|
597
|
-
fs.writeFileSync(item.target, next, "utf8");
|
|
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
|
+
}
|
|
598
401
|
}
|
|
599
|
-
item.status = "applied";
|
|
600
|
-
item.message = "retired Agentera-owned copied Codex hooks";
|
|
601
402
|
break;
|
|
602
403
|
}
|
|
603
404
|
default:
|
|
405
|
+
item.status = "failed";
|
|
406
|
+
item.message = `unsupported runtime migration action: ${item.action}`;
|
|
604
407
|
break;
|
|
605
408
|
}
|
|
606
409
|
}
|
|
607
410
|
catch (exc) {
|
|
608
|
-
item.status = "
|
|
609
|
-
item.message = `${item.action}
|
|
411
|
+
item.status = "blocked";
|
|
412
|
+
item.message = `${item.action} preserved the resource: ${exc.message}; rerun migration and review it manually`;
|
|
610
413
|
}
|
|
611
414
|
}
|
|
612
|
-
export function applyRuntimeMigrationItems(items,
|
|
613
|
-
const commands = resolveNpxHookCommands(ctx);
|
|
415
|
+
export function applyRuntimeMigrationItems(items, _ctx) {
|
|
614
416
|
for (const item of items) {
|
|
615
|
-
|
|
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
|
+
}
|
|
616
427
|
}
|
|
617
|
-
applyInstalledHooksRetirementItems(items, ctx);
|
|
618
428
|
}
|
|
619
|
-
//# sourceMappingURL=runtimeMigration.js.map
|