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.
Files changed (258) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +56 -0
  3. package/bin/avorelo +9 -0
  4. package/package.json +135 -0
  5. package/scripts/README.md +40 -0
  6. package/scripts/cco-dashboard.js +252 -0
  7. package/scripts/cco-status.js +430 -0
  8. package/scripts/lib/activation/account-state.js +37 -0
  9. package/scripts/lib/activation/activation-runner.js +546 -0
  10. package/scripts/lib/activation/activation-self-healing.js +480 -0
  11. package/scripts/lib/activation/activation-state.js +83 -0
  12. package/scripts/lib/activation/activation-summary.js +191 -0
  13. package/scripts/lib/activation/adapters/claude-code.js +77 -0
  14. package/scripts/lib/activation/adapters/codex-cli.js +52 -0
  15. package/scripts/lib/activation/adapters/cursor.js +37 -0
  16. package/scripts/lib/activation/adapters/github-agent.js +39 -0
  17. package/scripts/lib/activation/adapters/terminal.js +42 -0
  18. package/scripts/lib/activation/adapters/vscode.js +39 -0
  19. package/scripts/lib/activation/adapters/windsurf.js +37 -0
  20. package/scripts/lib/activation/ai-surface-detector.js +151 -0
  21. package/scripts/lib/activation/connect-account.js +145 -0
  22. package/scripts/lib/activation/detect-environment.js +75 -0
  23. package/scripts/lib/activation/detect-hosts.js +62 -0
  24. package/scripts/lib/activation/format-activation-output.js +109 -0
  25. package/scripts/lib/activation/next-action.js +43 -0
  26. package/scripts/lib/activation/repair-engine.js +219 -0
  27. package/scripts/lib/activation-distribution-readiness.js +507 -0
  28. package/scripts/lib/adapter-conformance.js +176 -0
  29. package/scripts/lib/adapter-readiness.js +417 -0
  30. package/scripts/lib/adapter-safety-boundaries.js +335 -0
  31. package/scripts/lib/adapter-technical-readiness-gate.js +205 -0
  32. package/scripts/lib/agent-access-governance.js +455 -0
  33. package/scripts/lib/agent-enforcement.js +765 -0
  34. package/scripts/lib/agent-policy-profile.js +210 -0
  35. package/scripts/lib/agent-security/action-evaluator.js +507 -0
  36. package/scripts/lib/agent-security/adapter-registry.js +98 -0
  37. package/scripts/lib/agent-security/auto-policy.js +139 -0
  38. package/scripts/lib/agent-security/bounded-scan.js +93 -0
  39. package/scripts/lib/agent-security/enforcement-adapter.js +174 -0
  40. package/scripts/lib/agent-security/enforcement-engine.js +1129 -0
  41. package/scripts/lib/agent-security/file-write-adapter.js +183 -0
  42. package/scripts/lib/agent-security/file-write-rules.js +178 -0
  43. package/scripts/lib/agent-security/index.js +3342 -0
  44. package/scripts/lib/agent-security/instruction-risk.js +181 -0
  45. package/scripts/lib/agent-security/mcp-action-adapter.js +185 -0
  46. package/scripts/lib/agent-security/mcp-action-rules.js +184 -0
  47. package/scripts/lib/agent-security/package-action-adapter.js +175 -0
  48. package/scripts/lib/agent-security/package-action-rules.js +233 -0
  49. package/scripts/lib/agent-security/performance.js +148 -0
  50. package/scripts/lib/agent-security/permission-minimizer.js +403 -0
  51. package/scripts/lib/agent-security/scan-cache.js +74 -0
  52. package/scripts/lib/agent-security/source-trust.js +146 -0
  53. package/scripts/lib/ai-install-prompt.js +288 -0
  54. package/scripts/lib/ai-workspace-hygiene.js +1499 -0
  55. package/scripts/lib/alpha-activation.js +520 -0
  56. package/scripts/lib/alpha-feedback.js +263 -0
  57. package/scripts/lib/alpha-readiness-gate.js +332 -0
  58. package/scripts/lib/anti-gaming.js +169 -0
  59. package/scripts/lib/artifact-health.js +431 -0
  60. package/scripts/lib/attribution.js +180 -0
  61. package/scripts/lib/audit.js +289 -0
  62. package/scripts/lib/avorelo-skill-registry.js +810 -0
  63. package/scripts/lib/batch-jobs.js +71 -0
  64. package/scripts/lib/brain-pack.js +578 -0
  65. package/scripts/lib/brand-boundary.js +424 -0
  66. package/scripts/lib/brand.js +74 -0
  67. package/scripts/lib/browser-capability.js +1048 -0
  68. package/scripts/lib/browser-proof-preflight.js +321 -0
  69. package/scripts/lib/cache-readiness.js +187 -0
  70. package/scripts/lib/canonical-reentry.js +162 -0
  71. package/scripts/lib/capability-packs.js +314 -0
  72. package/scripts/lib/capability-recommender.js +512 -0
  73. package/scripts/lib/capability-registry.js +1059 -0
  74. package/scripts/lib/carry-forward-surfacing.js +194 -0
  75. package/scripts/lib/ccusage-adapter.js +188 -0
  76. package/scripts/lib/company-loop.js +1149 -0
  77. package/scripts/lib/config.js +637 -0
  78. package/scripts/lib/context-acquisition-plan.js +287 -0
  79. package/scripts/lib/context-budget-guard.js +170 -0
  80. package/scripts/lib/context-budget-scanner.js +257 -0
  81. package/scripts/lib/context-optimizer.js +715 -0
  82. package/scripts/lib/context-reduction-plan.js +178 -0
  83. package/scripts/lib/context-safety.js +88 -0
  84. package/scripts/lib/context-savings-engine.js +158 -0
  85. package/scripts/lib/cost-evidence.js +254 -0
  86. package/scripts/lib/cross-host-install-plan.js +308 -0
  87. package/scripts/lib/cross-host-install-readiness.js +237 -0
  88. package/scripts/lib/cross-host-value-flow.js +268 -0
  89. package/scripts/lib/dashboard.js +900 -0
  90. package/scripts/lib/design-partner-feedback.js +346 -0
  91. package/scripts/lib/entitlements.js +100 -0
  92. package/scripts/lib/execution-packet.js +559 -0
  93. package/scripts/lib/experimentation-events.js +547 -0
  94. package/scripts/lib/external-capability-compliance.js +107 -0
  95. package/scripts/lib/external-user-simulation.js +166 -0
  96. package/scripts/lib/failure-recovery-readiness.js +81 -0
  97. package/scripts/lib/failure-recovery.js +419 -0
  98. package/scripts/lib/feedback-intelligence.js +537 -0
  99. package/scripts/lib/feedback-signals.js +205 -0
  100. package/scripts/lib/file-integrity.js +68 -0
  101. package/scripts/lib/fsx.js +127 -0
  102. package/scripts/lib/full-readiness-gate.js +451 -0
  103. package/scripts/lib/guidance-builder.js +174 -0
  104. package/scripts/lib/hook-apply.js +1019 -0
  105. package/scripts/lib/hook-baseline.js +310 -0
  106. package/scripts/lib/hook-config-preview.js +275 -0
  107. package/scripts/lib/hook-contracts.js +290 -0
  108. package/scripts/lib/hook-safety-boundary-readiness.js +80 -0
  109. package/scripts/lib/host-capability-matrix.js +351 -0
  110. package/scripts/lib/host-support-context.js +254 -0
  111. package/scripts/lib/http-hook-action.js +538 -0
  112. package/scripts/lib/install-ai-readiness.js +84 -0
  113. package/scripts/lib/install-intake-risk.js +1037 -0
  114. package/scripts/lib/install-journey-intelligence.js +329 -0
  115. package/scripts/lib/intervention-guidance.js +57 -0
  116. package/scripts/lib/known-limitations.js +115 -0
  117. package/scripts/lib/l8-path-truth.js +146 -0
  118. package/scripts/lib/launch-hardening-gate.js +436 -0
  119. package/scripts/lib/launch-readiness.js +628 -0
  120. package/scripts/lib/learning-memory.js +686 -0
  121. package/scripts/lib/lifecycle-hooks.js +802 -0
  122. package/scripts/lib/local-package-smoke.js +423 -0
  123. package/scripts/lib/local-pricing.js +299 -0
  124. package/scripts/lib/mcp-enforcement.js +311 -0
  125. package/scripts/lib/mcp-least-privilege-policy.js +303 -0
  126. package/scripts/lib/mcp-tool-inventory.js +388 -0
  127. package/scripts/lib/mcp-tool-risk.js +0 -0
  128. package/scripts/lib/memory.js +335 -0
  129. package/scripts/lib/metrics.js +699 -0
  130. package/scripts/lib/micro-proof.js +133 -0
  131. package/scripts/lib/next-run-context.js +436 -0
  132. package/scripts/lib/operating-value.js +1648 -0
  133. package/scripts/lib/optimization-v3.js +122 -0
  134. package/scripts/lib/orchestration/adapters/_shared.js +49 -0
  135. package/scripts/lib/orchestration/adapters/aider.js +18 -0
  136. package/scripts/lib/orchestration/adapters/claude-code.js +35 -0
  137. package/scripts/lib/orchestration/adapters/codex.js +35 -0
  138. package/scripts/lib/orchestration/adapters/gemini-cli.js +18 -0
  139. package/scripts/lib/orchestration/adapters/git.js +25 -0
  140. package/scripts/lib/orchestration/adapters/index.js +31 -0
  141. package/scripts/lib/orchestration/adapters/lm-studio.js +18 -0
  142. package/scripts/lib/orchestration/adapters/ollama.js +18 -0
  143. package/scripts/lib/orchestration/adapters/opencode.js +18 -0
  144. package/scripts/lib/orchestration/adapters/openrouter.js +18 -0
  145. package/scripts/lib/orchestration/adapters/test-runner.js +25 -0
  146. package/scripts/lib/orchestration/cli.js +438 -0
  147. package/scripts/lib/orchestration/execution-manager.js +279 -0
  148. package/scripts/lib/orchestration/handoff.js +314 -0
  149. package/scripts/lib/orchestration/index.js +456 -0
  150. package/scripts/lib/orchestration/inventory.js +47 -0
  151. package/scripts/lib/orchestration/model-discovery.js +498 -0
  152. package/scripts/lib/orchestration/model-profiler.js +170 -0
  153. package/scripts/lib/orchestration/model-profiles.js +252 -0
  154. package/scripts/lib/orchestration/model-refresh-policy.js +72 -0
  155. package/scripts/lib/orchestration/proof-writer.js +349 -0
  156. package/scripts/lib/orchestration/provider-discovery/aider.js +49 -0
  157. package/scripts/lib/orchestration/provider-discovery/claude-code.js +56 -0
  158. package/scripts/lib/orchestration/provider-discovery/codex.js +49 -0
  159. package/scripts/lib/orchestration/provider-discovery/common.js +186 -0
  160. package/scripts/lib/orchestration/provider-discovery/gemini.js +106 -0
  161. package/scripts/lib/orchestration/provider-discovery/lm-studio.js +118 -0
  162. package/scripts/lib/orchestration/provider-discovery/models-dev.js +12 -0
  163. package/scripts/lib/orchestration/provider-discovery/ollama.js +100 -0
  164. package/scripts/lib/orchestration/provider-discovery/opencode.js +47 -0
  165. package/scripts/lib/orchestration/provider-discovery/openrouter.js +44 -0
  166. package/scripts/lib/orchestration/risk-classifier.js +130 -0
  167. package/scripts/lib/orchestration/routing-policy.js +486 -0
  168. package/scripts/lib/orchestration/settings.js +112 -0
  169. package/scripts/lib/orchestration/state.js +165 -0
  170. package/scripts/lib/orchestration/verification-manager.js +138 -0
  171. package/scripts/lib/output-profiles.js +146 -0
  172. package/scripts/lib/package-content-audit.js +368 -0
  173. package/scripts/lib/package-runtime.js +278 -0
  174. package/scripts/lib/plan-surface.js +53 -0
  175. package/scripts/lib/plans.js +2318 -0
  176. package/scripts/lib/policy-provider.js +27 -0
  177. package/scripts/lib/prelaunch-activation-readiness.js +409 -0
  178. package/scripts/lib/prelaunch-evidence-store.js +816 -0
  179. package/scripts/lib/prelaunch-intelligence.js +869 -0
  180. package/scripts/lib/pricing-experiment.js +118 -0
  181. package/scripts/lib/pro-moment-events.js +77 -0
  182. package/scripts/lib/pro-moment-state.js +227 -0
  183. package/scripts/lib/pro-moments.js +1216 -0
  184. package/scripts/lib/product-learning-events.js +629 -0
  185. package/scripts/lib/project-profile.js +555 -0
  186. package/scripts/lib/prompt-compiler.js +280 -0
  187. package/scripts/lib/prompt-lint.js +32 -0
  188. package/scripts/lib/prompt-suggestions.js +52 -0
  189. package/scripts/lib/proof-canonical.js +398 -0
  190. package/scripts/lib/proof-drilldown.js +383 -0
  191. package/scripts/lib/proof-events.js +342 -0
  192. package/scripts/lib/proof-history.js +243 -0
  193. package/scripts/lib/proof-metrics.js +296 -0
  194. package/scripts/lib/proof-outcome-evidence.js +134 -0
  195. package/scripts/lib/proof-receipt.js +335 -0
  196. package/scripts/lib/proof-record.js +461 -0
  197. package/scripts/lib/public-activation-distribution-gate.js +258 -0
  198. package/scripts/lib/public-cli.js +3891 -0
  199. package/scripts/lib/public-distribution-truth.js +211 -0
  200. package/scripts/lib/public-install-claim-checker.js +294 -0
  201. package/scripts/lib/publish-provenance-readiness.js +283 -0
  202. package/scripts/lib/readiness-delta.js +218 -0
  203. package/scripts/lib/readiness-evidence-closure.js +196 -0
  204. package/scripts/lib/reentry-memory-capture.js +241 -0
  205. package/scripts/lib/reentry-memory-retrieval.js +302 -0
  206. package/scripts/lib/reentry-memory-status.js +146 -0
  207. package/scripts/lib/reentry-memory-store.js +178 -0
  208. package/scripts/lib/reentry-state.js +66 -0
  209. package/scripts/lib/release-candidate-bundle.js +166 -0
  210. package/scripts/lib/remediation.js +81 -0
  211. package/scripts/lib/repo-map.js +391 -0
  212. package/scripts/lib/run-improvements-lifecycle.js +330 -0
  213. package/scripts/lib/run-improvements.js +789 -0
  214. package/scripts/lib/runtime-decision-policy.js +387 -0
  215. package/scripts/lib/safe-path-engine.js +705 -0
  216. package/scripts/lib/safe-run-controller.js +887 -0
  217. package/scripts/lib/score.js +262 -0
  218. package/scripts/lib/seamless-enforcement.js +329 -0
  219. package/scripts/lib/seamless-outcome.js +689 -0
  220. package/scripts/lib/seamless-reality-gate.js +5043 -0
  221. package/scripts/lib/security-risk-classifier.js +511 -0
  222. package/scripts/lib/security-scan.js +384 -0
  223. package/scripts/lib/session-context-optimizer.js +1211 -0
  224. package/scripts/lib/session-timing.js +315 -0
  225. package/scripts/lib/skill-hygiene.js +805 -0
  226. package/scripts/lib/skill-packs.js +161 -0
  227. package/scripts/lib/skills-operating-layer.js +580 -0
  228. package/scripts/lib/smart-work-routing.js +768 -0
  229. package/scripts/lib/source-catalog.js +700 -0
  230. package/scripts/lib/status-value-summary.js +32 -0
  231. package/scripts/lib/support-bundle.js +578 -0
  232. package/scripts/lib/task-continuation.js +440 -0
  233. package/scripts/lib/test-helpers.js +15 -0
  234. package/scripts/lib/tier.js +38 -0
  235. package/scripts/lib/token-context-quality-gate.js +370 -0
  236. package/scripts/lib/token-cost-capture.js +187 -0
  237. package/scripts/lib/token-cost-intelligence.js +358 -0
  238. package/scripts/lib/token-efficiency-evidence.js +213 -0
  239. package/scripts/lib/token-evidence.js +699 -0
  240. package/scripts/lib/tokenish.js +17 -0
  241. package/scripts/lib/tool-output-sandbox.js +304 -0
  242. package/scripts/lib/trust-audit.js +136 -0
  243. package/scripts/lib/unified-events.js +396 -0
  244. package/scripts/lib/upgrade-interruption-recovery.js +407 -0
  245. package/scripts/lib/usage-ledger.js +201 -0
  246. package/scripts/lib/value-ledger.js +130 -0
  247. package/scripts/lib/value-proof-calibration.js +531 -0
  248. package/scripts/lib/visual-qa.js +231 -0
  249. package/scripts/lib/voice-alpha.js +29 -0
  250. package/scripts/lib/work-aware-orchestration.js +976 -0
  251. package/scripts/lib/work-control-receipts.js +577 -0
  252. package/scripts/lib/work-ledger.js +1123 -0
  253. package/scripts/lib/work-panel-preview.js +352 -0
  254. package/scripts/lib/workflow-discipline.js +280 -0
  255. package/scripts/lib/workflow-signals.js +419 -0
  256. package/scripts/lib/workspace-map.js +281 -0
  257. package/scripts/lib/workspace-registry.js +1367 -0
  258. package/scripts/lib/workspace-resolver.js +480 -0
@@ -0,0 +1,423 @@
1
+ "use strict";
2
+
3
+ // Local package smoke: pack tarball, install it in an isolated temp project,
4
+ // then verify the real first-use CLI path without mutating the source repo,
5
+ // touching the network, or writing to the user's real home directory.
6
+
7
+ const fs = require("fs");
8
+ const path = require("path");
9
+ const { spawnSync } = require("child_process");
10
+ const { nowIso } = require("./fsx");
11
+ const { appendProductLearningEvent } = require("./product-learning-events");
12
+ const {
13
+ createTempDir,
14
+ readPackageJson,
15
+ runNpm,
16
+ runNpx,
17
+ collectRuntimeDependencyGraph,
18
+ findMissingRuntimeDependencies,
19
+ getPublicRuntimeEntryFiles,
20
+ redactPathsInValue,
21
+ } = require("./package-runtime");
22
+
23
+ const CONTRACT = "avorelo.localPackageSmoke.v1";
24
+ const SCHEMA_VERSION = 1;
25
+ const ARTIFACT_DIR_REL = ".claude/cco/orchestration/public-distribution";
26
+ const ARTIFACT_REL = ARTIFACT_DIR_REL + "/latest-local-package-smoke.json";
27
+ const EXEC_TIMEOUT = 120000;
28
+ const ACTIVATE_CONTRACT = "avorelo.alphaActivation.v1";
29
+
30
+ function buildLocalPackageSmokePlan() {
31
+ return {
32
+ steps: [
33
+ "create_temp_dir",
34
+ "audit_runtime_dependencies",
35
+ "npm_pack_to_temp",
36
+ "create_temp_project",
37
+ "npm_install_tarball_into_temp_project",
38
+ "run_activate_help",
39
+ "run_status_help",
40
+ "run_dashboard_help",
41
+ "run_activate_json",
42
+ "run_status_text",
43
+ "run_dashboard_json",
44
+ "verify_source_repo_untouched",
45
+ "cleanup",
46
+ ],
47
+ notes: [
48
+ "Never runs npm publish.",
49
+ "Runs the packed CLI only inside an isolated temp project.",
50
+ "Redirects USERPROFILE/HOME to a temp home so no real global config is touched.",
51
+ "Uses a temp npm cache so PowerShell/npm cache permissions do not leak into the smoke result.",
52
+ "Cleans up temp files unless debug mode is enabled.",
53
+ ],
54
+ };
55
+ }
56
+
57
+ function buildCommandRecord(command, result, tempPaths) {
58
+ return redactPathsInValue({
59
+ command,
60
+ success: result.success,
61
+ stdout: (result.stdout || "").slice(0, 1200),
62
+ stderr: (result.stderr || "").slice(0, 1200),
63
+ combinedOutput: (result.combinedOutput || "").slice(0, 1200),
64
+ }, tempPaths);
65
+ }
66
+
67
+ function repoStatusSnapshot(cwd) {
68
+ const result = spawnSync("git", ["status", "--short"], {
69
+ cwd,
70
+ encoding: "utf8",
71
+ timeout: 30000,
72
+ stdio: "pipe",
73
+ });
74
+ return result.status === 0 ? (result.stdout || "").trim() : null;
75
+ }
76
+
77
+ function cleanup(tmpDir, debug, result) {
78
+ if (!debug && tmpDir) {
79
+ try { fs.rmSync(tmpDir, { recursive: true, force: true }); } catch {}
80
+ }
81
+ return result;
82
+ }
83
+
84
+ function buildBaseResult(overrides = {}) {
85
+ return {
86
+ contract: CONTRACT,
87
+ schemaVersion: SCHEMA_VERSION,
88
+ generatedAt: nowIso(),
89
+ status: "fail",
90
+ passed: false,
91
+ tarballCreated: false,
92
+ installSucceeded: false,
93
+ activateHelpSucceeded: false,
94
+ statusHelpSucceeded: false,
95
+ dashboardHelpSucceeded: false,
96
+ realActivationSucceeded: false,
97
+ realStatusSucceeded: false,
98
+ realDashboardSucceeded: false,
99
+ tempProjectRedacted: true,
100
+ sourceRepoUntouched: false,
101
+ runtimeDependenciesOk: false,
102
+ runtimeExternalDependencies: [],
103
+ missingRuntimeDependencies: [],
104
+ missingLocalRuntimeFiles: [],
105
+ commandOutputsSummarized: {
106
+ activateHelp: null,
107
+ statusHelp: null,
108
+ dashboardHelp: null,
109
+ realActivation: null,
110
+ realStatus: null,
111
+ realDashboard: null,
112
+ },
113
+ commands: [],
114
+ installError: null,
115
+ safeNextAction: "Local package smoke failed.",
116
+ noPublicLaunchClaim: true,
117
+ redacted: true,
118
+ ...overrides,
119
+ };
120
+ }
121
+
122
+ function buildSkippedResult(reason, overrides = {}) {
123
+ return buildBaseResult({
124
+ status: "skip",
125
+ safeNextAction: "Smoke test skipped: " + reason,
126
+ ...overrides,
127
+ });
128
+ }
129
+
130
+ function buildFailResult(reason, overrides = {}) {
131
+ return buildBaseResult({
132
+ status: "fail",
133
+ safeNextAction: reason,
134
+ ...overrides,
135
+ });
136
+ }
137
+
138
+ function writeTempProject(projectDir) {
139
+ fs.mkdirSync(projectDir, { recursive: true });
140
+ fs.writeFileSync(
141
+ path.join(projectDir, "package.json"),
142
+ JSON.stringify({
143
+ name: "avorelo-packed-smoke-project",
144
+ version: "1.0.0",
145
+ private: true,
146
+ }, null, 2),
147
+ "utf8"
148
+ );
149
+ fs.mkdirSync(path.join(projectDir, ".git"), { recursive: true });
150
+ }
151
+
152
+ function parseJsonOutput(result) {
153
+ if (!result || !result.success) return null;
154
+ try {
155
+ return JSON.parse(result.stdout || "");
156
+ } catch {
157
+ return null;
158
+ }
159
+ }
160
+
161
+ function didRealPackedCliSmokePass(smoke) {
162
+ return !!(
163
+ smoke &&
164
+ smoke.installSucceeded === true &&
165
+ smoke.runtimeDependenciesOk === true &&
166
+ smoke.activateHelpSucceeded === true &&
167
+ smoke.statusHelpSucceeded === true &&
168
+ smoke.dashboardHelpSucceeded === true &&
169
+ smoke.realActivationSucceeded === true &&
170
+ smoke.realStatusSucceeded === true &&
171
+ smoke.realDashboardSucceeded === true &&
172
+ smoke.tempProjectRedacted === true &&
173
+ smoke.sourceRepoUntouched === true &&
174
+ Array.isArray(smoke.missingRuntimeDependencies) &&
175
+ smoke.missingRuntimeDependencies.length === 0 &&
176
+ Array.isArray(smoke.missingLocalRuntimeFiles) &&
177
+ smoke.missingLocalRuntimeFiles.length === 0
178
+ );
179
+ }
180
+
181
+ function runPackedCliSmoke(tempDir, tarballPath, sourceRepoCwd) {
182
+ const pkg = readPackageJson(sourceRepoCwd);
183
+ const runtimeGraph = collectRuntimeDependencyGraph(sourceRepoCwd, {
184
+ entryFiles: getPublicRuntimeEntryFiles(sourceRepoCwd),
185
+ });
186
+ const missingRuntimeDependencies = findMissingRuntimeDependencies(pkg, runtimeGraph);
187
+ const tempProjectDir = path.join(tempDir, "project");
188
+ const tempHomeDir = path.join(tempDir, "home");
189
+ const cacheDir = path.join(tempDir, "npm-cache");
190
+ const tempPaths = [tempDir, tempProjectDir, tempHomeDir, cacheDir, tarballPath];
191
+ const sourceRepoStatusBefore = repoStatusSnapshot(sourceRepoCwd);
192
+
193
+ fs.mkdirSync(tempHomeDir, { recursive: true });
194
+ fs.mkdirSync(cacheDir, { recursive: true });
195
+ writeTempProject(tempProjectDir);
196
+
197
+ const sharedEnv = {
198
+ USERPROFILE: tempHomeDir,
199
+ HOME: tempHomeDir,
200
+ AVORELO_PLAN: "free",
201
+ };
202
+
203
+ const installResult = runNpm([
204
+ "install",
205
+ "--no-package-lock",
206
+ "--ignore-scripts",
207
+ "--no-save",
208
+ tarballPath,
209
+ ], {
210
+ cwd: tempProjectDir,
211
+ timeoutMs: EXEC_TIMEOUT,
212
+ cacheDir,
213
+ env: sharedEnv,
214
+ });
215
+
216
+ if (!installResult.success) {
217
+ return {
218
+ installSucceeded: false,
219
+ installError: redactPathsInValue(installResult.errorSummary, tempPaths),
220
+ commands: [],
221
+ sourceRepoUntouched: repoStatusSnapshot(sourceRepoCwd) === sourceRepoStatusBefore,
222
+ tempProjectRedacted: true,
223
+ runtimeDependenciesOk: missingRuntimeDependencies.length === 0 && runtimeGraph.missingLocalFiles.length === 0,
224
+ runtimeExternalDependencies: runtimeGraph.externalPackages,
225
+ missingRuntimeDependencies,
226
+ missingLocalRuntimeFiles: runtimeGraph.missingLocalFiles,
227
+ tempPaths,
228
+ };
229
+ }
230
+
231
+ const commandSpecs = [
232
+ { id: "activateHelp", command: ["activate", "--help"] },
233
+ { id: "statusHelp", command: ["status", "--help"] },
234
+ { id: "dashboardHelp", command: ["dashboard", "--help"] },
235
+ { id: "realActivation", command: ["activate", "--json"] },
236
+ { id: "realStatus", command: ["status", "--text"] },
237
+ { id: "realDashboard", command: ["dashboard", "--json"] },
238
+ ];
239
+
240
+ const commandResults = commandSpecs.map((spec) => {
241
+ const result = runNpx(["--no-install", "avorelo", ...spec.command], {
242
+ cwd: tempProjectDir,
243
+ timeoutMs: EXEC_TIMEOUT,
244
+ cacheDir,
245
+ env: sharedEnv,
246
+ });
247
+ return {
248
+ id: spec.id,
249
+ command: `npx --no-install avorelo ${spec.command.join(" ")}`,
250
+ raw: result,
251
+ record: buildCommandRecord(`npx --no-install avorelo ${spec.command.join(" ")}`, result, tempPaths),
252
+ };
253
+ });
254
+
255
+ const getResult = (id) => commandResults.find((entry) => entry.id === id);
256
+ const activationPayload = parseJsonOutput(getResult("realActivation").raw);
257
+ const dashboardPayload = parseJsonOutput(getResult("realDashboard").raw);
258
+
259
+ const realActivationSucceeded = !!(
260
+ getResult("realActivation").raw.success &&
261
+ activationPayload &&
262
+ activationPayload.contract === ACTIVATE_CONTRACT
263
+ );
264
+ const realStatusSucceeded = !!(
265
+ getResult("realStatus").raw.success &&
266
+ String(getResult("realStatus").raw.combinedOutput || "").trim().length > 0
267
+ );
268
+ const realDashboardSucceeded = !!(
269
+ getResult("realDashboard").raw.success &&
270
+ dashboardPayload &&
271
+ typeof dashboardPayload === "object"
272
+ );
273
+ const sourceRepoUntouched = repoStatusSnapshot(sourceRepoCwd) === sourceRepoStatusBefore;
274
+ const redactedCommands = commandResults.map((entry) => entry.record);
275
+ const redactedSerialized = JSON.stringify(redactedCommands);
276
+ const tempProjectRedacted = !tempPaths.some((tempPath) => redactedSerialized.includes(String(tempPath)));
277
+
278
+ return {
279
+ installSucceeded: true,
280
+ installError: null,
281
+ commands: redactedCommands,
282
+ activateHelpSucceeded: getResult("activateHelp").raw.success,
283
+ statusHelpSucceeded: getResult("statusHelp").raw.success,
284
+ dashboardHelpSucceeded: getResult("dashboardHelp").raw.success,
285
+ realActivationSucceeded,
286
+ realStatusSucceeded,
287
+ realDashboardSucceeded,
288
+ sourceRepoUntouched,
289
+ tempProjectRedacted,
290
+ runtimeDependenciesOk: missingRuntimeDependencies.length === 0 && runtimeGraph.missingLocalFiles.length === 0,
291
+ runtimeExternalDependencies: runtimeGraph.externalPackages,
292
+ missingRuntimeDependencies,
293
+ missingLocalRuntimeFiles: runtimeGraph.missingLocalFiles,
294
+ commandOutputsSummarized: {
295
+ activateHelp: getResult("activateHelp").record.combinedOutput || null,
296
+ statusHelp: getResult("statusHelp").record.combinedOutput || null,
297
+ dashboardHelp: getResult("dashboardHelp").record.combinedOutput || null,
298
+ realActivation: getResult("realActivation").record.combinedOutput || null,
299
+ realStatus: getResult("realStatus").record.combinedOutput || null,
300
+ realDashboard: getResult("realDashboard").record.combinedOutput || null,
301
+ },
302
+ };
303
+ }
304
+
305
+ function runLocalPackageSmoke(cwd, options = {}) {
306
+ if (options.forcedResult) return options.forcedResult;
307
+
308
+ const npmCheck = runNpm(["--version"], {
309
+ cwd,
310
+ timeoutMs: 30000,
311
+ cacheLabel: "package-smoke-version",
312
+ });
313
+ if (!npmCheck.success) {
314
+ return buildSkippedResult("npm not available: " + (npmCheck.errorSummary || "unknown"));
315
+ }
316
+
317
+ const debug = !!options.debug;
318
+ const tmpDir = createTempDir("avorelo-smoke-");
319
+ let tarballPath = null;
320
+ let tarballCreated = false;
321
+
322
+ try {
323
+ const cacheDir = path.join(tmpDir, "npm-cache");
324
+ const packResult = runNpm(["pack", "--pack-destination", tmpDir], {
325
+ cwd,
326
+ timeoutMs: EXEC_TIMEOUT,
327
+ cacheDir,
328
+ });
329
+
330
+ if (packResult.success) {
331
+ const tgzName = (packResult.stdout || "").trim().split("\n").pop().trim();
332
+ const candidate = path.join(tmpDir, tgzName);
333
+ if (fs.existsSync(candidate)) {
334
+ tarballPath = candidate;
335
+ tarballCreated = true;
336
+ }
337
+ }
338
+
339
+ if (!tarballCreated || !tarballPath) {
340
+ return cleanup(tmpDir, debug, buildFailResult("npm pack did not produce a .tgz file."));
341
+ }
342
+
343
+ const smokeResult = runPackedCliSmoke(tmpDir, tarballPath, cwd);
344
+ const result = buildBaseResult({
345
+ status: "fail",
346
+ tarballCreated,
347
+ installSucceeded: smokeResult.installSucceeded,
348
+ activateHelpSucceeded: smokeResult.activateHelpSucceeded === true,
349
+ statusHelpSucceeded: smokeResult.statusHelpSucceeded === true,
350
+ dashboardHelpSucceeded: smokeResult.dashboardHelpSucceeded === true,
351
+ realActivationSucceeded: smokeResult.realActivationSucceeded === true,
352
+ realStatusSucceeded: smokeResult.realStatusSucceeded === true,
353
+ realDashboardSucceeded: smokeResult.realDashboardSucceeded === true,
354
+ tempProjectRedacted: smokeResult.tempProjectRedacted === true,
355
+ sourceRepoUntouched: smokeResult.sourceRepoUntouched === true,
356
+ runtimeDependenciesOk: smokeResult.runtimeDependenciesOk === true,
357
+ runtimeExternalDependencies: smokeResult.runtimeExternalDependencies || [],
358
+ missingRuntimeDependencies: smokeResult.missingRuntimeDependencies || [],
359
+ missingLocalRuntimeFiles: smokeResult.missingLocalRuntimeFiles || [],
360
+ commandOutputsSummarized: smokeResult.commandOutputsSummarized || {},
361
+ commands: smokeResult.commands || [],
362
+ installError: smokeResult.installError,
363
+ });
364
+
365
+ result.passed = didRealPackedCliSmokePass(result);
366
+ result.status = result.passed ? "pass" : "fail";
367
+ result.safeNextAction = result.passed
368
+ ? "Local packed CLI smoke passed. Proceed to install claim check."
369
+ : result.missingRuntimeDependencies.length > 0
370
+ ? "Move missing runtime packages into dependencies or remove the runtime import."
371
+ : result.missingLocalRuntimeFiles.length > 0
372
+ ? "Fix missing local runtime files required by the public CLI."
373
+ : !result.realActivationSucceeded
374
+ ? "Fix the packed real activation path before claiming ready_to_publish."
375
+ : !result.realStatusSucceeded
376
+ ? "Fix the packed real status path before claiming ready_to_publish."
377
+ : !result.realDashboardSucceeded
378
+ ? "Fix the packed real dashboard path before claiming ready_to_publish."
379
+ : !result.sourceRepoUntouched
380
+ ? "The packed CLI mutated the source repo. Isolate the smoke further before publish."
381
+ : !result.tempProjectRedacted
382
+ ? "Redact temp absolute paths from smoke output before publish."
383
+ : "Local packed CLI smoke failed. Check the tarball install and the real first-use commands.";
384
+
385
+ return cleanup(tmpDir, debug, result);
386
+ } catch (error) {
387
+ return cleanup(tmpDir, debug, buildFailResult(String(error).slice(0, 200), {
388
+ tarballCreated,
389
+ installSucceeded: false,
390
+ }));
391
+ }
392
+ }
393
+
394
+ function writeLocalPackageSmoke(cwd, smoke) {
395
+ const dir = path.join(cwd, ARTIFACT_DIR_REL);
396
+ fs.mkdirSync(dir, { recursive: true });
397
+ fs.writeFileSync(path.join(cwd, ARTIFACT_REL), JSON.stringify(smoke, null, 2));
398
+ }
399
+
400
+ function formatLocalPackageSmokeText(smoke) {
401
+ const commandCount = (smoke.commands || []).length;
402
+ const passedCount = (smoke.commands || []).filter((command) => command.success).length;
403
+ return [
404
+ "Local Package Smoke [" + String(smoke.status || "unknown").toUpperCase() + "]",
405
+ " Tarball created: " + smoke.tarballCreated,
406
+ " Install succeeded: " + smoke.installSucceeded,
407
+ " Commands passed: " + passedCount + "/" + (commandCount || 6),
408
+ " Real activation/status/dashboard: " + [smoke.realActivationSucceeded, smoke.realStatusSucceeded, smoke.realDashboardSucceeded].join("/"),
409
+ " Runtime dependencies OK: " + smoke.runtimeDependenciesOk,
410
+ " Source repo untouched: " + smoke.sourceRepoUntouched,
411
+ " Next: " + smoke.safeNextAction,
412
+ ].join("\n");
413
+ }
414
+
415
+ module.exports = {
416
+ ACTIVATE_CONTRACT,
417
+ buildLocalPackageSmokePlan,
418
+ didRealPackedCliSmokePass,
419
+ runLocalPackageSmoke,
420
+ runPackedCliSmoke,
421
+ writeLocalPackageSmoke,
422
+ formatLocalPackageSmokeText,
423
+ };