agentera 3.0.0-dev.8 → 3.0.0-dev.81
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 +252 -22
- package/bundle/.agentera-build-source.json +8 -0
- package/bundle/CHANGELOG.md +1389 -0
- package/bundle/DESIGN.md +229 -0
- package/bundle/LICENSE +201 -0
- package/bundle/README.md +142 -0
- package/bundle/UPGRADE.md +275 -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 +484 -0
- package/bundle/references/adapters/package-registry.yaml +443 -188
- package/bundle/references/adapters/package-surface-characterization.md +68 -34
- package/bundle/references/adapters/product-v1-reset.yaml +101 -0
- 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 +357 -0
- package/bundle/references/analysis/evidence-tier-authority.yaml +559 -0
- package/bundle/references/analysis/personal-glossary-evaluation-authority.yaml +175 -0
- package/bundle/references/analysis/personal-glossary-evaluation-corpus.yaml +291 -0
- package/bundle/references/analysis/personal-glossary-holdout.yaml +192 -0
- package/bundle/references/analysis/verification-policy.yaml +262 -0
- package/bundle/references/artifacts/artifact-registry-interface-model.yaml +17 -8
- package/bundle/references/artifacts/glossary-entry-contract.yaml +2906 -0
- package/bundle/references/artifacts/state-storage-authority.yaml +3075 -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 +7 -5
- package/bundle/references/cli/vocabulary-index.yaml +7 -9
- package/bundle/references/cli/vocabulary.md +54 -97
- package/bundle/references/meta/retained-reference-authority.yaml +171 -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 +13 -4
- package/bundle/skills/agentera/capabilities/profile/schemas/exit.yaml +8 -5
- package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +8 -37
- package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +67 -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 +29 -30
- package/bundle/skills/agentera/schemas/artifacts/design.yaml +1 -0
- package/bundle/skills/agentera/schemas/artifacts/docs.yaml +7 -43
- package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +140 -34
- package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +87 -0
- package/bundle/skills/agentera/schemas/artifacts/health.yaml +53 -51
- package/bundle/skills/agentera/schemas/artifacts/objective.yaml +18 -35
- package/bundle/skills/agentera/schemas/artifacts/plan.yaml +453 -55
- package/bundle/skills/agentera/schemas/artifacts/progress.yaml +128 -39
- package/bundle/skills/agentera/schemas/artifacts/todo.yaml +305 -7
- package/bundle/skills/agentera/schemas/artifacts/vision.yaml +0 -19
- package/dist/.agentera-build-source.json +8 -0
- package/dist/analytics/extractCorpus/cli.js +52 -11
- package/dist/analytics/extractCorpus/copilotSessions.js +19 -8
- package/dist/analytics/extractCorpus/core.js +262 -14
- package/dist/analytics/extractCorpus/corpus.js +57 -18
- package/dist/analytics/extractCorpus/coverageAudit.js +44 -45
- package/dist/analytics/extractCorpus/cursorSessions.js +28 -8
- package/dist/analytics/extractCorpus/evidenceTiers.js +709 -0
- package/dist/analytics/extractCorpus/extractCorpusParity.js +4 -4
- package/dist/analytics/extractCorpus/filesystemSources.js +5 -5
- package/dist/analytics/extractCorpus/index.js +4 -2
- package/dist/analytics/extractCorpus/jsonlSessions.js +76 -8
- package/dist/analytics/extractCorpus/sqliteCaps.js +0 -1
- package/dist/analytics/extractCorpus/sqliteSessions.js +12 -4
- 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 +113 -0
- package/dist/analytics/personalGlossaryCandidateProjection.js +788 -0
- package/dist/analytics/personalGlossaryCandidateProjectionExcerpts.js +144 -0
- package/dist/analytics/personalGlossaryCandidateProjectionModel.js +1 -0
- package/dist/analytics/personalGlossaryCandidateReadView.js +23 -0
- package/dist/analytics/personalGlossaryCurrentGeneration.js +25 -0
- package/dist/analytics/personalGlossaryDecision.js +203 -0
- package/dist/analytics/personalGlossaryExplicit.js +788 -0
- package/dist/analytics/personalGlossaryExplicitMining.js +285 -0
- package/dist/analytics/personalGlossaryExplicitScope.js +41 -0
- package/dist/analytics/personalGlossaryExplicitSegments.js +418 -0
- package/dist/analytics/personalGlossaryExplicitTypes.js +26 -0
- package/dist/analytics/personalGlossaryLexicalClassifier.js +175 -0
- package/dist/analytics/personalGlossaryProfile.js +229 -0
- package/dist/analytics/personalGlossaryRecurrence.js +618 -0
- package/dist/analytics/personalGlossaryRefreshProjection.js +351 -0
- package/dist/analytics/personalGlossaryReviewRecordStorage.js +428 -0
- package/dist/analytics/personalGlossaryReviewRecords.js +332 -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 +20 -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 +104 -5
- 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 +52 -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 +162 -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/personalGlossaryCandidateReads.js +755 -0
- package/dist/cli/commands/personalGlossaryDecision.js +349 -0
- package/dist/cli/commands/personalGlossaryPublish.js +484 -0
- package/dist/cli/commands/personalGlossaryReviewRecordReads.js +209 -0
- package/dist/cli/commands/personalGlossaryReviewRecords.js +623 -0
- package/dist/cli/commands/prime/briefOrientation.js +845 -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 +338 -0
- package/dist/cli/commands/prime/collectOrientationState.js +124 -68
- package/dist/cli/commands/prime/orientationOutput.js +271 -59
- package/dist/cli/commands/prime/types.js +0 -1
- package/dist/cli/commands/prime.js +89 -11
- package/dist/cli/commands/profileGrounding.js +55 -0
- package/dist/cli/commands/query.js +74 -52
- package/dist/cli/commands/report.js +187 -27
- package/dist/cli/commands/route.js +142 -0
- package/dist/cli/commands/schema.js +436 -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 +459 -0
- package/dist/cli/commands/upgrade.js +176 -5
- package/dist/cli/commands/upgradeVerify.js +118 -0
- package/dist/cli/commands/validate.js +235 -136
- package/dist/cli/commands/verify.js +73 -16
- 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 +84 -52
- package/dist/cli/dispatch/lifecycle.js +182 -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 +419 -41
- package/dist/cli/migrationRequired.js +125 -0
- package/dist/cli/orientation/attention.js +19 -22
- 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/productV1Eol.js +55 -0
- package/dist/cli/profileAcquisition.js +167 -0
- package/dist/cli/startupCompletenessContract.js +11 -9
- 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 +23 -0
- package/dist/core/developmentChannel.js +1 -0
- package/dist/core/developmentInvocation.js +377 -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 +61 -2
- package/dist/eval/evalSkills.js +13 -14
- package/dist/eval/glossaryEvaluation.js +751 -0
- package/dist/eval/glossaryEvaluationProcess.js +29 -0
- package/dist/eval/glossaryEvaluationRunner.js +571 -0
- package/dist/eval/glossaryEvaluationSuccessReport.js +297 -0
- 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 +145 -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 +375 -0
- package/dist/registries/explicitSegmentGrammarContract.js +619 -0
- package/dist/registries/glossaryAdviceContract.js +79 -0
- package/dist/registries/glossaryCandidateContractPaths.js +6 -0
- package/dist/registries/glossaryCandidateContracts.js +820 -0
- package/dist/registries/glossaryCandidateDecisionAuthority.js +119 -0
- package/dist/registries/glossaryCandidateDecisionContract.js +62 -0
- package/dist/registries/glossaryCandidateProjectionAuthority.js +345 -0
- package/dist/registries/glossaryCandidateProjectionContract.js +108 -0
- package/dist/registries/glossaryCaveatContract.js +67 -0
- package/dist/registries/glossaryConsumerContractValidation.js +787 -0
- package/dist/registries/glossaryEntryContract.js +759 -0
- package/dist/registries/glossaryEntryTemporal.js +12 -0
- package/dist/registries/glossaryMiningAuthority.js +764 -0
- package/dist/registries/glossaryProfileFullContract.js +24 -0
- package/dist/registries/glossaryReviewRecordsAuthority.js +426 -0
- package/dist/registries/glossaryReviewRecordsContract.js +129 -0
- package/dist/registries/glossaryTermIdentity.js +139 -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/personalGlossaryContracts.js +1 -0
- 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 +168 -11
- 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 +618 -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 +894 -0
- package/dist/state/entityWriterLock.js +18 -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/todoCreateBatch.js +69 -0
- package/dist/state/todoDocsEntities.js +1339 -0
- package/dist/state/todoDocsEntityValidation.js +158 -0
- package/dist/state/todoMarkdownProjection.js +63 -0
- package/dist/state/todoReconciliationActivation.js +182 -0
- package/dist/state/todoReconciliationInspection.js +184 -0
- package/dist/state/todoReconciliationRepair.js +320 -0
- package/dist/state/todoReconciliationTransaction.js +628 -0
- package/dist/state/todoSeverityHeadings.js +71 -0
- package/dist/state/todoTransitionBatch.js +65 -0
- package/dist/state/todoUpdateBatch.js +50 -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 +380 -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 +133 -34
- package/dist/upgrade/lifecycleUpgrade.js +126 -0
- package/dist/upgrade/migrateArtifactsV2ToV3.js +325 -82
- package/dist/upgrade/migrationPublication.js +122 -0
- package/dist/upgrade/nextMajorDoctor.js +0 -22
- package/dist/upgrade/npxPlatformStatus.js +2 -2
- package/dist/upgrade/productV1Reset.js +515 -0
- package/dist/upgrade/productV1ResetAuthority.js +139 -0
- package/dist/upgrade/projectIntegration.js +126 -134
- package/dist/upgrade/projectIntegrationDecision.js +21 -13
- package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
- package/dist/upgrade/runtimeMigration.js +210 -430
- package/dist/upgrade/upgradeCommands.js +14 -1
- package/dist/upgrade/upgradeLock.js +85 -0
- package/dist/upgrade/upgradeOrchestrator.js +257 -48
- package/dist/upgrade/v3CapabilitySurface.js +2 -3
- package/dist/upgrade/versionResolution.js +0 -1
- package/dist/validate/activationArtifactEvidence.js +866 -0
- package/dist/validate/activationArtifactEvidenceTypes.js +12 -0
- package/dist/validate/activationConjunction.js +816 -0
- package/dist/validate/activationEvidenceManifest.js +610 -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/glossaryVariantGuard.js +96 -0
- package/dist/validate/retainedReferenceAuthority.js +879 -0
- package/dist/validate/selfAudit.js +39 -45
- package/dist/validate/vocabularyAuthority.js +8 -8
- package/package.json +39 -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/index.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/plan/instructions.js.map +0 -1
- package/dist/capabilities/profile/instructions.js.map +0 -1
- package/dist/capabilities/research/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/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/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/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/types.js.map +0 -1
- package/dist/cli/commands/prime/v1Migration.js +0 -39
- 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/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/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/types.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/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/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/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/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/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,14 +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 { resolveSourceRoot } from "../core/sourceRoot.js";
|
|
6
|
-
import { loadRegistry } from "../registries/runtimeAdapterRegistry.js";
|
|
7
|
-
import { codexCopiedHooksAreAgenteraOnly, codexPluginHooksEnabled, retireCodexCopiedHookTrust, } from "../setup/codex.js";
|
|
8
5
|
import { hasManagedMarker, opencodeConfigDir, } from "../setup/opencode.js";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
6
|
+
import { OPENCODE_SKILL_NAMES } from "../setup/opencodeConstants.js";
|
|
7
|
+
import { doctorRoots } from "./appModel.js";
|
|
8
|
+
import { bindMigrationResource, removeBoundMigrationResource, verifyBoundMigrationResource, } from "./migrationPublication.js";
|
|
12
9
|
const PYTHON_MANAGED_PATTERNS = [
|
|
13
10
|
/hooks\/validate_artifact\.py/,
|
|
14
11
|
/hooks\/cursor_session_start\.py/,
|
|
@@ -35,350 +32,116 @@ export function projectHasProjectLevelRuntimeHooks(project) {
|
|
|
35
32
|
return candidates.some((candidate) => isFile(candidate) || pathExists(candidate));
|
|
36
33
|
}
|
|
37
34
|
const OPENCODE_COMMAND_NAMES = ["agentera"];
|
|
38
|
-
const OPENCODE_SKILL_NAMES = ["agentera", "status"];
|
|
39
|
-
const CURSOR_AGENT_MARKER = "<!-- agentera: managed -->";
|
|
40
|
-
export function resolveNpxHookCommands(ctx) {
|
|
41
|
-
const env = ctx.env ?? process.env;
|
|
42
|
-
const home = ctx.home ?? env.HOME ?? os.homedir();
|
|
43
|
-
const sourceRoot = ctx.sourceRoot ?? resolveSourceRoot(env);
|
|
44
|
-
const channel = resolveUpdateChannel({
|
|
45
|
-
channel: ctx.channel ?? null,
|
|
46
|
-
env,
|
|
47
|
-
home,
|
|
48
|
-
sourceRoot,
|
|
49
|
-
});
|
|
50
|
-
const cliEntrypoint = channel.updateCommand.trim();
|
|
51
|
-
return {
|
|
52
|
-
cliEntrypoint,
|
|
53
|
-
validate: `${cliEntrypoint} hook validate-artifact`,
|
|
54
|
-
cursorSessionStart: `${cliEntrypoint} hook cursor-session-start`,
|
|
55
|
-
cursorSessionStop: `${cliEntrypoint} hook session-stop`,
|
|
56
|
-
cursorPreTool: `${cliEntrypoint} hook cursor-pre-tool-use`,
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
35
|
export function textUsesPythonManagedEntrypoint(text) {
|
|
60
36
|
if (/AGENTERA_HOME\s*=/.test(text)) {
|
|
61
37
|
return true;
|
|
62
38
|
}
|
|
63
39
|
return PYTHON_MANAGED_PATTERNS.some((pattern) => pattern.test(text));
|
|
64
40
|
}
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
next = next.replace(/uv run\s+\\?"?\$\{AGENTERA_HOME\}\/hooks\/validate_artifact\.py\\?"?/g, commands.validate);
|
|
72
|
-
next = next.replace(/uv run\s+\\?"?\$\{AGENTERA_HOME\}\/app\/hooks\/validate_artifact\.py\\?"?/g, commands.validate);
|
|
73
|
-
next = next.replace(/uv run\s+\\?"?\$\{PLUGIN_ROOT\}\/hooks\/validate_artifact\.py\\?"?/g, commands.validate);
|
|
74
|
-
next = next.replace(/uv run\s+hooks\/validate_artifact\.py/g, commands.validate);
|
|
75
|
-
if (next.includes("validate_artifact.py")) {
|
|
76
|
-
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);
|
|
77
47
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
if (runtime === "codex") {
|
|
86
|
-
next = next.replace(/AGENTERA_HOME\s*=\s*"[^"]*"/g, "");
|
|
87
|
-
next = next.replace(/AGENTERA_HOME\s*=\s*'[^']*'/g, "");
|
|
88
|
-
next = next.replace(/set\s*=\s*\{\s*,/g, "set = {");
|
|
89
|
-
next = next.replace(/,\s*,/g, ",");
|
|
90
|
-
next = next.replace(/,\s*\}/g, " }");
|
|
91
|
-
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
|
+
}
|
|
92
55
|
}
|
|
93
|
-
return
|
|
56
|
+
return commands;
|
|
94
57
|
}
|
|
95
|
-
function
|
|
96
|
-
|
|
97
|
-
|
|
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);
|
|
98
70
|
}
|
|
99
|
-
|
|
100
|
-
return
|
|
71
|
+
catch {
|
|
72
|
+
return false;
|
|
101
73
|
}
|
|
102
|
-
|
|
74
|
+
const commands = retiredHookCommands(document);
|
|
75
|
+
return commands.length > 0 && commands.every(isRetiredAgenteraHookCommand);
|
|
103
76
|
}
|
|
104
|
-
function
|
|
77
|
+
function textContainsRetiredAgenteraHook(text) {
|
|
78
|
+
return textUsesPythonManagedEntrypoint(text) || RETIRED_NPX_HOOK.test(text);
|
|
79
|
+
}
|
|
80
|
+
function pushRetireHookItem(items, runtime, filePath, allowedRoot) {
|
|
105
81
|
const text = fs.readFileSync(filePath, "utf8");
|
|
106
|
-
|
|
107
|
-
if (!textUsesPythonManagedEntrypoint(text) && !textReferencesV2InstalledHooks(text) && !needsBare) {
|
|
108
|
-
if (textUsesV3NpmEntrypoint(text)) {
|
|
109
|
-
items.push({
|
|
110
|
-
status: "noop",
|
|
111
|
-
action: "rewire-runtime",
|
|
112
|
-
runtime,
|
|
113
|
-
source: filePath,
|
|
114
|
-
message: "runtime config already references npm self-contained entrypoint",
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
// If the file has no Agentera content at all (no v2 Python, no v3 npm),
|
|
118
|
-
// it is not Agentera-managed. Do not push a blocked item — just return.
|
|
82
|
+
if (!textContainsRetiredAgenteraHook(text)) {
|
|
119
83
|
return;
|
|
120
84
|
}
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
status,
|
|
125
|
-
action: "rewire-runtime",
|
|
85
|
+
const item = {
|
|
86
|
+
status: wholeResourceProvesV2HookOwnership(text) ? "pending" : "blocked",
|
|
87
|
+
action: "retire-hooks",
|
|
126
88
|
runtime,
|
|
127
89
|
source: filePath,
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
function hasCursorManagedAgentMarker(text) {
|
|
136
|
-
return text.includes(CURSOR_AGENT_MARKER);
|
|
137
|
-
}
|
|
138
|
-
function copyIfChanged(source, target) {
|
|
139
|
-
if (!isFile(source)) {
|
|
140
|
-
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;
|
|
141
97
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
return false;
|
|
147
|
-
}
|
|
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`;
|
|
148
102
|
}
|
|
149
|
-
|
|
150
|
-
fs.copyFileSync(source, target);
|
|
151
|
-
return true;
|
|
103
|
+
items.push(item);
|
|
152
104
|
}
|
|
153
|
-
function planCodexItems(items, home, project
|
|
105
|
+
function planCodexItems(items, home, project) {
|
|
154
106
|
for (const root of [project, home]) {
|
|
155
107
|
const hooksPath = path.join(root, ".codex", "hooks", "codex-hooks.json");
|
|
156
|
-
const configPath = path.join(root, ".codex", "config.toml");
|
|
157
108
|
if (isFile(hooksPath)) {
|
|
158
|
-
|
|
159
|
-
}
|
|
160
|
-
if (isFile(configPath)) {
|
|
161
|
-
pushRewireItem(items, "codex", configPath, commands);
|
|
162
|
-
const configText = fs.readFileSync(configPath, "utf8");
|
|
163
|
-
const pluginHooks = codexPluginHooksEnabled(configText);
|
|
164
|
-
if (pluginHooks && isFile(hooksPath)) {
|
|
165
|
-
let hooksText;
|
|
166
|
-
try {
|
|
167
|
-
hooksText = fs.readFileSync(hooksPath, "utf8");
|
|
168
|
-
}
|
|
169
|
-
catch {
|
|
170
|
-
hooksText = "";
|
|
171
|
-
}
|
|
172
|
-
if (codexCopiedHooksAreAgenteraOnly(hooksText)) {
|
|
173
|
-
items.push({
|
|
174
|
-
status: "pending",
|
|
175
|
-
action: "retire-hooks",
|
|
176
|
-
runtime: "codex",
|
|
177
|
-
source: hooksPath,
|
|
178
|
-
target: configPath,
|
|
179
|
-
message: "will remove Agentera-owned copied Codex hooks because plugin hooks are enabled",
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
else if (hooksText.includes("validate_artifact") || hooksText.includes("hook validate-artifact")) {
|
|
183
|
-
items.push({
|
|
184
|
-
status: force ? "pending" : "blocked",
|
|
185
|
-
action: "retire-hooks",
|
|
186
|
-
runtime: "codex",
|
|
187
|
-
source: hooksPath,
|
|
188
|
-
target: configPath,
|
|
189
|
-
message: "plugin hooks are enabled, but copied hook target needs manual review before retirement",
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
}
|
|
109
|
+
pushRetireHookItem(items, "codex", hooksPath, root);
|
|
193
110
|
}
|
|
194
111
|
}
|
|
195
112
|
}
|
|
196
|
-
function planCursorItems(items, home, project
|
|
197
|
-
for (const hooksPath of [
|
|
198
|
-
path.join(project, ".cursor", "hooks.json"),
|
|
199
|
-
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")],
|
|
200
117
|
]) {
|
|
201
118
|
if (isFile(hooksPath)) {
|
|
202
|
-
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
const agentsSource = path.join(sourceRoot, ".cursor", "agents");
|
|
206
|
-
const pluginSource = path.join(sourceRoot, ".cursor-plugin", "plugin.json");
|
|
207
|
-
for (const root of [project]) {
|
|
208
|
-
const agentsDir = path.join(root, ".cursor", "agents");
|
|
209
|
-
if (isFile(pluginSource) && root === project) {
|
|
210
|
-
const pluginTarget = path.join(root, ".cursor-plugin", "plugin.json");
|
|
211
|
-
if (!isFile(pluginTarget)) {
|
|
212
|
-
items.push({
|
|
213
|
-
status: "pending",
|
|
214
|
-
action: "copy-plugin",
|
|
215
|
-
runtime: "cursor",
|
|
216
|
-
source: pluginSource,
|
|
217
|
-
target: pluginTarget,
|
|
218
|
-
message: "will copy managed Cursor plugin manifest",
|
|
219
|
-
});
|
|
220
|
-
}
|
|
221
|
-
else if (!fs.readFileSync(pluginSource).equals(fs.readFileSync(pluginTarget))) {
|
|
222
|
-
items.push({
|
|
223
|
-
status: "pending",
|
|
224
|
-
action: "copy-plugin",
|
|
225
|
-
runtime: "cursor",
|
|
226
|
-
source: pluginSource,
|
|
227
|
-
target: pluginTarget,
|
|
228
|
-
message: "will refresh managed Cursor plugin manifest",
|
|
229
|
-
});
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
const skipInTreeCursorAgents = root === project && projectUsesV3CapabilityInstructionModules(project);
|
|
233
|
-
if (skipInTreeCursorAgents) {
|
|
234
|
-
items.push({
|
|
235
|
-
status: "skipped",
|
|
236
|
-
action: "copy-agent",
|
|
237
|
-
runtime: "cursor",
|
|
238
|
-
target: agentsDir,
|
|
239
|
-
message: "v3 capability instruction modules present; in-tree .cursor/agents/ uses prime --context and is not overwritten",
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
else if (pathExists(agentsSource)) {
|
|
243
|
-
const CURSOR_MANAGED_AGENT = "agentera.md";
|
|
244
|
-
const src = path.join(agentsSource, CURSOR_MANAGED_AGENT);
|
|
245
|
-
if (isFile(src)) {
|
|
246
|
-
const dst = path.join(agentsDir, CURSOR_MANAGED_AGENT);
|
|
247
|
-
if (!isFile(dst)) {
|
|
248
|
-
items.push({
|
|
249
|
-
status: "pending",
|
|
250
|
-
action: "copy-agent",
|
|
251
|
-
runtime: "cursor",
|
|
252
|
-
source: src,
|
|
253
|
-
target: dst,
|
|
254
|
-
message: "will copy managed Cursor Agentera agent",
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
else {
|
|
258
|
-
const dstText = fs.readFileSync(dst, "utf8");
|
|
259
|
-
const srcText = fs.readFileSync(src, "utf8");
|
|
260
|
-
if (hasCursorManagedAgentMarker(dstText) && dstText !== srcText) {
|
|
261
|
-
items.push({
|
|
262
|
-
status: "pending",
|
|
263
|
-
action: "copy-agent",
|
|
264
|
-
runtime: "cursor",
|
|
265
|
-
source: src,
|
|
266
|
-
target: dst,
|
|
267
|
-
message: "will refresh stale managed Cursor Agentera agent",
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
}
|
|
119
|
+
pushRetireHookItem(items, "cursor", hooksPath, root);
|
|
272
120
|
}
|
|
273
121
|
}
|
|
274
122
|
}
|
|
275
|
-
function
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
items.push({
|
|
284
|
-
status: needsCopy ? "pending" : "noop",
|
|
285
|
-
action: "copy-plugin",
|
|
286
|
-
runtime: "opencode",
|
|
287
|
-
source: pluginSource,
|
|
288
|
-
target: pluginTarget,
|
|
289
|
-
message: needsCopy
|
|
290
|
-
? "will copy current Agentera OpenCode plugin to native plugin path"
|
|
291
|
-
: "OpenCode plugin already current at native plugin path",
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
const commandsSourceDir = path.join(sourceRoot, ".opencode", "commands");
|
|
295
|
-
const commandsTargetDir = path.join(configDir, "commands");
|
|
296
|
-
for (const name of OPENCODE_COMMAND_NAMES) {
|
|
297
|
-
const src = path.join(commandsSourceDir, `${name}.md`);
|
|
298
|
-
const dst = path.join(commandsTargetDir, `${name}.md`);
|
|
299
|
-
if (isFile(src)) {
|
|
300
|
-
const needsCopy = !isFile(dst) || (hasManagedMarker(fs.readFileSync(dst, "utf8")) && !fs.readFileSync(src).equals(fs.readFileSync(dst)));
|
|
301
|
-
items.push({
|
|
302
|
-
status: needsCopy ? "pending" : "noop",
|
|
303
|
-
action: "copy-command",
|
|
304
|
-
runtime: "opencode",
|
|
305
|
-
source: src,
|
|
306
|
-
target: dst,
|
|
307
|
-
message: needsCopy ? "will sync managed OpenCode command" : "OpenCode managed command already current",
|
|
308
|
-
});
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
const agentsSourceDir = path.join(sourceRoot, ".opencode", "agents");
|
|
312
|
-
const agentsTargetDir = path.join(configDir, "agents");
|
|
313
|
-
const OPENCODE_MANAGED_AGENT = "agentera.md";
|
|
314
|
-
if (pathExists(agentsSourceDir)) {
|
|
315
|
-
const src = path.join(agentsSourceDir, OPENCODE_MANAGED_AGENT);
|
|
316
|
-
if (isFile(src)) {
|
|
317
|
-
const dst = path.join(agentsTargetDir, OPENCODE_MANAGED_AGENT);
|
|
318
|
-
const needsCopy = !isFile(dst) || !fs.readFileSync(src).equals(fs.readFileSync(dst));
|
|
319
|
-
items.push({
|
|
320
|
-
status: needsCopy ? "pending" : "noop",
|
|
321
|
-
action: "copy-agent",
|
|
322
|
-
runtime: "opencode",
|
|
323
|
-
source: src,
|
|
324
|
-
target: dst,
|
|
325
|
-
message: needsCopy ? "will copy managed OpenCode Agentera agent" : "OpenCode Agentera agent already current",
|
|
326
|
-
});
|
|
327
|
-
}
|
|
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);
|
|
328
131
|
}
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
for (const name of OPENCODE_SKILL_NAMES) {
|
|
332
|
-
const src = path.join(skillsSourceRoot, name);
|
|
333
|
-
const dst = path.join(skillsTargetDir, name);
|
|
334
|
-
if (!isFile(path.join(src, "SKILL.md"))) {
|
|
335
|
-
continue;
|
|
336
|
-
}
|
|
337
|
-
if (!pathExists(dst)) {
|
|
338
|
-
items.push({
|
|
339
|
-
status: "pending",
|
|
340
|
-
action: "link-skill",
|
|
341
|
-
runtime: "opencode",
|
|
342
|
-
source: src,
|
|
343
|
-
target: dst,
|
|
344
|
-
message: "will create OpenCode skill link",
|
|
345
|
-
});
|
|
346
|
-
continue;
|
|
347
|
-
}
|
|
348
|
-
try {
|
|
349
|
-
const linkTarget = fs.readlinkSync(dst);
|
|
350
|
-
if (!linkTarget.includes("agentera") && path.basename(linkTarget) !== name) {
|
|
351
|
-
items.push({
|
|
352
|
-
status: "blocked",
|
|
353
|
-
action: "link-skill",
|
|
354
|
-
runtime: "opencode",
|
|
355
|
-
source: src,
|
|
356
|
-
target: dst,
|
|
357
|
-
message: "OpenCode skill path is user-owned; manual review required",
|
|
358
|
-
});
|
|
359
|
-
}
|
|
360
|
-
else if (path.resolve(path.dirname(dst), linkTarget) !== path.resolve(src)) {
|
|
361
|
-
items.push({
|
|
362
|
-
status: "pending",
|
|
363
|
-
action: "link-skill",
|
|
364
|
-
runtime: "opencode",
|
|
365
|
-
source: src,
|
|
366
|
-
target: dst,
|
|
367
|
-
message: "will update stale Agentera-managed OpenCode skill link",
|
|
368
|
-
});
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
catch {
|
|
372
|
-
items.push({
|
|
373
|
-
status: "pending",
|
|
374
|
-
action: "link-skill",
|
|
375
|
-
runtime: "opencode",
|
|
376
|
-
source: src,
|
|
377
|
-
target: dst,
|
|
378
|
-
message: "will replace non-symlink OpenCode skill path with managed link",
|
|
379
|
-
});
|
|
380
|
-
}
|
|
132
|
+
catch {
|
|
133
|
+
return null;
|
|
381
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
|
+
};
|
|
382
145
|
}
|
|
383
146
|
export function planStaleCommandCleanupItems(ctx, items) {
|
|
384
147
|
const env = ctx.env ?? process.env;
|
|
@@ -404,48 +167,99 @@ export function planStaleCommandCleanupItems(ctx, items) {
|
|
|
404
167
|
if (currentNames.has(name)) {
|
|
405
168
|
continue;
|
|
406
169
|
}
|
|
407
|
-
|
|
170
|
+
const item = {
|
|
408
171
|
status: "pending",
|
|
409
172
|
action: "remove-stale-command",
|
|
410
173
|
runtime: "opencode",
|
|
411
174
|
source: filePath,
|
|
412
175
|
message: `will remove stale managed command ${path.basename(filePath)}`,
|
|
413
|
-
}
|
|
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`;
|
|
181
|
+
}
|
|
182
|
+
items.push(item);
|
|
414
183
|
}
|
|
415
184
|
}
|
|
416
185
|
export function planStaleSkillCleanupItems(ctx, items) {
|
|
417
186
|
const env = ctx.env ?? process.env;
|
|
418
187
|
const home = resolvePath(ctx.home);
|
|
419
188
|
const skillsDir = path.join(opencodeConfigDir(home, env), "skills");
|
|
420
|
-
|
|
189
|
+
let skillsDirectory;
|
|
190
|
+
try {
|
|
191
|
+
skillsDirectory = fs.lstatSync(skillsDir);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (!skillsDirectory.isDirectory()) {
|
|
197
|
+
items.push({
|
|
198
|
+
status: "blocked",
|
|
199
|
+
action: "remove-stale-skill",
|
|
200
|
+
runtime: "opencode",
|
|
201
|
+
source: skillsDir,
|
|
202
|
+
message: `preserved ${skillsDir}: the legacy skills path is not a real directory; replace the unsafe path or review it manually`,
|
|
203
|
+
});
|
|
421
204
|
return;
|
|
422
205
|
}
|
|
423
206
|
const requiredNames = new Set(OPENCODE_SKILL_NAMES);
|
|
207
|
+
const managedSkillsRoot = path.join(doctorRoots(resolvePath(ctx.appHome)).activeBundleRoot, "skills");
|
|
424
208
|
for (const entry of fs.readdirSync(skillsDir, { withFileTypes: true })) {
|
|
209
|
+
const linkPath = path.join(skillsDir, entry.name);
|
|
425
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
|
+
}
|
|
426
220
|
continue;
|
|
427
221
|
}
|
|
428
|
-
const linkPath = path.join(skillsDir, entry.name);
|
|
429
222
|
let linkTarget;
|
|
430
223
|
try {
|
|
431
224
|
linkTarget = fs.readlinkSync(linkPath);
|
|
432
225
|
}
|
|
433
226
|
catch {
|
|
227
|
+
items.push({
|
|
228
|
+
status: "blocked",
|
|
229
|
+
action: "remove-stale-skill",
|
|
230
|
+
runtime: "opencode",
|
|
231
|
+
source: linkPath,
|
|
232
|
+
message: `preserved ${linkPath}: the symlink target could not be inspected; review the unsafe resource manually`,
|
|
233
|
+
});
|
|
434
234
|
continue;
|
|
435
235
|
}
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
236
|
+
const ownership = symlinkOwnership(linkPath, managedSkillsRoot);
|
|
237
|
+
if (!ownership) {
|
|
238
|
+
if (requiredNames.has(entry.name) || linkTarget.toLowerCase().includes("agentera")) {
|
|
239
|
+
items.push({
|
|
240
|
+
status: "blocked",
|
|
241
|
+
action: "remove-stale-skill",
|
|
242
|
+
runtime: "opencode",
|
|
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`,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
440
247
|
continue;
|
|
441
248
|
}
|
|
442
|
-
|
|
249
|
+
const item = {
|
|
443
250
|
status: "pending",
|
|
444
251
|
action: "remove-stale-skill",
|
|
445
252
|
runtime: "opencode",
|
|
446
253
|
source: linkPath,
|
|
447
|
-
|
|
448
|
-
|
|
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`;
|
|
261
|
+
}
|
|
262
|
+
items.push(item);
|
|
449
263
|
}
|
|
450
264
|
}
|
|
451
265
|
function walkJsonHookFiles(dir) {
|
|
@@ -468,10 +282,10 @@ function walkJsonHookFiles(dir) {
|
|
|
468
282
|
walk(dir);
|
|
469
283
|
return out;
|
|
470
284
|
}
|
|
471
|
-
function planCopilotItems(items, project
|
|
285
|
+
function planCopilotItems(items, project) {
|
|
472
286
|
const hooksDir = path.join(project, ".github", "hooks");
|
|
473
287
|
for (const hookFile of walkJsonHookFiles(hooksDir)) {
|
|
474
|
-
|
|
288
|
+
pushRetireHookItem(items, "copilot", hookFile, project);
|
|
475
289
|
}
|
|
476
290
|
if (!items.some((item) => item.runtime === "copilot")) {
|
|
477
291
|
items.push({
|
|
@@ -482,11 +296,6 @@ function planCopilotItems(items, project, commands) {
|
|
|
482
296
|
});
|
|
483
297
|
}
|
|
484
298
|
}
|
|
485
|
-
function planEnvRuntimeNoops(items, runtime, message) {
|
|
486
|
-
if (!items.some((item) => item.runtime === runtime)) {
|
|
487
|
-
items.push({ status: "noop", action: "configure", runtime, message });
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
299
|
export function planRuntimeMigrationItems(ctx) {
|
|
491
300
|
if (!ctx.env) {
|
|
492
301
|
throw new Error("MigrationContext.env is required for runtime migration planning; pass sandboxMigrationEnv(home, sourceRoot) in tests or an explicit env in callers.");
|
|
@@ -494,98 +303,38 @@ export function planRuntimeMigrationItems(ctx) {
|
|
|
494
303
|
const home = resolvePath(ctx.home);
|
|
495
304
|
const project = resolvePath(ctx.project);
|
|
496
305
|
const env = ctx.env;
|
|
497
|
-
const sourceRoot = resolvePath(ctx.sourceRoot ?? resolveSourceRoot(env));
|
|
498
|
-
const commands = resolveNpxHookCommands({ ...ctx, home, env, sourceRoot });
|
|
499
306
|
const items = [];
|
|
500
|
-
planCodexItems(items, home, project
|
|
501
|
-
planCursorItems(items, home, project
|
|
502
|
-
planOpencodeItems(items, home, sourceRoot, env, commands);
|
|
307
|
+
planCodexItems(items, home, project);
|
|
308
|
+
planCursorItems(items, home, project);
|
|
503
309
|
planStaleCommandCleanupItems(ctx, items);
|
|
504
310
|
planStaleSkillCleanupItems(ctx, items);
|
|
505
|
-
planCopilotItems(items, project
|
|
506
|
-
const hookRetirement = planInstalledHooksRetirementItems(ctx).filter((item) => item.status === "pending");
|
|
507
|
-
if (hookRetirement.length > 0 && items.some((item) => item.action === "rewire-runtime" && item.status === "pending")) {
|
|
508
|
-
items.push(...hookRetirement);
|
|
509
|
-
}
|
|
510
|
-
planEnvRuntimeNoops(items, "claude", "Claude Code plugin installs expose the app home without local config writes; use --update-packages to refresh marketplace surfaces");
|
|
511
|
-
planEnvRuntimeNoops(items, "cursor-agent", "Cursor Agent CLI inherits workspace Cursor hooks; no separate managed install surface");
|
|
512
|
-
void loadRegistry();
|
|
311
|
+
planCopilotItems(items, project);
|
|
513
312
|
return items;
|
|
514
313
|
}
|
|
515
|
-
|
|
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) {
|
|
516
323
|
if (item.status !== "pending") {
|
|
517
324
|
return;
|
|
518
325
|
}
|
|
519
326
|
try {
|
|
520
327
|
switch (item.action) {
|
|
521
|
-
case "rewire-runtime": {
|
|
522
|
-
if (!item.target || item.newText === undefined) {
|
|
523
|
-
item.status = "failed";
|
|
524
|
-
item.message = "rewire-runtime missing target or newText";
|
|
525
|
-
return;
|
|
526
|
-
}
|
|
527
|
-
fs.writeFileSync(item.target, item.newText, "utf8");
|
|
528
|
-
item.status = "applied";
|
|
529
|
-
item.message = "runtime config rewired to npm self-contained entrypoint";
|
|
530
|
-
break;
|
|
531
|
-
}
|
|
532
|
-
case "copy-plugin":
|
|
533
|
-
case "copy-agent":
|
|
534
|
-
case "copy-command": {
|
|
535
|
-
if (!item.source || !item.target) {
|
|
536
|
-
item.status = "failed";
|
|
537
|
-
item.message = `${item.action} missing source or target`;
|
|
538
|
-
return;
|
|
539
|
-
}
|
|
540
|
-
copyIfChanged(item.source, item.target);
|
|
541
|
-
item.status = "applied";
|
|
542
|
-
item.message = `applied ${item.action}`;
|
|
543
|
-
break;
|
|
544
|
-
}
|
|
545
|
-
case "link-skill": {
|
|
546
|
-
if (!item.source || !item.target) {
|
|
547
|
-
item.status = "failed";
|
|
548
|
-
item.message = "link-skill missing source or target";
|
|
549
|
-
return;
|
|
550
|
-
}
|
|
551
|
-
fs.mkdirSync(path.dirname(item.target), { recursive: true });
|
|
552
|
-
// lstat (not stat): stat follows symlinks and ENOENTs on dangling links; rmSync then fails.
|
|
553
|
-
let targetStat = null;
|
|
554
|
-
try {
|
|
555
|
-
targetStat = fs.lstatSync(item.target);
|
|
556
|
-
}
|
|
557
|
-
catch {
|
|
558
|
-
/* target absent */
|
|
559
|
-
}
|
|
560
|
-
if (targetStat) {
|
|
561
|
-
if (targetStat.isSymbolicLink()) {
|
|
562
|
-
fs.unlinkSync(item.target);
|
|
563
|
-
}
|
|
564
|
-
else {
|
|
565
|
-
fs.rmSync(item.target, { recursive: true, force: true });
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
fs.symlinkSync(item.source, item.target);
|
|
569
|
-
item.status = "applied";
|
|
570
|
-
item.message = "OpenCode skill link created";
|
|
571
|
-
break;
|
|
572
|
-
}
|
|
573
328
|
case "retire-hooks": {
|
|
574
329
|
if (!item.source) {
|
|
575
330
|
item.status = "failed";
|
|
576
331
|
item.message = "retire-hooks missing source";
|
|
577
332
|
return;
|
|
578
333
|
}
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
}
|
|
582
|
-
if (item.target && isFile(item.target)) {
|
|
583
|
-
const configText = fs.readFileSync(item.target, "utf8");
|
|
584
|
-
const next = retireCodexCopiedHookTrust(configText, item.source);
|
|
585
|
-
fs.writeFileSync(item.target, next, "utf8");
|
|
586
|
-
}
|
|
334
|
+
verifyBoundMigrationResource(item, "source");
|
|
335
|
+
removeBoundMigrationResource(item, "source");
|
|
587
336
|
item.status = "applied";
|
|
588
|
-
item.message = "retired
|
|
337
|
+
item.message = "retired whole-resource-proven Agentera hook";
|
|
589
338
|
break;
|
|
590
339
|
}
|
|
591
340
|
case "remove-stale-command": {
|
|
@@ -594,15 +343,15 @@ export function applyRuntimeMigrationItem(item, commands) {
|
|
|
594
343
|
item.message = "remove-stale-command missing source";
|
|
595
344
|
return;
|
|
596
345
|
}
|
|
597
|
-
if (
|
|
598
|
-
fs.rmSync(item.source, { force: true });
|
|
599
|
-
item.status = "applied";
|
|
600
|
-
item.message = `removed stale managed command ${path.basename(item.source)}`;
|
|
601
|
-
}
|
|
602
|
-
else {
|
|
346
|
+
if (!pathExists(item.source)) {
|
|
603
347
|
item.status = "noop";
|
|
604
348
|
item.message = `stale command already absent at ${item.source}`;
|
|
605
349
|
}
|
|
350
|
+
else {
|
|
351
|
+
removeBoundMigrationResource(item, "source");
|
|
352
|
+
item.status = "applied";
|
|
353
|
+
item.message = `removed stale managed command ${path.basename(item.source)}`;
|
|
354
|
+
}
|
|
606
355
|
break;
|
|
607
356
|
}
|
|
608
357
|
case "remove-stale-skill": {
|
|
@@ -614,35 +363,66 @@ export function applyRuntimeMigrationItem(item, commands) {
|
|
|
614
363
|
try {
|
|
615
364
|
const stat = fs.lstatSync(item.source);
|
|
616
365
|
if (stat.isSymbolicLink()) {
|
|
617
|
-
fs.
|
|
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");
|
|
618
384
|
item.status = "applied";
|
|
619
385
|
item.message = `removed stale skill symlink ${path.basename(item.source)}`;
|
|
620
386
|
}
|
|
621
387
|
else {
|
|
622
|
-
item.status = "
|
|
623
|
-
item.message =
|
|
388
|
+
item.status = "blocked";
|
|
389
|
+
item.message = `preserved ${item.source}: only a fingerprinted v2 app-owned symlink is eligible; review it manually`;
|
|
624
390
|
}
|
|
625
391
|
}
|
|
626
|
-
catch {
|
|
627
|
-
|
|
628
|
-
|
|
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
|
+
}
|
|
629
401
|
}
|
|
630
402
|
break;
|
|
631
403
|
}
|
|
632
404
|
default:
|
|
405
|
+
item.status = "failed";
|
|
406
|
+
item.message = `unsupported runtime migration action: ${item.action}`;
|
|
633
407
|
break;
|
|
634
408
|
}
|
|
635
409
|
}
|
|
636
410
|
catch (exc) {
|
|
637
|
-
item.status = "
|
|
638
|
-
item.message = `${item.action}
|
|
411
|
+
item.status = "blocked";
|
|
412
|
+
item.message = `${item.action} preserved the resource: ${exc.message}; rerun migration and review it manually`;
|
|
639
413
|
}
|
|
640
414
|
}
|
|
641
|
-
export function applyRuntimeMigrationItems(items,
|
|
642
|
-
const commands = resolveNpxHookCommands(ctx);
|
|
415
|
+
export function applyRuntimeMigrationItems(items, _ctx) {
|
|
643
416
|
for (const item of items) {
|
|
644
|
-
|
|
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
|
+
}
|
|
645
427
|
}
|
|
646
|
-
applyInstalledHooksRetirementItems(items, ctx);
|
|
647
428
|
}
|
|
648
|
-
//# sourceMappingURL=runtimeMigration.js.map
|