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,32 @@
1
+ #!/usr/bin/env node
2
+ // Thin deterministic value-summary builder for cco-status
3
+ // Local-first, bounded, no ML, no remote
4
+ "use strict";
5
+
6
+ const path = require("path");
7
+ const fs = require("fs");
8
+
9
+ /**
10
+ * Build deterministic value-summary from available evidence signals
11
+ * Given current status snapshot, returns single-line summary of bounded work/value
12
+ * @param {object} status - snapshot from buildStatusDashboard
13
+ * @returns {string} deterministic summary (50 chars max)
14
+ */
15
+ function buildValueSummary(status) {
16
+ // Available signals from dashboard:
17
+ // - status.tier (free/pro/teams)
18
+ // - status.profile (terse/standard/deep)
19
+ // - status.topRecommendedFixes (array, 0-3 items)
20
+ // - status.benefitSummary?.minutesSavedEstimate (number or 0)
21
+ // - status.nextBestAction (string or null)
22
+ const fixCount = (status.topRecommendedFixes || []).length;
23
+ const minutes = status.benefitSummary?.minutesSavedEstimate || 0;
24
+ const next = status.nextBestAction || "Pending";
25
+ const profile = status.profile || "standard";
26
+
27
+ // Deterministic bounded summary (max ~50 chars):
28
+ // "Avorelo: 3 fixes (~8 min), next: Run tests, profile: standard"
29
+ return `Avorelo: ${fixCount} fix${fixCount !== 1 ? "es" : ""} (~${minutes} min), next: ${next}, profile: ${profile}`;
30
+ }
31
+
32
+ module.exports = { buildValueSummary };
@@ -0,0 +1,578 @@
1
+ "use strict";
2
+
3
+ // ── Support Bundle ────────────────────────────────────────────────────────────
4
+ //
5
+ // Contract: avorelo.supportBundle.v1
6
+ //
7
+ // Generates a redacted support/debug bundle for alpha users and support.
8
+ // Includes references/summaries from existing artifacts — no raw code,
9
+ // prompts, secrets, PII, or config dumps.
10
+
11
+ const fs = require("fs");
12
+ const path = require("path");
13
+ const { ensureCcoDirs, nowIso } = require("./fsx");
14
+ const { appendProductLearningEvent } = require("./product-learning-events");
15
+
16
+ const CONTRACT = "avorelo.supportBundle.v1";
17
+ const SCHEMA_VERSION = 1;
18
+ const BUNDLE_REL = ".claude/cco/support/latest-support-bundle.json";
19
+ const BUNDLE_DIR_REL = ".claude/cco/support";
20
+
21
+ // ── Helpers ───────────────────────────────────────────────────────────────────
22
+
23
+ function safeReadJson(absPath) {
24
+ try {
25
+ if (!fs.existsSync(absPath)) return null;
26
+ return JSON.parse(fs.readFileSync(absPath, "utf8").replace(/^/, ""));
27
+ } catch {
28
+ return null;
29
+ }
30
+ }
31
+
32
+ function artifactSummary(cwd, rel, label) {
33
+ const absPath = path.join(cwd, rel);
34
+ if (!fs.existsSync(absPath)) {
35
+ return { label, path: rel, available: false };
36
+ }
37
+ try {
38
+ const data = JSON.parse(fs.readFileSync(absPath, "utf8").replace(/^/, ""));
39
+ const bytes = fs.statSync(absPath).size;
40
+ return {
41
+ label,
42
+ path: rel,
43
+ available: true,
44
+ bytes,
45
+ contract: data.contract || null,
46
+ status: data.status || null,
47
+ createdAt: data.createdAt || null,
48
+ schemaVersion: data.schemaVersion || null,
49
+ };
50
+ } catch {
51
+ return { label, path: rel, available: true, bytes: 0, contract: null, status: "parse_error" };
52
+ }
53
+ }
54
+
55
+ function countJsonFiles(cwd, rel) {
56
+ const dirAbs = path.join(cwd, rel);
57
+ try {
58
+ if (!fs.existsSync(dirAbs)) return 0;
59
+ return fs.readdirSync(dirAbs).filter((f) => f.endsWith(".json")).length;
60
+ } catch {
61
+ return 0;
62
+ }
63
+ }
64
+
65
+ function countJsonlLines(cwd, rel) {
66
+ const absPath = path.join(cwd, rel);
67
+ try {
68
+ if (!fs.existsSync(absPath)) return 0;
69
+ const content = fs.readFileSync(absPath, "utf8");
70
+ return content.split("\n").filter((l) => l.trim().startsWith("{")).length;
71
+ } catch {
72
+ return 0;
73
+ }
74
+ }
75
+
76
+ function nodeVersion() {
77
+ return process.version;
78
+ }
79
+
80
+ function platformInfo() {
81
+ return {
82
+ platform: process.platform,
83
+ arch: process.arch,
84
+ node: nodeVersion(),
85
+ };
86
+ }
87
+
88
+ // ── Build bundle ──────────────────────────────────────────────────────────────
89
+
90
+ function buildSupportBundle(cwd, options = {}) {
91
+ const artifacts = [
92
+ artifactSummary(cwd, ".claude/cco/state/activation.json", "activation-state"),
93
+ artifactSummary(cwd, ".claude/cco/orchestration/activation/latest-activation.json", "alpha-activation"),
94
+ artifactSummary(cwd, ".claude/cco/orchestration/alpha-readiness/latest-gate.json", "alpha-readiness-gate"),
95
+ artifactSummary(cwd, ".claude/cco/orchestration/safe-run/latest-run.json", "latest-safe-run"),
96
+ artifactSummary(cwd, ".claude/cco/orchestration/hook-apply/latest-doctor.json", "hook-doctor"),
97
+ artifactSummary(cwd, ".claude/cco/orchestration/hook-apply/latest-apply.json", "hook-apply"),
98
+ artifactSummary(cwd, ".claude/cco/orchestration/seamless-outcome/latest-reality-gate.json", "proof-reality-gate"),
99
+ artifactSummary(cwd, ".claude/cco/orchestration/seamless-outcome/latest-value-summary.json", "value-summary"),
100
+ artifactSummary(cwd, ".claude/cco/orchestration/company-loop/latest-report.json", "company-loop"),
101
+ artifactSummary(cwd, ".claude/cco/orchestration/work-ledger/latest-ledger.json", "work-ledger"),
102
+ artifactSummary(cwd, ".claude/cco/orchestration/smart-work-routing/latest-route.json", "smart-route"),
103
+ artifactSummary(cwd, ".claude/cco/orchestration/worker-handoff/latest-handoff.json", "worker-handoff"),
104
+ artifactSummary(cwd, ".claude/cco/orchestration/hook-baseline/latest-baseline.json", "hook-baseline"),
105
+ artifactSummary(cwd, ".claude/cco/orchestration/project-profile/latest-profile.json", "project-profile"),
106
+ // PR #143 — Token Efficiency + Context Quality Hardening
107
+ artifactSummary(cwd, ".claude/cco/orchestration/token-efficiency/latest-evidence.json", "token-efficiency-evidence"),
108
+ artifactSummary(cwd, ".claude/cco/orchestration/token-efficiency/latest-quality-gate.json", "token-context-quality-gate"),
109
+ artifactSummary(cwd, ".claude/cco/orchestration/repo-map/latest-map.json", "repo-map"),
110
+ artifactSummary(cwd, ".claude/cco/orchestration/context-acquisition/latest-plan.json", "context-acquisition-plan"),
111
+ artifactSummary(cwd, ".claude/cco/orchestration/cache-readiness/latest-readiness.json", "cache-readiness"),
112
+ // PR #145 — MCP Least-Privilege Tool Governance (summaries only, no raw config)
113
+ artifactSummary(cwd, ".claude/cco/orchestration/mcp-tool-governance/latest-inventory.json", "mcp-tool-inventory"),
114
+ artifactSummary(cwd, ".claude/cco/orchestration/mcp-tool-governance/latest-risk.json", "mcp-tool-risk"),
115
+ artifactSummary(cwd, ".claude/cco/orchestration/mcp-tool-governance/latest-policy.json", "mcp-policy"),
116
+ artifactSummary(cwd, ".claude/cco/orchestration/mcp-tool-governance/latest-pretooluse-decision.json", "mcp-pretooluse-decision"),
117
+ // PR #146 — AI Install + Pre-Launch Readiness
118
+ artifactSummary(cwd, ".claude/cco/orchestration/ai-install/latest-prompt.json", "ai-install-prompt"),
119
+ artifactSummary(cwd, ".claude/cco/orchestration/prelaunch-readiness/latest-activation-readiness.json", "prelaunch-readiness"),
120
+ // PR #147 — Pre-Launch Intelligence Layer (summaries only, no raw prompts/feedback/code)
121
+ artifactSummary(cwd, ".claude/cco/orchestration/prelaunch-intelligence/latest-intelligence.json", "prelaunch-intelligence"),
122
+ artifactSummary(cwd, ".claude/cco/orchestration/prelaunch-intelligence/latest-feedback-intelligence.json", "feedback-intelligence"),
123
+ artifactSummary(cwd, ".claude/cco/orchestration/prelaunch-intelligence/latest-token-cost-intelligence.json", "token-cost-intelligence"),
124
+ artifactSummary(cwd, ".claude/cco/evidence/token-cost/latest-capture.json", "token-cost-capture"),
125
+ artifactSummary(cwd, ".claude/cco/evidence/token-cost/summary.json", "token-cost-summary"),
126
+ artifactSummary(cwd, ".claude/cco/orchestration/prelaunch-intelligence/latest-install-journey.json", "install-journey-intelligence"),
127
+ artifactSummary(cwd, ".claude/cco/orchestration/full-readiness/latest-evidence-closure.json", "readiness-evidence-closure"),
128
+ artifactSummary(cwd, ".claude/cco/orchestration/seamless-outcome/latest-proof-outcome-evidence.json", "proof-outcome-evidence"),
129
+ ];
130
+
131
+ // Feedback summary (counts only, no content)
132
+ const feedbackCount = countJsonFiles(cwd, ".claude/cco/feedback") + countJsonlLines(cwd, ".claude/cco/evidence/feedback/feedback.jsonl");
133
+ const feedbackSummary = { count: feedbackCount, dir: ".claude/cco/feedback" };
134
+
135
+ // Prompt readiness summary (status/score only — no raw promptText)
136
+ const prelaunchReadinessArtifact = safeReadJson(
137
+ path.join(cwd, ".claude/cco/orchestration/prelaunch-readiness/latest-activation-readiness.json")
138
+ );
139
+ const promptReadinessSummary = prelaunchReadinessArtifact
140
+ ? {
141
+ status: prelaunchReadinessArtifact.status,
142
+ score: prelaunchReadinessArtifact.score,
143
+ noPublicLaunchClaim: prelaunchReadinessArtifact.noPublicLaunchClaim,
144
+ checkCount: (prelaunchReadinessArtifact.checks || []).length,
145
+ passCount: (prelaunchReadinessArtifact.checks || []).filter((c) => c.status === "pass").length,
146
+ warnCount: (prelaunchReadinessArtifact.checks || []).filter((c) => c.status === "warn").length,
147
+ artifactPath: ".claude/cco/orchestration/prelaunch-readiness/latest-activation-readiness.json",
148
+ redacted: true,
149
+ }
150
+ : null;
151
+
152
+ // Pre-launch intelligence summary (status/score only — no raw feedback/prompts)
153
+ const intelligenceArtifact = safeReadJson(
154
+ path.join(cwd, ".claude/cco/orchestration/prelaunch-intelligence/latest-intelligence.json")
155
+ );
156
+ const intelligenceSummary = intelligenceArtifact
157
+ ? {
158
+ status: intelligenceArtifact.status,
159
+ score: intelligenceArtifact.score,
160
+ topFriction: intelligenceArtifact.frictionSummary?.topFriction,
161
+ tokenEvidenceLevel: intelligenceArtifact.tokenCostSummary?.evidenceLevel,
162
+ missingEvidenceCount: (intelligenceArtifact.missingEvidence || []).length,
163
+ recommendedNextPr: intelligenceArtifact.recommendedNextPr?.recommendation,
164
+ noPublicLaunchClaim: true,
165
+ redacted: true,
166
+ }
167
+ : null;
168
+
169
+ const feedbackArtifact = safeReadJson(
170
+ path.join(cwd, ".claude/cco/orchestration/prelaunch-intelligence/latest-feedback-intelligence.json")
171
+ );
172
+ const feedbackIntelligenceSummary = feedbackArtifact
173
+ ? {
174
+ status: feedbackArtifact.status,
175
+ readinessStatus: feedbackArtifact.readinessStatus,
176
+ score: feedbackArtifact.score,
177
+ qualifiedFeedbackItemsCount: feedbackArtifact.qualifiedFeedbackItemsCount || 0,
178
+ topFriction: feedbackArtifact.topFriction,
179
+ redacted: true,
180
+ }
181
+ : null;
182
+
183
+ const tokenCostArtifact = safeReadJson(
184
+ path.join(cwd, ".claude/cco/orchestration/prelaunch-intelligence/latest-token-cost-intelligence.json")
185
+ );
186
+ const tokenCostCaptureArtifact = safeReadJson(
187
+ path.join(cwd, ".claude/cco/evidence/token-cost/latest-capture.json")
188
+ );
189
+ const tokenCostSummaryArtifact = safeReadJson(
190
+ path.join(cwd, ".claude/cco/evidence/token-cost/summary.json")
191
+ );
192
+ const tokenCostEvidenceSummary = tokenCostArtifact
193
+ ? {
194
+ status: tokenCostArtifact.status,
195
+ readinessStatus: tokenCostArtifact.readinessStatus,
196
+ evidenceLevel: tokenCostArtifact.evidenceLevel,
197
+ evidenceMode: tokenCostSummaryArtifact?.evidenceMode || tokenCostArtifact.evidenceMode || "missing",
198
+ realUsageSamplesCount: tokenCostArtifact.realUsageSamplesCount || 0,
199
+ capturedUsageSamplesCount: tokenCostSummaryArtifact?.capturedUsageSamplesCount || tokenCostCaptureArtifact?.realUsageSamplesCount || 0,
200
+ confidence: tokenCostArtifact.confidence || "missing",
201
+ noExactSavingsClaim: tokenCostArtifact.noExactSavingsClaim === true,
202
+ noSavingsClaimUnlessMeasured: tokenCostSummaryArtifact?.noSavingsClaimUnlessMeasured === true,
203
+ redacted: true,
204
+ }
205
+ : null;
206
+
207
+ const proofOutcomeArtifact = safeReadJson(
208
+ path.join(cwd, ".claude/cco/orchestration/seamless-outcome/latest-proof-outcome-evidence.json")
209
+ );
210
+ const proofOutcomeSummary = proofOutcomeArtifact
211
+ ? {
212
+ status: proofOutcomeArtifact.status,
213
+ latestProofAvailable: proofOutcomeArtifact.latestProofAvailable === true,
214
+ realTaskProofCount: proofOutcomeArtifact.realTaskProofCount || 0,
215
+ simulatedProofDetected: proofOutcomeArtifact.simulatedProofDetected === true,
216
+ proofQuality: proofOutcomeArtifact.proofQuality || "missing",
217
+ rawContentExcluded: true,
218
+ redacted: true,
219
+ }
220
+ : null;
221
+
222
+ let failureRecoveryReadinessSummary = null;
223
+ let hookSafetyBoundarySummary = null;
224
+ let installAiReadinessSummary = null;
225
+ try {
226
+ const { buildFailureRecoveryReadiness } = require("./failure-recovery-readiness");
227
+ const { buildHookSafetyBoundaryReadiness } = require("./hook-safety-boundary-readiness");
228
+ const { buildInstallAiReadiness } = require("./install-ai-readiness");
229
+ const failureSurface = buildFailureRecoveryReadiness(cwd);
230
+ const hookSurface = buildHookSafetyBoundaryReadiness(cwd);
231
+ const installSurface = buildInstallAiReadiness(cwd);
232
+ failureRecoveryReadinessSummary = {
233
+ status: failureSurface.status,
234
+ receiptAvailable: failureSurface.receiptAvailable === true,
235
+ launchHardeningAvailable: failureSurface.launchHardeningAvailable === true,
236
+ safeNextAction: failureSurface.safeNextAction || null,
237
+ redacted: true,
238
+ };
239
+ hookSafetyBoundarySummary = {
240
+ status: hookSurface.status,
241
+ hookDoctorStatus: hookSurface.hookDoctorStatus,
242
+ approvalBoundaryExported: hookSurface.approvalBoundaryExported === true,
243
+ installPromptBoundariesAvailable: hookSurface.installPromptBoundariesAvailable === true,
244
+ redacted: true,
245
+ };
246
+ installAiReadinessSummary = {
247
+ status: installSurface.status,
248
+ approvalBoundariesAvailable: installSurface.approvalBoundariesAvailable === true,
249
+ firstValuePathAvailable: installSurface.firstValuePathAvailable === true,
250
+ recoveryPathAvailable: installSurface.recoveryPathAvailable === true,
251
+ redacted: true,
252
+ };
253
+ } catch {}
254
+
255
+ // Full readiness gate summary (PR #148)
256
+ const fullReadinessArtifact = safeReadJson(
257
+ path.join(cwd, ".claude/cco/orchestration/full-readiness/latest-gate.json")
258
+ );
259
+ const knownLimitationsArtifact = safeReadJson(
260
+ path.join(cwd, ".claude/cco/orchestration/full-readiness/latest-known-limitations.json")
261
+ );
262
+ const evidenceClosureArtifact = safeReadJson(
263
+ path.join(cwd, ".claude/cco/orchestration/full-readiness/latest-evidence-closure.json")
264
+ );
265
+ const fullReadinessSummary = fullReadinessArtifact
266
+ ? {
267
+ status: fullReadinessArtifact.status,
268
+ score: fullReadinessArtifact.score,
269
+ releaseCandidateStatus: fullReadinessArtifact.releaseCandidateStatus,
270
+ blockerCount: (fullReadinessArtifact.blockers || []).length,
271
+ warningCount: (fullReadinessArtifact.warnings || []).length,
272
+ recommendedNextPr: fullReadinessArtifact.recommendedNextPr,
273
+ noPublicLaunchClaim: true,
274
+ redacted: true,
275
+ }
276
+ : null;
277
+ const knownLimitationsSummary = knownLimitationsArtifact
278
+ ? {
279
+ totalLimitations: knownLimitationsArtifact.totalLimitations,
280
+ blockerLimitationsCount: knownLimitationsArtifact.blockerLimitationsCount,
281
+ overallImpact: knownLimitationsArtifact.overallImpact,
282
+ redacted: true,
283
+ }
284
+ : null;
285
+ const evidenceClosureSummary = evidenceClosureArtifact
286
+ ? {
287
+ status: evidenceClosureArtifact.status,
288
+ evidencePresentCount: evidenceClosureArtifact.evidencePresentCount,
289
+ evidenceMissingCount: evidenceClosureArtifact.evidenceMissingCount,
290
+ nextAction: evidenceClosureArtifact.nextAction,
291
+ rawContentExcluded: true,
292
+ redacted: true,
293
+ }
294
+ : null;
295
+
296
+ // Activation distribution readiness summary (PR #149)
297
+ let activationDistributionSummary = null;
298
+ try {
299
+ const { buildActivationDistributionSurface } = require("./activation-distribution-readiness");
300
+ const adrSurface = buildActivationDistributionSurface(cwd, {});
301
+ if (adrSurface.status !== "not_available") {
302
+ activationDistributionSummary = {
303
+ status: adrSurface.status,
304
+ score: adrSurface.score,
305
+ blockerCount: adrSurface.blockerCount,
306
+ warningCount: adrSurface.warningCount,
307
+ noPublicLaunchClaim: true,
308
+ redacted: true,
309
+ };
310
+ }
311
+ } catch {}
312
+
313
+ // Public distribution summary (PR #161)
314
+ let publicDistributionSummary = null;
315
+ try {
316
+ const gateArtifact = safeReadJson(
317
+ path.join(cwd, ".claude/cco/orchestration/public-distribution/latest-gate.json")
318
+ );
319
+ if (gateArtifact) {
320
+ publicDistributionSummary = {
321
+ status: gateArtifact.status,
322
+ score: gateArtifact.score,
323
+ publicInstallStatus: gateArtifact.publicInstallStatus,
324
+ localPackageStatus: gateArtifact.localPackageStatus,
325
+ packageContentStatus: gateArtifact.packageContentStatus,
326
+ claimSafetyStatus: gateArtifact.claimSafetyStatus,
327
+ provenanceStatus: gateArtifact.provenanceStatus,
328
+ blockerCount: gateArtifact.blockerCount,
329
+ warningCount: gateArtifact.warningCount,
330
+ noPublicLaunchClaim: true,
331
+ redacted: true,
332
+ };
333
+ }
334
+ } catch {}
335
+
336
+ // Adapter technical readiness summary (PR #162)
337
+ let adapterTechnicalReadinessSummary = null;
338
+ try {
339
+ const adapterGateArtifact = safeReadJson(
340
+ path.join(cwd, ".claude/cco/orchestration/adapter-readiness/latest-technical-gate.json")
341
+ );
342
+ if (adapterGateArtifact) {
343
+ adapterTechnicalReadinessSummary = {
344
+ status: adapterGateArtifact.status,
345
+ score: adapterGateArtifact.score,
346
+ verdict: adapterGateArtifact.verdict,
347
+ blockerCount: adapterGateArtifact.blockerCount || 0,
348
+ warningCount: adapterGateArtifact.warningCount || 0,
349
+ browserRequired: false,
350
+ noBrowserLaunch: true,
351
+ noPublicLaunchClaim: true,
352
+ redacted: true,
353
+ };
354
+ }
355
+ } catch {}
356
+
357
+ // Host context summary (PR #163/#164) — compact, no secrets, no env dumps
358
+ // Contract: avorelo.supportBundleHostContext.v1
359
+ let hostContext = null;
360
+ try {
361
+ const adapterReadinessArtifact = safeReadJson(
362
+ path.join(cwd, ".claude/cco/orchestration/adapter-readiness/latest-readiness.json")
363
+ );
364
+ const hostMatrixArtifact = safeReadJson(
365
+ path.join(cwd, ".claude/cco/orchestration/adapter-readiness/latest-host-capability-matrix.json")
366
+ );
367
+ const installPlanArtifact = safeReadJson(
368
+ path.join(cwd, ".claude/cco/orchestration/adapter-readiness/latest-install-plan.json")
369
+ );
370
+ const browserPreflightArtifact = safeReadJson(
371
+ path.join(cwd, ".claude/cco/orchestration/adapter-readiness/latest-browser-proof-preflight.json")
372
+ );
373
+ const safetyBoundariesArtifact = safeReadJson(
374
+ path.join(cwd, ".claude/cco/orchestration/adapter-readiness/latest-adapter-safety-boundaries.json")
375
+ );
376
+
377
+ hostContext = {
378
+ contract: "avorelo.supportBundleHostContext.v1",
379
+ generatedAt: nowIso(),
380
+ // Adapter readiness (7-host detection + scoring)
381
+ adapterReadiness: adapterReadinessArtifact ? {
382
+ status: adapterReadinessArtifact.status,
383
+ score: adapterReadinessArtifact.score,
384
+ verdict: adapterReadinessArtifact.verdict,
385
+ readyHosts: adapterReadinessArtifact.readyHosts || [],
386
+ partialHosts: adapterReadinessArtifact.partialHosts || [],
387
+ unsupportedHosts: adapterReadinessArtifact.unsupportedHosts || [],
388
+ blockerCount: adapterReadinessArtifact.blockers ? adapterReadinessArtifact.blockers.length : 0,
389
+ warningCount: adapterReadinessArtifact.warnings ? adapterReadinessArtifact.warnings.length : 0,
390
+ approvalRequiredBeforeApply: true,
391
+ noWorksEverywhereClaim: true,
392
+ } : null,
393
+ // Host capability matrix (which hosts detected, per-host capabilities)
394
+ hostCapabilityMatrix: hostMatrixArtifact ? {
395
+ status: hostMatrixArtifact.status,
396
+ detectedCount: hostMatrixArtifact.detectedCount || 0,
397
+ primaryHost: hostMatrixArtifact.primaryHost || "none",
398
+ detectedHosts: hostMatrixArtifact.detectedHosts || [],
399
+ fullValueHosts: hostMatrixArtifact.fullValueHosts || [],
400
+ partialValueHosts: hostMatrixArtifact.partialValueHosts || [],
401
+ blockerCount: hostMatrixArtifact.blockerCount || 0,
402
+ warningCount: hostMatrixArtifact.warningCount || 0,
403
+ } : null,
404
+ // Cross-host install plan (per-host install paths and approval boundaries)
405
+ crossHostInstallPlan: installPlanArtifact ? {
406
+ status: installPlanArtifact.status,
407
+ supportedHostIds: installPlanArtifact.supportedHostIds || [],
408
+ unsupportedHostIds: installPlanArtifact.unsupportedHostIds || [],
409
+ blockerCount: installPlanArtifact.blockerCount || 0,
410
+ warningCount: installPlanArtifact.warningCount || 0,
411
+ noWorksEverywhereClaim: installPlanArtifact.noWorksEverywhereClaim === true,
412
+ } : null,
413
+ // Browser proof preflight (preflight only — no browser launched)
414
+ browserProofPreflight: browserPreflightArtifact ? {
415
+ status: browserPreflightArtifact.status,
416
+ localFirstPathVerified: browserPreflightArtifact.localFirstPathVerified === true,
417
+ browserRequired: false,
418
+ noBrowserLaunch: true,
419
+ blockerCount: browserPreflightArtifact.blockerCount || 0,
420
+ warningCount: browserPreflightArtifact.warningCount || 0,
421
+ } : null,
422
+ // Adapter safety boundaries (no tokens, no auto-apply, MCP isolation)
423
+ safetyBoundaries: safetyBoundariesArtifact ? {
424
+ status: safetyBoundariesArtifact.status,
425
+ approvalRequiredBeforeApply: true,
426
+ blockerCount: safetyBoundariesArtifact.blockerCount || 0,
427
+ warningCount: safetyBoundariesArtifact.warningCount || 0,
428
+ } : null,
429
+ // Explicit contract markers — support is per-host, not universal
430
+ noWorksEverywhereClaim: true,
431
+ hostSupportIsPerEnvironment: true,
432
+ redacted: true,
433
+ };
434
+ } catch {}
435
+
436
+ // Design partner feedback summary (PR #160)
437
+ let designPartnerFeedbackSummary = null;
438
+ try {
439
+ const { buildDesignPartnerFeedbackSummary } = require("./design-partner-feedback");
440
+ const dpSummary = buildDesignPartnerFeedbackSummary(cwd, {});
441
+ designPartnerFeedbackSummary = {
442
+ status: dpSummary.status,
443
+ qualifiedSessionCount: dpSummary.qualifiedSessionCount,
444
+ blockerCount: dpSummary.blockerCount,
445
+ partnerAliasCount: dpSummary.partnerAliasCount,
446
+ noPublicLaunchClaim: true,
447
+ redacted: true,
448
+ };
449
+ } catch {}
450
+
451
+ // Product learning events (count only)
452
+ const eventCount = countJsonlLines(cwd, ".claude/cco/events/product-learning.jsonl");
453
+
454
+ // Node/platform info
455
+ const platform = platformInfo();
456
+
457
+ // Available artifacts count
458
+ const available = artifacts.filter((a) => a.available).length;
459
+ const missing = artifacts.filter((a) => !a.available).length;
460
+
461
+ const bundle = {
462
+ contract: CONTRACT,
463
+ schemaVersion: SCHEMA_VERSION,
464
+ createdAt: nowIso(),
465
+ status: available > 0 ? "ready" : "empty",
466
+ summary: {
467
+ artifactsAvailable: available,
468
+ artifactsMissing: missing,
469
+ feedbackItems: feedbackCount,
470
+ productLearningEvents: eventCount,
471
+ },
472
+ platform,
473
+ artifacts,
474
+ feedbackSummary,
475
+ promptReadinessSummary,
476
+ intelligenceSummary,
477
+ feedbackIntelligenceSummary,
478
+ tokenCostEvidenceSummary,
479
+ proofOutcomeSummary,
480
+ failureRecoveryReadinessSummary,
481
+ hookSafetyBoundarySummary,
482
+ installAiReadinessSummary,
483
+ fullReadinessSummary,
484
+ knownLimitationsSummary,
485
+ activationDistributionSummary,
486
+ publicDistributionSummary,
487
+ adapterTechnicalReadinessSummary,
488
+ hostContext,
489
+ designPartnerFeedbackSummary,
490
+ evidenceClosureSummary,
491
+ note: [
492
+ "This bundle contains only artifact references and status summaries.",
493
+ "No raw code, prompts, secrets, PII, or config dumps are included.",
494
+ "Share this file with support if requested.",
495
+ ],
496
+ redacted: true,
497
+ };
498
+
499
+ return bundle;
500
+ }
501
+
502
+ // ── Write bundle ──────────────────────────────────────────────────────────────
503
+
504
+ function writeSupportBundle(cwd, bundle) {
505
+ try {
506
+ ensureCcoDirs(cwd);
507
+ const dirAbs = path.join(cwd, BUNDLE_DIR_REL);
508
+ if (!fs.existsSync(dirAbs)) fs.mkdirSync(dirAbs, { recursive: true });
509
+ const bundleAbs = path.join(cwd, BUNDLE_REL);
510
+ fs.writeFileSync(bundleAbs, JSON.stringify(bundle, null, 2), "utf8");
511
+ return bundleAbs;
512
+ } catch {
513
+ return null;
514
+ }
515
+ }
516
+
517
+ // ── Generate bundle ───────────────────────────────────────────────────────────
518
+
519
+ function generateSupportBundle(cwd, options = {}) {
520
+ const bundle = buildSupportBundle(cwd, options);
521
+ const written = writeSupportBundle(cwd, bundle);
522
+
523
+ try {
524
+ appendProductLearningEvent(cwd, {
525
+ eventName: "support_bundle_generated",
526
+ status: bundle.status,
527
+ artifactsAvailable: bundle.summary.artifactsAvailable,
528
+ artifactsMissing: bundle.summary.artifactsMissing,
529
+ });
530
+ } catch {}
531
+
532
+ return { ...bundle, artifactPath: written ? BUNDLE_REL : null };
533
+ }
534
+
535
+ // ── Format text ───────────────────────────────────────────────────────────────
536
+
537
+ function formatSupportBundleText(bundle) {
538
+ const lines = [];
539
+ lines.push(`Support bundle: ${bundle.status}`);
540
+ lines.push(` Artifacts: ${bundle.summary.artifactsAvailable} available, ${bundle.summary.artifactsMissing} missing`);
541
+ lines.push(` Feedback items: ${bundle.summary.feedbackItems}`);
542
+ lines.push(` Product learning events: ${bundle.summary.productLearningEvents}`);
543
+ lines.push(` Platform: ${bundle.platform.platform} / Node ${bundle.platform.node}`);
544
+ lines.push("");
545
+ lines.push("Artifact status:");
546
+ (bundle.artifacts || []).forEach((a) => {
547
+ const icon = a.available ? "+" : "-";
548
+ const statusStr = a.status ? ` [${a.status}]` : "";
549
+ lines.push(` ${icon} ${a.label}${statusStr}`);
550
+ });
551
+ lines.push("");
552
+ lines.push(bundle.note ? bundle.note.join(" ") : "");
553
+ if (bundle.artifactPath) lines.push(`\nBundle written: ${bundle.artifactPath}`);
554
+ return lines.join("\n");
555
+ }
556
+
557
+ function buildSupportBundleSurface(cwd, options) {
558
+ const bundle = buildSupportBundle(cwd, options);
559
+ const written = writeSupportBundle(cwd, bundle);
560
+ return {
561
+ status: bundle.status,
562
+ redacted: bundle.redacted,
563
+ noWorksEverywhereClaim: bundle.noWorksEverywhereClaim,
564
+ artifactPath: written ? BUNDLE_REL : null,
565
+ written: !!written,
566
+ };
567
+ }
568
+
569
+ module.exports = {
570
+ CONTRACT,
571
+ SCHEMA_VERSION,
572
+ BUNDLE_REL,
573
+ buildSupportBundle,
574
+ writeSupportBundle,
575
+ generateSupportBundle,
576
+ buildSupportBundleSurface,
577
+ formatSupportBundleText,
578
+ };