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,329 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
// ── Install Journey Intelligence ──────────────────────────────────────────────
|
|
4
|
-
//
|
|
5
|
-
// Contract: avorelo.installJourneyIntelligence.v1
|
|
6
|
-
//
|
|
7
|
-
// Computes the install/activation funnel from existing artifacts.
|
|
8
|
-
// Missing optional steps → warn. Missing core steps → warn with recovery.
|
|
9
|
-
// No public launch claim.
|
|
10
|
-
|
|
11
|
-
const fs = require("fs");
|
|
12
|
-
const path = require("path");
|
|
13
|
-
const { nowIso } = require("./fsx");
|
|
14
|
-
const { appendProductLearningEvent } = require("./product-learning-events");
|
|
15
|
-
|
|
16
|
-
const CONTRACT = "avorelo.installJourneyIntelligence.v1";
|
|
17
|
-
const SCHEMA_VERSION = 1;
|
|
18
|
-
const INTELLIGENCE_DIR_REL = ".claude/cco/orchestration/prelaunch-intelligence";
|
|
19
|
-
const ARTIFACT_REL = `${INTELLIGENCE_DIR_REL}/latest-install-journey.json`;
|
|
20
|
-
|
|
21
|
-
const FUNNEL_STEPS = [
|
|
22
|
-
{
|
|
23
|
-
id: "install_prompt_generated",
|
|
24
|
-
label: "Install prompt generated",
|
|
25
|
-
artifactRel: ".claude/cco/orchestration/ai-install/latest-prompt.json",
|
|
26
|
-
required: true,
|
|
27
|
-
recoveryAction: "Run: node bin/avorelo install-ai --json",
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
id: "activation_checked",
|
|
31
|
-
label: "Activation checked",
|
|
32
|
-
artifactRel: ".claude/cco/orchestration/activation/latest-activation.json",
|
|
33
|
-
required: false,
|
|
34
|
-
recoveryAction: "Run: node bin/avorelo activate --json",
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
id: "first_value_checked",
|
|
38
|
-
label: "First value checked",
|
|
39
|
-
artifactRel: ".claude/cco/orchestration/prelaunch-readiness/latest-activation-readiness.json",
|
|
40
|
-
required: true,
|
|
41
|
-
recoveryAction: "Run: node bin/avorelo first-value-check --json",
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
id: "hook_status_known",
|
|
45
|
-
label: "Hook status known",
|
|
46
|
-
artifactRel: ".claude/cco/orchestration/hook-apply/latest-doctor.json",
|
|
47
|
-
required: false,
|
|
48
|
-
recoveryAction: "Run: node bin/avorelo hooks doctor --json",
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
id: "token_context_checked",
|
|
52
|
-
label: "Token/context checked",
|
|
53
|
-
artifactRel: ".claude/cco/orchestration/token-efficiency/latest-evidence.json",
|
|
54
|
-
required: false,
|
|
55
|
-
recoveryAction: "Run: node bin/avorelo token-efficiency --json",
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
id: "mcp_governance_checked",
|
|
59
|
-
label: "MCP governance checked",
|
|
60
|
-
artifactRel: ".claude/cco/orchestration/mcp-tool-governance/latest-inventory.json",
|
|
61
|
-
required: false,
|
|
62
|
-
recoveryAction: "Run: node bin/avorelo mcp doctor --json",
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
id: "launch_hardening_checked",
|
|
66
|
-
label: "Launch hardening checked",
|
|
67
|
-
artifactRel: ".claude/cco/orchestration/launch-hardening/latest-gate.json",
|
|
68
|
-
required: false,
|
|
69
|
-
recoveryAction: "Run: node bin/avorelo launch-hardening --json",
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
id: "support_bundle_available",
|
|
73
|
-
label: "Support bundle available",
|
|
74
|
-
artifactRel: ".claude/cco/support/latest-support-bundle.json",
|
|
75
|
-
required: false,
|
|
76
|
-
recoveryAction: "Run: node bin/avorelo support-bundle --json",
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
id: "proof_or_outcome_available",
|
|
80
|
-
label: "Proof or outcome available",
|
|
81
|
-
artifactRel: ".claude/cco/orchestration/seamless-outcome/latest-value-summary.json",
|
|
82
|
-
required: false,
|
|
83
|
-
recoveryAction: "Run: node bin/avorelo proof after completing a task.",
|
|
84
|
-
},
|
|
85
|
-
];
|
|
86
|
-
|
|
87
|
-
// Manual steps that Avorelo automates
|
|
88
|
-
const MANUAL_STEPS_AVOIDED = [
|
|
89
|
-
{
|
|
90
|
-
id: "manual_install_prompt_research",
|
|
91
|
-
label: "Manual AI install prompt research",
|
|
92
|
-
avoidedBy: "install_prompt_generated",
|
|
93
|
-
evidenceBacked: true,
|
|
94
|
-
},
|
|
95
|
-
{
|
|
96
|
-
id: "manual_hook_config_review",
|
|
97
|
-
label: "Manual hook configuration review",
|
|
98
|
-
avoidedBy: "hook_status_known",
|
|
99
|
-
evidenceBacked: true,
|
|
100
|
-
},
|
|
101
|
-
{
|
|
102
|
-
id: "manual_mcp_risk_review",
|
|
103
|
-
label: "Manual MCP/tool risk review",
|
|
104
|
-
avoidedBy: "mcp_governance_checked",
|
|
105
|
-
evidenceBacked: true,
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
id: "manual_token_cost_estimation",
|
|
109
|
-
label: "Manual token/cost estimation",
|
|
110
|
-
avoidedBy: "token_context_checked",
|
|
111
|
-
evidenceBacked: true,
|
|
112
|
-
},
|
|
113
|
-
];
|
|
114
|
-
|
|
115
|
-
function safeReadJson(absPath) {
|
|
116
|
-
try {
|
|
117
|
-
if (!fs.existsSync(absPath)) return null;
|
|
118
|
-
return JSON.parse(fs.readFileSync(absPath, "utf8").replace(/^/, ""));
|
|
119
|
-
} catch {
|
|
120
|
-
return null;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
function collectInstallJourneySignals(cwd, options = {}) {
|
|
125
|
-
const stepStatuses = {};
|
|
126
|
-
for (const step of FUNNEL_STEPS) {
|
|
127
|
-
const absPath = path.join(cwd, step.artifactRel);
|
|
128
|
-
const artifact = safeReadJson(absPath);
|
|
129
|
-
stepStatuses[step.id] = {
|
|
130
|
-
present: artifact !== null,
|
|
131
|
-
artifactStatus: artifact?.status || null,
|
|
132
|
-
artifactPath: step.artifactRel,
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
return stepStatuses;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
function buildInstallJourneyFunnel(cwd, options = {}) {
|
|
139
|
-
const signals = collectInstallJourneySignals(cwd, options);
|
|
140
|
-
|
|
141
|
-
const funnel = FUNNEL_STEPS.map((step) => {
|
|
142
|
-
const signal = signals[step.id];
|
|
143
|
-
let status;
|
|
144
|
-
if (!signal.present) {
|
|
145
|
-
status = step.required ? "missing_required" : "missing_optional";
|
|
146
|
-
} else if (signal.artifactStatus === "fail") {
|
|
147
|
-
status = "fail";
|
|
148
|
-
} else if (signal.artifactStatus === "warn") {
|
|
149
|
-
status = "warn";
|
|
150
|
-
} else {
|
|
151
|
-
status = "ready";
|
|
152
|
-
}
|
|
153
|
-
return {
|
|
154
|
-
id: step.id,
|
|
155
|
-
label: step.label,
|
|
156
|
-
status,
|
|
157
|
-
required: step.required,
|
|
158
|
-
artifactPath: step.artifactRel,
|
|
159
|
-
recoveryAction: (status === "ready" || status === "warn") ? null : step.recoveryAction,
|
|
160
|
-
};
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
// Drop-offs: steps that are missing or failed
|
|
164
|
-
const dropOffs = funnel.filter((s) => s.status === "missing_required" || s.status === "fail");
|
|
165
|
-
const optionalMissing = funnel.filter((s) => s.status === "missing_optional");
|
|
166
|
-
|
|
167
|
-
// Blockers: required steps missing/failed
|
|
168
|
-
const blockers = dropOffs.map((s) => ({
|
|
169
|
-
step: s.id,
|
|
170
|
-
label: s.label,
|
|
171
|
-
status: s.status,
|
|
172
|
-
recoveryAction: s.recoveryAction,
|
|
173
|
-
}));
|
|
174
|
-
|
|
175
|
-
// Warnings: optional steps missing
|
|
176
|
-
const warnings = optionalMissing.map((s) => ({
|
|
177
|
-
step: s.id,
|
|
178
|
-
label: s.label,
|
|
179
|
-
status: s.status,
|
|
180
|
-
recoveryAction: s.recoveryAction,
|
|
181
|
-
}));
|
|
182
|
-
|
|
183
|
-
// Manual steps avoided
|
|
184
|
-
const manualStepsAvoided = MANUAL_STEPS_AVOIDED.filter((m) => {
|
|
185
|
-
const avoidedSignal = signals[m.avoidedBy];
|
|
186
|
-
return avoidedSignal && avoidedSignal.present;
|
|
187
|
-
}).map((m) => ({
|
|
188
|
-
id: m.id,
|
|
189
|
-
label: m.label,
|
|
190
|
-
evidenceBacked: m.evidenceBacked,
|
|
191
|
-
evidenceRef: signals[m.avoidedBy]?.artifactPath || null,
|
|
192
|
-
}));
|
|
193
|
-
|
|
194
|
-
// Overall status
|
|
195
|
-
let journeyStatus;
|
|
196
|
-
if (blockers.length > 0) {
|
|
197
|
-
journeyStatus = "warn"; // not fail — missing optional steps don't block the journey
|
|
198
|
-
} else if (warnings.length > 3) {
|
|
199
|
-
journeyStatus = "warn";
|
|
200
|
-
} else {
|
|
201
|
-
journeyStatus = "ready";
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// Next action
|
|
205
|
-
let nextAction;
|
|
206
|
-
if (blockers.length > 0) {
|
|
207
|
-
nextAction = blockers[0].recoveryAction;
|
|
208
|
-
} else if (warnings.length > 0) {
|
|
209
|
-
nextAction = warnings[0].recoveryAction || `Run: node bin/avorelo activate --json`;
|
|
210
|
-
} else {
|
|
211
|
-
nextAction = "Run node bin/avorelo proof to document value.";
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
return {
|
|
215
|
-
funnel,
|
|
216
|
-
dropOffs,
|
|
217
|
-
blockers,
|
|
218
|
-
warnings,
|
|
219
|
-
manualStepsAvoided,
|
|
220
|
-
journeyStatus,
|
|
221
|
-
nextAction,
|
|
222
|
-
stepsComplete: funnel.filter((s) => s.status === "ready" || s.status === "warn").length,
|
|
223
|
-
stepsTotal: funnel.length,
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
function buildInstallJourneyIntelligence(cwd, options = {}) {
|
|
228
|
-
const funnelData = buildInstallJourneyFunnel(cwd, options);
|
|
229
|
-
|
|
230
|
-
return {
|
|
231
|
-
contract: CONTRACT,
|
|
232
|
-
schemaVersion: SCHEMA_VERSION,
|
|
233
|
-
createdAt: nowIso(),
|
|
234
|
-
status: funnelData.journeyStatus,
|
|
235
|
-
funnel: funnelData.funnel,
|
|
236
|
-
dropOffs: funnelData.dropOffs,
|
|
237
|
-
blockers: funnelData.blockers,
|
|
238
|
-
warnings: funnelData.warnings,
|
|
239
|
-
manualStepsAvoided: funnelData.manualStepsAvoided,
|
|
240
|
-
stepsComplete: funnelData.stepsComplete,
|
|
241
|
-
stepsTotal: funnelData.stepsTotal,
|
|
242
|
-
nextAction: funnelData.nextAction,
|
|
243
|
-
noPublicLaunchClaim: true,
|
|
244
|
-
redacted: true,
|
|
245
|
-
};
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
function writeInstallJourneyIntelligence(cwd, intelligence) {
|
|
249
|
-
const dirAbs = path.join(cwd, INTELLIGENCE_DIR_REL);
|
|
250
|
-
fs.mkdirSync(dirAbs, { recursive: true });
|
|
251
|
-
const absPath = path.join(cwd, ARTIFACT_REL);
|
|
252
|
-
fs.writeFileSync(absPath, JSON.stringify(intelligence, null, 2), "utf8");
|
|
253
|
-
return absPath;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
function buildInstallJourneySurface(cwd, options = {}) {
|
|
257
|
-
const absPath = path.join(cwd, ARTIFACT_REL);
|
|
258
|
-
const existing = safeReadJson(absPath);
|
|
259
|
-
if (existing) {
|
|
260
|
-
return {
|
|
261
|
-
status: existing.status,
|
|
262
|
-
stepsComplete: existing.stepsComplete,
|
|
263
|
-
stepsTotal: existing.stepsTotal,
|
|
264
|
-
blockers: existing.blockers?.length || 0,
|
|
265
|
-
manualStepsAvoided: existing.manualStepsAvoided?.length || 0,
|
|
266
|
-
artifactPath: ARTIFACT_REL,
|
|
267
|
-
};
|
|
268
|
-
}
|
|
269
|
-
const intel = buildInstallJourneyIntelligence(cwd, options);
|
|
270
|
-
writeInstallJourneyIntelligence(cwd, intel);
|
|
271
|
-
return {
|
|
272
|
-
status: intel.status,
|
|
273
|
-
stepsComplete: intel.stepsComplete,
|
|
274
|
-
stepsTotal: intel.stepsTotal,
|
|
275
|
-
blockers: intel.blockers?.length || 0,
|
|
276
|
-
manualStepsAvoided: intel.manualStepsAvoided?.length || 0,
|
|
277
|
-
artifactPath: ARTIFACT_REL,
|
|
278
|
-
};
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
function formatInstallJourneyText(intelligence, options = {}) {
|
|
282
|
-
const debug = options.debug === true;
|
|
283
|
-
const lines = [];
|
|
284
|
-
|
|
285
|
-
lines.push(`Install journey: ${intelligence.status}`);
|
|
286
|
-
lines.push(` Steps: ${intelligence.stepsComplete}/${intelligence.stepsTotal} ready`);
|
|
287
|
-
lines.push(` Manual steps avoided: ${intelligence.manualStepsAvoided?.length || 0}`);
|
|
288
|
-
|
|
289
|
-
if (intelligence.blockers?.length > 0) {
|
|
290
|
-
lines.push(` Blockers: ${intelligence.blockers.length}`);
|
|
291
|
-
if (debug) {
|
|
292
|
-
for (const b of intelligence.blockers) {
|
|
293
|
-
lines.push(` - ${b.label} [${b.status}]`);
|
|
294
|
-
if (b.recoveryAction) lines.push(` Recovery: ${b.recoveryAction}`);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
if (intelligence.warnings?.length > 0) {
|
|
300
|
-
lines.push(` Warnings: ${intelligence.warnings.length}`);
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
lines.push(` Next: ${intelligence.nextAction}`);
|
|
304
|
-
|
|
305
|
-
if (debug && intelligence.funnel) {
|
|
306
|
-
lines.push("");
|
|
307
|
-
lines.push("Funnel:");
|
|
308
|
-
for (const step of intelligence.funnel) {
|
|
309
|
-
const icon = step.status === "ready" ? "+" : step.status === "warn" ? "~" : "-";
|
|
310
|
-
lines.push(` ${icon} [${step.status}] ${step.label}`);
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
return lines.join("\n");
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
module.exports = {
|
|
318
|
-
CONTRACT,
|
|
319
|
-
SCHEMA_VERSION,
|
|
320
|
-
ARTIFACT_REL,
|
|
321
|
-
FUNNEL_STEPS,
|
|
322
|
-
MANUAL_STEPS_AVOIDED,
|
|
323
|
-
collectInstallJourneySignals,
|
|
324
|
-
buildInstallJourneyFunnel,
|
|
325
|
-
buildInstallJourneyIntelligence,
|
|
326
|
-
writeInstallJourneyIntelligence,
|
|
327
|
-
buildInstallJourneySurface,
|
|
328
|
-
formatInstallJourneyText,
|
|
329
|
-
};
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const { nowIso, safeReadJson, safeWriteJson } = require("./fsx");
|
|
4
|
-
|
|
5
|
-
const LATEST_INTERVENTION_PATH = ".claude/cco/state/latest-intervention.json";
|
|
6
|
-
|
|
7
|
-
function ensureSentence(text, fallback) {
|
|
8
|
-
const value = String(text || "").trim();
|
|
9
|
-
const out = value || fallback;
|
|
10
|
-
return /[.!?]$/.test(out) ? out : `${out}.`;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
function normalizePath(value) {
|
|
14
|
-
if (value === null || value === undefined || value === "") return null;
|
|
15
|
-
return String(value);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
function buildInterventionSnapshot(input = {}) {
|
|
19
|
-
return {
|
|
20
|
-
interventionVersion: 1,
|
|
21
|
-
createdAt: nowIso(),
|
|
22
|
-
sessionId: String(input.sessionId || "unknown"),
|
|
23
|
-
eventName: String(input.eventName || "unknown"),
|
|
24
|
-
kind: String(input.kind || "intervention"),
|
|
25
|
-
whatHappened: ensureSentence(input.whatHappened, "Wuz paused the current step."),
|
|
26
|
-
nextAction: ensureSentence(input.nextAction, "Continue with the smallest safe next step."),
|
|
27
|
-
preservedState: ensureSentence(input.preservedState, "Current repo state was preserved."),
|
|
28
|
-
artifactPath: normalizePath(input.artifactPath),
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
function writeLatestIntervention(cwd, input) {
|
|
33
|
-
const snapshot = buildInterventionSnapshot(input);
|
|
34
|
-
safeWriteJson(cwd, LATEST_INTERVENTION_PATH, snapshot);
|
|
35
|
-
return { snapshot, path: LATEST_INTERVENTION_PATH };
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function loadLatestIntervention(cwd) {
|
|
39
|
-
return safeReadJson(cwd, LATEST_INTERVENTION_PATH, null);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function formatInterventionMessage(input = {}) {
|
|
43
|
-
const snapshot = buildInterventionSnapshot(input);
|
|
44
|
-
const parts = [snapshot.whatHappened, `Next: ${snapshot.nextAction}`, `Preserved: ${snapshot.preservedState}`];
|
|
45
|
-
if (snapshot.artifactPath) {
|
|
46
|
-
parts.push(`Artifact: ${snapshot.artifactPath}.`);
|
|
47
|
-
}
|
|
48
|
-
return parts.join(" ");
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
module.exports = {
|
|
52
|
-
LATEST_INTERVENTION_PATH,
|
|
53
|
-
buildInterventionSnapshot,
|
|
54
|
-
writeLatestIntervention,
|
|
55
|
-
loadLatestIntervention,
|
|
56
|
-
formatInterventionMessage,
|
|
57
|
-
};
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
// ── Known Limitations Register ────────────────────────────────────────────────
|
|
4
|
-
// Contract: avorelo.knownLimitations.v1
|
|
5
|
-
// Documents known limitations of Avorelo for external pre-launch use.
|
|
6
|
-
// Blocker limitations block candidate_ready. Accepted limitations allow warn.
|
|
7
|
-
|
|
8
|
-
const fs = require("fs");
|
|
9
|
-
const path = require("path");
|
|
10
|
-
const { nowIso } = require("./fsx");
|
|
11
|
-
const { appendProductLearningEvent } = require("./product-learning-events");
|
|
12
|
-
|
|
13
|
-
const CONTRACT = "avorelo.knownLimitations.v1";
|
|
14
|
-
const SCHEMA_VERSION = 1;
|
|
15
|
-
const LIMITATIONS_DIR_REL = ".claude/cco/orchestration/full-readiness";
|
|
16
|
-
const ARTIFACT_REL = LIMITATIONS_DIR_REL + "/latest-known-limitations.json";
|
|
17
|
-
|
|
18
|
-
var LIMITATION_CATEGORIES = Object.freeze(["install_distribution", "exact_cost_unavailable", "feedback_insufficient", "browser_proof_missing", "plugin_adapter_pending", "mcp_config_preview_only", "hook_apply_requires_approval", "token_estimate_approximate", "support_scope_local_only", "external_project_coverage_unknown", "unknown"]);
|
|
19
|
-
|
|
20
|
-
function safeReadJson(absPath) {
|
|
21
|
-
try {
|
|
22
|
-
if (!fs.existsSync(absPath)) return null;
|
|
23
|
-
return JSON.parse(fs.readFileSync(absPath, "utf8").replace(/^/, ""));
|
|
24
|
-
} catch { return null; }
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function getBaselineLimitations() {
|
|
28
|
-
return [
|
|
29
|
-
{ id: "exact_cost_unavailable", category: "exact_cost_unavailable", severity: "info", userImpact: "Token/cost savings shown as estimates only unless real usage evidence is imported.", releaseImpact: "Acceptable for pre-launch. Cannot make exact ROI claims in any launch material.", mitigation: "Import real token/cost usage samples or keep all cost outputs caveated with noExactSavingsClaim=true.", owner: "avorelo", status: "accepted", evidenceRefs: [".claude/cco/orchestration/prelaunch-intelligence/latest-token-cost-intelligence.json"], redacted: true },
|
|
30
|
-
{ id: "feedback_insufficient", category: "feedback_insufficient", severity: "warn", userImpact: "Feedback intelligence stays insufficient until qualified redacted feedback evidence exists.", releaseImpact: "Cannot cluster friction patterns confidently without real local feedback evidence.", mitigation: "Add dogfood feedback via `avorelo feedback add` or import structured redacted feedback evidence.", owner: "avorelo", status: "accepted", evidenceRefs: [".claude/cco/orchestration/prelaunch-intelligence/latest-feedback-intelligence.json"], redacted: true },
|
|
31
|
-
{ id: "install_distribution", category: "install_distribution", severity: "warn", userImpact: "Avorelo is not yet distributed via npm or a public install mechanism.", releaseImpact: "External users need direct repo access until a distribution-readiness slice is completed.", mitigation: "One-prompt AI install works for repo-local use. Distribution remains a separate readiness layer.", owner: "avorelo", status: "accepted", evidenceRefs: [".claude/cco/orchestration/ai-install/latest-prompt.json"], redacted: true },
|
|
32
|
-
{ id: "browser_proof_missing", category: "browser_proof_missing", severity: "info", userImpact: "No visual/browser proof of UI flows. Proof is CLI-output and artifact based.", releaseImpact: "Cannot demonstrate UI flows visually. Browser Proof is a separate future PR.", mitigation: "CLI outputs are compact and verifiable. Browser proof deferred intentionally.", owner: "avorelo", status: "accepted", evidenceRefs: [], redacted: true },
|
|
33
|
-
{ id: "plugin_adapter_pending", category: "plugin_adapter_pending", severity: "info", userImpact: "Plugin/adapter marketplace not implemented. Only core CLI surface is available.", releaseImpact: "Users limited to built-in capabilities. Adapter readiness is a separate future PR.", mitigation: "Core capabilities cover the primary use case. Adapters are additive.", owner: "avorelo", status: "accepted", evidenceRefs: [], redacted: true },
|
|
34
|
-
{ id: "mcp_config_preview_only", category: "mcp_config_preview_only", severity: "warn", userImpact: "MCP governance is preview-only — it inventories and risk-scores but does not auto-patch config.", releaseImpact: "Users must manually apply MCP config changes. No auto-patching without approval.", mitigation: "This is by design — MCP config changes require explicit user approval.", owner: "avorelo", status: "accepted", evidenceRefs: [".claude/cco/orchestration/mcp-tool-governance/latest-policy.json"], redacted: true },
|
|
35
|
-
{ id: "hook_apply_requires_approval", category: "hook_apply_requires_approval", severity: "info", userImpact: "Hooks are not auto-applied. Users must run `avorelo hooks apply --yes` to install.", releaseImpact: "First-run users may not have hooks active until they explicitly approve.", mitigation: "AI install prompt includes hook setup step. Approval boundary is a safety feature.", owner: "avorelo", status: "accepted", evidenceRefs: [".claude/cco/orchestration/ai-install/latest-prompt.json"], redacted: true },
|
|
36
|
-
{ id: "token_estimate_approximate", category: "token_estimate_approximate", severity: "info", userImpact: "Token savings are estimated from receipt data, not verified against provider billing.", releaseImpact: "Cannot make exact token savings claims in any launch material.", mitigation: "All token outputs include noExactSavingsClaim=true and caveats.", owner: "avorelo", status: "accepted", evidenceRefs: [".claude/cco/orchestration/token-efficiency/latest-evidence.json"], redacted: true },
|
|
37
|
-
{ id: "support_scope_local_only", category: "support_scope_local_only", severity: "info", userImpact: "Support bundle is local-only and redacted. No cloud support backend.", releaseImpact: "Support requires user to share bundle manually. No auto-submit to support system.", mitigation: "Bundle is redacted and safe to share. Manual sharing is explicit and controlled.", owner: "avorelo", status: "accepted", evidenceRefs: [".claude/cco/support/latest-support-bundle.json"], redacted: true },
|
|
38
|
-
{ id: "external_project_coverage_unknown", category: "external_project_coverage_unknown", severity: "warn", userImpact: "Avorelo has been tested primarily on itself. Coverage on external projects is unknown.", releaseImpact: "External pre-launch users may encounter edge cases not covered by internal dogfood.", mitigation: "External user simulation covers common scenarios. Alpha users provide real coverage data.", owner: "avorelo", status: "accepted", evidenceRefs: [], redacted: true },
|
|
39
|
-
];
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function classifyLimitation(limitation, options) {
|
|
43
|
-
options = options || {};
|
|
44
|
-
if (limitation.severity === "blocker") return "blocks_candidate_ready";
|
|
45
|
-
if (limitation.severity === "warn") return "allows_candidate_warn";
|
|
46
|
-
return "info_only";
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function buildKnownLimitations(cwd, signals, options) {
|
|
50
|
-
options = options || {};
|
|
51
|
-
var limitations = getBaselineLimitations();
|
|
52
|
-
|
|
53
|
-
var tci = signals && signals.tokenCostIntelligence;
|
|
54
|
-
if (tci && (tci.evidenceLevel === "not_available" || tci.status === "not_available")) {
|
|
55
|
-
var ec = limitations.find(function(l) { return l.id === "exact_cost_unavailable"; });
|
|
56
|
-
if (ec) ec.severity = "warn";
|
|
57
|
-
}
|
|
58
|
-
if (tci && (tci.realUsageSamplesCount || 0) > 0) {
|
|
59
|
-
var ec2 = limitations.find(function(l) { return l.id === "exact_cost_unavailable"; });
|
|
60
|
-
if (ec2) ec2.severity = "info";
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
var fi = signals && signals.feedbackIntelligence;
|
|
64
|
-
if (fi && (fi.qualifiedFeedbackItemsCount || 0) > 0) {
|
|
65
|
-
var fb = limitations.find(function(l) { return l.id === "feedback_insufficient"; });
|
|
66
|
-
if (fb) {
|
|
67
|
-
fb.severity = "info";
|
|
68
|
-
fb.status = "mitigated";
|
|
69
|
-
fb.releaseImpact = "Feedback evidence exists locally, but broader external coverage may still be limited.";
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
var classified = limitations.map(function(l) { return Object.assign({}, l, { classification: classifyLimitation(l) }); });
|
|
74
|
-
var blockerLimitations = classified.filter(function(l) { return l.severity === "blocker" && l.status !== "accepted"; });
|
|
75
|
-
var warnLimitations = classified.filter(function(l) { return l.severity === "warn"; });
|
|
76
|
-
var infoLimitations = classified.filter(function(l) { return l.severity === "info"; });
|
|
77
|
-
var overallImpact = blockerLimitations.length > 0 ? "blocks_candidate_ready" : warnLimitations.length > 0 ? "allows_candidate_warn" : "info_only";
|
|
78
|
-
|
|
79
|
-
var result = { contract: CONTRACT, schemaVersion: SCHEMA_VERSION, createdAt: nowIso(), totalLimitations: classified.length, blockerLimitationsCount: blockerLimitations.length, warnLimitationsCount: warnLimitations.length, infoLimitationsCount: infoLimitations.length, overallImpact: overallImpact, limitations: classified, redacted: true };
|
|
80
|
-
try { appendProductLearningEvent(cwd, { eventName: "known_limitations_built", category: "full_readiness", totalLimitations: classified.length, blockerCount: blockerLimitations.length, warnCount: warnLimitations.length }); } catch (e) {}
|
|
81
|
-
return result;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
function writeKnownLimitations(cwd, limitations) {
|
|
85
|
-
var dir = path.join(cwd, LIMITATIONS_DIR_REL);
|
|
86
|
-
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
|
|
87
|
-
fs.writeFileSync(path.join(cwd, ARTIFACT_REL), JSON.stringify(limitations, null, 2));
|
|
88
|
-
return limitations;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
function buildKnownLimitationsSurface(cwd, options) {
|
|
92
|
-
options = options || {};
|
|
93
|
-
var limitations = safeReadJson(path.join(cwd, ARTIFACT_REL));
|
|
94
|
-
if (!limitations) return { status: "not_available", totalLimitations: 0 };
|
|
95
|
-
return { totalLimitations: limitations.totalLimitations, blockerLimitationsCount: limitations.blockerLimitationsCount, warnLimitationsCount: limitations.warnLimitationsCount, overallImpact: limitations.overallImpact, limitations: limitations.limitations };
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
function formatKnownLimitationsText(limitations, options) {
|
|
99
|
-
options = options || {};
|
|
100
|
-
var lines = [];
|
|
101
|
-
lines.push("Known limitations: " + limitations.totalLimitations);
|
|
102
|
-
lines.push("Impact: " + limitations.overallImpact);
|
|
103
|
-
if (limitations.blockerLimitationsCount > 0) lines.push("Blockers: " + limitations.blockerLimitationsCount);
|
|
104
|
-
lines.push("");
|
|
105
|
-
limitations.limitations.forEach(function(l) {
|
|
106
|
-
lines.push("[" + l.severity + "] " + l.id);
|
|
107
|
-
lines.push(" Impact: " + l.userImpact);
|
|
108
|
-
lines.push(" Mitigation: " + l.mitigation);
|
|
109
|
-
lines.push(" Status: " + l.status);
|
|
110
|
-
lines.push("");
|
|
111
|
-
});
|
|
112
|
-
return lines.join("\n");
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
module.exports = { CONTRACT, SCHEMA_VERSION, ARTIFACT_REL, LIMITATION_CATEGORIES, buildKnownLimitations, classifyLimitation, writeKnownLimitations, buildKnownLimitationsSurface, formatKnownLimitationsText };
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
|
|
4
|
-
import { readJson } from '../ws-aif-utils.js';
|
|
5
|
-
|
|
6
|
-
export function normalizeRef(inputPath) {
|
|
7
|
-
return inputPath.split(path.sep).join('/');
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export function readJsonOrNull(filePath) {
|
|
11
|
-
if (!filePath) return null;
|
|
12
|
-
return fs.existsSync(filePath) ? readJson(filePath) : null;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function findRepoRoot(startCwd) {
|
|
16
|
-
let cursor = path.resolve(startCwd);
|
|
17
|
-
while (true) {
|
|
18
|
-
const required = ['artifacts', 'scripts', 'tests'];
|
|
19
|
-
if (required.every((name) => fs.existsSync(path.join(cursor, name)))) return cursor;
|
|
20
|
-
const parent = path.dirname(cursor);
|
|
21
|
-
if (parent === cursor) return null;
|
|
22
|
-
cursor = parent;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function resolveRepoRoot(options = {}) {
|
|
27
|
-
if (options.repoRoot) return path.resolve(options.repoRoot);
|
|
28
|
-
const currentCwd = path.resolve(options.currentCwd || process.cwd());
|
|
29
|
-
return findRepoRoot(currentCwd);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
function resolveArtifactRoot(baseRoot, overridePath, relativePath) {
|
|
33
|
-
if (!overridePath) return baseRoot ? path.join(baseRoot, relativePath) : null;
|
|
34
|
-
return path.isAbsolute(overridePath) ? overridePath : path.resolve(baseRoot || process.cwd(), overridePath);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function resolveOptionalFilePath(baseRoot, currentCwd, overridePath, defaultPath) {
|
|
38
|
-
if (overridePath) {
|
|
39
|
-
return path.isAbsolute(overridePath)
|
|
40
|
-
? overridePath
|
|
41
|
-
: path.resolve(baseRoot || currentCwd, overridePath);
|
|
42
|
-
}
|
|
43
|
-
return defaultPath || null;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export function latestRunIdFromRoots(l4gRoot, l5bRoot) {
|
|
47
|
-
if (!l4gRoot || !l5bRoot) return null;
|
|
48
|
-
|
|
49
|
-
const repeatedUseProof = readJsonOrNull(path.join(l5bRoot, 'repeated-use-proof.v1.json'));
|
|
50
|
-
if (typeof repeatedUseProof?.latest_run_id === 'string' && repeatedUseProof.latest_run_id) {
|
|
51
|
-
return repeatedUseProof.latest_run_id;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const runtimeSurfaceState = readJsonOrNull(path.join(l5bRoot, 'runtime-surface-state.v1.json'));
|
|
55
|
-
if (typeof runtimeSurfaceState?.last_run_id === 'string' && runtimeSurfaceState.last_run_id) {
|
|
56
|
-
return runtimeSurfaceState.last_run_id;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const ledger = readJsonOrNull(path.join(l4gRoot, 'founder-dogfood-ledger.v1.json'));
|
|
60
|
-
if (typeof ledger?.last_updated_run === 'string' && ledger.last_updated_run) {
|
|
61
|
-
return ledger.last_updated_run;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const runsRoot = path.join(l4gRoot, 'runs');
|
|
65
|
-
if (!fs.existsSync(runsRoot)) return null;
|
|
66
|
-
|
|
67
|
-
const latest = fs.readdirSync(runsRoot, { withFileTypes: true })
|
|
68
|
-
.filter((entry) => entry.isDirectory())
|
|
69
|
-
.map((entry) => {
|
|
70
|
-
const fullPath = path.join(runsRoot, entry.name);
|
|
71
|
-
return {
|
|
72
|
-
fullPath,
|
|
73
|
-
name: entry.name,
|
|
74
|
-
mtimeMs: fs.statSync(fullPath).mtimeMs,
|
|
75
|
-
};
|
|
76
|
-
})
|
|
77
|
-
.sort((left, right) => right.mtimeMs - left.mtimeMs)[0];
|
|
78
|
-
|
|
79
|
-
return latest?.name || null;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
export function buildRunArtifactPaths(l4gRoot, runId) {
|
|
83
|
-
const runDir = l4gRoot && runId ? path.join(l4gRoot, 'runs', runId) : null;
|
|
84
|
-
|
|
85
|
-
return {
|
|
86
|
-
runDir,
|
|
87
|
-
runSummary: runDir ? path.join(runDir, 'run-summary.v1.json') : null,
|
|
88
|
-
runtimeLivePacket: runDir ? path.join(runDir, 'runtime-live-packet.v1.json') : null,
|
|
89
|
-
inWorkflowInteraction: runDir ? path.join(runDir, 'in-workflow-interaction.v1.json') : null,
|
|
90
|
-
heroLoopOutput: runDir ? path.join(runDir, 'hero-loop-output.v1.json') : null,
|
|
91
|
-
explainability: runDir ? path.join(runDir, 'customer-explainability.v1.json') : null,
|
|
92
|
-
valuePack: runDir ? path.join(runDir, 'user-visible-value-pack.v1.json') : null,
|
|
93
|
-
handoff: runDir ? path.join(runDir, 'handoff-outcome.v1.json') : null,
|
|
94
|
-
readiness: runDir ? path.join(runDir, 'readiness.v1.json') : null,
|
|
95
|
-
repeatedUseProof: runDir ? path.join(runDir, 'repeated-use-proof.v1.json') : null,
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
export function relativeRefIfExists(repoRoot, currentCwd, targetPath) {
|
|
100
|
-
if (!targetPath || !fs.existsSync(targetPath)) return null;
|
|
101
|
-
return normalizeRef(path.relative(repoRoot || currentCwd, targetPath));
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
export function resolveL8Context(options = {}) {
|
|
105
|
-
const currentCwd = path.resolve(options.currentCwd || process.cwd());
|
|
106
|
-
const repoRoot = resolveRepoRoot(options);
|
|
107
|
-
const repoRootFound = Boolean(repoRoot && fs.existsSync(repoRoot));
|
|
108
|
-
const resolutionBase = repoRoot || currentCwd;
|
|
109
|
-
|
|
110
|
-
const l4gRoot = resolveArtifactRoot(
|
|
111
|
-
resolutionBase,
|
|
112
|
-
options.l4gRoot,
|
|
113
|
-
path.join('artifacts', 'ws-aif', 'l4g-session'),
|
|
114
|
-
);
|
|
115
|
-
const l5bRoot = resolveArtifactRoot(
|
|
116
|
-
resolutionBase,
|
|
117
|
-
options.l5bRoot,
|
|
118
|
-
path.join('artifacts', 'ws-aif', 'l5b'),
|
|
119
|
-
);
|
|
120
|
-
const l8Root = resolveArtifactRoot(
|
|
121
|
-
resolutionBase,
|
|
122
|
-
options.l8Root,
|
|
123
|
-
path.join('artifacts', 'ws-aif', 'l8'),
|
|
124
|
-
);
|
|
125
|
-
|
|
126
|
-
const reconciliationPath = resolveOptionalFilePath(
|
|
127
|
-
resolutionBase,
|
|
128
|
-
currentCwd,
|
|
129
|
-
options.reconciliationPath,
|
|
130
|
-
l4gRoot ? path.join(l4gRoot, 'repo-reconciliation.v1.json') : null,
|
|
131
|
-
);
|
|
132
|
-
const latestRunId = options.runId || latestRunIdFromRoots(l4gRoot, l5bRoot);
|
|
133
|
-
const runPaths = buildRunArtifactPaths(l4gRoot, latestRunId);
|
|
134
|
-
|
|
135
|
-
return {
|
|
136
|
-
currentCwd,
|
|
137
|
-
repoRoot,
|
|
138
|
-
repoRootFound,
|
|
139
|
-
l4gRoot,
|
|
140
|
-
l5bRoot,
|
|
141
|
-
l8Root,
|
|
142
|
-
reconciliationPath,
|
|
143
|
-
latestRunId,
|
|
144
|
-
runPaths,
|
|
145
|
-
};
|
|
146
|
-
}
|