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,211 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const fs = require("fs");
|
|
4
|
-
const path = require("path");
|
|
5
|
-
const { nowIso } = require("./fsx");
|
|
6
|
-
const { appendProductLearningEvent } = require("./product-learning-events");
|
|
7
|
-
const {
|
|
8
|
-
readPackageJson,
|
|
9
|
-
getBinEntries,
|
|
10
|
-
getPublishConfig,
|
|
11
|
-
mapDistributionStateToStatus,
|
|
12
|
-
} = require("./package-runtime");
|
|
13
|
-
|
|
14
|
-
const CONTRACT = "avorelo.publicDistributionTruth.v1";
|
|
15
|
-
const SCHEMA_VERSION = 1;
|
|
16
|
-
const ARTIFACT_DIR_REL = ".claude/cco/orchestration/public-distribution";
|
|
17
|
-
const ARTIFACT_REL = ARTIFACT_DIR_REL + "/latest-truth.json";
|
|
18
|
-
|
|
19
|
-
function pass(id, label, evidence, detail) {
|
|
20
|
-
return { id, label, status: "pass", evidence: evidence || null, detail: detail || null, safeNextAction: null };
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function warn(id, label, safeNextAction, evidence, detail) {
|
|
24
|
-
return { id, label, status: "warn", evidence: evidence || null, detail: detail || null, safeNextAction: safeNextAction || "Review warning." };
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function blocked(id, label, safeNextAction, evidence, detail) {
|
|
28
|
-
return { id, label, status: "blocked", evidence: evidence || null, detail: detail || null, safeNextAction: safeNextAction || "Fix blocker." };
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function inspectPackageMetadata(cwd) {
|
|
32
|
-
const pkg = readPackageJson(cwd);
|
|
33
|
-
const checks = [];
|
|
34
|
-
if (!pkg) {
|
|
35
|
-
checks.push(blocked("package_name_present", "package.json must exist", "Create a valid package.json."));
|
|
36
|
-
return { pkg: null, checks };
|
|
37
|
-
}
|
|
38
|
-
checks.push(pkg.name ? pass("package_name_present", "package.json name present", { name: pkg.name }) : blocked("package_name_present", "package.json name missing", "Set package.json name to avorelo."));
|
|
39
|
-
checks.push(pkg.name === "avorelo"
|
|
40
|
-
? pass("package_name_avorelo_or_truthfully_named", "Package name is avorelo", { name: pkg.name })
|
|
41
|
-
: blocked("package_name_avorelo_or_truthfully_named", "Package name must be avorelo", "Use the public package name avorelo."));
|
|
42
|
-
checks.push(pkg.version
|
|
43
|
-
? pass("package_version_present", "Package version is present", { version: pkg.version })
|
|
44
|
-
: blocked("package_version_present", "Package version is missing", "Set a package version."));
|
|
45
|
-
checks.push(typeof pkg.private === "boolean"
|
|
46
|
-
? pass("package_private_status_truthful", "package.json private flag is explicit", { private: pkg.private })
|
|
47
|
-
: blocked("package_private_status_truthful", "package.json private flag must be explicit", "Set private true or false explicitly."));
|
|
48
|
-
checks.push(/wuz/i.test(JSON.stringify({ name: pkg.name, description: pkg.description, keywords: pkg.keywords || [] }))
|
|
49
|
-
? blocked("no_wuz_public_leak", "No internal Wuz naming in public metadata", "Remove Wuz wording from public package metadata.")
|
|
50
|
-
: pass("no_wuz_public_leak", "No internal Wuz naming in public metadata"));
|
|
51
|
-
checks.push(pass("support_metadata_truthful", "Support metadata is present", { homepage: pkg.homepage || null, bugs: pkg.bugs || null }));
|
|
52
|
-
return { pkg, checks };
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function inspectPackageBin(cwd) {
|
|
56
|
-
const pkg = readPackageJson(cwd);
|
|
57
|
-
const checks = [];
|
|
58
|
-
const binEntries = getBinEntries(pkg);
|
|
59
|
-
if (binEntries.avorelo === "bin/avorelo") {
|
|
60
|
-
checks.push(pass("bin_avorelo_present", "bin.avorelo points to bin/avorelo", { bin: binEntries.avorelo }));
|
|
61
|
-
} else {
|
|
62
|
-
checks.push(blocked("bin_avorelo_present", "bin.avorelo must point to bin/avorelo", "Set bin.avorelo to bin/avorelo."));
|
|
63
|
-
}
|
|
64
|
-
const binPath = path.join(cwd, "bin", "avorelo");
|
|
65
|
-
if (fs.existsSync(binPath)) {
|
|
66
|
-
const firstLine = fs.readFileSync(binPath, "utf8").split("\n")[0];
|
|
67
|
-
checks.push(pass("bin_target_exists", "bin/avorelo exists", { path: "bin/avorelo" }));
|
|
68
|
-
checks.push(firstLine.includes("#!/usr/bin/env node")
|
|
69
|
-
? pass("bin_target_executable_or_node_runnable", "bin/avorelo is node-runnable", { shebang: firstLine })
|
|
70
|
-
: warn("bin_target_executable_or_node_runnable", "bin/avorelo is missing a node shebang", "Add #!/usr/bin/env node to bin/avorelo."));
|
|
71
|
-
} else {
|
|
72
|
-
checks.push(blocked("bin_target_exists", "bin/avorelo is missing", "Add bin/avorelo to the package."));
|
|
73
|
-
checks.push(blocked("bin_target_executable_or_node_runnable", "bin/avorelo is not checkable", "Create bin/avorelo first."));
|
|
74
|
-
}
|
|
75
|
-
return { pkg, checks };
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
function inspectPackageFilesPolicy(cwd) {
|
|
79
|
-
const pkg = readPackageJson(cwd);
|
|
80
|
-
const checks = [];
|
|
81
|
-
if (pkg && Array.isArray(pkg.files) && pkg.files.length > 0) {
|
|
82
|
-
checks.push(pass("files_allowlist_present_or_safe", "package.json files allowlist is present", { files: pkg.files }));
|
|
83
|
-
return { pkg, filesPolicyStatus: "files_field", checks };
|
|
84
|
-
}
|
|
85
|
-
if (fs.existsSync(path.join(cwd, ".npmignore"))) {
|
|
86
|
-
checks.push(warn("files_allowlist_present_or_safe", ".npmignore is present without package.json files allowlist", "Prefer package.json files for a tighter publish surface."));
|
|
87
|
-
return { pkg, filesPolicyStatus: "npmignore", checks };
|
|
88
|
-
}
|
|
89
|
-
checks.push(blocked("files_allowlist_present_or_safe", "Package include/exclude control is missing", "Add a package.json files allowlist."));
|
|
90
|
-
return { pkg, filesPolicyStatus: "none", checks };
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
function inspectPublicInstallClaims(cwd) {
|
|
94
|
-
const pkg = readPackageJson(cwd);
|
|
95
|
-
const checks = [];
|
|
96
|
-
if (pkg && pkg.private === false) {
|
|
97
|
-
checks.push(pass("public_install_claims_truthful", "Public package claims can be evaluated", { private: false }));
|
|
98
|
-
checks.push(pass("install_ai_command_truthful", "Public command claims must still remain caveated until publish verification"));
|
|
99
|
-
} else {
|
|
100
|
-
checks.push(pass("public_install_claims_truthful", "Private package keeps public claims caveated", { private: true }));
|
|
101
|
-
checks.push(pass("install_ai_command_truthful", "Install guidance remains local-only until package is public-ready"));
|
|
102
|
-
}
|
|
103
|
-
return { pkg, checks };
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
function buildPublicDistributionTruth(cwd) {
|
|
107
|
-
const metaResult = inspectPackageMetadata(cwd);
|
|
108
|
-
const binResult = inspectPackageBin(cwd);
|
|
109
|
-
const filesResult = inspectPackageFilesPolicy(cwd);
|
|
110
|
-
const installResult = inspectPublicInstallClaims(cwd);
|
|
111
|
-
const pkg = metaResult.pkg || binResult.pkg || filesResult.pkg || installResult.pkg;
|
|
112
|
-
const publishConfig = getPublishConfig(pkg) || {};
|
|
113
|
-
const checks = [...metaResult.checks, ...binResult.checks, ...filesResult.checks, ...installResult.checks];
|
|
114
|
-
const blockers = checks.filter((check) => check.status === "blocked").map((check) => check.id);
|
|
115
|
-
const warnings = checks.filter((check) => check.status === "warn").map((check) => check.id);
|
|
116
|
-
|
|
117
|
-
let distributionState = "publish_blocked";
|
|
118
|
-
if (blockers.length === 0) {
|
|
119
|
-
distributionState = pkg && pkg.private === false ? "ready_to_publish" : "private_local_only";
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
const truth = {
|
|
123
|
-
contract: CONTRACT,
|
|
124
|
-
schemaVersion: SCHEMA_VERSION,
|
|
125
|
-
generatedAt: nowIso(),
|
|
126
|
-
status: distributionState === "publish_blocked" ? "blocked" : (warnings.length > 0 ? "warn" : "pass"),
|
|
127
|
-
distributionState,
|
|
128
|
-
packageName: pkg ? pkg.name : null,
|
|
129
|
-
version: pkg ? pkg.version : null,
|
|
130
|
-
privateStatus: pkg ? !!pkg.private : null,
|
|
131
|
-
private: pkg ? pkg.private : null,
|
|
132
|
-
publishConfig,
|
|
133
|
-
binEntries: getBinEntries(pkg),
|
|
134
|
-
filesPolicyStatus: filesResult.filesPolicyStatus,
|
|
135
|
-
publicInstallStatus: distributionState,
|
|
136
|
-
installAiStatus: distributionState === "published_verified" ? "live" : "caveated",
|
|
137
|
-
supportStatus: "present",
|
|
138
|
-
domainStatus: pkg && pkg.homepage ? "present" : "pending",
|
|
139
|
-
checks,
|
|
140
|
-
blockers,
|
|
141
|
-
warnings,
|
|
142
|
-
safeNextAction: distributionState === "publish_blocked"
|
|
143
|
-
? "Fix package metadata, bin, or files policy before publish."
|
|
144
|
-
: distributionState === "ready_to_publish"
|
|
145
|
-
? "Run package-audit, package-smoke, install-claims, and publish-readiness to verify the public package path."
|
|
146
|
-
: "Package is still private-only. Keep public install claims caveated.",
|
|
147
|
-
noPublicLaunchClaim: true,
|
|
148
|
-
redacted: true,
|
|
149
|
-
};
|
|
150
|
-
|
|
151
|
-
return truth;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
function writePublicDistributionTruth(cwd, truth) {
|
|
155
|
-
const dir = path.join(cwd, ARTIFACT_DIR_REL);
|
|
156
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
157
|
-
fs.writeFileSync(path.join(cwd, ARTIFACT_REL), JSON.stringify(truth, null, 2));
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
function buildPublicDistributionSurface(cwd) {
|
|
161
|
-
const truth = buildPublicDistributionTruth(cwd);
|
|
162
|
-
writePublicDistributionTruth(cwd, truth);
|
|
163
|
-
try {
|
|
164
|
-
appendProductLearningEvent(cwd, {
|
|
165
|
-
event: "public_distribution_truth_built",
|
|
166
|
-
contract: CONTRACT,
|
|
167
|
-
distributionState: truth.distributionState,
|
|
168
|
-
blockerCount: truth.blockers.length,
|
|
169
|
-
warningCount: truth.warnings.length,
|
|
170
|
-
});
|
|
171
|
-
} catch {}
|
|
172
|
-
|
|
173
|
-
return {
|
|
174
|
-
status: truth.status,
|
|
175
|
-
distributionState: truth.distributionState,
|
|
176
|
-
packageName: truth.packageName,
|
|
177
|
-
version: truth.version,
|
|
178
|
-
privateStatus: truth.privateStatus,
|
|
179
|
-
binStatus: truth.binEntries.avorelo ? "present" : "missing",
|
|
180
|
-
filesPolicyStatus: truth.filesPolicyStatus,
|
|
181
|
-
publicInstallStatus: truth.publicInstallStatus,
|
|
182
|
-
blockerCount: truth.blockers.length,
|
|
183
|
-
warningCount: truth.warnings.length,
|
|
184
|
-
safeNextAction: truth.safeNextAction,
|
|
185
|
-
noPublicLaunchClaim: true,
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
function formatPublicDistributionText(truth) {
|
|
190
|
-
return [
|
|
191
|
-
"Public Distribution Truth [" + String(truth.status || "unknown").toUpperCase() + "]",
|
|
192
|
-
" Package: " + (truth.packageName || "?") + "@" + (truth.version || "?"),
|
|
193
|
-
" Distribution state: " + truth.distributionState,
|
|
194
|
-
" Private: " + truth.privateStatus,
|
|
195
|
-
" Files policy: " + truth.filesPolicyStatus,
|
|
196
|
-
" Blockers: " + truth.blockers.length,
|
|
197
|
-
" Warnings: " + truth.warnings.length,
|
|
198
|
-
" Next: " + truth.safeNextAction,
|
|
199
|
-
].join("\n");
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
module.exports = {
|
|
203
|
-
buildPublicDistributionTruth,
|
|
204
|
-
inspectPackageMetadata,
|
|
205
|
-
inspectPackageBin,
|
|
206
|
-
inspectPackageFilesPolicy,
|
|
207
|
-
inspectPublicInstallClaims,
|
|
208
|
-
writePublicDistributionTruth,
|
|
209
|
-
buildPublicDistributionSurface,
|
|
210
|
-
formatPublicDistributionText,
|
|
211
|
-
};
|
|
@@ -1,294 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const fs = require("fs");
|
|
4
|
-
const path = require("path");
|
|
5
|
-
const { nowIso } = require("./fsx");
|
|
6
|
-
const { appendProductLearningEvent } = require("./product-learning-events");
|
|
7
|
-
const { readPackageJson } = require("./package-runtime");
|
|
8
|
-
|
|
9
|
-
const CONTRACT = "avorelo.publicInstallClaimCheck.v1";
|
|
10
|
-
const SCHEMA_VERSION = 1;
|
|
11
|
-
const ARTIFACT_DIR_REL = ".claude/cco/orchestration/public-distribution";
|
|
12
|
-
const ARTIFACT_REL = ARTIFACT_DIR_REL + "/latest-install-claim-check.json";
|
|
13
|
-
const MAX_FILES = 500;
|
|
14
|
-
const MAX_CHARS_PER_FILE = 8000;
|
|
15
|
-
|
|
16
|
-
const STRONG_PUBLIC_CLAIMS = [
|
|
17
|
-
/npx avorelo@latest/i,
|
|
18
|
-
/npm install -g avorelo/i,
|
|
19
|
-
/npm exec avorelo/i,
|
|
20
|
-
];
|
|
21
|
-
|
|
22
|
-
const BLOCK_ALWAYS_PATTERNS = [
|
|
23
|
-
{ pattern: /works everywhere|works on every machine/i, reason: "works-everywhere claim is not allowed" },
|
|
24
|
-
{ pattern: /guaranteed/i, reason: "guaranteed outcome claim is not allowed" },
|
|
25
|
-
{ pattern: /official partnership/i, reason: "unsupported partnership claim is not allowed" },
|
|
26
|
-
];
|
|
27
|
-
|
|
28
|
-
const CAVEAT_CONTEXT_PATTERNS = [
|
|
29
|
-
/pending npm publication/i,
|
|
30
|
-
/publish verification/i,
|
|
31
|
-
/publication is still required/i,
|
|
32
|
-
/target public install/i,
|
|
33
|
-
/ready_to_publish/i,
|
|
34
|
-
/ready to publish/i,
|
|
35
|
-
/not yet verified live/i,
|
|
36
|
-
/once npm publication is verified/i,
|
|
37
|
-
/until publication is confirmed/i,
|
|
38
|
-
/distribution status/i,
|
|
39
|
-
];
|
|
40
|
-
|
|
41
|
-
const FILE_LEVEL_CAVEAT_PATTERNS = [
|
|
42
|
-
/distribution status/i,
|
|
43
|
-
/not yet publicly available/i,
|
|
44
|
-
/ready to publish/i,
|
|
45
|
-
/ready_to_publish/i,
|
|
46
|
-
/publish verification/i,
|
|
47
|
-
/pending npm publication/i,
|
|
48
|
-
/not yet verified live/i,
|
|
49
|
-
/dogfood/i,
|
|
50
|
-
/demo script/i,
|
|
51
|
-
/planning/i,
|
|
52
|
-
];
|
|
53
|
-
|
|
54
|
-
function safeReadJson(absPath) {
|
|
55
|
-
try {
|
|
56
|
-
if (!fs.existsSync(absPath)) return null;
|
|
57
|
-
return JSON.parse(fs.readFileSync(absPath, "utf8").replace(/^\uFEFF/, ""));
|
|
58
|
-
} catch {
|
|
59
|
-
return null;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
function safeReadText(absPath, maxChars) {
|
|
64
|
-
try {
|
|
65
|
-
if (!fs.existsSync(absPath)) return null;
|
|
66
|
-
const file = fs.readFileSync(absPath, "utf8");
|
|
67
|
-
return file.slice(0, maxChars || MAX_CHARS_PER_FILE);
|
|
68
|
-
} catch {
|
|
69
|
-
return null;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
function collectFiles(dir, matcher, collected = []) {
|
|
74
|
-
if (!fs.existsSync(dir) || collected.length >= MAX_FILES) return collected;
|
|
75
|
-
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
76
|
-
for (const entry of entries) {
|
|
77
|
-
if (collected.length >= MAX_FILES) break;
|
|
78
|
-
const full = path.join(dir, entry.name);
|
|
79
|
-
if (entry.isDirectory()) {
|
|
80
|
-
if (/node_modules|\.git|\.wasp|dist|artifacts|\.tmp/i.test(entry.name)) continue;
|
|
81
|
-
collectFiles(full, matcher, collected);
|
|
82
|
-
} else if (entry.isFile() && matcher(entry.name)) {
|
|
83
|
-
collected.push(full);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
return collected;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
function detectDistributionState(cwd, options = {}) {
|
|
90
|
-
if (options.distributionState) return options.distributionState;
|
|
91
|
-
const truthArtifact = safeReadJson(path.join(cwd, ARTIFACT_DIR_REL, "latest-truth.json"));
|
|
92
|
-
if (truthArtifact && truthArtifact.distributionState) return truthArtifact.distributionState;
|
|
93
|
-
const pkg = readPackageJson(cwd);
|
|
94
|
-
if (pkg && typeof pkg.avoreloDistributionState === "string") return pkg.avoreloDistributionState;
|
|
95
|
-
return pkg && pkg.private === false ? "ready_to_publish" : "private_local_only";
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
function hasCaveatContext(contextLines) {
|
|
99
|
-
const combined = (contextLines || []).join(" ");
|
|
100
|
-
return CAVEAT_CONTEXT_PATTERNS.some((pattern) => pattern.test(combined));
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function hasFileLevelCaveat(lines, relPath) {
|
|
104
|
-
if (/dogfood|demo|decision|deployment|contract|audit|roadmap|feedback/i.test(relPath || "")) return true;
|
|
105
|
-
const combined = lines.slice(0, 30).join(" ");
|
|
106
|
-
return FILE_LEVEL_CAVEAT_PATTERNS.some((pattern) => pattern.test(combined));
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
function classifyInstallClaim(claim, distributionState) {
|
|
110
|
-
const text = claim.text || "";
|
|
111
|
-
const effectiveState = distributionState || "private_local_only";
|
|
112
|
-
const isNegatedPolicyText = /\b(no|not|never|without|unsupported)\b/i.test(text);
|
|
113
|
-
const isPrimaryPublicSurface = /README\.md$|docs\/INSTALL\.md$|docs\/ACTIVATION\.md$|docs\/WEBSITE-ACTIVATION-COPY\.md$|apps\/public-web\/src\/index\.html$/i.test(claim.file || "");
|
|
114
|
-
|
|
115
|
-
for (const { pattern, reason } of BLOCK_ALWAYS_PATTERNS) {
|
|
116
|
-
if (pattern.test(text)) {
|
|
117
|
-
if (!isPrimaryPublicSurface) {
|
|
118
|
-
return { ...claim, decision: "allowed", reason: "internal or non-primary doc reference" };
|
|
119
|
-
}
|
|
120
|
-
if (isNegatedPolicyText || claim.fileCaveated) {
|
|
121
|
-
return { ...claim, decision: "allowed", reason: "policy or caveat text, not a positive claim" };
|
|
122
|
-
}
|
|
123
|
-
return { ...claim, decision: "blocked", reason };
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
const isStrongPublicClaim = STRONG_PUBLIC_CLAIMS.some((pattern) => pattern.test(text));
|
|
128
|
-
if (isStrongPublicClaim) {
|
|
129
|
-
if (effectiveState === "published_verified") {
|
|
130
|
-
return { ...claim, decision: "allowed", reason: "published_verified allows live public install commands" };
|
|
131
|
-
}
|
|
132
|
-
if (claim.fileCaveated || hasCaveatContext(claim.contextLines)) {
|
|
133
|
-
return { ...claim, decision: "caveated", reason: "public install claim is present but explicitly caveated" };
|
|
134
|
-
}
|
|
135
|
-
return {
|
|
136
|
-
...claim,
|
|
137
|
-
decision: "blocked",
|
|
138
|
-
reason: "uncaveated public install claim is stronger than current distribution state (" + effectiveState + ")",
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
if (/local.*install|node bin\/avorelo|npm run avorelo:activate/i.test(text)) {
|
|
143
|
-
return { ...claim, decision: "allowed", reason: "repo-local install path is allowed" };
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
return { ...claim, decision: "allowed", reason: "no blocked claim pattern matched" };
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
function scanTextForClaims(text, relPath, distributionState, metadataOnly) {
|
|
150
|
-
if (!text) return [];
|
|
151
|
-
const lines = text.split("\n");
|
|
152
|
-
const claims = [];
|
|
153
|
-
const fileCaveated = !metadataOnly && hasFileLevelCaveat(lines, relPath);
|
|
154
|
-
|
|
155
|
-
for (let index = 0; index < lines.length; index += 1) {
|
|
156
|
-
const line = lines[index];
|
|
157
|
-
const textLooksRelevant =
|
|
158
|
-
/avorelo@latest|npm install -g avorelo|npm exec avorelo|works everywhere|works on every machine|guaranteed|official partnership/i.test(line);
|
|
159
|
-
if (!textLooksRelevant) continue;
|
|
160
|
-
|
|
161
|
-
const contextStart = Math.max(0, index - 12);
|
|
162
|
-
const contextEnd = Math.min(lines.length - 1, index + 12);
|
|
163
|
-
const rawClaim = {
|
|
164
|
-
file: relPath,
|
|
165
|
-
line: index + 1,
|
|
166
|
-
text: line.trim().slice(0, 140),
|
|
167
|
-
metadataOnly: !!metadataOnly,
|
|
168
|
-
fileCaveated,
|
|
169
|
-
contextLines: metadataOnly ? [] : lines.slice(contextStart, contextEnd + 1).map((entry) => entry.trim()),
|
|
170
|
-
};
|
|
171
|
-
const classified = classifyInstallClaim(rawClaim, distributionState);
|
|
172
|
-
const outputClaim = { ...classified };
|
|
173
|
-
delete outputClaim.contextLines;
|
|
174
|
-
claims.push(outputClaim);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
return claims;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
function scanInstallClaims(cwd, options = {}) {
|
|
181
|
-
const distributionState = detectDistributionState(cwd, options);
|
|
182
|
-
const claims = [];
|
|
183
|
-
let filesScanned = 0;
|
|
184
|
-
|
|
185
|
-
const docsFiles = collectFiles(path.join(cwd, "docs"), (name) => name.endsWith(".md"));
|
|
186
|
-
const webFiles = collectFiles(path.join(cwd, "apps", "public-web", "src"), (name) => name.endsWith(".html"));
|
|
187
|
-
|
|
188
|
-
for (const absPath of [...docsFiles, ...webFiles]) {
|
|
189
|
-
const text = safeReadText(absPath, MAX_CHARS_PER_FILE);
|
|
190
|
-
const relPath = path.relative(cwd, absPath).replace(/\\/g, "/");
|
|
191
|
-
claims.push(...scanTextForClaims(text, relPath, distributionState, false));
|
|
192
|
-
filesScanned += 1;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
const readmePath = path.join(cwd, "README.md");
|
|
196
|
-
if (fs.existsSync(readmePath)) {
|
|
197
|
-
claims.push(...scanTextForClaims(safeReadText(readmePath, MAX_CHARS_PER_FILE), "README.md", distributionState, false));
|
|
198
|
-
filesScanned += 1;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
const pkg = readPackageJson(cwd);
|
|
202
|
-
if (pkg) {
|
|
203
|
-
const metadataText = [pkg.name || "", pkg.description || "", (pkg.keywords || []).join(" ")].join(" ");
|
|
204
|
-
claims.push(...scanTextForClaims(metadataText, "package.json#metadata", distributionState, true));
|
|
205
|
-
filesScanned += 1;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
return {
|
|
209
|
-
claims,
|
|
210
|
-
filesScanned,
|
|
211
|
-
distributionState,
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
function validateInstallClaims(cwd, options = {}) {
|
|
216
|
-
const { claims, filesScanned, distributionState } = scanInstallClaims(cwd, options);
|
|
217
|
-
const blockedClaims = claims.filter((claim) => claim.decision === "blocked");
|
|
218
|
-
const caveatedClaims = claims.filter((claim) => claim.decision === "caveated");
|
|
219
|
-
const allowedClaims = claims.filter((claim) => claim.decision === "allowed");
|
|
220
|
-
const ok = blockedClaims.length === 0;
|
|
221
|
-
const status = blockedClaims.length > 0 ? "blocked" : "pass";
|
|
222
|
-
const safeNextAction = blockedClaims.length > 0
|
|
223
|
-
? "Fix blocked public install claims so they match the current distribution state."
|
|
224
|
-
: caveatedClaims.length > 0
|
|
225
|
-
? "Claims are appropriately caveated for " + distributionState + "."
|
|
226
|
-
: "Install claim check passed. No false public install claims found.";
|
|
227
|
-
|
|
228
|
-
const report = {
|
|
229
|
-
contract: CONTRACT,
|
|
230
|
-
schemaVersion: SCHEMA_VERSION,
|
|
231
|
-
generatedAt: nowIso(),
|
|
232
|
-
status,
|
|
233
|
-
ok,
|
|
234
|
-
distributionState,
|
|
235
|
-
filesScanned,
|
|
236
|
-
claimsFound: claims.length,
|
|
237
|
-
blockedCount: blockedClaims.length,
|
|
238
|
-
caveatedCount: caveatedClaims.length,
|
|
239
|
-
allowedCount: allowedClaims.length,
|
|
240
|
-
blockedClaims,
|
|
241
|
-
caveatedClaims,
|
|
242
|
-
allowedClaims,
|
|
243
|
-
safeNextAction,
|
|
244
|
-
noPublicLaunchClaim: true,
|
|
245
|
-
redacted: true,
|
|
246
|
-
};
|
|
247
|
-
|
|
248
|
-
try {
|
|
249
|
-
appendProductLearningEvent(cwd, {
|
|
250
|
-
event: "public_install_claim_check",
|
|
251
|
-
contract: CONTRACT,
|
|
252
|
-
status,
|
|
253
|
-
distributionState,
|
|
254
|
-
blockedCount: blockedClaims.length,
|
|
255
|
-
caveatedCount: caveatedClaims.length,
|
|
256
|
-
});
|
|
257
|
-
} catch {}
|
|
258
|
-
|
|
259
|
-
return report;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
function writePublicInstallClaimCheck(cwd, report) {
|
|
263
|
-
const dir = path.join(cwd, ARTIFACT_DIR_REL);
|
|
264
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
265
|
-
fs.writeFileSync(path.join(cwd, ARTIFACT_REL), JSON.stringify(report, null, 2));
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
function formatPublicInstallClaimText(report) {
|
|
269
|
-
const lines = [
|
|
270
|
-
"Public Install Claim Check [" + String(report.status || "unknown").toUpperCase() + "]",
|
|
271
|
-
" Distribution state: " + report.distributionState,
|
|
272
|
-
" Files scanned: " + report.filesScanned,
|
|
273
|
-
" Claims found: " + report.claimsFound,
|
|
274
|
-
" Blocked: " + report.blockedCount,
|
|
275
|
-
" Caveated: " + report.caveatedCount,
|
|
276
|
-
" Allowed: " + report.allowedCount,
|
|
277
|
-
" Next: " + report.safeNextAction,
|
|
278
|
-
];
|
|
279
|
-
if (report.blockedCount > 0) {
|
|
280
|
-
lines.push(" Blocked claims:");
|
|
281
|
-
for (const claim of report.blockedClaims.slice(0, 5)) {
|
|
282
|
-
lines.push(" [" + claim.file + ":" + claim.line + "] " + claim.text);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
return lines.join("\n");
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
module.exports = {
|
|
289
|
-
scanInstallClaims,
|
|
290
|
-
classifyInstallClaim,
|
|
291
|
-
validateInstallClaims,
|
|
292
|
-
writePublicInstallClaimCheck,
|
|
293
|
-
formatPublicInstallClaimText,
|
|
294
|
-
};
|