avorelo 0.1.0 → 0.3.0
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 +23 -16
- package/README.md +90 -51
- package/bin/avorelo.mjs +7 -0
- package/dist/avorelo.mjs +19741 -0
- package/package.json +135 -120
- package/bin/avorelo +0 -9
- package/scripts/README.md +0 -40
- package/scripts/cco-dashboard.js +0 -252
- package/scripts/cco-status.js +0 -430
- package/scripts/lib/activation/account-state.js +0 -37
- package/scripts/lib/activation/activation-runner.js +0 -546
- package/scripts/lib/activation/activation-self-healing.js +0 -480
- package/scripts/lib/activation/activation-state.js +0 -83
- package/scripts/lib/activation/activation-summary.js +0 -191
- package/scripts/lib/activation/adapters/claude-code.js +0 -77
- package/scripts/lib/activation/adapters/codex-cli.js +0 -52
- package/scripts/lib/activation/adapters/cursor.js +0 -37
- package/scripts/lib/activation/adapters/github-agent.js +0 -39
- package/scripts/lib/activation/adapters/terminal.js +0 -42
- package/scripts/lib/activation/adapters/vscode.js +0 -39
- package/scripts/lib/activation/adapters/windsurf.js +0 -37
- package/scripts/lib/activation/ai-surface-detector.js +0 -151
- package/scripts/lib/activation/connect-account.js +0 -145
- package/scripts/lib/activation/detect-environment.js +0 -75
- package/scripts/lib/activation/detect-hosts.js +0 -62
- package/scripts/lib/activation/format-activation-output.js +0 -109
- package/scripts/lib/activation/next-action.js +0 -43
- package/scripts/lib/activation/repair-engine.js +0 -219
- package/scripts/lib/activation-distribution-readiness.js +0 -507
- package/scripts/lib/adapter-conformance.js +0 -176
- package/scripts/lib/adapter-readiness.js +0 -417
- package/scripts/lib/adapter-safety-boundaries.js +0 -335
- package/scripts/lib/adapter-technical-readiness-gate.js +0 -205
- package/scripts/lib/agent-access-governance.js +0 -455
- package/scripts/lib/agent-enforcement.js +0 -765
- package/scripts/lib/agent-policy-profile.js +0 -210
- package/scripts/lib/agent-security/action-evaluator.js +0 -507
- package/scripts/lib/agent-security/adapter-registry.js +0 -98
- package/scripts/lib/agent-security/auto-policy.js +0 -139
- package/scripts/lib/agent-security/bounded-scan.js +0 -93
- package/scripts/lib/agent-security/enforcement-adapter.js +0 -174
- package/scripts/lib/agent-security/enforcement-engine.js +0 -1129
- package/scripts/lib/agent-security/file-write-adapter.js +0 -183
- package/scripts/lib/agent-security/file-write-rules.js +0 -178
- package/scripts/lib/agent-security/index.js +0 -3342
- package/scripts/lib/agent-security/instruction-risk.js +0 -181
- package/scripts/lib/agent-security/mcp-action-adapter.js +0 -185
- package/scripts/lib/agent-security/mcp-action-rules.js +0 -184
- package/scripts/lib/agent-security/package-action-adapter.js +0 -175
- package/scripts/lib/agent-security/package-action-rules.js +0 -233
- package/scripts/lib/agent-security/performance.js +0 -148
- package/scripts/lib/agent-security/permission-minimizer.js +0 -403
- package/scripts/lib/agent-security/scan-cache.js +0 -74
- package/scripts/lib/agent-security/source-trust.js +0 -146
- package/scripts/lib/ai-install-prompt.js +0 -288
- package/scripts/lib/ai-workspace-hygiene.js +0 -1499
- package/scripts/lib/alpha-activation.js +0 -520
- package/scripts/lib/alpha-feedback.js +0 -263
- package/scripts/lib/alpha-readiness-gate.js +0 -332
- package/scripts/lib/anti-gaming.js +0 -169
- package/scripts/lib/artifact-health.js +0 -431
- package/scripts/lib/attribution.js +0 -180
- package/scripts/lib/audit.js +0 -289
- package/scripts/lib/avorelo-skill-registry.js +0 -810
- package/scripts/lib/batch-jobs.js +0 -71
- package/scripts/lib/brain-pack.js +0 -578
- package/scripts/lib/brand-boundary.js +0 -424
- package/scripts/lib/brand.js +0 -74
- package/scripts/lib/browser-capability.js +0 -1048
- package/scripts/lib/browser-proof-preflight.js +0 -321
- package/scripts/lib/cache-readiness.js +0 -187
- package/scripts/lib/canonical-reentry.js +0 -162
- package/scripts/lib/capability-packs.js +0 -314
- package/scripts/lib/capability-recommender.js +0 -512
- package/scripts/lib/capability-registry.js +0 -1059
- package/scripts/lib/carry-forward-surfacing.js +0 -194
- package/scripts/lib/ccusage-adapter.js +0 -188
- package/scripts/lib/company-loop.js +0 -1149
- package/scripts/lib/config.js +0 -637
- package/scripts/lib/context-acquisition-plan.js +0 -287
- package/scripts/lib/context-budget-guard.js +0 -170
- package/scripts/lib/context-budget-scanner.js +0 -257
- package/scripts/lib/context-optimizer.js +0 -715
- package/scripts/lib/context-reduction-plan.js +0 -178
- package/scripts/lib/context-safety.js +0 -88
- package/scripts/lib/context-savings-engine.js +0 -158
- package/scripts/lib/cost-evidence.js +0 -254
- package/scripts/lib/cross-host-install-plan.js +0 -308
- package/scripts/lib/cross-host-install-readiness.js +0 -237
- package/scripts/lib/cross-host-value-flow.js +0 -268
- package/scripts/lib/dashboard.js +0 -900
- package/scripts/lib/design-partner-feedback.js +0 -346
- package/scripts/lib/entitlements.js +0 -100
- package/scripts/lib/execution-packet.js +0 -559
- package/scripts/lib/experimentation-events.js +0 -547
- package/scripts/lib/external-capability-compliance.js +0 -107
- package/scripts/lib/external-user-simulation.js +0 -166
- package/scripts/lib/failure-recovery-readiness.js +0 -81
- package/scripts/lib/failure-recovery.js +0 -419
- package/scripts/lib/feedback-intelligence.js +0 -537
- package/scripts/lib/feedback-signals.js +0 -205
- package/scripts/lib/file-integrity.js +0 -68
- package/scripts/lib/fsx.js +0 -127
- package/scripts/lib/full-readiness-gate.js +0 -451
- package/scripts/lib/guidance-builder.js +0 -174
- package/scripts/lib/hook-apply.js +0 -1019
- package/scripts/lib/hook-baseline.js +0 -310
- package/scripts/lib/hook-config-preview.js +0 -275
- package/scripts/lib/hook-contracts.js +0 -290
- package/scripts/lib/hook-safety-boundary-readiness.js +0 -80
- package/scripts/lib/host-capability-matrix.js +0 -351
- package/scripts/lib/host-support-context.js +0 -254
- package/scripts/lib/http-hook-action.js +0 -538
- package/scripts/lib/install-ai-readiness.js +0 -84
- package/scripts/lib/install-intake-risk.js +0 -1037
- package/scripts/lib/install-journey-intelligence.js +0 -329
- package/scripts/lib/intervention-guidance.js +0 -57
- package/scripts/lib/known-limitations.js +0 -115
- package/scripts/lib/l8-path-truth.js +0 -146
- package/scripts/lib/launch-hardening-gate.js +0 -436
- package/scripts/lib/launch-readiness.js +0 -628
- package/scripts/lib/learning-memory.js +0 -686
- package/scripts/lib/lifecycle-hooks.js +0 -802
- package/scripts/lib/local-package-smoke.js +0 -423
- package/scripts/lib/local-pricing.js +0 -299
- package/scripts/lib/mcp-enforcement.js +0 -311
- package/scripts/lib/mcp-least-privilege-policy.js +0 -303
- package/scripts/lib/mcp-tool-inventory.js +0 -388
- package/scripts/lib/mcp-tool-risk.js +0 -0
- package/scripts/lib/memory.js +0 -335
- package/scripts/lib/metrics.js +0 -699
- package/scripts/lib/micro-proof.js +0 -133
- package/scripts/lib/next-run-context.js +0 -436
- package/scripts/lib/operating-value.js +0 -1648
- package/scripts/lib/optimization-v3.js +0 -122
- package/scripts/lib/orchestration/adapters/_shared.js +0 -49
- package/scripts/lib/orchestration/adapters/aider.js +0 -18
- package/scripts/lib/orchestration/adapters/claude-code.js +0 -35
- package/scripts/lib/orchestration/adapters/codex.js +0 -35
- package/scripts/lib/orchestration/adapters/gemini-cli.js +0 -18
- package/scripts/lib/orchestration/adapters/git.js +0 -25
- package/scripts/lib/orchestration/adapters/index.js +0 -31
- package/scripts/lib/orchestration/adapters/lm-studio.js +0 -18
- package/scripts/lib/orchestration/adapters/ollama.js +0 -18
- package/scripts/lib/orchestration/adapters/opencode.js +0 -18
- package/scripts/lib/orchestration/adapters/openrouter.js +0 -18
- package/scripts/lib/orchestration/adapters/test-runner.js +0 -25
- package/scripts/lib/orchestration/cli.js +0 -438
- package/scripts/lib/orchestration/execution-manager.js +0 -279
- package/scripts/lib/orchestration/handoff.js +0 -314
- package/scripts/lib/orchestration/index.js +0 -456
- package/scripts/lib/orchestration/inventory.js +0 -47
- package/scripts/lib/orchestration/model-discovery.js +0 -498
- package/scripts/lib/orchestration/model-profiler.js +0 -170
- package/scripts/lib/orchestration/model-profiles.js +0 -252
- package/scripts/lib/orchestration/model-refresh-policy.js +0 -72
- package/scripts/lib/orchestration/proof-writer.js +0 -349
- package/scripts/lib/orchestration/provider-discovery/aider.js +0 -49
- package/scripts/lib/orchestration/provider-discovery/claude-code.js +0 -56
- package/scripts/lib/orchestration/provider-discovery/codex.js +0 -49
- package/scripts/lib/orchestration/provider-discovery/common.js +0 -186
- package/scripts/lib/orchestration/provider-discovery/gemini.js +0 -106
- package/scripts/lib/orchestration/provider-discovery/lm-studio.js +0 -118
- package/scripts/lib/orchestration/provider-discovery/models-dev.js +0 -12
- package/scripts/lib/orchestration/provider-discovery/ollama.js +0 -100
- package/scripts/lib/orchestration/provider-discovery/opencode.js +0 -47
- package/scripts/lib/orchestration/provider-discovery/openrouter.js +0 -44
- package/scripts/lib/orchestration/risk-classifier.js +0 -130
- package/scripts/lib/orchestration/routing-policy.js +0 -486
- package/scripts/lib/orchestration/settings.js +0 -112
- package/scripts/lib/orchestration/state.js +0 -165
- package/scripts/lib/orchestration/verification-manager.js +0 -138
- package/scripts/lib/output-profiles.js +0 -146
- package/scripts/lib/package-content-audit.js +0 -368
- package/scripts/lib/package-runtime.js +0 -278
- package/scripts/lib/plan-surface.js +0 -53
- package/scripts/lib/plans.js +0 -2318
- package/scripts/lib/policy-provider.js +0 -27
- package/scripts/lib/prelaunch-activation-readiness.js +0 -409
- package/scripts/lib/prelaunch-evidence-store.js +0 -816
- package/scripts/lib/prelaunch-intelligence.js +0 -869
- package/scripts/lib/pricing-experiment.js +0 -118
- package/scripts/lib/pro-moment-events.js +0 -77
- package/scripts/lib/pro-moment-state.js +0 -227
- package/scripts/lib/pro-moments.js +0 -1216
- package/scripts/lib/product-learning-events.js +0 -629
- package/scripts/lib/project-profile.js +0 -555
- package/scripts/lib/prompt-compiler.js +0 -280
- package/scripts/lib/prompt-lint.js +0 -32
- package/scripts/lib/prompt-suggestions.js +0 -52
- package/scripts/lib/proof-canonical.js +0 -398
- package/scripts/lib/proof-drilldown.js +0 -383
- package/scripts/lib/proof-events.js +0 -342
- package/scripts/lib/proof-history.js +0 -243
- package/scripts/lib/proof-metrics.js +0 -296
- package/scripts/lib/proof-outcome-evidence.js +0 -134
- package/scripts/lib/proof-receipt.js +0 -335
- package/scripts/lib/proof-record.js +0 -461
- package/scripts/lib/public-activation-distribution-gate.js +0 -258
- package/scripts/lib/public-cli.js +0 -3891
- package/scripts/lib/public-distribution-truth.js +0 -211
- package/scripts/lib/public-install-claim-checker.js +0 -294
- package/scripts/lib/publish-provenance-readiness.js +0 -283
- package/scripts/lib/readiness-delta.js +0 -218
- package/scripts/lib/readiness-evidence-closure.js +0 -196
- package/scripts/lib/reentry-memory-capture.js +0 -241
- package/scripts/lib/reentry-memory-retrieval.js +0 -302
- package/scripts/lib/reentry-memory-status.js +0 -146
- package/scripts/lib/reentry-memory-store.js +0 -178
- package/scripts/lib/reentry-state.js +0 -66
- package/scripts/lib/release-candidate-bundle.js +0 -166
- package/scripts/lib/remediation.js +0 -81
- package/scripts/lib/repo-map.js +0 -391
- package/scripts/lib/run-improvements-lifecycle.js +0 -330
- package/scripts/lib/run-improvements.js +0 -789
- package/scripts/lib/runtime-decision-policy.js +0 -387
- package/scripts/lib/safe-path-engine.js +0 -705
- package/scripts/lib/safe-run-controller.js +0 -887
- package/scripts/lib/score.js +0 -262
- package/scripts/lib/seamless-enforcement.js +0 -329
- package/scripts/lib/seamless-outcome.js +0 -689
- package/scripts/lib/seamless-reality-gate.js +0 -5043
- package/scripts/lib/security-risk-classifier.js +0 -511
- package/scripts/lib/security-scan.js +0 -384
- package/scripts/lib/session-context-optimizer.js +0 -1211
- package/scripts/lib/session-timing.js +0 -315
- package/scripts/lib/skill-hygiene.js +0 -805
- package/scripts/lib/skill-packs.js +0 -161
- package/scripts/lib/skills-operating-layer.js +0 -580
- package/scripts/lib/smart-work-routing.js +0 -768
- package/scripts/lib/source-catalog.js +0 -700
- package/scripts/lib/status-value-summary.js +0 -32
- package/scripts/lib/support-bundle.js +0 -578
- package/scripts/lib/task-continuation.js +0 -440
- package/scripts/lib/test-helpers.js +0 -15
- package/scripts/lib/tier.js +0 -38
- package/scripts/lib/token-context-quality-gate.js +0 -370
- package/scripts/lib/token-cost-capture.js +0 -187
- package/scripts/lib/token-cost-intelligence.js +0 -358
- package/scripts/lib/token-efficiency-evidence.js +0 -213
- package/scripts/lib/token-evidence.js +0 -699
- package/scripts/lib/tokenish.js +0 -17
- package/scripts/lib/tool-output-sandbox.js +0 -304
- package/scripts/lib/trust-audit.js +0 -136
- package/scripts/lib/unified-events.js +0 -396
- package/scripts/lib/upgrade-interruption-recovery.js +0 -407
- package/scripts/lib/usage-ledger.js +0 -201
- package/scripts/lib/value-ledger.js +0 -130
- package/scripts/lib/value-proof-calibration.js +0 -531
- package/scripts/lib/visual-qa.js +0 -231
- package/scripts/lib/voice-alpha.js +0 -29
- package/scripts/lib/work-aware-orchestration.js +0 -976
- package/scripts/lib/work-control-receipts.js +0 -577
- package/scripts/lib/work-ledger.js +0 -1123
- package/scripts/lib/work-panel-preview.js +0 -352
- package/scripts/lib/workflow-discipline.js +0 -280
- package/scripts/lib/workflow-signals.js +0 -419
- package/scripts/lib/workspace-map.js +0 -281
- package/scripts/lib/workspace-registry.js +0 -1367
- package/scripts/lib/workspace-resolver.js +0 -480
|
@@ -1,308 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
// ── Cross-Host Install Plan ───────────────────────────────────────────────────
|
|
4
|
-
// Contract: avorelo.crossHostInstallPlan.v1
|
|
5
|
-
// Answers: "What is the exact install path for each host? What requires approval?
|
|
6
|
-
// Which hosts are caveated or unsupported?"
|
|
7
|
-
// Does NOT install. Does NOT auto-apply. Does NOT publish. Read+plan only.
|
|
8
|
-
|
|
9
|
-
const fs = require("fs");
|
|
10
|
-
const path = require("path");
|
|
11
|
-
const { nowIso } = require("./fsx");
|
|
12
|
-
const { appendProductLearningEvent } = require("./product-learning-events");
|
|
13
|
-
|
|
14
|
-
const CONTRACT = "avorelo.crossHostInstallPlan.v1";
|
|
15
|
-
const SCHEMA_VERSION = 1;
|
|
16
|
-
const ARTIFACT_DIR_REL = ".claude/cco/orchestration/adapter-readiness";
|
|
17
|
-
const ARTIFACT_REL = ARTIFACT_DIR_REL + "/latest-install-plan.json";
|
|
18
|
-
|
|
19
|
-
function safeReadJson(absPath) {
|
|
20
|
-
try {
|
|
21
|
-
if (!fs.existsSync(absPath)) return null;
|
|
22
|
-
return JSON.parse(fs.readFileSync(absPath, "utf8").replace(/^/, ""));
|
|
23
|
-
} catch { return null; }
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// ── Host Install Definitions ──────────────────────────────────────────────────
|
|
27
|
-
|
|
28
|
-
const HOST_INSTALL_DEFS = [
|
|
29
|
-
{
|
|
30
|
-
hostId: "cli",
|
|
31
|
-
hostLabel: "CLI (local)",
|
|
32
|
-
installMethod: "cli_prompt",
|
|
33
|
-
commandSequence: [
|
|
34
|
-
"node bin/avorelo activate",
|
|
35
|
-
"node bin/avorelo status",
|
|
36
|
-
],
|
|
37
|
-
approvalBoundaries: [
|
|
38
|
-
"Hook config changes require explicit --yes flag",
|
|
39
|
-
"MCP config changes require manual review",
|
|
40
|
-
],
|
|
41
|
-
caveats: [],
|
|
42
|
-
supported: true,
|
|
43
|
-
tier: "core",
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
hostId: "claude_code",
|
|
47
|
-
hostLabel: "Claude Code",
|
|
48
|
-
installMethod: "ai_prompt",
|
|
49
|
-
commandSequence: [
|
|
50
|
-
"Run: node bin/avorelo install-ai --prompt (copy prompt to Claude Code chat)",
|
|
51
|
-
"Run in terminal: node bin/avorelo activate",
|
|
52
|
-
"Review hook config preview: node bin/avorelo hooks preview",
|
|
53
|
-
"Apply hooks (explicit approval): node bin/avorelo hooks apply --yes",
|
|
54
|
-
],
|
|
55
|
-
approvalBoundaries: [
|
|
56
|
-
"Hook config changes require explicit --yes flag",
|
|
57
|
-
"MCP config changes require user review in .claude/settings.json",
|
|
58
|
-
"All install-ai steps surface approval checkpoints",
|
|
59
|
-
],
|
|
60
|
-
caveats: [
|
|
61
|
-
"Package not yet public — use local install path (node bin/avorelo)",
|
|
62
|
-
"Hook depth: full lifecycle available",
|
|
63
|
-
"MCP supported",
|
|
64
|
-
],
|
|
65
|
-
supported: true,
|
|
66
|
-
tier: "primary",
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
hostId: "codex",
|
|
70
|
-
hostLabel: "Codex CLI",
|
|
71
|
-
installMethod: "terminal_fallback",
|
|
72
|
-
commandSequence: [
|
|
73
|
-
"Run in terminal: node bin/avorelo activate",
|
|
74
|
-
"Review hook config: node bin/avorelo hooks preview",
|
|
75
|
-
"Apply hooks with explicit approval: node bin/avorelo hooks apply --yes",
|
|
76
|
-
],
|
|
77
|
-
approvalBoundaries: [
|
|
78
|
-
"Hook config changes require explicit --yes flag",
|
|
79
|
-
],
|
|
80
|
-
caveats: [
|
|
81
|
-
"No dedicated Codex adapter yet — terminal path only",
|
|
82
|
-
"Hook depth: partial lifecycle",
|
|
83
|
-
"MCP: partial support",
|
|
84
|
-
],
|
|
85
|
-
supported: true,
|
|
86
|
-
tier: "partial",
|
|
87
|
-
},
|
|
88
|
-
{
|
|
89
|
-
hostId: "vscode",
|
|
90
|
-
hostLabel: "VS Code",
|
|
91
|
-
installMethod: "terminal_fallback",
|
|
92
|
-
commandSequence: [
|
|
93
|
-
"Open VS Code integrated terminal",
|
|
94
|
-
"Run: node bin/avorelo activate",
|
|
95
|
-
"Review hook config: node bin/avorelo hooks preview",
|
|
96
|
-
],
|
|
97
|
-
approvalBoundaries: [
|
|
98
|
-
"Hook config changes require explicit --yes flag",
|
|
99
|
-
"No VS Code extension — terminal path only",
|
|
100
|
-
],
|
|
101
|
-
caveats: [
|
|
102
|
-
"No VS Code extension implemented — terminal path only",
|
|
103
|
-
"Hook depth: extension-bridge only",
|
|
104
|
-
"MCP: limited",
|
|
105
|
-
],
|
|
106
|
-
supported: true,
|
|
107
|
-
tier: "partial",
|
|
108
|
-
},
|
|
109
|
-
{
|
|
110
|
-
hostId: "cursor",
|
|
111
|
-
hostLabel: "Cursor",
|
|
112
|
-
installMethod: "terminal_fallback",
|
|
113
|
-
commandSequence: [
|
|
114
|
-
"Open Cursor integrated terminal",
|
|
115
|
-
"Run: node bin/avorelo activate",
|
|
116
|
-
"Review hook config: node bin/avorelo hooks preview",
|
|
117
|
-
],
|
|
118
|
-
approvalBoundaries: [
|
|
119
|
-
"Hook config changes require explicit --yes flag",
|
|
120
|
-
"No Cursor extension — terminal path only",
|
|
121
|
-
],
|
|
122
|
-
caveats: [
|
|
123
|
-
"No Cursor extension implemented — terminal path only",
|
|
124
|
-
"Hook depth: partial",
|
|
125
|
-
"MCP: partial",
|
|
126
|
-
],
|
|
127
|
-
supported: true,
|
|
128
|
-
tier: "partial",
|
|
129
|
-
},
|
|
130
|
-
{
|
|
131
|
-
hostId: "openhands",
|
|
132
|
-
hostLabel: "OpenHands",
|
|
133
|
-
installMethod: "unsupported",
|
|
134
|
-
commandSequence: [],
|
|
135
|
-
approvalBoundaries: [],
|
|
136
|
-
caveats: [
|
|
137
|
-
"OpenHands adapter not yet implemented",
|
|
138
|
-
"Use CLI path if running from terminal environment",
|
|
139
|
-
],
|
|
140
|
-
supported: false,
|
|
141
|
-
tier: "unsupported",
|
|
142
|
-
safeAlternative: "Use CLI path: node bin/avorelo activate",
|
|
143
|
-
},
|
|
144
|
-
{
|
|
145
|
-
hostId: "unknown",
|
|
146
|
-
hostLabel: "Unknown / Generic",
|
|
147
|
-
installMethod: "terminal_fallback",
|
|
148
|
-
commandSequence: [
|
|
149
|
-
"Run in terminal: node bin/avorelo activate",
|
|
150
|
-
],
|
|
151
|
-
approvalBoundaries: [
|
|
152
|
-
"Hook config changes require explicit --yes flag",
|
|
153
|
-
],
|
|
154
|
-
caveats: [
|
|
155
|
-
"Host not detected — using generic CLI fallback",
|
|
156
|
-
"Some features may not be available",
|
|
157
|
-
],
|
|
158
|
-
supported: true,
|
|
159
|
-
tier: "fallback",
|
|
160
|
-
},
|
|
161
|
-
];
|
|
162
|
-
|
|
163
|
-
// ── Build Plan for Single Host ────────────────────────────────────────────────
|
|
164
|
-
|
|
165
|
-
function buildCrossHostInstallPlan(cwd, hostId, options) {
|
|
166
|
-
options = options || {};
|
|
167
|
-
const def = HOST_INSTALL_DEFS.find(function(d) { return d.hostId === hostId; });
|
|
168
|
-
if (!def) {
|
|
169
|
-
return {
|
|
170
|
-
hostId,
|
|
171
|
-
hostLabel: hostId,
|
|
172
|
-
installMethod: "unknown",
|
|
173
|
-
commandSequence: [],
|
|
174
|
-
approvalBoundaries: [],
|
|
175
|
-
caveats: ["Host definition not found"],
|
|
176
|
-
supported: false,
|
|
177
|
-
safeNextAction: "Use CLI path: node bin/avorelo activate",
|
|
178
|
-
evidenceRefs: [],
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
// Check if install-ai artifact is available for hosts that support it
|
|
183
|
-
let evidenceRefs = [];
|
|
184
|
-
const installAiPath = path.join(cwd, ".claude/cco/orchestration/ai-install/latest-prompt.json");
|
|
185
|
-
if (fs.existsSync(installAiPath) && def.installMethod === "ai_prompt") {
|
|
186
|
-
evidenceRefs.push(".claude/cco/orchestration/ai-install/latest-prompt.json");
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
const safeNextAction = def.supported
|
|
190
|
-
? "Run: " + (def.commandSequence[0] || "node bin/avorelo activate")
|
|
191
|
-
: (def.safeAlternative || "Host unsupported — use CLI path instead");
|
|
192
|
-
|
|
193
|
-
return Object.assign({}, def, {
|
|
194
|
-
safeNextAction,
|
|
195
|
-
evidenceRefs,
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// ── Build All Host Plans ──────────────────────────────────────────────────────
|
|
200
|
-
|
|
201
|
-
function buildAllHostInstallPlans(cwd, options) {
|
|
202
|
-
options = options || {};
|
|
203
|
-
|
|
204
|
-
const plans = HOST_INSTALL_DEFS.map(function(def) {
|
|
205
|
-
return buildCrossHostInstallPlan(cwd, def.hostId, options);
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
const supportedHostIds = plans.filter(function(p) { return p.supported; }).map(function(p) { return p.hostId; });
|
|
209
|
-
const unsupportedHostIds = plans.filter(function(p) { return !p.supported; }).map(function(p) { return p.hostId; });
|
|
210
|
-
const corePlans = plans.filter(function(p) { return p.tier === "core" || p.tier === "primary"; });
|
|
211
|
-
const coreBroken = corePlans.some(function(p) { return !p.supported; });
|
|
212
|
-
|
|
213
|
-
const blockerCount = coreBroken ? 1 : 0;
|
|
214
|
-
const warningCount = unsupportedHostIds.length;
|
|
215
|
-
|
|
216
|
-
const status = blockerCount > 0 ? "blocked" : warningCount > 0 ? "warn" : "pass";
|
|
217
|
-
|
|
218
|
-
const safeNextAction = blockerCount > 0
|
|
219
|
-
? "Core install path (cli/claude_code) is broken — repair before proceeding."
|
|
220
|
-
: warningCount > 0
|
|
221
|
-
? "Some hosts are unsupported or partial. Core CLI path is available. Caveats documented."
|
|
222
|
-
: "All supported hosts have install plans. Unsupported hosts have safe alternatives documented.";
|
|
223
|
-
|
|
224
|
-
return {
|
|
225
|
-
contract: CONTRACT,
|
|
226
|
-
schemaVersion: SCHEMA_VERSION,
|
|
227
|
-
generatedAt: nowIso(),
|
|
228
|
-
status,
|
|
229
|
-
plans,
|
|
230
|
-
supportedHostIds,
|
|
231
|
-
unsupportedHostIds,
|
|
232
|
-
blockerCount,
|
|
233
|
-
warningCount,
|
|
234
|
-
safeNextAction,
|
|
235
|
-
noWorksEverywhereClaim: true,
|
|
236
|
-
noPublicLaunchClaim: true,
|
|
237
|
-
redacted: true,
|
|
238
|
-
};
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
// ── Write ─────────────────────────────────────────────────────────────────────
|
|
242
|
-
|
|
243
|
-
function writeCrossHostInstallPlan(cwd, plan) {
|
|
244
|
-
const dir = path.join(cwd, ARTIFACT_DIR_REL);
|
|
245
|
-
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
|
|
246
|
-
fs.writeFileSync(path.join(cwd, ARTIFACT_REL), JSON.stringify(plan, null, 2));
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
// ── Surface ───────────────────────────────────────────────────────────────────
|
|
250
|
-
|
|
251
|
-
function buildCrossHostInstallSurface(cwd, options) {
|
|
252
|
-
const plan = buildAllHostInstallPlans(cwd, options);
|
|
253
|
-
writeCrossHostInstallPlan(cwd, plan);
|
|
254
|
-
try {
|
|
255
|
-
appendProductLearningEvent(cwd, {
|
|
256
|
-
event: "cross_host_install_plan_built",
|
|
257
|
-
contract: CONTRACT,
|
|
258
|
-
status: plan.status,
|
|
259
|
-
supportedCount: plan.supportedHostIds.length,
|
|
260
|
-
unsupportedCount: plan.unsupportedHostIds.length,
|
|
261
|
-
});
|
|
262
|
-
} catch { /* non-fatal */ }
|
|
263
|
-
return {
|
|
264
|
-
status: plan.status,
|
|
265
|
-
supportedHostIds: plan.supportedHostIds,
|
|
266
|
-
unsupportedHostIds: plan.unsupportedHostIds,
|
|
267
|
-
blockerCount: plan.blockerCount,
|
|
268
|
-
warningCount: plan.warningCount,
|
|
269
|
-
noWorksEverywhereClaim: true,
|
|
270
|
-
noPublicLaunchClaim: true,
|
|
271
|
-
};
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
// ── Format ────────────────────────────────────────────────────────────────────
|
|
275
|
-
|
|
276
|
-
function formatCrossHostInstallText(plan, options) {
|
|
277
|
-
options = options || {};
|
|
278
|
-
var lines = [
|
|
279
|
-
"Cross-Host Install Plan [" + (plan.status || "?").toUpperCase() + "]",
|
|
280
|
-
" Supported hosts: " + (plan.supportedHostIds || []).join(", "),
|
|
281
|
-
" Unsupported hosts: " + (plan.unsupportedHostIds || []).join(", "),
|
|
282
|
-
" Blockers: " + (plan.blockerCount || 0),
|
|
283
|
-
" Warnings: " + (plan.warningCount || 0),
|
|
284
|
-
];
|
|
285
|
-
if (options.debug && plan.plans) {
|
|
286
|
-
plan.plans.forEach(function(p) {
|
|
287
|
-
lines.push(" [" + p.hostId + "] " + p.installMethod + (p.supported ? "" : " (unsupported)"));
|
|
288
|
-
if (p.caveats && p.caveats.length) {
|
|
289
|
-
p.caveats.forEach(function(c) { lines.push(" caveat: " + c); });
|
|
290
|
-
}
|
|
291
|
-
});
|
|
292
|
-
}
|
|
293
|
-
lines.push(" No works-everywhere claim. Unsupported hosts caveated.");
|
|
294
|
-
lines.push(" Next: " + (plan.safeNextAction || "Review cross-host install plan."));
|
|
295
|
-
return lines.join("\n");
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
module.exports = {
|
|
299
|
-
CONTRACT,
|
|
300
|
-
SCHEMA_VERSION,
|
|
301
|
-
ARTIFACT_REL,
|
|
302
|
-
HOST_INSTALL_DEFS,
|
|
303
|
-
buildCrossHostInstallPlan,
|
|
304
|
-
buildAllHostInstallPlans,
|
|
305
|
-
writeCrossHostInstallPlan,
|
|
306
|
-
buildCrossHostInstallSurface,
|
|
307
|
-
formatCrossHostInstallText,
|
|
308
|
-
};
|
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
// ── Cross-Host Install Readiness ──────────────────────────────────────────────
|
|
4
|
-
// Contract: avorelo.crossHostInstallReadiness.v1
|
|
5
|
-
// Answers: "Does install-ai work on each detected host? Is the bin entry viable?
|
|
6
|
-
// Is there a clear activation path per host?"
|
|
7
|
-
// Reads existing install-ai artifacts. Does NOT run installs. Does NOT publish.
|
|
8
|
-
|
|
9
|
-
const fs = require("fs");
|
|
10
|
-
const path = require("path");
|
|
11
|
-
const { nowIso } = require("./fsx");
|
|
12
|
-
const { appendProductLearningEvent } = require("./product-learning-events");
|
|
13
|
-
|
|
14
|
-
const CONTRACT = "avorelo.crossHostInstallReadiness.v1";
|
|
15
|
-
const SCHEMA_VERSION = 1;
|
|
16
|
-
const ARTIFACT_DIR_REL = ".claude/cco/orchestration/adapter-readiness";
|
|
17
|
-
const ARTIFACT_REL = ARTIFACT_DIR_REL + "/latest-cross-host-install.json";
|
|
18
|
-
|
|
19
|
-
function safeReadJson(absPath) {
|
|
20
|
-
try {
|
|
21
|
-
if (!fs.existsSync(absPath)) return null;
|
|
22
|
-
return JSON.parse(fs.readFileSync(absPath, "utf8").replace(/^/, ""));
|
|
23
|
-
} catch { return null; }
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function pass(id, label, evidence, detail) {
|
|
27
|
-
return { id, label, status: "pass", evidence: evidence || null, detail: detail || null, safeNextAction: null };
|
|
28
|
-
}
|
|
29
|
-
function warn(id, label, safeNextAction, evidence, detail) {
|
|
30
|
-
return { id, label, status: "warn", evidence: evidence || null, detail: detail || null, safeNextAction: safeNextAction || "Review and resolve." };
|
|
31
|
-
}
|
|
32
|
-
function blocked(id, label, safeNextAction, evidence, detail) {
|
|
33
|
-
return { id, label, status: "blocked", evidence: evidence || null, detail: detail || null, safeNextAction: safeNextAction || "Fix blocker before proceeding." };
|
|
34
|
-
}
|
|
35
|
-
function info(id, label, evidence, detail) {
|
|
36
|
-
return { id, label, status: "info", evidence: evidence || null, detail: detail || null, safeNextAction: null };
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// ── Shared Checks ─────────────────────────────────────────────────────────────
|
|
40
|
-
|
|
41
|
-
function checkBinEntryPresent(cwd) {
|
|
42
|
-
const binPath = path.join(cwd, "bin", "avorelo");
|
|
43
|
-
if (fs.existsSync(binPath)) {
|
|
44
|
-
return pass("bin_entry_present", "bin/avorelo entry present", { path: "bin/avorelo" });
|
|
45
|
-
}
|
|
46
|
-
return blocked("bin_entry_present", "bin/avorelo entry missing",
|
|
47
|
-
"Create bin/avorelo entry point before cross-host testing.", null, "bin/avorelo not found.");
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function checkInstallAiArtifact(cwd) {
|
|
51
|
-
const installAiPath = path.join(cwd, ".claude/cco/orchestration/ai-install/latest-prompt.json");
|
|
52
|
-
const artifact = safeReadJson(installAiPath);
|
|
53
|
-
if (!artifact) {
|
|
54
|
-
return warn("install_ai_artifact", "install-ai artifact not yet generated",
|
|
55
|
-
"Run: node bin/avorelo install-ai --json to generate the install-ai artifact.",
|
|
56
|
-
null, "latest-prompt.json not found.");
|
|
57
|
-
}
|
|
58
|
-
return pass("install_ai_artifact", "install-ai artifact present",
|
|
59
|
-
{ path: ".claude/cco/orchestration/ai-install/latest-prompt.json" });
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
function checkActivationStatePresent(cwd) {
|
|
63
|
-
const statePath = path.join(cwd, ".claude/cco/state/activation.json");
|
|
64
|
-
if (fs.existsSync(statePath)) {
|
|
65
|
-
return pass("activation_state_present", "Activation state file present",
|
|
66
|
-
{ path: ".claude/cco/state/activation.json" });
|
|
67
|
-
}
|
|
68
|
-
return warn("activation_state_present", "Activation state file not found",
|
|
69
|
-
"Run: node bin/avorelo activate to initialize activation state.",
|
|
70
|
-
null, ".claude/cco/state/activation.json not found.");
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// ── Per-Host Install Checks ───────────────────────────────────────────────────
|
|
74
|
-
|
|
75
|
-
function checkHostInstallReadiness(cwd, hostId, hostLabel, installAiSupported) {
|
|
76
|
-
const checks = [];
|
|
77
|
-
|
|
78
|
-
if (!installAiSupported) {
|
|
79
|
-
checks.push(warn("install_ai_supported_" + hostId,
|
|
80
|
-
"install-ai not supported on " + hostLabel,
|
|
81
|
-
"Document manual install path for " + hostLabel + " in docs/INSTALL.md.",
|
|
82
|
-
{ hostId }));
|
|
83
|
-
return { hostId, hostLabel, supported: false, checks, status: "warn" };
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// For supported hosts, verify the install-ai prompt would work
|
|
87
|
-
const installAiArtifact = safeReadJson(path.join(cwd, ".claude/cco/orchestration/ai-install/latest-prompt.json"));
|
|
88
|
-
if (installAiArtifact) {
|
|
89
|
-
checks.push(pass("install_ai_prompt_" + hostId,
|
|
90
|
-
"install-ai prompt ready for " + hostLabel,
|
|
91
|
-
{ hostId, hasPrompt: true }));
|
|
92
|
-
} else {
|
|
93
|
-
checks.push(warn("install_ai_prompt_" + hostId,
|
|
94
|
-
"install-ai prompt not yet generated for " + hostLabel,
|
|
95
|
-
"Run: node bin/avorelo install-ai --json",
|
|
96
|
-
{ hostId }));
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// Check host-specific state
|
|
100
|
-
const hostStatePath = path.join(cwd, ".claude/cco/state/hosts/" + hostId + ".json");
|
|
101
|
-
if (fs.existsSync(hostStatePath)) {
|
|
102
|
-
checks.push(pass("host_state_" + hostId, hostLabel + " host state present",
|
|
103
|
-
{ path: ".claude/cco/state/hosts/" + hostId + ".json" }));
|
|
104
|
-
} else {
|
|
105
|
-
checks.push(info("host_state_" + hostId, hostLabel + " host state not yet written",
|
|
106
|
-
{ hostId }, "Will be created on first activation."));
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const status = checks.some(function(c) { return c.status === "blocked"; }) ? "blocked"
|
|
110
|
-
: checks.every(function(c) { return c.status === "pass" || c.status === "info"; }) ? "pass"
|
|
111
|
-
: "warn";
|
|
112
|
-
|
|
113
|
-
return { hostId, hostLabel, supported: true, checks, status };
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// ── Build Cross-Host Install Readiness ────────────────────────────────────────
|
|
117
|
-
|
|
118
|
-
const HOST_INSTALL_DEFS = [
|
|
119
|
-
{ id: "claude_code", label: "Claude Code", installAiSupported: true },
|
|
120
|
-
{ id: "cursor", label: "Cursor", installAiSupported: true },
|
|
121
|
-
{ id: "windsurf", label: "Windsurf", installAiSupported: true },
|
|
122
|
-
{ id: "codex", label: "Codex CLI", installAiSupported: true },
|
|
123
|
-
{ id: "vscode", label: "VS Code", installAiSupported: true },
|
|
124
|
-
{ id: "github_agent", label: "GitHub Copilot Agent", installAiSupported: false },
|
|
125
|
-
];
|
|
126
|
-
|
|
127
|
-
function buildCrossHostInstallReadiness(cwd, options) {
|
|
128
|
-
const sharedChecks = [
|
|
129
|
-
checkBinEntryPresent(cwd),
|
|
130
|
-
checkInstallAiArtifact(cwd),
|
|
131
|
-
checkActivationStatePresent(cwd),
|
|
132
|
-
];
|
|
133
|
-
|
|
134
|
-
const hostResults = HOST_INSTALL_DEFS.map(function(def) {
|
|
135
|
-
return checkHostInstallReadiness(cwd, def.id, def.label, def.installAiSupported);
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
const allChecks = sharedChecks.concat(
|
|
139
|
-
hostResults.reduce(function(acc, h) { return acc.concat(h.checks); }, [])
|
|
140
|
-
);
|
|
141
|
-
|
|
142
|
-
const blockers = allChecks.filter(function(c) { return c.status === "blocked"; });
|
|
143
|
-
const warnings = allChecks.filter(function(c) { return c.status === "warn"; });
|
|
144
|
-
|
|
145
|
-
const supportedHosts = hostResults.filter(function(h) { return h.supported; }).map(function(h) { return h.hostId; });
|
|
146
|
-
const unsupportedHosts = hostResults.filter(function(h) { return !h.supported; }).map(function(h) { return h.hostId; });
|
|
147
|
-
|
|
148
|
-
var status;
|
|
149
|
-
if (blockers.length > 0) {
|
|
150
|
-
status = "blocked";
|
|
151
|
-
} else if (warnings.length > 0) {
|
|
152
|
-
status = "warn";
|
|
153
|
-
} else {
|
|
154
|
-
status = "pass";
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
const safeNextAction = blockers.length > 0
|
|
158
|
-
? "Fix install blockers before cross-host testing. Ensure bin/avorelo exists."
|
|
159
|
-
: warnings.length > 0
|
|
160
|
-
? "Review cross-host install warnings. Generate install-ai artifact if missing."
|
|
161
|
-
: "Cross-host install readiness verified for all supported hosts.";
|
|
162
|
-
|
|
163
|
-
return {
|
|
164
|
-
contract: CONTRACT,
|
|
165
|
-
schemaVersion: SCHEMA_VERSION,
|
|
166
|
-
generatedAt: nowIso(),
|
|
167
|
-
status,
|
|
168
|
-
supportedHosts,
|
|
169
|
-
unsupportedHosts,
|
|
170
|
-
sharedChecks,
|
|
171
|
-
hostResults,
|
|
172
|
-
blockerCount: blockers.length,
|
|
173
|
-
warningCount: warnings.length,
|
|
174
|
-
safeNextAction,
|
|
175
|
-
noPublicLaunchClaim: true,
|
|
176
|
-
redacted: true,
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// ── Write ─────────────────────────────────────────────────────────────────────
|
|
181
|
-
|
|
182
|
-
function writeCrossHostInstallReadiness(cwd, readiness) {
|
|
183
|
-
const dir = path.join(cwd, ARTIFACT_DIR_REL);
|
|
184
|
-
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
|
|
185
|
-
fs.writeFileSync(path.join(cwd, ARTIFACT_REL), JSON.stringify(readiness, null, 2));
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// ── Surface ───────────────────────────────────────────────────────────────────
|
|
189
|
-
|
|
190
|
-
function buildCrossHostInstallSurface(cwd, options) {
|
|
191
|
-
const readiness = buildCrossHostInstallReadiness(cwd, options);
|
|
192
|
-
writeCrossHostInstallReadiness(cwd, readiness);
|
|
193
|
-
try {
|
|
194
|
-
appendProductLearningEvent(cwd, {
|
|
195
|
-
event: "cross_host_install_readiness_built",
|
|
196
|
-
contract: CONTRACT,
|
|
197
|
-
status: readiness.status,
|
|
198
|
-
blockerCount: readiness.blockerCount,
|
|
199
|
-
});
|
|
200
|
-
} catch { /* non-fatal */ }
|
|
201
|
-
return {
|
|
202
|
-
status: readiness.status,
|
|
203
|
-
supportedHosts: readiness.supportedHosts,
|
|
204
|
-
unsupportedHosts: readiness.unsupportedHosts,
|
|
205
|
-
blockerCount: readiness.blockerCount,
|
|
206
|
-
warningCount: readiness.warningCount,
|
|
207
|
-
noPublicLaunchClaim: true,
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// ── Format ────────────────────────────────────────────────────────────────────
|
|
212
|
-
|
|
213
|
-
function formatCrossHostInstallText(readiness) {
|
|
214
|
-
var lines = [
|
|
215
|
-
"Cross-Host Install Readiness [" + (readiness.status || "?").toUpperCase() + "]",
|
|
216
|
-
" Supported hosts: " + (readiness.supportedHosts || []).join(", "),
|
|
217
|
-
" Unsupported hosts: " + (readiness.unsupportedHosts || []).join(", "),
|
|
218
|
-
" Blockers: " + (readiness.blockerCount || 0),
|
|
219
|
-
" Warnings: " + (readiness.warningCount || 0),
|
|
220
|
-
" Next: " + (readiness.safeNextAction || "Review cross-host install readiness."),
|
|
221
|
-
];
|
|
222
|
-
return lines.join("\n");
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
module.exports = {
|
|
226
|
-
CONTRACT,
|
|
227
|
-
SCHEMA_VERSION,
|
|
228
|
-
ARTIFACT_REL,
|
|
229
|
-
HOST_INSTALL_DEFS,
|
|
230
|
-
buildCrossHostInstallReadiness,
|
|
231
|
-
writeCrossHostInstallReadiness,
|
|
232
|
-
buildCrossHostInstallSurface,
|
|
233
|
-
formatCrossHostInstallText,
|
|
234
|
-
checkBinEntryPresent,
|
|
235
|
-
checkInstallAiArtifact,
|
|
236
|
-
checkHostInstallReadiness,
|
|
237
|
-
};
|