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,165 @@
1
+ "use strict";
2
+
3
+ const fs = require("fs");
4
+ const path = require("path");
5
+ const crypto = require("crypto");
6
+ const { ensureCcoDirs } = require("../fsx");
7
+
8
+ const ORCHESTRATION_ROOT = path.join(".claude", "cco", "orchestration");
9
+
10
+ function rootPath(cwd, ...parts) {
11
+ return path.join(cwd, ORCHESTRATION_ROOT, ...parts);
12
+ }
13
+
14
+ function ensureOrchestrationDirs(cwd) {
15
+ ensureCcoDirs(cwd);
16
+ [
17
+ rootPath(cwd),
18
+ rootPath(cwd, "runs"),
19
+ rootPath(cwd, "handoffs"),
20
+ rootPath(cwd, "host-contracts"),
21
+ ].forEach((dir) => fs.mkdirSync(dir, { recursive: true }));
22
+ }
23
+
24
+ function safeReadJson(absPath, fallback = null) {
25
+ try {
26
+ return JSON.parse(fs.readFileSync(absPath, "utf8").replace(/^\uFEFF/, ""));
27
+ } catch {
28
+ return fallback;
29
+ }
30
+ }
31
+
32
+ function safeReadJsonRel(cwd, relPath, fallback = null) {
33
+ return safeReadJson(path.join(cwd, relPath), fallback);
34
+ }
35
+
36
+ function writeJson(absPath, value) {
37
+ fs.mkdirSync(path.dirname(absPath), { recursive: true });
38
+ fs.writeFileSync(absPath, JSON.stringify(value, null, 2), "utf8");
39
+ }
40
+
41
+ function writeText(absPath, value) {
42
+ fs.mkdirSync(path.dirname(absPath), { recursive: true });
43
+ fs.writeFileSync(absPath, String(value || ""), "utf8");
44
+ }
45
+
46
+ function relativeFromCwd(cwd, absPath) {
47
+ return path.relative(cwd, absPath).replace(/\\/g, "/");
48
+ }
49
+
50
+ function createRunId() {
51
+ return `orch-${Date.now()}-${crypto.randomBytes(3).toString("hex")}`;
52
+ }
53
+
54
+ function getCurrentPaths(cwd) {
55
+ ensureOrchestrationDirs(cwd);
56
+ return {
57
+ root: rootPath(cwd),
58
+ inventory: rootPath(cwd, "inventory.json"),
59
+ inventoryRefreshLock: rootPath(cwd, "inventory-refresh.lock.json"),
60
+ workerFailures: rootPath(cwd, "worker-failures.json"),
61
+ currentTask: rootPath(cwd, "current-task.md"),
62
+ currentRouteJson: rootPath(cwd, "current-route.json"),
63
+ currentRouteMd: rootPath(cwd, "current-route.md"),
64
+ currentProofJson: rootPath(cwd, "current-proof.json"),
65
+ currentProofMd: rootPath(cwd, "current-proof.md"),
66
+ lock: rootPath(cwd, "run.lock.json"),
67
+ hostContractsDir: rootPath(cwd, "host-contracts"),
68
+ };
69
+ }
70
+
71
+ function getRunPaths(cwd, runId) {
72
+ ensureOrchestrationDirs(cwd);
73
+ const dir = rootPath(cwd, "runs", runId);
74
+ return {
75
+ dir,
76
+ task: path.join(dir, "task.json"),
77
+ route: path.join(dir, "route.json"),
78
+ executionLog: path.join(dir, "execution-log.jsonl"),
79
+ diffSummary: path.join(dir, "diff-summary.md"),
80
+ verification: path.join(dir, "verification.json"),
81
+ proof: path.join(dir, "proof.json"),
82
+ };
83
+ }
84
+
85
+ function appendJsonl(absPath, entry) {
86
+ fs.mkdirSync(path.dirname(absPath), { recursive: true });
87
+ fs.appendFileSync(absPath, `${JSON.stringify(entry)}\n`, "utf8");
88
+ }
89
+
90
+ function readLatestRunProofs(cwd, limit = 20) {
91
+ const runsDir = rootPath(cwd, "runs");
92
+ try {
93
+ return fs.readdirSync(runsDir)
94
+ .map((name) => {
95
+ const proofPath = path.join(runsDir, name, "proof.json");
96
+ const stat = fs.existsSync(proofPath) ? fs.statSync(proofPath) : null;
97
+ if (!stat) return null;
98
+ return {
99
+ name,
100
+ proofPath,
101
+ mtimeMs: stat.mtimeMs,
102
+ proof: safeReadJson(proofPath, null),
103
+ };
104
+ })
105
+ .filter(Boolean)
106
+ .sort((a, b) => b.mtimeMs - a.mtimeMs)
107
+ .slice(0, limit);
108
+ } catch {
109
+ return [];
110
+ }
111
+ }
112
+
113
+ function tryAcquireRunLock(cwd, metadata = {}, options = {}) {
114
+ const paths = getCurrentPaths(cwd);
115
+ const now = new Date();
116
+ const timeoutMs = Math.max(60_000, Number(options.timeoutMs || 20 * 60 * 1000));
117
+ const existing = safeReadJson(paths.lock, null);
118
+ if (existing && existing.acquiredAt) {
119
+ const ageMs = now.getTime() - Date.parse(existing.acquiredAt);
120
+ if (Number.isFinite(ageMs) && ageMs < timeoutMs) {
121
+ return {
122
+ ok: false,
123
+ reason: "concurrent_run_active",
124
+ lock: existing,
125
+ };
126
+ }
127
+ }
128
+
129
+ const lock = {
130
+ lockVersion: 1,
131
+ runId: metadata.runId || createRunId(),
132
+ acquiredAt: now.toISOString(),
133
+ task: metadata.task || null,
134
+ surface: metadata.surface || null,
135
+ };
136
+ writeJson(paths.lock, lock);
137
+ return { ok: true, lock };
138
+ }
139
+
140
+ function releaseRunLock(cwd, runId) {
141
+ const paths = getCurrentPaths(cwd);
142
+ const current = safeReadJson(paths.lock, null);
143
+ if (!current) return;
144
+ if (runId && current.runId && current.runId !== runId) return;
145
+ try {
146
+ fs.unlinkSync(paths.lock);
147
+ } catch {}
148
+ }
149
+
150
+ module.exports = {
151
+ ORCHESTRATION_ROOT,
152
+ ensureOrchestrationDirs,
153
+ safeReadJson,
154
+ safeReadJsonRel,
155
+ writeJson,
156
+ writeText,
157
+ relativeFromCwd,
158
+ createRunId,
159
+ getCurrentPaths,
160
+ getRunPaths,
161
+ appendJsonl,
162
+ readLatestRunProofs,
163
+ tryAcquireRunLock,
164
+ releaseRunLock,
165
+ };
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+
3
+ const fs = require("fs");
4
+ const path = require("path");
5
+ const { spawnSync } = require("child_process");
6
+
7
+ function safeReadPackageJson(cwd) {
8
+ try {
9
+ return JSON.parse(fs.readFileSync(path.join(cwd, "package.json"), "utf8"));
10
+ } catch {
11
+ return {};
12
+ }
13
+ }
14
+
15
+ function defaultRunner(command, args, options = {}) {
16
+ return spawnSync(command, args, {
17
+ cwd: options.cwd,
18
+ env: options.env || process.env,
19
+ encoding: "utf8",
20
+ timeout: options.timeoutMs || 30_000,
21
+ });
22
+ }
23
+
24
+ function inferVerificationCommands(cwd, taskContext) {
25
+ const pkg = safeReadPackageJson(cwd);
26
+ const scripts = pkg.scripts || {};
27
+ const commands = [
28
+ {
29
+ id: "git_diff",
30
+ command: "git",
31
+ args: ["diff", "--stat", "--no-ext-diff"],
32
+ required: true,
33
+ purpose: "diff",
34
+ },
35
+ ];
36
+
37
+ if (taskContext.classification.taskType === "docs" && taskContext.classification.risk === "low") {
38
+ return commands;
39
+ }
40
+
41
+ if (typeof scripts.test === "string") {
42
+ commands.push({
43
+ id: "npm_test",
44
+ command: "npm",
45
+ args: ["test"],
46
+ required: false,
47
+ purpose: "tests",
48
+ });
49
+ }
50
+
51
+ if (typeof scripts.build === "string" && ["implementation", "ui", "cli", "build"].includes(taskContext.classification.taskType)) {
52
+ commands.push({
53
+ id: "npm_build",
54
+ command: "npm",
55
+ args: ["run", "build"],
56
+ required: false,
57
+ purpose: "build",
58
+ });
59
+ }
60
+
61
+ if (typeof scripts["test:brand"] === "string") {
62
+ commands.push({
63
+ id: "npm_test_brand",
64
+ command: "npm",
65
+ args: ["run", "test:brand"],
66
+ required: false,
67
+ purpose: "brand",
68
+ });
69
+ }
70
+
71
+ return commands;
72
+ }
73
+
74
+ function summarizeCommand(result) {
75
+ return {
76
+ status: result.status,
77
+ stdout: String(result.stdout || "").slice(0, 4000),
78
+ stderr: String(result.stderr || "").slice(0, 4000),
79
+ };
80
+ }
81
+
82
+ function verifyWorkspace(cwd, taskContext, options = {}) {
83
+ const commands = options.commands || inferVerificationCommands(cwd, taskContext);
84
+ if (!commands.length) {
85
+ return {
86
+ status: "insufficient",
87
+ commands: [],
88
+ reason: "No deterministic verification commands were inferred.",
89
+ };
90
+ }
91
+
92
+ const runner = options.commandRunner || defaultRunner;
93
+ const results = [];
94
+ let failures = 0;
95
+ let ranMeaningfulCheck = false;
96
+
97
+ commands.forEach((entry) => {
98
+ const outcome = runner(entry.command, entry.args, {
99
+ cwd,
100
+ env: options.env || process.env,
101
+ timeoutMs: options.timeoutMs || 30_000,
102
+ });
103
+ const summarized = summarizeCommand(outcome);
104
+ results.push({
105
+ ...entry,
106
+ ...summarized,
107
+ });
108
+ if (entry.id !== "git_diff") ranMeaningfulCheck = true;
109
+ if (Number(outcome.status) !== 0 && entry.id !== "git_diff") failures += 1;
110
+ });
111
+
112
+ if (failures > 0) {
113
+ return {
114
+ status: "failed",
115
+ commands: results,
116
+ reason: "One or more deterministic verification commands failed.",
117
+ };
118
+ }
119
+
120
+ if (!ranMeaningfulCheck) {
121
+ return {
122
+ status: "insufficient",
123
+ commands: results,
124
+ reason: "Only diff-level verification was available.",
125
+ };
126
+ }
127
+
128
+ return {
129
+ status: "passed",
130
+ commands: results,
131
+ reason: "Deterministic verification commands passed.",
132
+ };
133
+ }
134
+
135
+ module.exports = {
136
+ inferVerificationCommands,
137
+ verifyWorkspace,
138
+ };
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * CJS bridge for Avorelo output profiles.
5
+ *
6
+ * Mirrors src/output_profiles/ (the canonical TS module).
7
+ * Used by hook scripts which are CJS and cannot import TS directly.
8
+ *
9
+ * If you change rendering logic, update src/output_profiles/renderers.ts
10
+ * and this file together. The integration test verifies parity.
11
+ */
12
+
13
+ const fs = require("fs");
14
+ const path = require("path");
15
+ const os = require("os");
16
+
17
+ const VALID_PROFILES = ["terse", "standard", "deep"];
18
+
19
+ function resolveOutputProfile(envValue) {
20
+ if (!envValue) return "standard";
21
+ const normalized = String(envValue).trim().toLowerCase();
22
+ if (VALID_PROFILES.includes(normalized)) return normalized;
23
+ return "standard";
24
+ }
25
+
26
+ function renderSessionBrief({ toolDisplayName, projectPath, nativeGuidanceSurfaces, profile, continuity, carryForwardAvailable }) {
27
+ // Only show continuity re-entry if carry-forward is NOT available
28
+ // Carry-forward provides more specific context (tool history, age, etc.)
29
+ const showContinuityReEntry = continuity?.hasPriorSession && !carryForwardAvailable;
30
+ const reEntryInfo = showContinuityReEntry ? ` (Session re-entry #${continuity.reEntryCount + 1})` : "";
31
+
32
+ if (profile === "terse") {
33
+ return [
34
+ `# Avorelo Active — ${toolDisplayName}${reEntryInfo}`,
35
+ "",
36
+ `- Project: \`${projectPath}\``,
37
+ `- Surfaces: ${nativeGuidanceSurfaces.join(", ")}`,
38
+ ].join("\n");
39
+ }
40
+
41
+ const reEntrySection = showContinuityReEntry ? [
42
+ "",
43
+ `> **Re-entry session** — Continuing work from earlier session. Run \`avorelo status\` to see progress and next best action.`
44
+ ] : [];
45
+
46
+ return [
47
+ `# Avorelo Is Active In This ${toolDisplayName} Session${reEntryInfo}`,
48
+ "",
49
+ `- Project path: \`${projectPath}\``,
50
+ `- Avorelo adds: launch context, tool-specific project guidance, beta-pack defaults, and starter guidance`,
51
+ `- Native guidance surfaces: ${nativeGuidanceSurfaces.join(", ")}`,
52
+ "- Avorelo does not keep a hidden background runtime after launch",
53
+ "- First move: start working in the active repo without re-explaining the Avorelo project truth",
54
+ ...reEntrySection,
55
+ ].join("\n");
56
+ }
57
+
58
+ function renderKickoffPrompt({ toolDisplayName, projectPath, nativeGuidanceSurfaces, profile }) {
59
+ if (profile === "terse") {
60
+ return [
61
+ `Avorelo active. ${toolDisplayName}, project: ${projectPath}.`,
62
+ `Prepared: ${nativeGuidanceSurfaces.join(", ")}.`,
63
+ "Start with one concrete first move. Ask what to do first.",
64
+ ].join("\n");
65
+ }
66
+
67
+ return [
68
+ `Avorelo is active for this ${toolDisplayName} session.`,
69
+ `Project path: ${projectPath}.`,
70
+ `Avorelo prepared the project context, ${nativeGuidanceSurfaces.join(", ")}, the Avorelo beta-pack defaults, and this kickoff prompt.`,
71
+ "Avorelo is not a hidden background runtime after launch.",
72
+ "Please start with a short founder handoff that says what Avorelo prepared, suggests one concrete first move in this repo, and ends with one short question asking what they want to do first.",
73
+ ].join("\n");
74
+ }
75
+
76
+ function renderBannerLines({ projectPath, sessionBriefPath, profile }) {
77
+ if (profile === "terse") {
78
+ return [
79
+ "",
80
+ `Avorelo active. Project: ${projectPath}`,
81
+ "",
82
+ ];
83
+ }
84
+
85
+ return [
86
+ "",
87
+ "Avorelo is active for this session.",
88
+ `Project path: ${projectPath}`,
89
+ "Avorelo added: launcher + project context + starter guidance",
90
+ "Avorelo is not running silently in the background after launch.",
91
+ "Start with the Avorelo kickoff already loaded below.",
92
+ ...(sessionBriefPath ? [`Session brief: ${sessionBriefPath}`] : []),
93
+ "",
94
+ ];
95
+ }
96
+
97
+ function renderSystemPromptProfilePolicy(profile) {
98
+ if (profile === "standard") return "";
99
+
100
+ if (profile === "terse") {
101
+ return [
102
+ "",
103
+ "Output profile: terse. Reduce filler phrasing and redundant recaps.",
104
+ "Preserve verbatim: code blocks, shell commands, file paths, URLs, IDs, dates, versions, env vars, canonical fields, blocked reasons, recovery steps, rollback instructions, evidence, uncertainty statements, safety warnings.",
105
+ ].join("\n");
106
+ }
107
+
108
+ return [
109
+ "",
110
+ "Output profile: deep. Provide full rationale, tradeoff analysis, and discovery context when relevant.",
111
+ "Preserve verbatim: code blocks, shell commands, file paths, URLs, IDs, dates, versions, env vars, canonical fields, blocked reasons, recovery steps, rollback instructions, evidence, uncertainty statements, safety warnings.",
112
+ ].join("\n");
113
+ }
114
+
115
+ const TELEMETRY_DIR = path.join(os.homedir(), ".wuz", "runtime", "telemetry");
116
+ const TELEMETRY_FILE = path.join(TELEMETRY_DIR, "output-profile.log");
117
+
118
+ function writeProfileTelemetry(record) {
119
+ try {
120
+ fs.mkdirSync(TELEMETRY_DIR, { recursive: true });
121
+ fs.appendFileSync(TELEMETRY_FILE, JSON.stringify(record) + "\n", "utf8");
122
+ } catch {
123
+ // Best-effort only. Never block launch.
124
+ }
125
+ }
126
+
127
+ function buildTelemetryRecord({ profile, surface, inputText, outputText }) {
128
+ return {
129
+ ts: new Date().toISOString(),
130
+ profile,
131
+ surface,
132
+ bytes_in: Buffer.byteLength(inputText, "utf8"),
133
+ bytes_out: Buffer.byteLength(outputText, "utf8"),
134
+ };
135
+ }
136
+
137
+ module.exports = {
138
+ VALID_PROFILES,
139
+ resolveOutputProfile,
140
+ renderSessionBrief,
141
+ renderKickoffPrompt,
142
+ renderBannerLines,
143
+ renderSystemPromptProfilePolicy,
144
+ writeProfileTelemetry,
145
+ buildTelemetryRecord,
146
+ };