avorelo 0.3.8 → 0.4.0-rc.2
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 +16 -23
- package/README.md +62 -72
- package/bin/avorelo +9 -0
- package/package.json +147 -139
- package/scripts/README.md +40 -0
- package/scripts/avorelo-session-collision-guard.js +540 -0
- package/scripts/avorelo-workstream-preflight.js +918 -0
- package/scripts/cco-dashboard.js +346 -0
- package/scripts/cco-posttooluse.js +504 -0
- package/scripts/cco-pretooluse.js +381 -0
- package/scripts/cco-status.js +540 -0
- package/scripts/cco-stop.js +77 -0
- package/scripts/cco-userprompt-submit.js +83 -0
- package/scripts/lib/activation/account-state.js +37 -0
- package/scripts/lib/activation/activate-command.js +114 -0
- package/scripts/lib/activation/activation-runner.js +607 -0
- package/scripts/lib/activation/activation-self-healing.js +481 -0
- package/scripts/lib/activation/activation-state.js +96 -0
- package/scripts/lib/activation/activation-summary.js +241 -0
- package/scripts/lib/activation/adapters/claude-code.js +77 -0
- package/scripts/lib/activation/adapters/codex-cli.js +52 -0
- package/scripts/lib/activation/adapters/cursor.js +37 -0
- package/scripts/lib/activation/adapters/github-agent.js +39 -0
- package/scripts/lib/activation/adapters/terminal.js +42 -0
- package/scripts/lib/activation/adapters/vscode.js +39 -0
- package/scripts/lib/activation/adapters/windsurf.js +37 -0
- package/scripts/lib/activation/ai-surface-detector.js +151 -0
- package/scripts/lib/activation/connect-account.js +145 -0
- package/scripts/lib/activation/detect-environment.js +75 -0
- package/scripts/lib/activation/detect-hosts.js +62 -0
- package/scripts/lib/activation/format-activation-output.js +109 -0
- package/scripts/lib/activation/next-action.js +43 -0
- package/scripts/lib/activation/repair-engine.js +219 -0
- package/scripts/lib/activation/run-entry.js +346 -0
- package/scripts/lib/activation-distribution-readiness.js +507 -0
- package/scripts/lib/adapter-conformance.js +176 -0
- package/scripts/lib/adapter-readiness.js +428 -0
- package/scripts/lib/adapter-safety-boundaries.js +335 -0
- package/scripts/lib/adapter-technical-readiness-gate.js +205 -0
- package/scripts/lib/agent-access-governance.js +455 -0
- package/scripts/lib/agent-activation-readiness.js +878 -0
- package/scripts/lib/agent-enforcement.js +765 -0
- package/scripts/lib/agent-evolution-loop.js +479 -0
- package/scripts/lib/agent-policy-profile.js +210 -0
- package/scripts/lib/agent-security/action-evaluator.js +507 -0
- package/scripts/lib/agent-security/adapter-registry.js +98 -0
- package/scripts/lib/agent-security/auto-policy.js +139 -0
- package/scripts/lib/agent-security/bounded-scan.js +93 -0
- package/scripts/lib/agent-security/enforcement-adapter.js +174 -0
- package/scripts/lib/agent-security/enforcement-engine.js +1129 -0
- package/scripts/lib/agent-security/file-write-adapter.js +183 -0
- package/scripts/lib/agent-security/file-write-rules.js +178 -0
- package/scripts/lib/agent-security/index.js +3342 -0
- package/scripts/lib/agent-security/instruction-risk.js +181 -0
- package/scripts/lib/agent-security/mcp-action-adapter.js +185 -0
- package/scripts/lib/agent-security/mcp-action-rules.js +184 -0
- package/scripts/lib/agent-security/package-action-adapter.js +175 -0
- package/scripts/lib/agent-security/package-action-rules.js +233 -0
- package/scripts/lib/agent-security/performance.js +148 -0
- package/scripts/lib/agent-security/permission-minimizer.js +403 -0
- package/scripts/lib/agent-security/scan-cache.js +74 -0
- package/scripts/lib/agent-security/source-trust.js +146 -0
- package/scripts/lib/ai-efficiency-dogfood-pack.js +437 -0
- package/scripts/lib/ai-efficiency-eval.js +207 -0
- package/scripts/lib/ai-efficiency-guard-contract.js +209 -0
- package/scripts/lib/ai-efficiency-measured-value.js +106 -0
- package/scripts/lib/ai-install-prompt.js +293 -0
- package/scripts/lib/ai-task-inference.js +155 -0
- package/scripts/lib/ai-value-ledger.js +121 -0
- package/scripts/lib/ai-value-proof-table.js +151 -0
- package/scripts/lib/ai-work-efficiency-routing.js +623 -0
- package/scripts/lib/ai-workspace-hygiene.js +1499 -0
- package/scripts/lib/alpha-activation.js +520 -0
- package/scripts/lib/alpha-feedback.js +263 -0
- package/scripts/lib/alpha-readiness-gate.js +332 -0
- package/scripts/lib/anti-gaming.js +169 -0
- package/scripts/lib/artifact-health.js +431 -0
- package/scripts/lib/artifact-receipt-hygiene.js +619 -0
- package/scripts/lib/attribution.js +180 -0
- package/scripts/lib/audit.js +289 -0
- package/scripts/lib/avorelo-skill-registry.js +810 -0
- package/scripts/lib/batch-jobs.js +71 -0
- package/scripts/lib/brain-pack.js +578 -0
- package/scripts/lib/brand-boundary.js +424 -0
- package/scripts/lib/brand.js +74 -0
- package/scripts/lib/browser-capability.js +1048 -0
- package/scripts/lib/browser-proof-governed-workflow.js +1020 -0
- package/scripts/lib/browser-proof-preflight.js +321 -0
- package/scripts/lib/cache-readiness.js +296 -0
- package/scripts/lib/canonical-reentry.js +162 -0
- package/scripts/lib/capability-contract-validator.js +177 -0
- package/scripts/lib/capability-hygiene.js +504 -0
- package/scripts/lib/capability-intake-quarantine.js +789 -0
- package/scripts/lib/capability-kernel-registry.js +566 -0
- package/scripts/lib/capability-kernel.js +202 -0
- package/scripts/lib/capability-manifest.js +255 -0
- package/scripts/lib/capability-outcome-normalizer.js +104 -0
- package/scripts/lib/capability-packs.js +314 -0
- package/scripts/lib/capability-recommender.js +513 -0
- package/scripts/lib/capability-registry.js +1062 -0
- package/scripts/lib/carry-forward-surfacing.js +194 -0
- package/scripts/lib/ccusage-adapter.js +188 -0
- package/scripts/lib/claude-session-evidence/index.js +1027 -0
- package/scripts/lib/cli-output-sanitizer.js +118 -0
- package/scripts/lib/company-loop.js +1149 -0
- package/scripts/lib/config.js +641 -0
- package/scripts/lib/context-acquisition-plan.js +359 -0
- package/scripts/lib/context-authority-rules.js +138 -0
- package/scripts/lib/context-budget-guard.js +170 -0
- package/scripts/lib/context-budget-scanner.js +257 -0
- package/scripts/lib/context-budget.js +167 -0
- package/scripts/lib/context-claim-safety.js +116 -0
- package/scripts/lib/context-compiler.js +236 -0
- package/scripts/lib/context-optimizer.js +715 -0
- package/scripts/lib/context-packet.js +121 -0
- package/scripts/lib/context-receipt.js +57 -0
- package/scripts/lib/context-reduction-plan.js +179 -0
- package/scripts/lib/context-safety.js +88 -0
- package/scripts/lib/context-savings-engine.js +158 -0
- package/scripts/lib/context-source-registry.js +393 -0
- package/scripts/lib/context-task-profiles.js +147 -0
- package/scripts/lib/cost-abuse-guard.js +975 -0
- package/scripts/lib/cost-evidence.js +287 -0
- package/scripts/lib/cost-to-outcome-signals.js +639 -0
- package/scripts/lib/cross-host-install-plan.js +308 -0
- package/scripts/lib/cross-host-install-readiness.js +242 -0
- package/scripts/lib/cross-host-value-flow.js +268 -0
- package/scripts/lib/dashboard.js +1056 -0
- package/scripts/lib/data-permissions-guard.js +1187 -0
- package/scripts/lib/deployment-environment-guard.js +1236 -0
- package/scripts/lib/design-partner-feedback.js +346 -0
- package/scripts/lib/dogfood-evidence-freshness.js +567 -0
- package/scripts/lib/efficiency-receipt.js +354 -0
- package/scripts/lib/entitlements.js +100 -0
- package/scripts/lib/execution-packet.js +559 -0
- package/scripts/lib/execution-route-governor.js +179 -0
- package/scripts/lib/experimentation-events.js +547 -0
- package/scripts/lib/external-capability-compliance.js +107 -0
- package/scripts/lib/external-readiness/ai-visibility/ai-visibility-runner.js +322 -0
- package/scripts/lib/external-readiness/calibration/benchmark-site-catalog.js +121 -0
- package/scripts/lib/external-readiness/calibration/completion-gate.js +112 -0
- package/scripts/lib/external-readiness/calibration/real-site-benchmark-runner.js +284 -0
- package/scripts/lib/external-readiness/drift-detector.js +100 -0
- package/scripts/lib/external-readiness/endpoint-prober.js +332 -0
- package/scripts/lib/external-readiness/external-readiness-runner.js +112 -0
- package/scripts/lib/external-readiness/full-agent-readiness-scorer.js +220 -0
- package/scripts/lib/external-readiness/golden-path-runner.js +333 -0
- package/scripts/lib/external-readiness/inside-out-runner.js +118 -0
- package/scripts/lib/external-readiness/proof-receipt-writer.js +112 -0
- package/scripts/lib/external-readiness/safe-fix-executor.js +117 -0
- package/scripts/lib/external-readiness/skills/category-boundary-guard.js +30 -0
- package/scripts/lib/external-readiness/skills/pmm-positioning-guard.js +69 -0
- package/scripts/lib/external-readiness/skills/safe-fix-policy.js +35 -0
- package/scripts/lib/external-user-simulation.js +166 -0
- package/scripts/lib/failure-recovery-readiness.js +81 -0
- package/scripts/lib/failure-recovery.js +419 -0
- package/scripts/lib/feedback-intelligence.js +537 -0
- package/scripts/lib/feedback-signals.js +205 -0
- package/scripts/lib/file-integrity.js +68 -0
- package/scripts/lib/fsx.js +129 -0
- package/scripts/lib/full-readiness-gate.js +451 -0
- package/scripts/lib/governed-action-exposure-primitives.js +1514 -0
- package/scripts/lib/governed-exposure-planner.js +186 -0
- package/scripts/lib/governed-workspace-hygiene.js +946 -0
- package/scripts/lib/guard-suite-common.js +412 -0
- package/scripts/lib/guidance-builder.js +174 -0
- package/scripts/lib/hook-apply.js +1075 -0
- package/scripts/lib/hook-baseline.js +310 -0
- package/scripts/lib/hook-config-preview.js +275 -0
- package/scripts/lib/hook-contracts.js +290 -0
- package/scripts/lib/hook-safety-boundary-readiness.js +80 -0
- package/scripts/lib/host-capability-matrix.js +351 -0
- package/scripts/lib/host-support-context.js +254 -0
- package/scripts/lib/http-hook-action.js +538 -0
- package/scripts/lib/install-ai-readiness.js +84 -0
- package/scripts/lib/install-intake-risk.js +1051 -0
- package/scripts/lib/install-journey-intelligence.js +329 -0
- package/scripts/lib/intervention-guidance.js +57 -0
- package/scripts/lib/known-limitations.js +115 -0
- package/scripts/lib/l8-path-truth.js +146 -0
- package/scripts/lib/launch-hardening-gate.js +436 -0
- package/scripts/lib/launch-readiness.js +635 -0
- package/scripts/lib/learning-experimentation-foundation.js +1484 -0
- package/scripts/lib/learning-memory.js +686 -0
- package/scripts/lib/lifecycle-hooks.js +982 -0
- package/scripts/lib/local-package-smoke.js +436 -0
- package/scripts/lib/local-pricing.js +299 -0
- package/scripts/lib/mcp-enforcement.js +311 -0
- package/scripts/lib/mcp-least-privilege-policy.js +303 -0
- package/scripts/lib/mcp-tool-inventory.js +388 -0
- package/scripts/lib/mcp-tool-risk.js +0 -0
- package/scripts/lib/memory.js +335 -0
- package/scripts/lib/metrics.js +699 -0
- package/scripts/lib/micro-proof.js +133 -0
- package/scripts/lib/model-work-class-routing.js +79 -0
- package/scripts/lib/next-run-context.js +436 -0
- package/scripts/lib/next-run-continuity.js +1207 -0
- package/scripts/lib/observability-recovery-guard.js +1030 -0
- package/scripts/lib/operating-value.js +1662 -0
- package/scripts/lib/optimization-v3.js +122 -0
- package/scripts/lib/orchestration/adapters/_shared.js +49 -0
- package/scripts/lib/orchestration/adapters/aider.js +18 -0
- package/scripts/lib/orchestration/adapters/claude-code.js +35 -0
- package/scripts/lib/orchestration/adapters/codex.js +35 -0
- package/scripts/lib/orchestration/adapters/gemini-cli.js +18 -0
- package/scripts/lib/orchestration/adapters/git.js +25 -0
- package/scripts/lib/orchestration/adapters/index.js +31 -0
- package/scripts/lib/orchestration/adapters/lm-studio.js +18 -0
- package/scripts/lib/orchestration/adapters/ollama.js +18 -0
- package/scripts/lib/orchestration/adapters/opencode.js +18 -0
- package/scripts/lib/orchestration/adapters/openrouter.js +18 -0
- package/scripts/lib/orchestration/adapters/test-runner.js +25 -0
- package/scripts/lib/orchestration/cli.js +438 -0
- package/scripts/lib/orchestration/execution-manager.js +279 -0
- package/scripts/lib/orchestration/handoff.js +314 -0
- package/scripts/lib/orchestration/index.js +456 -0
- package/scripts/lib/orchestration/inventory.js +47 -0
- package/scripts/lib/orchestration/model-discovery.js +498 -0
- package/scripts/lib/orchestration/model-profiler.js +170 -0
- package/scripts/lib/orchestration/model-profiles.js +252 -0
- package/scripts/lib/orchestration/model-refresh-policy.js +72 -0
- package/scripts/lib/orchestration/proof-writer.js +349 -0
- package/scripts/lib/orchestration/provider-discovery/aider.js +49 -0
- package/scripts/lib/orchestration/provider-discovery/claude-code.js +56 -0
- package/scripts/lib/orchestration/provider-discovery/codex.js +49 -0
- package/scripts/lib/orchestration/provider-discovery/common.js +186 -0
- package/scripts/lib/orchestration/provider-discovery/gemini.js +106 -0
- package/scripts/lib/orchestration/provider-discovery/lm-studio.js +118 -0
- package/scripts/lib/orchestration/provider-discovery/models-dev.js +12 -0
- package/scripts/lib/orchestration/provider-discovery/ollama.js +100 -0
- package/scripts/lib/orchestration/provider-discovery/opencode.js +47 -0
- package/scripts/lib/orchestration/provider-discovery/openrouter.js +44 -0
- package/scripts/lib/orchestration/risk-classifier.js +130 -0
- package/scripts/lib/orchestration/routing-policy.js +486 -0
- package/scripts/lib/orchestration/settings.js +95 -0
- package/scripts/lib/orchestration/state.js +165 -0
- package/scripts/lib/orchestration/verification-manager.js +138 -0
- package/scripts/lib/outcome-evidence-stack.js +1083 -0
- package/scripts/lib/output-profiles.js +146 -0
- package/scripts/lib/package-content-audit.js +368 -0
- package/scripts/lib/package-runtime.js +278 -0
- package/scripts/lib/plan-surface.js +53 -0
- package/scripts/lib/plans.js +2327 -0
- package/scripts/lib/policy-provider.js +27 -0
- package/scripts/lib/prelaunch-activation-readiness.js +409 -0
- package/scripts/lib/prelaunch-evidence-store.js +816 -0
- package/scripts/lib/prelaunch-intelligence.js +869 -0
- package/scripts/lib/pricing-experiment.js +118 -0
- package/scripts/lib/pro-moment-events.js +77 -0
- package/scripts/lib/pro-moment-state.js +227 -0
- package/scripts/lib/pro-moments.js +1216 -0
- package/scripts/lib/product-home-receipt.js +1790 -0
- package/scripts/lib/product-learning-events.js +696 -0
- package/scripts/lib/production-confidence-control-tower.js +1209 -0
- package/scripts/lib/production-confidence.js +1858 -0
- package/scripts/lib/project-profile.js +555 -0
- package/scripts/lib/prompt-compiler-plan.js +94 -0
- package/scripts/lib/prompt-compiler.js +280 -0
- package/scripts/lib/prompt-lint.js +32 -0
- package/scripts/lib/prompt-suggestions.js +52 -0
- package/scripts/lib/proof-canonical.js +398 -0
- package/scripts/lib/proof-drilldown.js +383 -0
- package/scripts/lib/proof-e2e/promise-completion.js +141 -0
- package/scripts/lib/proof-e2e/promise-dashboard-claims.js +135 -0
- package/scripts/lib/proof-e2e/promise-local-proof.js +156 -0
- package/scripts/lib/proof-e2e/promise-provider-neutral.js +136 -0
- package/scripts/lib/proof-e2e/promise-registry.js +219 -0
- package/scripts/lib/proof-e2e/promise-security-trust.js +141 -0
- package/scripts/lib/proof-e2e/promise-skills-risk.js +163 -0
- package/scripts/lib/proof-e2e/promise-token-savings.js +112 -0
- package/scripts/lib/proof-e2e/promise-work-management.js +126 -0
- package/scripts/lib/proof-events.js +342 -0
- package/scripts/lib/proof-history.js +243 -0
- package/scripts/lib/proof-metrics.js +296 -0
- package/scripts/lib/proof-outcome-evidence.js +134 -0
- package/scripts/lib/proof-receipt.js +335 -0
- package/scripts/lib/proof-record.js +461 -0
- package/scripts/lib/proof-savings-report.js +1549 -0
- package/scripts/lib/public-activation-distribution-gate.js +266 -0
- package/scripts/lib/public-cli.js +5631 -0
- package/scripts/lib/public-distribution-truth.js +211 -0
- package/scripts/lib/public-distribution.js +73 -0
- package/scripts/lib/public-install-claim-checker.js +300 -0
- package/scripts/lib/publish-provenance-readiness.js +287 -0
- package/scripts/lib/readiness-delta.js +218 -0
- package/scripts/lib/readiness-evidence-closure.js +196 -0
- package/scripts/lib/reentry-memory-capture.js +241 -0
- package/scripts/lib/reentry-memory-retrieval.js +302 -0
- package/scripts/lib/reentry-memory-status.js +147 -0
- package/scripts/lib/reentry-memory-store.js +183 -0
- package/scripts/lib/reentry-state.js +66 -0
- package/scripts/lib/release-candidate-bundle.js +166 -0
- package/scripts/lib/remediation.js +81 -0
- package/scripts/lib/repo-map.js +391 -0
- package/scripts/lib/run-action-policy.js +104 -0
- package/scripts/lib/run-contract-receipt.js +48 -0
- package/scripts/lib/run-contract.js +288 -0
- package/scripts/lib/run-cost-to-verified-outcome.js +87 -0
- package/scripts/lib/run-improvements-lifecycle.js +330 -0
- package/scripts/lib/run-improvements.js +789 -0
- package/scripts/lib/run-proof-contract.js +116 -0
- package/scripts/lib/run-risk-classifier.js +131 -0
- package/scripts/lib/run-task-classifier.js +216 -0
- package/scripts/lib/runtime-decision-policy.js +387 -0
- package/scripts/lib/safe-path-engine.js +705 -0
- package/scripts/lib/safe-repair.js +877 -0
- package/scripts/lib/safe-run-controller.js +887 -0
- package/scripts/lib/scope-repair-before-approval.js +865 -0
- package/scripts/lib/score.js +262 -0
- package/scripts/lib/seamless-enforcement.js +329 -0
- package/scripts/lib/seamless-outcome.js +689 -0
- package/scripts/lib/seamless-reality-gate.js +5053 -0
- package/scripts/lib/security-confidence/activation-safety.js +78 -0
- package/scripts/lib/security-confidence/adapters/adapter-contract.js +125 -0
- package/scripts/lib/security-confidence/adapters/mock-claude-bughunter-adapter.js +36 -0
- package/scripts/lib/security-confidence/adapters/mock-decepticon-adapter.js +34 -0
- package/scripts/lib/security-confidence/adapters/mock-mcp-scan-adapter.js +35 -0
- package/scripts/lib/security-confidence/adapters/mock-snyk-agent-scan-adapter.js +35 -0
- package/scripts/lib/security-confidence/adapters/mock-tank-adapter.js +34 -0
- package/scripts/lib/security-confidence/adapters/reference-registry.js +63 -0
- package/scripts/lib/security-confidence/auth-rbac-plan.js +39 -0
- package/scripts/lib/security-confidence/component-inventory.js +151 -0
- package/scripts/lib/security-confidence/constants.js +191 -0
- package/scripts/lib/security-confidence/dependency-script-risk.js +95 -0
- package/scripts/lib/security-confidence/evidence-hygiene.js +127 -0
- package/scripts/lib/security-confidence/feature-impact-classifier.js +80 -0
- package/scripts/lib/security-confidence/file-utils.js +161 -0
- package/scripts/lib/security-confidence/finding-triage.js +90 -0
- package/scripts/lib/security-confidence/findings.js +115 -0
- package/scripts/lib/security-confidence/index.js +29 -0
- package/scripts/lib/security-confidence/permission-budget.js +93 -0
- package/scripts/lib/security-confidence/redaction.js +82 -0
- package/scripts/lib/security-confidence/redteam-fixtures.js +53 -0
- package/scripts/lib/security-confidence/reference-adoption.js +229 -0
- package/scripts/lib/security-confidence/reference-taxonomy.js +155 -0
- package/scripts/lib/security-confidence/report-quality.js +99 -0
- package/scripts/lib/security-confidence/report-writer.js +79 -0
- package/scripts/lib/security-confidence/risk-classifier.js +187 -0
- package/scripts/lib/security-confidence/runner.js +179 -0
- package/scripts/lib/security-confidence/schema.js +188 -0
- package/scripts/lib/security-confidence/secret-safety.js +74 -0
- package/scripts/lib/security-confidence/security-capability-router.js +98 -0
- package/scripts/lib/security-confidence/web-security-smoke-plan.js +46 -0
- package/scripts/lib/security-risk-classifier.js +511 -0
- package/scripts/lib/security-scan.js +396 -0
- package/scripts/lib/session-context-optimizer.js +1211 -0
- package/scripts/lib/session-timing.js +322 -0
- package/scripts/lib/skill-hygiene.js +805 -0
- package/scripts/lib/skill-packs.js +161 -0
- package/scripts/lib/skills-operating-layer-v1.js +1023 -0
- package/scripts/lib/skills-operating-layer.js +629 -0
- package/scripts/lib/smallest-safe-plan.js +214 -0
- package/scripts/lib/smart-routing-plan.js +115 -0
- package/scripts/lib/smart-work-routing.js +768 -0
- package/scripts/lib/source-catalog.js +1022 -0
- package/scripts/lib/status-value-summary.js +32 -0
- package/scripts/lib/supply-chain-dependency-guard.js +1333 -0
- package/scripts/lib/supply-chain-guard.js +219 -0
- package/scripts/lib/support-bundle.js +561 -0
- package/scripts/lib/support-redaction.js +66 -0
- package/scripts/lib/task-continuation.js +440 -0
- package/scripts/lib/test-helpers.js +15 -0
- package/scripts/lib/tier.js +38 -0
- package/scripts/lib/token-context-quality-gate.js +370 -0
- package/scripts/lib/token-cost-capture.js +187 -0
- package/scripts/lib/token-cost-evidence.js +862 -0
- package/scripts/lib/token-cost-intelligence.js +358 -0
- package/scripts/lib/token-efficiency-evidence.js +213 -0
- package/scripts/lib/token-efficiency-map.js +110 -0
- package/scripts/lib/token-evidence.js +703 -0
- package/scripts/lib/tokenish.js +17 -0
- package/scripts/lib/tool-output-sandbox.js +559 -0
- package/scripts/lib/trust-audit.js +136 -0
- package/scripts/lib/unified-events.js +396 -0
- package/scripts/lib/upgrade-interruption-recovery.js +407 -0
- package/scripts/lib/usage-ledger.js +201 -0
- package/scripts/lib/value-ledger.js +130 -0
- package/scripts/lib/value-proof-calibration.js +531 -0
- package/scripts/lib/visual-qa.js +231 -0
- package/scripts/lib/voice-alpha.js +29 -0
- package/scripts/lib/webhook-idempotency-guard.js +990 -0
- package/scripts/lib/work-aware-orchestration.js +976 -0
- package/scripts/lib/work-control-receipts.js +577 -0
- package/scripts/lib/work-ledger.js +1123 -0
- package/scripts/lib/work-panel-preview.js +352 -0
- package/scripts/lib/workflow-discipline.js +280 -0
- package/scripts/lib/workflow-intelligence-radar.js +804 -0
- package/scripts/lib/workflow-signals.js +419 -0
- package/scripts/lib/workspace-map.js +281 -0
- package/scripts/lib/workspace-registry.js +1367 -0
- package/scripts/lib/workspace-resolver.js +542 -0
- package/scripts/wuz-doctor.js +315 -0
- package/bin/avorelo.mjs +0 -7
- package/dist/avorelo.mjs +0 -24678
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const fs = require("fs");
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const {
|
|
6
|
+
ensureCcoDirs,
|
|
7
|
+
ensureProjectConfig,
|
|
8
|
+
safeReadJson,
|
|
9
|
+
safeWriteJson,
|
|
10
|
+
nowIso,
|
|
11
|
+
} = require("../fsx");
|
|
12
|
+
const { attemptAutoRecovery } = require("../upgrade-interruption-recovery");
|
|
13
|
+
|
|
14
|
+
const CONTEXT_PACK_REL = ".claude/cco/state/context-pack.json";
|
|
15
|
+
const ONBOARDING_REL = ".claude/cco/state/onboarding.json";
|
|
16
|
+
|
|
17
|
+
function buildDefaultOnboardingState() {
|
|
18
|
+
return {
|
|
19
|
+
status: "completed",
|
|
20
|
+
createdAt: nowIso(),
|
|
21
|
+
completedAt: nowIso(),
|
|
22
|
+
stepsCompleted: ["activation"],
|
|
23
|
+
hasSeenDashboard: false,
|
|
24
|
+
hasSeenStatus: true,
|
|
25
|
+
hasCompletedSession: false,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function buildContextPack(cwd, context) {
|
|
30
|
+
return {
|
|
31
|
+
version: 1,
|
|
32
|
+
generatedAt: nowIso(),
|
|
33
|
+
project: {
|
|
34
|
+
cwd: context.project.cwd,
|
|
35
|
+
gitDetected: context.project.gitDetected,
|
|
36
|
+
repoRoot: context.project.repoRoot,
|
|
37
|
+
packageJsonDetected: context.project.packageJsonDetected,
|
|
38
|
+
},
|
|
39
|
+
commands: {
|
|
40
|
+
status: "avorelo status --text",
|
|
41
|
+
audit: "avorelo audit",
|
|
42
|
+
activate: "npx avorelo@latest activate",
|
|
43
|
+
},
|
|
44
|
+
hosts: (context.detectedHosts || [])
|
|
45
|
+
.filter((host) => host.detected)
|
|
46
|
+
.map((host) => ({
|
|
47
|
+
id: host.id,
|
|
48
|
+
label: host.label,
|
|
49
|
+
depth: host.depth,
|
|
50
|
+
})),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function localFilesReady(cwd) {
|
|
55
|
+
return (
|
|
56
|
+
fs.existsSync(path.join(cwd, ".claude", "cco", "config.json")) &&
|
|
57
|
+
fs.existsSync(path.join(cwd, ".claude", "cco", "state", "onboarding.json")) &&
|
|
58
|
+
fs.existsSync(path.join(cwd, ".claude", "cco", "state", "context-pack.json"))
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function runRepairEngine(cwd, context, options = {}) {
|
|
63
|
+
const repairEnabled = options.repair !== false;
|
|
64
|
+
const repairsAttempted = [];
|
|
65
|
+
const manualFixesRequired = [];
|
|
66
|
+
const issues = [];
|
|
67
|
+
let localSetupReady = false;
|
|
68
|
+
|
|
69
|
+
if (!context.environment.nodeDetected) {
|
|
70
|
+
issues.push({ id: "node_missing", classification: "blocking", reason: "Node.js is required to run Avorelo." });
|
|
71
|
+
manualFixesRequired.push({
|
|
72
|
+
id: "install_node",
|
|
73
|
+
label: "Install Node.js",
|
|
74
|
+
command: "https://nodejs.org/",
|
|
75
|
+
reason: "Avorelo activation requires Node.js in PATH.",
|
|
76
|
+
blocking: true,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (!context.environment.npmDetected) {
|
|
81
|
+
issues.push({ id: "npm_missing", classification: "blocking", reason: "npm is required for the activation entrypoint." });
|
|
82
|
+
manualFixesRequired.push({
|
|
83
|
+
id: "install_npm",
|
|
84
|
+
label: "Restore npm in PATH",
|
|
85
|
+
command: null,
|
|
86
|
+
reason: "Avorelo activation uses npm/npx for the primary install and verification path.",
|
|
87
|
+
blocking: true,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (repairEnabled && manualFixesRequired.every((fix) => !fix.blocking)) {
|
|
92
|
+
try {
|
|
93
|
+
ensureCcoDirs(cwd);
|
|
94
|
+
repairsAttempted.push({
|
|
95
|
+
id: "ensure_cco_dirs",
|
|
96
|
+
status: "applied",
|
|
97
|
+
reason: "Prepared local Avorelo directories.",
|
|
98
|
+
});
|
|
99
|
+
} catch (error) {
|
|
100
|
+
manualFixesRequired.push({
|
|
101
|
+
id: "fix_local_write_access",
|
|
102
|
+
label: "Restore local write access",
|
|
103
|
+
command: null,
|
|
104
|
+
reason: `Avorelo could not create project-local state: ${error.message}`,
|
|
105
|
+
blocking: true,
|
|
106
|
+
});
|
|
107
|
+
issues.push({ id: "write_access", classification: "blocking", reason: error.message });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (repairEnabled && manualFixesRequired.every((fix) => !fix.blocking)) {
|
|
112
|
+
ensureProjectConfig(cwd);
|
|
113
|
+
repairsAttempted.push({
|
|
114
|
+
id: "ensure_project_config",
|
|
115
|
+
status: "applied",
|
|
116
|
+
reason: "Normalized project-local Avorelo config.",
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
const originalConsoleError = console.error;
|
|
120
|
+
let recovery;
|
|
121
|
+
try {
|
|
122
|
+
console.error = () => {};
|
|
123
|
+
recovery = attemptAutoRecovery(cwd);
|
|
124
|
+
} finally {
|
|
125
|
+
console.error = originalConsoleError;
|
|
126
|
+
}
|
|
127
|
+
if (recovery.success) {
|
|
128
|
+
repairsAttempted.push({
|
|
129
|
+
id: "upgrade_marker_repair",
|
|
130
|
+
status: "applied",
|
|
131
|
+
reason: recovery.recoveryType,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (!safeReadJson(cwd, ONBOARDING_REL, null)) {
|
|
136
|
+
safeWriteJson(cwd, ONBOARDING_REL, buildDefaultOnboardingState());
|
|
137
|
+
repairsAttempted.push({
|
|
138
|
+
id: "create_onboarding_state",
|
|
139
|
+
status: "applied",
|
|
140
|
+
reason: "Created onboarding state for activation.",
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
} else if (!repairEnabled && !safeReadJson(cwd, ONBOARDING_REL, null)) {
|
|
144
|
+
issues.push({ id: "missing_onboarding_state", classification: "recoverable", reason: "Onboarding state is missing." });
|
|
145
|
+
manualFixesRequired.push({
|
|
146
|
+
id: "run_activation_with_repair",
|
|
147
|
+
label: "Run activation with repair enabled",
|
|
148
|
+
command: "npx avorelo@latest activate --repair",
|
|
149
|
+
reason: "Avorelo can recreate missing local state automatically when repair is enabled.",
|
|
150
|
+
blocking: false,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (repairEnabled && manualFixesRequired.every((fix) => !fix.blocking)) {
|
|
155
|
+
const contextPack = buildContextPack(cwd, context);
|
|
156
|
+
safeWriteJson(cwd, CONTEXT_PACK_REL, contextPack);
|
|
157
|
+
repairsAttempted.push({
|
|
158
|
+
id: "generate_context_pack",
|
|
159
|
+
status: "applied",
|
|
160
|
+
reason: "Generated a reusable local context pack.",
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const hostConfiguration = [];
|
|
165
|
+
if (repairEnabled && Array.isArray(context.detectedHosts)) {
|
|
166
|
+
context.detectedHosts
|
|
167
|
+
.filter((host) => host.detected && host.canAutoConfigure && typeof host.configureIfSafe === "function")
|
|
168
|
+
.forEach((host) => {
|
|
169
|
+
try {
|
|
170
|
+
const result = host.configureIfSafe(cwd, { contextPackRel: CONTEXT_PACK_REL });
|
|
171
|
+
hostConfiguration.push({
|
|
172
|
+
id: host.id,
|
|
173
|
+
applied: result?.applied === true,
|
|
174
|
+
integrationId: result?.integrationId || null,
|
|
175
|
+
});
|
|
176
|
+
if (result?.applied) {
|
|
177
|
+
repairsAttempted.push({
|
|
178
|
+
id: `configure_${host.id}`,
|
|
179
|
+
status: "applied",
|
|
180
|
+
reason: `Prepared ${host.label} project-local artifacts.`,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
} catch (error) {
|
|
184
|
+
issues.push({
|
|
185
|
+
id: `${host.id}_configure_failed`,
|
|
186
|
+
classification: "optional",
|
|
187
|
+
reason: error.message,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
localSetupReady = manualFixesRequired.every((fix) => !fix.blocking) && localFilesReady(cwd);
|
|
194
|
+
|
|
195
|
+
if (!context.project.gitDetected) {
|
|
196
|
+
issues.push({
|
|
197
|
+
id: "git_repo_not_detected",
|
|
198
|
+
classification: "optional",
|
|
199
|
+
reason: "Git repo not detected. Avorelo still runs in local mode.",
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return {
|
|
204
|
+
repairEnabled,
|
|
205
|
+
localSetupReady,
|
|
206
|
+
issues,
|
|
207
|
+
repairsAttempted,
|
|
208
|
+
manualFixesRequired,
|
|
209
|
+
hostConfiguration,
|
|
210
|
+
contextPackRel: CONTEXT_PACK_REL,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
module.exports = {
|
|
215
|
+
CONTEXT_PACK_REL,
|
|
216
|
+
buildDefaultOnboardingState,
|
|
217
|
+
buildContextPack,
|
|
218
|
+
runRepairEngine,
|
|
219
|
+
};
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// ── Activation Always-On Run Entry v1 ─────────────────────────────────────────
|
|
4
|
+
//
|
|
5
|
+
// Contract: avorelo.runEntry.v1
|
|
6
|
+
//
|
|
7
|
+
// Installs a durable, local-first "run entry" contract into a project when it is
|
|
8
|
+
// activated, so future supported AI coding sessions know to start with Avorelo
|
|
9
|
+
// (Session Collision Guard before edits/pushes, Workstream Preflight before new
|
|
10
|
+
// work) without the user repeating those instructions every session.
|
|
11
|
+
//
|
|
12
|
+
// What it installs into the TARGET project (cwd):
|
|
13
|
+
// 1. A marker-bracketed "Avorelo Run Entry" block in AGENTS.md (created if
|
|
14
|
+
// missing; the block is upserted in place; all user content outside the
|
|
15
|
+
// markers is preserved).
|
|
16
|
+
// 2. A machine-readable contract record at
|
|
17
|
+
// .claude/cco/run-entry/run-entry.json (for verify/repair/idempotency).
|
|
18
|
+
// 3. run-entry metadata on the canonical activation state
|
|
19
|
+
// .claude/cco/state/activation.json (runEntry.*).
|
|
20
|
+
//
|
|
21
|
+
// Honesty boundary: this makes Avorelo the default starting layer for SUPPORTED
|
|
22
|
+
// local sessions that read project instruction files. It does NOT and cannot
|
|
23
|
+
// force arbitrary external AI tools to obey unless they read these instructions
|
|
24
|
+
// or run through an Avorelo entrypoint. No runtime enforcement is added here.
|
|
25
|
+
//
|
|
26
|
+
// Safety: only local files under the target project are written. No git
|
|
27
|
+
// mutations, no push/merge, no deploy/publish, no package-lock writes, no hooks.
|
|
28
|
+
|
|
29
|
+
const fs = require("fs");
|
|
30
|
+
const path = require("path");
|
|
31
|
+
const { safeReadJson, safeWriteJson, safeWriteText, nowIso } = require("../fsx");
|
|
32
|
+
const {
|
|
33
|
+
ACTIVATION_STATE_REL,
|
|
34
|
+
readActivationState,
|
|
35
|
+
writeActivationState,
|
|
36
|
+
} = require("./activation-state");
|
|
37
|
+
|
|
38
|
+
const RUN_ENTRY_CONTRACT = "avorelo.runEntry.v1";
|
|
39
|
+
const RUN_ENTRY_SCHEMA_VERSION = 1;
|
|
40
|
+
const BLOCK_SCHEMA_VERSION = 1;
|
|
41
|
+
|
|
42
|
+
const RUN_ENTRY_DIR_REL = ".claude/cco/run-entry";
|
|
43
|
+
const RUN_ENTRY_CONTRACT_REL = `${RUN_ENTRY_DIR_REL}/run-entry.json`;
|
|
44
|
+
const INSTRUCTION_SURFACE_REL = "AGENTS.md";
|
|
45
|
+
|
|
46
|
+
const GUARD_SCRIPT_REL = "scripts/avorelo-session-collision-guard.js";
|
|
47
|
+
const PREFLIGHT_SCRIPT_REL = "scripts/avorelo-workstream-preflight.js";
|
|
48
|
+
|
|
49
|
+
const BLOCK_START = `<!-- AVORELO:RUN-ENTRY:START schemaVersion=${BLOCK_SCHEMA_VERSION} (managed by Avorelo; edit only outside these markers) -->`;
|
|
50
|
+
const BLOCK_END = "<!-- AVORELO:RUN-ENTRY:END -->";
|
|
51
|
+
// Version-agnostic matcher so an older managed block is detected and upgraded.
|
|
52
|
+
const BLOCK_RE = /<!-- AVORELO:RUN-ENTRY:START[\s\S]*?<!-- AVORELO:RUN-ENTRY:END -->/;
|
|
53
|
+
|
|
54
|
+
// The Avorelo installation root (where scripts/lib lives) — used only to read
|
|
55
|
+
// the Avorelo package version, never written to.
|
|
56
|
+
const AVORELO_ROOT = path.resolve(__dirname, "../../..");
|
|
57
|
+
|
|
58
|
+
function readAvoreloVersion() {
|
|
59
|
+
try {
|
|
60
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(AVORELO_ROOT, "package.json"), "utf8"));
|
|
61
|
+
return typeof pkg.version === "string" ? pkg.version : null;
|
|
62
|
+
} catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// ── Instruction block ─────────────────────────────────────────────────────────
|
|
68
|
+
|
|
69
|
+
function buildInstructionBlock() {
|
|
70
|
+
return [
|
|
71
|
+
BLOCK_START,
|
|
72
|
+
"## Avorelo Run Entry (v1)",
|
|
73
|
+
"",
|
|
74
|
+
"This project is activated with Avorelo. Supported AI coding sessions should start here.",
|
|
75
|
+
"Avorelo manages the content between these markers; put your own notes outside them.",
|
|
76
|
+
"",
|
|
77
|
+
"1. Before editing files, run:",
|
|
78
|
+
" `node scripts/avorelo-session-collision-guard.js`",
|
|
79
|
+
"2. If the result is not `safe_to_continue`, stop and report. Do not edit or push.",
|
|
80
|
+
"3. Before starting a new workstream, run:",
|
|
81
|
+
" `node scripts/avorelo-workstream-preflight.js \"<workstream>\"`",
|
|
82
|
+
"4. If the shared clone is dirty, work in a clean isolated git worktree.",
|
|
83
|
+
"5. Do not push, force-push, or merge without explicit user approval.",
|
|
84
|
+
"6. Do not claim deploy / publish / production unless it actually happened.",
|
|
85
|
+
"7. Use Avorelo validators and dogfood artifacts for proof.",
|
|
86
|
+
"",
|
|
87
|
+
"Fail open when advisory data is missing; stop and report on dirty or collision risk.",
|
|
88
|
+
"Note: external tools that ignore project instructions may still need manual routing.",
|
|
89
|
+
"(If Avorelo is installed as a package, run the guard/preflight via the packaged scripts.)",
|
|
90
|
+
BLOCK_END,
|
|
91
|
+
].join("\n");
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ── Guard / preflight availability (advisory) ─────────────────────────────────
|
|
95
|
+
|
|
96
|
+
function detectScript(cwd, relPath) {
|
|
97
|
+
const local = path.join(cwd, relPath);
|
|
98
|
+
if (fs.existsSync(local)) return { available: true, path: relPath };
|
|
99
|
+
const packaged = path.join(cwd, "node_modules", "avorelo", relPath);
|
|
100
|
+
if (fs.existsSync(packaged)) return { available: true, path: `node_modules/avorelo/${relPath}` };
|
|
101
|
+
return { available: false, path: null };
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function detectGuardPreflight(cwd) {
|
|
105
|
+
return {
|
|
106
|
+
guard: detectScript(cwd, GUARD_SCRIPT_REL),
|
|
107
|
+
preflight: detectScript(cwd, PREFLIGHT_SCRIPT_REL),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// ── Instruction surface upsert (preserves user content) ───────────────────────
|
|
112
|
+
|
|
113
|
+
function safeReadText(absPath) {
|
|
114
|
+
try {
|
|
115
|
+
return fs.existsSync(absPath) ? fs.readFileSync(absPath, "utf8") : null;
|
|
116
|
+
} catch {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function upsertInstructionSurface(cwd) {
|
|
122
|
+
const absPath = path.join(cwd, INSTRUCTION_SURFACE_REL);
|
|
123
|
+
const desiredBlock = buildInstructionBlock();
|
|
124
|
+
const existing = safeReadText(absPath);
|
|
125
|
+
|
|
126
|
+
if (existing === null) {
|
|
127
|
+
const content = `# AGENTS\n\n${desiredBlock}\n`;
|
|
128
|
+
safeWriteText(cwd, INSTRUCTION_SURFACE_REL, content);
|
|
129
|
+
return { surface: INSTRUCTION_SURFACE_REL, action: "created" };
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (BLOCK_RE.test(existing)) {
|
|
133
|
+
const current = existing.match(BLOCK_RE)[0];
|
|
134
|
+
if (current === desiredBlock) {
|
|
135
|
+
return { surface: INSTRUCTION_SURFACE_REL, action: "unchanged" };
|
|
136
|
+
}
|
|
137
|
+
// Upgrade the managed block in place; everything else is preserved verbatim.
|
|
138
|
+
const updated = existing.replace(BLOCK_RE, desiredBlock);
|
|
139
|
+
safeWriteText(cwd, INSTRUCTION_SURFACE_REL, updated);
|
|
140
|
+
return { surface: INSTRUCTION_SURFACE_REL, action: "updated" };
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// File exists but has no managed block: append it, preserving user content.
|
|
144
|
+
const sep = existing.endsWith("\n") ? "\n" : "\n\n";
|
|
145
|
+
safeWriteText(cwd, INSTRUCTION_SURFACE_REL, `${existing}${sep}${desiredBlock}\n`);
|
|
146
|
+
return { surface: INSTRUCTION_SURFACE_REL, action: "installed" };
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function instructionSurfaceHasBlock(cwd) {
|
|
150
|
+
const existing = safeReadText(path.join(cwd, INSTRUCTION_SURFACE_REL));
|
|
151
|
+
if (existing === null) return { exists: false, hasBlock: false, current: false };
|
|
152
|
+
const match = existing.match(BLOCK_RE);
|
|
153
|
+
return {
|
|
154
|
+
exists: true,
|
|
155
|
+
hasBlock: Boolean(match),
|
|
156
|
+
current: Boolean(match) && match[0] === buildInstructionBlock(),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// ── Contract record ───────────────────────────────────────────────────────────
|
|
161
|
+
|
|
162
|
+
function writeContractRecord(cwd, availability) {
|
|
163
|
+
const existing = safeReadJson(cwd, RUN_ENTRY_CONTRACT_REL, null);
|
|
164
|
+
const installedAt = existing && existing.installedAt ? existing.installedAt : nowIso();
|
|
165
|
+
|
|
166
|
+
// Meaningful (timestamp-independent) content, used to decide if a write is needed
|
|
167
|
+
// so re-activation is truly idempotent and does not report a phantom repair.
|
|
168
|
+
const meaningful = {
|
|
169
|
+
schemaVersion: RUN_ENTRY_SCHEMA_VERSION,
|
|
170
|
+
contract: RUN_ENTRY_CONTRACT,
|
|
171
|
+
blockSchemaVersion: BLOCK_SCHEMA_VERSION,
|
|
172
|
+
instructionSurfaces: [INSTRUCTION_SURFACE_REL],
|
|
173
|
+
guardScript: GUARD_SCRIPT_REL,
|
|
174
|
+
preflightScript: PREFLIGHT_SCRIPT_REL,
|
|
175
|
+
guardAvailable: availability.guard.available,
|
|
176
|
+
preflightAvailable: availability.preflight.available,
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
if (existing) {
|
|
180
|
+
const existingMeaningful = {
|
|
181
|
+
schemaVersion: existing.schemaVersion,
|
|
182
|
+
contract: existing.contract,
|
|
183
|
+
blockSchemaVersion: existing.blockSchemaVersion,
|
|
184
|
+
instructionSurfaces: existing.instructionSurfaces,
|
|
185
|
+
guardScript: existing.guardScript,
|
|
186
|
+
preflightScript: existing.preflightScript,
|
|
187
|
+
guardAvailable: existing.guardAvailable,
|
|
188
|
+
preflightAvailable: existing.preflightAvailable,
|
|
189
|
+
};
|
|
190
|
+
if (JSON.stringify(existingMeaningful) === JSON.stringify(meaningful)) {
|
|
191
|
+
return { file: RUN_ENTRY_CONTRACT_REL, action: "unchanged", record: existing };
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const record = { ...meaningful, contract: RUN_ENTRY_CONTRACT, installedAt, updatedAt: nowIso() };
|
|
196
|
+
const action = !existing
|
|
197
|
+
? "created"
|
|
198
|
+
: existing.schemaVersion !== RUN_ENTRY_SCHEMA_VERSION
|
|
199
|
+
? "upgraded"
|
|
200
|
+
: "updated";
|
|
201
|
+
safeWriteJson(cwd, RUN_ENTRY_CONTRACT_REL, record);
|
|
202
|
+
return { file: RUN_ENTRY_CONTRACT_REL, action, record };
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// ── Activation state run-entry metadata ───────────────────────────────────────
|
|
206
|
+
|
|
207
|
+
function updateActivationStateRunEntry(cwd, info) {
|
|
208
|
+
// Only annotate an existing state file; never fabricate full activation state
|
|
209
|
+
// here (that is owned by the activation flow). If no state exists yet, a
|
|
210
|
+
// minimal record is still written so verify/repair has something to read.
|
|
211
|
+
const state = readActivationState(cwd);
|
|
212
|
+
state.runEntry = {
|
|
213
|
+
installed: true,
|
|
214
|
+
schemaVersion: RUN_ENTRY_SCHEMA_VERSION,
|
|
215
|
+
installedAt: state.runEntry && state.runEntry.installedAt ? state.runEntry.installedAt : nowIso(),
|
|
216
|
+
updatedAt: nowIso(),
|
|
217
|
+
activationSource: info.activationSource || "unknown",
|
|
218
|
+
avoreloVersion: info.avoreloVersion || null,
|
|
219
|
+
installedRunEntryContract: true,
|
|
220
|
+
installedInstructionSurfaces: [INSTRUCTION_SURFACE_REL],
|
|
221
|
+
lastVerificationResult: info.lastVerificationResult || null,
|
|
222
|
+
};
|
|
223
|
+
state.updatedAt = nowIso();
|
|
224
|
+
writeActivationState(cwd, state);
|
|
225
|
+
return state.runEntry;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// ── Install / repair (idempotent) ─────────────────────────────────────────────
|
|
229
|
+
|
|
230
|
+
function installRunEntry(cwd, options = {}) {
|
|
231
|
+
const availability = detectGuardPreflight(cwd);
|
|
232
|
+
const surface = upsertInstructionSurface(cwd);
|
|
233
|
+
const contract = writeContractRecord(cwd, availability);
|
|
234
|
+
|
|
235
|
+
const verification = verifyRunEntry(cwd, { availability });
|
|
236
|
+
|
|
237
|
+
const runEntryState = updateActivationStateRunEntry(cwd, {
|
|
238
|
+
activationSource: options.activationSource || "cli",
|
|
239
|
+
avoreloVersion: readAvoreloVersion(),
|
|
240
|
+
lastVerificationResult: verification.ok ? "pass" : "repaired",
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
// Classify per-file actions for a compact, honest summary.
|
|
244
|
+
const created = [];
|
|
245
|
+
const updated = [];
|
|
246
|
+
const unchanged = [];
|
|
247
|
+
for (const item of [surface, { surface: contract.file, action: contract.action }]) {
|
|
248
|
+
if (item.action === "created") created.push(item.surface);
|
|
249
|
+
else if (item.action === "installed" || item.action === "updated" || item.action === "upgraded") updated.push(item.surface);
|
|
250
|
+
else unchanged.push(item.surface);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return {
|
|
254
|
+
contract: RUN_ENTRY_CONTRACT,
|
|
255
|
+
schemaVersion: RUN_ENTRY_SCHEMA_VERSION,
|
|
256
|
+
installedInstructionSurfaces: [INSTRUCTION_SURFACE_REL],
|
|
257
|
+
contractPath: RUN_ENTRY_CONTRACT_REL,
|
|
258
|
+
created,
|
|
259
|
+
updated,
|
|
260
|
+
unchanged,
|
|
261
|
+
guardAvailable: availability.guard.available,
|
|
262
|
+
preflightAvailable: availability.preflight.available,
|
|
263
|
+
verification,
|
|
264
|
+
runEntryState,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// ── Verify ────────────────────────────────────────────────────────────────────
|
|
269
|
+
//
|
|
270
|
+
// Required local contract files: the instruction surface block + the contract
|
|
271
|
+
// record. These fail/repair if missing. Guard/preflight availability is
|
|
272
|
+
// ADVISORY (fail open) because a package-installed project may expose them at a
|
|
273
|
+
// different path or not at all.
|
|
274
|
+
|
|
275
|
+
function verifyRunEntry(cwd, options = {}) {
|
|
276
|
+
const availability = options.availability || detectGuardPreflight(cwd);
|
|
277
|
+
const surfaceState = instructionSurfaceHasBlock(cwd);
|
|
278
|
+
const contractExists = safeReadJson(cwd, RUN_ENTRY_CONTRACT_REL, null) !== null;
|
|
279
|
+
const stateExists = fs.existsSync(path.join(cwd, ACTIVATION_STATE_REL));
|
|
280
|
+
|
|
281
|
+
const checks = {
|
|
282
|
+
activationStateExists: stateExists,
|
|
283
|
+
runEntryContractExists: contractExists,
|
|
284
|
+
instructionSurfaceExists: surfaceState.exists,
|
|
285
|
+
instructionSurfaceHasBlock: surfaceState.hasBlock,
|
|
286
|
+
instructionSurfaceCurrent: surfaceState.current,
|
|
287
|
+
guardAvailable: availability.guard.available, // advisory
|
|
288
|
+
preflightAvailable: availability.preflight.available, // advisory
|
|
289
|
+
};
|
|
290
|
+
|
|
291
|
+
// Only required local contract files gate ok; advisory availability does not.
|
|
292
|
+
const missingRequired = [];
|
|
293
|
+
if (!checks.runEntryContractExists) missingRequired.push(RUN_ENTRY_CONTRACT_REL);
|
|
294
|
+
if (!checks.instructionSurfaceHasBlock) missingRequired.push(`${INSTRUCTION_SURFACE_REL} (run-entry block)`);
|
|
295
|
+
|
|
296
|
+
const advisory = [];
|
|
297
|
+
if (!checks.guardAvailable) advisory.push(GUARD_SCRIPT_REL);
|
|
298
|
+
if (!checks.preflightAvailable) advisory.push(PREFLIGHT_SCRIPT_REL);
|
|
299
|
+
|
|
300
|
+
return {
|
|
301
|
+
ok: missingRequired.length === 0,
|
|
302
|
+
checks,
|
|
303
|
+
missingRequired,
|
|
304
|
+
advisoryMissing: advisory,
|
|
305
|
+
repairCommand: "npx avorelo@latest activate",
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// ── Compact summary line(s) for activation output ─────────────────────────────
|
|
310
|
+
|
|
311
|
+
function formatRunEntrySummary(result) {
|
|
312
|
+
const lines = [];
|
|
313
|
+
lines.push("Run entry:");
|
|
314
|
+
lines.push(` + Instruction surface: ${result.installedInstructionSurfaces.join(", ")}`);
|
|
315
|
+
lines.push(` + Contract: ${result.contractPath}`);
|
|
316
|
+
const changed = [...result.created, ...result.updated];
|
|
317
|
+
if (changed.length) {
|
|
318
|
+
lines.push(` + Installed/repaired: ${changed.join(", ")}`);
|
|
319
|
+
} else {
|
|
320
|
+
lines.push(" + Already up to date (idempotent)");
|
|
321
|
+
}
|
|
322
|
+
lines.push(` + Session Collision Guard available: ${result.guardAvailable ? "yes" : "no (advisory)"}`);
|
|
323
|
+
lines.push(` + Workstream Preflight available: ${result.preflightAvailable ? "yes" : "no (advisory)"}`);
|
|
324
|
+
return lines.join("\n");
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
module.exports = {
|
|
328
|
+
RUN_ENTRY_CONTRACT,
|
|
329
|
+
RUN_ENTRY_SCHEMA_VERSION,
|
|
330
|
+
BLOCK_SCHEMA_VERSION,
|
|
331
|
+
RUN_ENTRY_DIR_REL,
|
|
332
|
+
RUN_ENTRY_CONTRACT_REL,
|
|
333
|
+
INSTRUCTION_SURFACE_REL,
|
|
334
|
+
GUARD_SCRIPT_REL,
|
|
335
|
+
PREFLIGHT_SCRIPT_REL,
|
|
336
|
+
BLOCK_START,
|
|
337
|
+
BLOCK_END,
|
|
338
|
+
buildInstructionBlock,
|
|
339
|
+
detectGuardPreflight,
|
|
340
|
+
upsertInstructionSurface,
|
|
341
|
+
instructionSurfaceHasBlock,
|
|
342
|
+
writeContractRecord,
|
|
343
|
+
installRunEntry,
|
|
344
|
+
verifyRunEntry,
|
|
345
|
+
formatRunEntrySummary,
|
|
346
|
+
};
|