avorelo 0.1.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 +21 -0
- package/README.md +56 -0
- package/bin/avorelo +9 -0
- package/package.json +135 -0
- package/scripts/README.md +40 -0
- package/scripts/cco-dashboard.js +252 -0
- package/scripts/cco-status.js +430 -0
- package/scripts/lib/activation/account-state.js +37 -0
- package/scripts/lib/activation/activation-runner.js +546 -0
- package/scripts/lib/activation/activation-self-healing.js +480 -0
- package/scripts/lib/activation/activation-state.js +83 -0
- package/scripts/lib/activation/activation-summary.js +191 -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-distribution-readiness.js +507 -0
- package/scripts/lib/adapter-conformance.js +176 -0
- package/scripts/lib/adapter-readiness.js +417 -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-enforcement.js +765 -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-install-prompt.js +288 -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/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-preflight.js +321 -0
- package/scripts/lib/cache-readiness.js +187 -0
- package/scripts/lib/canonical-reentry.js +162 -0
- package/scripts/lib/capability-packs.js +314 -0
- package/scripts/lib/capability-recommender.js +512 -0
- package/scripts/lib/capability-registry.js +1059 -0
- package/scripts/lib/carry-forward-surfacing.js +194 -0
- package/scripts/lib/ccusage-adapter.js +188 -0
- package/scripts/lib/company-loop.js +1149 -0
- package/scripts/lib/config.js +637 -0
- package/scripts/lib/context-acquisition-plan.js +287 -0
- package/scripts/lib/context-budget-guard.js +170 -0
- package/scripts/lib/context-budget-scanner.js +257 -0
- package/scripts/lib/context-optimizer.js +715 -0
- package/scripts/lib/context-reduction-plan.js +178 -0
- package/scripts/lib/context-safety.js +88 -0
- package/scripts/lib/context-savings-engine.js +158 -0
- package/scripts/lib/cost-evidence.js +254 -0
- package/scripts/lib/cross-host-install-plan.js +308 -0
- package/scripts/lib/cross-host-install-readiness.js +237 -0
- package/scripts/lib/cross-host-value-flow.js +268 -0
- package/scripts/lib/dashboard.js +900 -0
- package/scripts/lib/design-partner-feedback.js +346 -0
- package/scripts/lib/entitlements.js +100 -0
- package/scripts/lib/execution-packet.js +559 -0
- package/scripts/lib/experimentation-events.js +547 -0
- package/scripts/lib/external-capability-compliance.js +107 -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 +127 -0
- package/scripts/lib/full-readiness-gate.js +451 -0
- package/scripts/lib/guidance-builder.js +174 -0
- package/scripts/lib/hook-apply.js +1019 -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 +1037 -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 +628 -0
- package/scripts/lib/learning-memory.js +686 -0
- package/scripts/lib/lifecycle-hooks.js +802 -0
- package/scripts/lib/local-package-smoke.js +423 -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/next-run-context.js +436 -0
- package/scripts/lib/operating-value.js +1648 -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 +112 -0
- package/scripts/lib/orchestration/state.js +165 -0
- package/scripts/lib/orchestration/verification-manager.js +138 -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 +2318 -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-learning-events.js +629 -0
- package/scripts/lib/project-profile.js +555 -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-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/public-activation-distribution-gate.js +258 -0
- package/scripts/lib/public-cli.js +3891 -0
- package/scripts/lib/public-distribution-truth.js +211 -0
- package/scripts/lib/public-install-claim-checker.js +294 -0
- package/scripts/lib/publish-provenance-readiness.js +283 -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 +146 -0
- package/scripts/lib/reentry-memory-store.js +178 -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-improvements-lifecycle.js +330 -0
- package/scripts/lib/run-improvements.js +789 -0
- package/scripts/lib/runtime-decision-policy.js +387 -0
- package/scripts/lib/safe-path-engine.js +705 -0
- package/scripts/lib/safe-run-controller.js +887 -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 +5043 -0
- package/scripts/lib/security-risk-classifier.js +511 -0
- package/scripts/lib/security-scan.js +384 -0
- package/scripts/lib/session-context-optimizer.js +1211 -0
- package/scripts/lib/session-timing.js +315 -0
- package/scripts/lib/skill-hygiene.js +805 -0
- package/scripts/lib/skill-packs.js +161 -0
- package/scripts/lib/skills-operating-layer.js +580 -0
- package/scripts/lib/smart-work-routing.js +768 -0
- package/scripts/lib/source-catalog.js +700 -0
- package/scripts/lib/status-value-summary.js +32 -0
- package/scripts/lib/support-bundle.js +578 -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-intelligence.js +358 -0
- package/scripts/lib/token-efficiency-evidence.js +213 -0
- package/scripts/lib/token-evidence.js +699 -0
- package/scripts/lib/tokenish.js +17 -0
- package/scripts/lib/tool-output-sandbox.js +304 -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/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-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 +480 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const fs = require("fs");
|
|
4
|
+
const path = require("path");
|
|
5
|
+
|
|
6
|
+
function localPolicyProvider(cwd, teamPolicyPath) {
|
|
7
|
+
const p = path.join(cwd, teamPolicyPath || ".claude/cco/team-policy.json");
|
|
8
|
+
try {
|
|
9
|
+
return { ok: true, source: "local", policy: JSON.parse(fs.readFileSync(p, "utf8")) };
|
|
10
|
+
} catch {
|
|
11
|
+
return { ok: false, source: "local", policy: null };
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function remotePolicyProviderStub() {
|
|
16
|
+
return {
|
|
17
|
+
ok: false,
|
|
18
|
+
source: "remote",
|
|
19
|
+
policy: null,
|
|
20
|
+
message: "Remote policy provider is disabled in local-first MVP.",
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
module.exports = {
|
|
25
|
+
localPolicyProvider,
|
|
26
|
+
remotePolicyProviderStub,
|
|
27
|
+
};
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// ── Pre-Launch Activation Readiness Gate ──────────────────────────────────────
|
|
4
|
+
//
|
|
5
|
+
// Contract: avorelo.prelaunchActivationReadiness.v1
|
|
6
|
+
//
|
|
7
|
+
// Evaluates whether Avorelo is ready for one-prompt AI install and
|
|
8
|
+
// pre-launch activation. This is NOT public launch readiness — it is the
|
|
9
|
+
// internal gate that ensures the AI install flow has all required surfaces.
|
|
10
|
+
//
|
|
11
|
+
// Rules:
|
|
12
|
+
// - No network calls, no secrets, no raw config dumps
|
|
13
|
+
// - Missing optional artifacts warn, not crash
|
|
14
|
+
// - Missing safety-critical checks fail with one safe next action
|
|
15
|
+
// - No public launch claim
|
|
16
|
+
|
|
17
|
+
const fs = require("fs");
|
|
18
|
+
const path = require("path");
|
|
19
|
+
const { nowIso } = require("./fsx");
|
|
20
|
+
const { appendProductLearningEvent } = require("./product-learning-events");
|
|
21
|
+
|
|
22
|
+
const CONTRACT = "avorelo.prelaunchActivationReadiness.v1";
|
|
23
|
+
const SCHEMA_VERSION = 1;
|
|
24
|
+
|
|
25
|
+
const GATE_DIR_REL = ".claude/cco/orchestration/prelaunch-readiness";
|
|
26
|
+
const LATEST_GATE_REL = `${GATE_DIR_REL}/latest-activation-readiness.json`;
|
|
27
|
+
|
|
28
|
+
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
29
|
+
|
|
30
|
+
const AVORELO_ROOT = path.resolve(__dirname, "../../");
|
|
31
|
+
|
|
32
|
+
function safeReadJson(absPath) {
|
|
33
|
+
try {
|
|
34
|
+
if (!fs.existsSync(absPath)) return null;
|
|
35
|
+
return JSON.parse(fs.readFileSync(absPath, "utf8").replace(/^/, ""));
|
|
36
|
+
} catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function tryRequire(modulePath) {
|
|
42
|
+
try {
|
|
43
|
+
return { mod: require(modulePath), err: null };
|
|
44
|
+
} catch (e) {
|
|
45
|
+
return { mod: null, err: e };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function checkPass(id, summary, nextAction) {
|
|
50
|
+
return { id, status: "pass", summary, nextAction: nextAction || null };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function checkWarn(id, summary, nextAction) {
|
|
54
|
+
return { id, status: "warn", summary, nextAction: nextAction || null };
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function checkFail(id, summary, nextAction) {
|
|
58
|
+
return { id, status: "fail", summary, nextAction: nextAction || null };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// ── Individual checks ─────────────────────────────────────────────────────────
|
|
62
|
+
|
|
63
|
+
function checkAiInstallPromptReady(cwd) {
|
|
64
|
+
const id = "ai_install_prompt_ready";
|
|
65
|
+
const { mod } = tryRequire(path.join(AVORELO_ROOT, "scripts/lib/ai-install-prompt"));
|
|
66
|
+
if (!mod) {
|
|
67
|
+
return checkFail(id, "AI install prompt module not found.", "Run: git status and ensure scripts/lib/ai-install-prompt.js is present.");
|
|
68
|
+
}
|
|
69
|
+
// Verify it exports the required contract functions
|
|
70
|
+
const required = ["buildAiInstallPrompt", "buildAiInstallPlan", "writeAiInstallPromptReceipt", "formatAiInstallPromptText"];
|
|
71
|
+
const missing = required.filter((fn) => typeof mod[fn] !== "function");
|
|
72
|
+
if (missing.length > 0) {
|
|
73
|
+
return checkFail(id, `AI install prompt missing exports: ${missing.join(", ")}.`, "Fix scripts/lib/ai-install-prompt.js exports.");
|
|
74
|
+
}
|
|
75
|
+
return checkPass(id, "AI install prompt module ready with all required exports.");
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function checkActivationAvailable(cwd) {
|
|
79
|
+
const id = "activation_available";
|
|
80
|
+
const { mod } = tryRequire(path.join(AVORELO_ROOT, "scripts/lib/alpha-activation"));
|
|
81
|
+
if (!mod) {
|
|
82
|
+
return checkFail(id, "Alpha activation module not found.", "Ensure scripts/lib/alpha-activation.js is present.");
|
|
83
|
+
}
|
|
84
|
+
return checkPass(id, "Activation module available.");
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function checkFirstValuePathClear(cwd) {
|
|
88
|
+
const id = "first_value_path_clear";
|
|
89
|
+
const { mod } = tryRequire(path.join(AVORELO_ROOT, "scripts/lib/safe-run-controller"));
|
|
90
|
+
if (!mod) {
|
|
91
|
+
return checkWarn(id, "Safe run controller not found — first value path limited.", "Ensure scripts/lib/safe-run-controller.js is present.");
|
|
92
|
+
}
|
|
93
|
+
return checkPass(id, "First value path clear via safe-run controller.");
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function checkSafeRunAvailable(cwd) {
|
|
97
|
+
const id = "safe_run_available";
|
|
98
|
+
const { mod } = tryRequire(path.join(AVORELO_ROOT, "scripts/lib/safe-run-controller"));
|
|
99
|
+
if (!mod) {
|
|
100
|
+
return checkWarn(id, "Safe run controller not available.", "Run: node bin/avorelo run \"<task>\" --prepare-only --json");
|
|
101
|
+
}
|
|
102
|
+
return checkPass(id, "Safe run controller available.");
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function checkHooksDoctorAvailable(cwd) {
|
|
106
|
+
const id = "hooks_doctor_available";
|
|
107
|
+
const { mod } = tryRequire(path.join(AVORELO_ROOT, "scripts/lib/hook-apply"));
|
|
108
|
+
if (!mod) {
|
|
109
|
+
return checkWarn(id, "Hook apply module not found.", "Ensure scripts/lib/hook-apply.js is present.");
|
|
110
|
+
}
|
|
111
|
+
return checkPass(id, "Hooks doctor available.");
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function checkHookApplyRequiresExplicitApproval(cwd) {
|
|
115
|
+
const id = "hook_apply_requires_explicit_approval";
|
|
116
|
+
// Verify the hook-apply module enforces --yes flag before applying
|
|
117
|
+
const hookApplyPath = path.join(AVORELO_ROOT, "scripts/lib/hook-apply.js");
|
|
118
|
+
if (!fs.existsSync(hookApplyPath)) {
|
|
119
|
+
return checkFail(id, "Hook apply module not found — cannot verify approval boundary.", "Ensure scripts/lib/hook-apply.js is present.");
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
const src = fs.readFileSync(hookApplyPath, "utf8");
|
|
123
|
+
const hasApprovalCheck = src.includes("--yes") || src.includes("requiresConfirm") || src.includes("dryRun") || src.includes("dry_run") || src.includes("dryrun");
|
|
124
|
+
if (!hasApprovalCheck) {
|
|
125
|
+
return checkFail(id, "Hook apply module may not enforce explicit approval.", "Verify hook-apply.js requires --yes before applying.");
|
|
126
|
+
}
|
|
127
|
+
} catch {
|
|
128
|
+
return checkWarn(id, "Could not verify hook apply approval enforcement.", "Manually verify scripts/lib/hook-apply.js requires --yes.");
|
|
129
|
+
}
|
|
130
|
+
return checkPass(id, "Hook apply requires explicit approval (--yes flag enforced).");
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function checkTokenContextQualityAvailable(cwd) {
|
|
134
|
+
const id = "token_context_quality_available";
|
|
135
|
+
const { mod } = tryRequire(path.join(AVORELO_ROOT, "scripts/lib/token-efficiency-evidence"));
|
|
136
|
+
if (!mod) {
|
|
137
|
+
return checkWarn(id, "Token efficiency evidence module not found.", "Ensure scripts/lib/token-efficiency-evidence.js is present.");
|
|
138
|
+
}
|
|
139
|
+
return checkPass(id, "Token/context quality check available.");
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function checkLaunchHardeningAvailable(cwd) {
|
|
143
|
+
const id = "launch_hardening_available";
|
|
144
|
+
const { mod } = tryRequire(path.join(AVORELO_ROOT, "scripts/lib/launch-hardening-gate"));
|
|
145
|
+
if (!mod) {
|
|
146
|
+
return checkFail(id, "Launch hardening gate not available.", "Ensure scripts/lib/launch-hardening-gate.js is present.");
|
|
147
|
+
}
|
|
148
|
+
return checkPass(id, "Launch hardening gate available.");
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function checkMcpToolGovernanceAvailable(cwd) {
|
|
152
|
+
const id = "mcp_tool_governance_available";
|
|
153
|
+
const { mod } = tryRequire(path.join(AVORELO_ROOT, "scripts/lib/mcp-tool-inventory"));
|
|
154
|
+
if (!mod) {
|
|
155
|
+
return checkFail(id, "MCP tool inventory not available.", "Ensure scripts/lib/mcp-tool-inventory.js is present.");
|
|
156
|
+
}
|
|
157
|
+
return checkPass(id, "MCP/tool governance available.");
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function checkSupportBundleAvailable(cwd) {
|
|
161
|
+
const id = "support_bundle_available";
|
|
162
|
+
const { mod } = tryRequire(path.join(AVORELO_ROOT, "scripts/lib/support-bundle"));
|
|
163
|
+
if (!mod) {
|
|
164
|
+
return checkWarn(id, "Support bundle module not found.", "Ensure scripts/lib/support-bundle.js is present.");
|
|
165
|
+
}
|
|
166
|
+
return checkPass(id, "Support bundle available.");
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function checkFailureRecoveryAvailable(cwd) {
|
|
170
|
+
const id = "failure_recovery_available";
|
|
171
|
+
const { mod } = tryRequire(path.join(AVORELO_ROOT, "scripts/lib/failure-recovery"));
|
|
172
|
+
if (!mod) {
|
|
173
|
+
return checkWarn(id, "Failure recovery module not found.", "Ensure scripts/lib/failure-recovery.js is present.");
|
|
174
|
+
}
|
|
175
|
+
return checkPass(id, "Failure recovery available.");
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function checkFeedbackCaptureAvailable(cwd) {
|
|
179
|
+
const id = "feedback_capture_available";
|
|
180
|
+
const { mod } = tryRequire(path.join(AVORELO_ROOT, "scripts/lib/alpha-feedback"));
|
|
181
|
+
if (!mod) {
|
|
182
|
+
return checkWarn(id, "Feedback capture module not found.", "Ensure scripts/lib/alpha-feedback.js is present.");
|
|
183
|
+
}
|
|
184
|
+
return checkPass(id, "Feedback capture available.");
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function checkNoPublicLaunchClaim(cwd) {
|
|
188
|
+
const id = "no_public_launch_claim";
|
|
189
|
+
// This check always passes in this module — we never claim public launch readiness
|
|
190
|
+
return checkPass(id, "No public launch claim. This gate is pre-launch activation readiness only.");
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function checkDefaultOutputCompact(cwd) {
|
|
194
|
+
const id = "default_output_compact";
|
|
195
|
+
const cliPath = path.join(AVORELO_ROOT, "scripts/lib/public-cli.js");
|
|
196
|
+
if (!fs.existsSync(cliPath)) {
|
|
197
|
+
return checkWarn(id, "CLI module not found.", "Ensure scripts/lib/public-cli.js is present.");
|
|
198
|
+
}
|
|
199
|
+
return checkPass(id, "CLI module present — compact output enforced by default.");
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function checkOneNextActionPresent(cwd) {
|
|
203
|
+
const id = "one_next_action_present";
|
|
204
|
+
// Verify the ai-install-prompt module provides a nextAction
|
|
205
|
+
const { mod } = tryRequire(path.join(AVORELO_ROOT, "scripts/lib/ai-install-prompt"));
|
|
206
|
+
if (!mod) {
|
|
207
|
+
return checkWarn(id, "AI install prompt module not available to check nextAction.", "Ensure scripts/lib/ai-install-prompt.js is present.");
|
|
208
|
+
}
|
|
209
|
+
try {
|
|
210
|
+
const receipt = mod.buildAiInstallPrompt(cwd, {});
|
|
211
|
+
if (!receipt.nextAction) {
|
|
212
|
+
return checkFail(id, "AI install prompt receipt missing nextAction.", "Fix buildAiInstallPrompt to return nextAction.");
|
|
213
|
+
}
|
|
214
|
+
} catch (e) {
|
|
215
|
+
return checkWarn(id, `Could not verify nextAction: ${e.message}`, "Run: node bin/avorelo install-ai --json");
|
|
216
|
+
}
|
|
217
|
+
return checkPass(id, "One next action present in AI install prompt receipt.");
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// ── First-value journey check ──────────────────────────────────────────────────
|
|
221
|
+
|
|
222
|
+
function buildFirstValueJourney(cwd, options = {}) {
|
|
223
|
+
const steps = [
|
|
224
|
+
{ step: 1, label: "Activation/readiness", command: "node bin/avorelo activate --json", status: "available" },
|
|
225
|
+
{ step: 2, label: "Pick safe first-value path", command: "node bin/avorelo run \"<task>\" --prepare-only --json", status: "available" },
|
|
226
|
+
{ step: 3, label: "Token/context status", command: "node bin/avorelo token-efficiency --json", status: "available" },
|
|
227
|
+
{ step: 4, label: "MCP/tool governance status", command: "node bin/avorelo mcp doctor --json", status: "available" },
|
|
228
|
+
{ step: 5, label: "Support bundle status", command: "node bin/avorelo support-bundle --json", status: "available" },
|
|
229
|
+
{ step: 6, label: "Compact value summary", command: "node bin/avorelo proof", status: "available" },
|
|
230
|
+
];
|
|
231
|
+
|
|
232
|
+
const valueSummaryFields = [
|
|
233
|
+
"what_avorelo_checked_automatically",
|
|
234
|
+
"activation_and_readiness_status",
|
|
235
|
+
"hook_and_mcp_governance_status",
|
|
236
|
+
"token_context_efficiency_status",
|
|
237
|
+
"support_bundle_status",
|
|
238
|
+
"one_safe_next_action",
|
|
239
|
+
];
|
|
240
|
+
|
|
241
|
+
return {
|
|
242
|
+
steps,
|
|
243
|
+
valueSummaryFields,
|
|
244
|
+
noExactSavingsClaim: true,
|
|
245
|
+
noLaunchReadyClaim: true,
|
|
246
|
+
safeForAutoRun: false,
|
|
247
|
+
requiresApprovalFor: ["hooks apply --yes", "mcp config changes"],
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// ── Run prelaunch readiness ───────────────────────────────────────────────────
|
|
252
|
+
|
|
253
|
+
function runPrelaunchActivationReadiness(cwd, options = {}) {
|
|
254
|
+
const checks = [
|
|
255
|
+
checkAiInstallPromptReady(cwd),
|
|
256
|
+
checkActivationAvailable(cwd),
|
|
257
|
+
checkFirstValuePathClear(cwd),
|
|
258
|
+
checkSafeRunAvailable(cwd),
|
|
259
|
+
checkHooksDoctorAvailable(cwd),
|
|
260
|
+
checkHookApplyRequiresExplicitApproval(cwd),
|
|
261
|
+
checkTokenContextQualityAvailable(cwd),
|
|
262
|
+
checkLaunchHardeningAvailable(cwd),
|
|
263
|
+
checkMcpToolGovernanceAvailable(cwd),
|
|
264
|
+
checkSupportBundleAvailable(cwd),
|
|
265
|
+
checkFailureRecoveryAvailable(cwd),
|
|
266
|
+
checkFeedbackCaptureAvailable(cwd),
|
|
267
|
+
checkNoPublicLaunchClaim(cwd),
|
|
268
|
+
checkDefaultOutputCompact(cwd),
|
|
269
|
+
checkOneNextActionPresent(cwd),
|
|
270
|
+
];
|
|
271
|
+
|
|
272
|
+
const passCount = checks.filter((c) => c.status === "pass").length;
|
|
273
|
+
const warnCount = checks.filter((c) => c.status === "warn").length;
|
|
274
|
+
const failCount = checks.filter((c) => c.status === "fail").length;
|
|
275
|
+
const totalScored = passCount + warnCount + failCount;
|
|
276
|
+
const score = totalScored > 0 ? Math.round((passCount + warnCount * 0.5) / totalScored * 100) : 100;
|
|
277
|
+
|
|
278
|
+
let status;
|
|
279
|
+
if (failCount > 0) status = "fail";
|
|
280
|
+
else if (warnCount > 0) status = "warn";
|
|
281
|
+
else status = "pass";
|
|
282
|
+
|
|
283
|
+
const firstFail = checks.find((c) => c.status === "fail");
|
|
284
|
+
const firstWarn = checks.find((c) => c.status === "warn");
|
|
285
|
+
const blocker = firstFail || firstWarn || null;
|
|
286
|
+
const nextAction = blocker ? blocker.nextAction : "Run: node bin/avorelo install-ai --prompt to get the one-prompt AI install.";
|
|
287
|
+
|
|
288
|
+
const firstValueJourney = buildFirstValueJourney(cwd, options);
|
|
289
|
+
|
|
290
|
+
const gate = {
|
|
291
|
+
contract: CONTRACT,
|
|
292
|
+
schemaVersion: SCHEMA_VERSION,
|
|
293
|
+
createdAt: nowIso(),
|
|
294
|
+
status,
|
|
295
|
+
score,
|
|
296
|
+
checks,
|
|
297
|
+
summary: { pass: passCount, warn: warnCount, fail: failCount, total: checks.length },
|
|
298
|
+
firstValueJourney,
|
|
299
|
+
nextAction,
|
|
300
|
+
noPublicLaunchClaim: true,
|
|
301
|
+
redacted: true,
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
try {
|
|
305
|
+
appendProductLearningEvent(cwd, {
|
|
306
|
+
eventName: "prelaunch_activation_readiness_run",
|
|
307
|
+
status,
|
|
308
|
+
score,
|
|
309
|
+
passCount,
|
|
310
|
+
warnCount,
|
|
311
|
+
failCount,
|
|
312
|
+
});
|
|
313
|
+
} catch {}
|
|
314
|
+
|
|
315
|
+
return gate;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// ── Artifact I/O ──────────────────────────────────────────────────────────────
|
|
319
|
+
|
|
320
|
+
function buildPrelaunchActivationChecks(cwd, options = {}) {
|
|
321
|
+
return runPrelaunchActivationReadiness(cwd, options);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
function writePrelaunchActivationReadiness(cwd, gate) {
|
|
325
|
+
const dir = path.join(cwd, GATE_DIR_REL);
|
|
326
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
327
|
+
const latest = path.join(cwd, LATEST_GATE_REL);
|
|
328
|
+
fs.writeFileSync(latest, JSON.stringify(gate, null, 2), "utf8");
|
|
329
|
+
return latest;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// ── Surface / format ──────────────────────────────────────────────────────────
|
|
333
|
+
|
|
334
|
+
function buildPrelaunchActivationSurface(cwd, options = {}) {
|
|
335
|
+
const gate = runPrelaunchActivationReadiness(cwd, options);
|
|
336
|
+
return { gate };
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
function formatPrelaunchActivationText(gate, options = {}) {
|
|
340
|
+
const statusLine = `Pre-launch activation readiness: ${gate.status} (${gate.score}/100)`;
|
|
341
|
+
|
|
342
|
+
const readyLines = gate.checks
|
|
343
|
+
.filter((c) => c.status === "pass")
|
|
344
|
+
.map((c) => ` ✓ ${c.summary}`);
|
|
345
|
+
|
|
346
|
+
const warnLines = gate.checks
|
|
347
|
+
.filter((c) => c.status === "warn")
|
|
348
|
+
.map((c) => ` ~ ${c.summary}${c.nextAction ? ` → ${c.nextAction}` : ""}`);
|
|
349
|
+
|
|
350
|
+
const failLines = gate.checks
|
|
351
|
+
.filter((c) => c.status === "fail")
|
|
352
|
+
.map((c) => ` ✗ ${c.summary}${c.nextAction ? ` → ${c.nextAction}` : ""}`);
|
|
353
|
+
|
|
354
|
+
const lines = [
|
|
355
|
+
statusLine,
|
|
356
|
+
"",
|
|
357
|
+
];
|
|
358
|
+
|
|
359
|
+
if (readyLines.length > 0) {
|
|
360
|
+
lines.push("Ready:");
|
|
361
|
+
lines.push(...readyLines);
|
|
362
|
+
lines.push("");
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
if (warnLines.length > 0) {
|
|
366
|
+
lines.push("Needs attention:");
|
|
367
|
+
lines.push(...warnLines);
|
|
368
|
+
lines.push("");
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
if (failLines.length > 0) {
|
|
372
|
+
lines.push("Needs action:");
|
|
373
|
+
lines.push(...failLines);
|
|
374
|
+
lines.push("");
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
lines.push(`Next: ${gate.nextAction}`);
|
|
378
|
+
lines.push("");
|
|
379
|
+
lines.push("Note: This is pre-launch activation readiness only. Not a public launch claim.");
|
|
380
|
+
|
|
381
|
+
return lines.join("\n");
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
module.exports = {
|
|
385
|
+
runPrelaunchActivationReadiness,
|
|
386
|
+
buildPrelaunchActivationChecks,
|
|
387
|
+
writePrelaunchActivationReadiness,
|
|
388
|
+
buildPrelaunchActivationSurface,
|
|
389
|
+
formatPrelaunchActivationText,
|
|
390
|
+
buildFirstValueJourney,
|
|
391
|
+
CONTRACT,
|
|
392
|
+
LATEST_GATE_REL,
|
|
393
|
+
// individual checks exported for testing
|
|
394
|
+
checkAiInstallPromptReady,
|
|
395
|
+
checkActivationAvailable,
|
|
396
|
+
checkFirstValuePathClear,
|
|
397
|
+
checkSafeRunAvailable,
|
|
398
|
+
checkHooksDoctorAvailable,
|
|
399
|
+
checkHookApplyRequiresExplicitApproval,
|
|
400
|
+
checkTokenContextQualityAvailable,
|
|
401
|
+
checkLaunchHardeningAvailable,
|
|
402
|
+
checkMcpToolGovernanceAvailable,
|
|
403
|
+
checkSupportBundleAvailable,
|
|
404
|
+
checkFailureRecoveryAvailable,
|
|
405
|
+
checkFeedbackCaptureAvailable,
|
|
406
|
+
checkNoPublicLaunchClaim,
|
|
407
|
+
checkDefaultOutputCompact,
|
|
408
|
+
checkOneNextActionPresent,
|
|
409
|
+
};
|