avorelo 0.3.8 → 0.4.0-rc.2

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 (394) hide show
  1. package/LICENSE +16 -23
  2. package/README.md +62 -72
  3. package/bin/avorelo +9 -0
  4. package/package.json +147 -139
  5. package/scripts/README.md +40 -0
  6. package/scripts/avorelo-session-collision-guard.js +540 -0
  7. package/scripts/avorelo-workstream-preflight.js +918 -0
  8. package/scripts/cco-dashboard.js +346 -0
  9. package/scripts/cco-posttooluse.js +504 -0
  10. package/scripts/cco-pretooluse.js +381 -0
  11. package/scripts/cco-status.js +540 -0
  12. package/scripts/cco-stop.js +77 -0
  13. package/scripts/cco-userprompt-submit.js +83 -0
  14. package/scripts/lib/activation/account-state.js +37 -0
  15. package/scripts/lib/activation/activate-command.js +114 -0
  16. package/scripts/lib/activation/activation-runner.js +607 -0
  17. package/scripts/lib/activation/activation-self-healing.js +481 -0
  18. package/scripts/lib/activation/activation-state.js +96 -0
  19. package/scripts/lib/activation/activation-summary.js +241 -0
  20. package/scripts/lib/activation/adapters/claude-code.js +77 -0
  21. package/scripts/lib/activation/adapters/codex-cli.js +52 -0
  22. package/scripts/lib/activation/adapters/cursor.js +37 -0
  23. package/scripts/lib/activation/adapters/github-agent.js +39 -0
  24. package/scripts/lib/activation/adapters/terminal.js +42 -0
  25. package/scripts/lib/activation/adapters/vscode.js +39 -0
  26. package/scripts/lib/activation/adapters/windsurf.js +37 -0
  27. package/scripts/lib/activation/ai-surface-detector.js +151 -0
  28. package/scripts/lib/activation/connect-account.js +145 -0
  29. package/scripts/lib/activation/detect-environment.js +75 -0
  30. package/scripts/lib/activation/detect-hosts.js +62 -0
  31. package/scripts/lib/activation/format-activation-output.js +109 -0
  32. package/scripts/lib/activation/next-action.js +43 -0
  33. package/scripts/lib/activation/repair-engine.js +219 -0
  34. package/scripts/lib/activation/run-entry.js +346 -0
  35. package/scripts/lib/activation-distribution-readiness.js +507 -0
  36. package/scripts/lib/adapter-conformance.js +176 -0
  37. package/scripts/lib/adapter-readiness.js +428 -0
  38. package/scripts/lib/adapter-safety-boundaries.js +335 -0
  39. package/scripts/lib/adapter-technical-readiness-gate.js +205 -0
  40. package/scripts/lib/agent-access-governance.js +455 -0
  41. package/scripts/lib/agent-activation-readiness.js +878 -0
  42. package/scripts/lib/agent-enforcement.js +765 -0
  43. package/scripts/lib/agent-evolution-loop.js +479 -0
  44. package/scripts/lib/agent-policy-profile.js +210 -0
  45. package/scripts/lib/agent-security/action-evaluator.js +507 -0
  46. package/scripts/lib/agent-security/adapter-registry.js +98 -0
  47. package/scripts/lib/agent-security/auto-policy.js +139 -0
  48. package/scripts/lib/agent-security/bounded-scan.js +93 -0
  49. package/scripts/lib/agent-security/enforcement-adapter.js +174 -0
  50. package/scripts/lib/agent-security/enforcement-engine.js +1129 -0
  51. package/scripts/lib/agent-security/file-write-adapter.js +183 -0
  52. package/scripts/lib/agent-security/file-write-rules.js +178 -0
  53. package/scripts/lib/agent-security/index.js +3342 -0
  54. package/scripts/lib/agent-security/instruction-risk.js +181 -0
  55. package/scripts/lib/agent-security/mcp-action-adapter.js +185 -0
  56. package/scripts/lib/agent-security/mcp-action-rules.js +184 -0
  57. package/scripts/lib/agent-security/package-action-adapter.js +175 -0
  58. package/scripts/lib/agent-security/package-action-rules.js +233 -0
  59. package/scripts/lib/agent-security/performance.js +148 -0
  60. package/scripts/lib/agent-security/permission-minimizer.js +403 -0
  61. package/scripts/lib/agent-security/scan-cache.js +74 -0
  62. package/scripts/lib/agent-security/source-trust.js +146 -0
  63. package/scripts/lib/ai-efficiency-dogfood-pack.js +437 -0
  64. package/scripts/lib/ai-efficiency-eval.js +207 -0
  65. package/scripts/lib/ai-efficiency-guard-contract.js +209 -0
  66. package/scripts/lib/ai-efficiency-measured-value.js +106 -0
  67. package/scripts/lib/ai-install-prompt.js +293 -0
  68. package/scripts/lib/ai-task-inference.js +155 -0
  69. package/scripts/lib/ai-value-ledger.js +121 -0
  70. package/scripts/lib/ai-value-proof-table.js +151 -0
  71. package/scripts/lib/ai-work-efficiency-routing.js +623 -0
  72. package/scripts/lib/ai-workspace-hygiene.js +1499 -0
  73. package/scripts/lib/alpha-activation.js +520 -0
  74. package/scripts/lib/alpha-feedback.js +263 -0
  75. package/scripts/lib/alpha-readiness-gate.js +332 -0
  76. package/scripts/lib/anti-gaming.js +169 -0
  77. package/scripts/lib/artifact-health.js +431 -0
  78. package/scripts/lib/artifact-receipt-hygiene.js +619 -0
  79. package/scripts/lib/attribution.js +180 -0
  80. package/scripts/lib/audit.js +289 -0
  81. package/scripts/lib/avorelo-skill-registry.js +810 -0
  82. package/scripts/lib/batch-jobs.js +71 -0
  83. package/scripts/lib/brain-pack.js +578 -0
  84. package/scripts/lib/brand-boundary.js +424 -0
  85. package/scripts/lib/brand.js +74 -0
  86. package/scripts/lib/browser-capability.js +1048 -0
  87. package/scripts/lib/browser-proof-governed-workflow.js +1020 -0
  88. package/scripts/lib/browser-proof-preflight.js +321 -0
  89. package/scripts/lib/cache-readiness.js +296 -0
  90. package/scripts/lib/canonical-reentry.js +162 -0
  91. package/scripts/lib/capability-contract-validator.js +177 -0
  92. package/scripts/lib/capability-hygiene.js +504 -0
  93. package/scripts/lib/capability-intake-quarantine.js +789 -0
  94. package/scripts/lib/capability-kernel-registry.js +566 -0
  95. package/scripts/lib/capability-kernel.js +202 -0
  96. package/scripts/lib/capability-manifest.js +255 -0
  97. package/scripts/lib/capability-outcome-normalizer.js +104 -0
  98. package/scripts/lib/capability-packs.js +314 -0
  99. package/scripts/lib/capability-recommender.js +513 -0
  100. package/scripts/lib/capability-registry.js +1062 -0
  101. package/scripts/lib/carry-forward-surfacing.js +194 -0
  102. package/scripts/lib/ccusage-adapter.js +188 -0
  103. package/scripts/lib/claude-session-evidence/index.js +1027 -0
  104. package/scripts/lib/cli-output-sanitizer.js +118 -0
  105. package/scripts/lib/company-loop.js +1149 -0
  106. package/scripts/lib/config.js +641 -0
  107. package/scripts/lib/context-acquisition-plan.js +359 -0
  108. package/scripts/lib/context-authority-rules.js +138 -0
  109. package/scripts/lib/context-budget-guard.js +170 -0
  110. package/scripts/lib/context-budget-scanner.js +257 -0
  111. package/scripts/lib/context-budget.js +167 -0
  112. package/scripts/lib/context-claim-safety.js +116 -0
  113. package/scripts/lib/context-compiler.js +236 -0
  114. package/scripts/lib/context-optimizer.js +715 -0
  115. package/scripts/lib/context-packet.js +121 -0
  116. package/scripts/lib/context-receipt.js +57 -0
  117. package/scripts/lib/context-reduction-plan.js +179 -0
  118. package/scripts/lib/context-safety.js +88 -0
  119. package/scripts/lib/context-savings-engine.js +158 -0
  120. package/scripts/lib/context-source-registry.js +393 -0
  121. package/scripts/lib/context-task-profiles.js +147 -0
  122. package/scripts/lib/cost-abuse-guard.js +975 -0
  123. package/scripts/lib/cost-evidence.js +287 -0
  124. package/scripts/lib/cost-to-outcome-signals.js +639 -0
  125. package/scripts/lib/cross-host-install-plan.js +308 -0
  126. package/scripts/lib/cross-host-install-readiness.js +242 -0
  127. package/scripts/lib/cross-host-value-flow.js +268 -0
  128. package/scripts/lib/dashboard.js +1056 -0
  129. package/scripts/lib/data-permissions-guard.js +1187 -0
  130. package/scripts/lib/deployment-environment-guard.js +1236 -0
  131. package/scripts/lib/design-partner-feedback.js +346 -0
  132. package/scripts/lib/dogfood-evidence-freshness.js +567 -0
  133. package/scripts/lib/efficiency-receipt.js +354 -0
  134. package/scripts/lib/entitlements.js +100 -0
  135. package/scripts/lib/execution-packet.js +559 -0
  136. package/scripts/lib/execution-route-governor.js +179 -0
  137. package/scripts/lib/experimentation-events.js +547 -0
  138. package/scripts/lib/external-capability-compliance.js +107 -0
  139. package/scripts/lib/external-readiness/ai-visibility/ai-visibility-runner.js +322 -0
  140. package/scripts/lib/external-readiness/calibration/benchmark-site-catalog.js +121 -0
  141. package/scripts/lib/external-readiness/calibration/completion-gate.js +112 -0
  142. package/scripts/lib/external-readiness/calibration/real-site-benchmark-runner.js +284 -0
  143. package/scripts/lib/external-readiness/drift-detector.js +100 -0
  144. package/scripts/lib/external-readiness/endpoint-prober.js +332 -0
  145. package/scripts/lib/external-readiness/external-readiness-runner.js +112 -0
  146. package/scripts/lib/external-readiness/full-agent-readiness-scorer.js +220 -0
  147. package/scripts/lib/external-readiness/golden-path-runner.js +333 -0
  148. package/scripts/lib/external-readiness/inside-out-runner.js +118 -0
  149. package/scripts/lib/external-readiness/proof-receipt-writer.js +112 -0
  150. package/scripts/lib/external-readiness/safe-fix-executor.js +117 -0
  151. package/scripts/lib/external-readiness/skills/category-boundary-guard.js +30 -0
  152. package/scripts/lib/external-readiness/skills/pmm-positioning-guard.js +69 -0
  153. package/scripts/lib/external-readiness/skills/safe-fix-policy.js +35 -0
  154. package/scripts/lib/external-user-simulation.js +166 -0
  155. package/scripts/lib/failure-recovery-readiness.js +81 -0
  156. package/scripts/lib/failure-recovery.js +419 -0
  157. package/scripts/lib/feedback-intelligence.js +537 -0
  158. package/scripts/lib/feedback-signals.js +205 -0
  159. package/scripts/lib/file-integrity.js +68 -0
  160. package/scripts/lib/fsx.js +129 -0
  161. package/scripts/lib/full-readiness-gate.js +451 -0
  162. package/scripts/lib/governed-action-exposure-primitives.js +1514 -0
  163. package/scripts/lib/governed-exposure-planner.js +186 -0
  164. package/scripts/lib/governed-workspace-hygiene.js +946 -0
  165. package/scripts/lib/guard-suite-common.js +412 -0
  166. package/scripts/lib/guidance-builder.js +174 -0
  167. package/scripts/lib/hook-apply.js +1075 -0
  168. package/scripts/lib/hook-baseline.js +310 -0
  169. package/scripts/lib/hook-config-preview.js +275 -0
  170. package/scripts/lib/hook-contracts.js +290 -0
  171. package/scripts/lib/hook-safety-boundary-readiness.js +80 -0
  172. package/scripts/lib/host-capability-matrix.js +351 -0
  173. package/scripts/lib/host-support-context.js +254 -0
  174. package/scripts/lib/http-hook-action.js +538 -0
  175. package/scripts/lib/install-ai-readiness.js +84 -0
  176. package/scripts/lib/install-intake-risk.js +1051 -0
  177. package/scripts/lib/install-journey-intelligence.js +329 -0
  178. package/scripts/lib/intervention-guidance.js +57 -0
  179. package/scripts/lib/known-limitations.js +115 -0
  180. package/scripts/lib/l8-path-truth.js +146 -0
  181. package/scripts/lib/launch-hardening-gate.js +436 -0
  182. package/scripts/lib/launch-readiness.js +635 -0
  183. package/scripts/lib/learning-experimentation-foundation.js +1484 -0
  184. package/scripts/lib/learning-memory.js +686 -0
  185. package/scripts/lib/lifecycle-hooks.js +982 -0
  186. package/scripts/lib/local-package-smoke.js +436 -0
  187. package/scripts/lib/local-pricing.js +299 -0
  188. package/scripts/lib/mcp-enforcement.js +311 -0
  189. package/scripts/lib/mcp-least-privilege-policy.js +303 -0
  190. package/scripts/lib/mcp-tool-inventory.js +388 -0
  191. package/scripts/lib/mcp-tool-risk.js +0 -0
  192. package/scripts/lib/memory.js +335 -0
  193. package/scripts/lib/metrics.js +699 -0
  194. package/scripts/lib/micro-proof.js +133 -0
  195. package/scripts/lib/model-work-class-routing.js +79 -0
  196. package/scripts/lib/next-run-context.js +436 -0
  197. package/scripts/lib/next-run-continuity.js +1207 -0
  198. package/scripts/lib/observability-recovery-guard.js +1030 -0
  199. package/scripts/lib/operating-value.js +1662 -0
  200. package/scripts/lib/optimization-v3.js +122 -0
  201. package/scripts/lib/orchestration/adapters/_shared.js +49 -0
  202. package/scripts/lib/orchestration/adapters/aider.js +18 -0
  203. package/scripts/lib/orchestration/adapters/claude-code.js +35 -0
  204. package/scripts/lib/orchestration/adapters/codex.js +35 -0
  205. package/scripts/lib/orchestration/adapters/gemini-cli.js +18 -0
  206. package/scripts/lib/orchestration/adapters/git.js +25 -0
  207. package/scripts/lib/orchestration/adapters/index.js +31 -0
  208. package/scripts/lib/orchestration/adapters/lm-studio.js +18 -0
  209. package/scripts/lib/orchestration/adapters/ollama.js +18 -0
  210. package/scripts/lib/orchestration/adapters/opencode.js +18 -0
  211. package/scripts/lib/orchestration/adapters/openrouter.js +18 -0
  212. package/scripts/lib/orchestration/adapters/test-runner.js +25 -0
  213. package/scripts/lib/orchestration/cli.js +438 -0
  214. package/scripts/lib/orchestration/execution-manager.js +279 -0
  215. package/scripts/lib/orchestration/handoff.js +314 -0
  216. package/scripts/lib/orchestration/index.js +456 -0
  217. package/scripts/lib/orchestration/inventory.js +47 -0
  218. package/scripts/lib/orchestration/model-discovery.js +498 -0
  219. package/scripts/lib/orchestration/model-profiler.js +170 -0
  220. package/scripts/lib/orchestration/model-profiles.js +252 -0
  221. package/scripts/lib/orchestration/model-refresh-policy.js +72 -0
  222. package/scripts/lib/orchestration/proof-writer.js +349 -0
  223. package/scripts/lib/orchestration/provider-discovery/aider.js +49 -0
  224. package/scripts/lib/orchestration/provider-discovery/claude-code.js +56 -0
  225. package/scripts/lib/orchestration/provider-discovery/codex.js +49 -0
  226. package/scripts/lib/orchestration/provider-discovery/common.js +186 -0
  227. package/scripts/lib/orchestration/provider-discovery/gemini.js +106 -0
  228. package/scripts/lib/orchestration/provider-discovery/lm-studio.js +118 -0
  229. package/scripts/lib/orchestration/provider-discovery/models-dev.js +12 -0
  230. package/scripts/lib/orchestration/provider-discovery/ollama.js +100 -0
  231. package/scripts/lib/orchestration/provider-discovery/opencode.js +47 -0
  232. package/scripts/lib/orchestration/provider-discovery/openrouter.js +44 -0
  233. package/scripts/lib/orchestration/risk-classifier.js +130 -0
  234. package/scripts/lib/orchestration/routing-policy.js +486 -0
  235. package/scripts/lib/orchestration/settings.js +95 -0
  236. package/scripts/lib/orchestration/state.js +165 -0
  237. package/scripts/lib/orchestration/verification-manager.js +138 -0
  238. package/scripts/lib/outcome-evidence-stack.js +1083 -0
  239. package/scripts/lib/output-profiles.js +146 -0
  240. package/scripts/lib/package-content-audit.js +368 -0
  241. package/scripts/lib/package-runtime.js +278 -0
  242. package/scripts/lib/plan-surface.js +53 -0
  243. package/scripts/lib/plans.js +2327 -0
  244. package/scripts/lib/policy-provider.js +27 -0
  245. package/scripts/lib/prelaunch-activation-readiness.js +409 -0
  246. package/scripts/lib/prelaunch-evidence-store.js +816 -0
  247. package/scripts/lib/prelaunch-intelligence.js +869 -0
  248. package/scripts/lib/pricing-experiment.js +118 -0
  249. package/scripts/lib/pro-moment-events.js +77 -0
  250. package/scripts/lib/pro-moment-state.js +227 -0
  251. package/scripts/lib/pro-moments.js +1216 -0
  252. package/scripts/lib/product-home-receipt.js +1790 -0
  253. package/scripts/lib/product-learning-events.js +696 -0
  254. package/scripts/lib/production-confidence-control-tower.js +1209 -0
  255. package/scripts/lib/production-confidence.js +1858 -0
  256. package/scripts/lib/project-profile.js +555 -0
  257. package/scripts/lib/prompt-compiler-plan.js +94 -0
  258. package/scripts/lib/prompt-compiler.js +280 -0
  259. package/scripts/lib/prompt-lint.js +32 -0
  260. package/scripts/lib/prompt-suggestions.js +52 -0
  261. package/scripts/lib/proof-canonical.js +398 -0
  262. package/scripts/lib/proof-drilldown.js +383 -0
  263. package/scripts/lib/proof-e2e/promise-completion.js +141 -0
  264. package/scripts/lib/proof-e2e/promise-dashboard-claims.js +135 -0
  265. package/scripts/lib/proof-e2e/promise-local-proof.js +156 -0
  266. package/scripts/lib/proof-e2e/promise-provider-neutral.js +136 -0
  267. package/scripts/lib/proof-e2e/promise-registry.js +219 -0
  268. package/scripts/lib/proof-e2e/promise-security-trust.js +141 -0
  269. package/scripts/lib/proof-e2e/promise-skills-risk.js +163 -0
  270. package/scripts/lib/proof-e2e/promise-token-savings.js +112 -0
  271. package/scripts/lib/proof-e2e/promise-work-management.js +126 -0
  272. package/scripts/lib/proof-events.js +342 -0
  273. package/scripts/lib/proof-history.js +243 -0
  274. package/scripts/lib/proof-metrics.js +296 -0
  275. package/scripts/lib/proof-outcome-evidence.js +134 -0
  276. package/scripts/lib/proof-receipt.js +335 -0
  277. package/scripts/lib/proof-record.js +461 -0
  278. package/scripts/lib/proof-savings-report.js +1549 -0
  279. package/scripts/lib/public-activation-distribution-gate.js +266 -0
  280. package/scripts/lib/public-cli.js +5631 -0
  281. package/scripts/lib/public-distribution-truth.js +211 -0
  282. package/scripts/lib/public-distribution.js +73 -0
  283. package/scripts/lib/public-install-claim-checker.js +300 -0
  284. package/scripts/lib/publish-provenance-readiness.js +287 -0
  285. package/scripts/lib/readiness-delta.js +218 -0
  286. package/scripts/lib/readiness-evidence-closure.js +196 -0
  287. package/scripts/lib/reentry-memory-capture.js +241 -0
  288. package/scripts/lib/reentry-memory-retrieval.js +302 -0
  289. package/scripts/lib/reentry-memory-status.js +147 -0
  290. package/scripts/lib/reentry-memory-store.js +183 -0
  291. package/scripts/lib/reentry-state.js +66 -0
  292. package/scripts/lib/release-candidate-bundle.js +166 -0
  293. package/scripts/lib/remediation.js +81 -0
  294. package/scripts/lib/repo-map.js +391 -0
  295. package/scripts/lib/run-action-policy.js +104 -0
  296. package/scripts/lib/run-contract-receipt.js +48 -0
  297. package/scripts/lib/run-contract.js +288 -0
  298. package/scripts/lib/run-cost-to-verified-outcome.js +87 -0
  299. package/scripts/lib/run-improvements-lifecycle.js +330 -0
  300. package/scripts/lib/run-improvements.js +789 -0
  301. package/scripts/lib/run-proof-contract.js +116 -0
  302. package/scripts/lib/run-risk-classifier.js +131 -0
  303. package/scripts/lib/run-task-classifier.js +216 -0
  304. package/scripts/lib/runtime-decision-policy.js +387 -0
  305. package/scripts/lib/safe-path-engine.js +705 -0
  306. package/scripts/lib/safe-repair.js +877 -0
  307. package/scripts/lib/safe-run-controller.js +887 -0
  308. package/scripts/lib/scope-repair-before-approval.js +865 -0
  309. package/scripts/lib/score.js +262 -0
  310. package/scripts/lib/seamless-enforcement.js +329 -0
  311. package/scripts/lib/seamless-outcome.js +689 -0
  312. package/scripts/lib/seamless-reality-gate.js +5053 -0
  313. package/scripts/lib/security-confidence/activation-safety.js +78 -0
  314. package/scripts/lib/security-confidence/adapters/adapter-contract.js +125 -0
  315. package/scripts/lib/security-confidence/adapters/mock-claude-bughunter-adapter.js +36 -0
  316. package/scripts/lib/security-confidence/adapters/mock-decepticon-adapter.js +34 -0
  317. package/scripts/lib/security-confidence/adapters/mock-mcp-scan-adapter.js +35 -0
  318. package/scripts/lib/security-confidence/adapters/mock-snyk-agent-scan-adapter.js +35 -0
  319. package/scripts/lib/security-confidence/adapters/mock-tank-adapter.js +34 -0
  320. package/scripts/lib/security-confidence/adapters/reference-registry.js +63 -0
  321. package/scripts/lib/security-confidence/auth-rbac-plan.js +39 -0
  322. package/scripts/lib/security-confidence/component-inventory.js +151 -0
  323. package/scripts/lib/security-confidence/constants.js +191 -0
  324. package/scripts/lib/security-confidence/dependency-script-risk.js +95 -0
  325. package/scripts/lib/security-confidence/evidence-hygiene.js +127 -0
  326. package/scripts/lib/security-confidence/feature-impact-classifier.js +80 -0
  327. package/scripts/lib/security-confidence/file-utils.js +161 -0
  328. package/scripts/lib/security-confidence/finding-triage.js +90 -0
  329. package/scripts/lib/security-confidence/findings.js +115 -0
  330. package/scripts/lib/security-confidence/index.js +29 -0
  331. package/scripts/lib/security-confidence/permission-budget.js +93 -0
  332. package/scripts/lib/security-confidence/redaction.js +82 -0
  333. package/scripts/lib/security-confidence/redteam-fixtures.js +53 -0
  334. package/scripts/lib/security-confidence/reference-adoption.js +229 -0
  335. package/scripts/lib/security-confidence/reference-taxonomy.js +155 -0
  336. package/scripts/lib/security-confidence/report-quality.js +99 -0
  337. package/scripts/lib/security-confidence/report-writer.js +79 -0
  338. package/scripts/lib/security-confidence/risk-classifier.js +187 -0
  339. package/scripts/lib/security-confidence/runner.js +179 -0
  340. package/scripts/lib/security-confidence/schema.js +188 -0
  341. package/scripts/lib/security-confidence/secret-safety.js +74 -0
  342. package/scripts/lib/security-confidence/security-capability-router.js +98 -0
  343. package/scripts/lib/security-confidence/web-security-smoke-plan.js +46 -0
  344. package/scripts/lib/security-risk-classifier.js +511 -0
  345. package/scripts/lib/security-scan.js +396 -0
  346. package/scripts/lib/session-context-optimizer.js +1211 -0
  347. package/scripts/lib/session-timing.js +322 -0
  348. package/scripts/lib/skill-hygiene.js +805 -0
  349. package/scripts/lib/skill-packs.js +161 -0
  350. package/scripts/lib/skills-operating-layer-v1.js +1023 -0
  351. package/scripts/lib/skills-operating-layer.js +629 -0
  352. package/scripts/lib/smallest-safe-plan.js +214 -0
  353. package/scripts/lib/smart-routing-plan.js +115 -0
  354. package/scripts/lib/smart-work-routing.js +768 -0
  355. package/scripts/lib/source-catalog.js +1022 -0
  356. package/scripts/lib/status-value-summary.js +32 -0
  357. package/scripts/lib/supply-chain-dependency-guard.js +1333 -0
  358. package/scripts/lib/supply-chain-guard.js +219 -0
  359. package/scripts/lib/support-bundle.js +561 -0
  360. package/scripts/lib/support-redaction.js +66 -0
  361. package/scripts/lib/task-continuation.js +440 -0
  362. package/scripts/lib/test-helpers.js +15 -0
  363. package/scripts/lib/tier.js +38 -0
  364. package/scripts/lib/token-context-quality-gate.js +370 -0
  365. package/scripts/lib/token-cost-capture.js +187 -0
  366. package/scripts/lib/token-cost-evidence.js +862 -0
  367. package/scripts/lib/token-cost-intelligence.js +358 -0
  368. package/scripts/lib/token-efficiency-evidence.js +213 -0
  369. package/scripts/lib/token-efficiency-map.js +110 -0
  370. package/scripts/lib/token-evidence.js +703 -0
  371. package/scripts/lib/tokenish.js +17 -0
  372. package/scripts/lib/tool-output-sandbox.js +559 -0
  373. package/scripts/lib/trust-audit.js +136 -0
  374. package/scripts/lib/unified-events.js +396 -0
  375. package/scripts/lib/upgrade-interruption-recovery.js +407 -0
  376. package/scripts/lib/usage-ledger.js +201 -0
  377. package/scripts/lib/value-ledger.js +130 -0
  378. package/scripts/lib/value-proof-calibration.js +531 -0
  379. package/scripts/lib/visual-qa.js +231 -0
  380. package/scripts/lib/voice-alpha.js +29 -0
  381. package/scripts/lib/webhook-idempotency-guard.js +990 -0
  382. package/scripts/lib/work-aware-orchestration.js +976 -0
  383. package/scripts/lib/work-control-receipts.js +577 -0
  384. package/scripts/lib/work-ledger.js +1123 -0
  385. package/scripts/lib/work-panel-preview.js +352 -0
  386. package/scripts/lib/workflow-discipline.js +280 -0
  387. package/scripts/lib/workflow-intelligence-radar.js +804 -0
  388. package/scripts/lib/workflow-signals.js +419 -0
  389. package/scripts/lib/workspace-map.js +281 -0
  390. package/scripts/lib/workspace-registry.js +1367 -0
  391. package/scripts/lib/workspace-resolver.js +542 -0
  392. package/scripts/wuz-doctor.js +315 -0
  393. package/bin/avorelo.mjs +0 -7
  394. package/dist/avorelo.mjs +0 -24678
@@ -0,0 +1,504 @@
1
+ "use strict";
2
+
3
+ const fs = require("fs");
4
+ const path = require("path");
5
+
6
+ const { nowIso, safeReadJson, safeWriteJson } = require("./fsx");
7
+
8
+ const CONTRACT = "avorelo.capabilityHygiene.v1";
9
+ const REPORT_DIR_REL = ".claude/cco/reports/capability-hygiene";
10
+ const REPORT_JSON_REL = `${REPORT_DIR_REL}/latest-report.json`;
11
+
12
+ const MAX_FILES = 1500;
13
+ const MAX_FINDINGS = 25;
14
+ const MAX_EVIDENCE_REFS_PER_FINDING = 3;
15
+
16
+ const SKIP_DIRS = new Set([
17
+ ".git", "node_modules", "dist", "build", "coverage", ".next", ".nuxt", ".turbo", ".wasp", "temp",
18
+ ]);
19
+
20
+ const EXTERNAL_WRITE_CATEGORIES = new Set([
21
+ "browser", "network", "deploy", "billing", "write", "external",
22
+ ]);
23
+
24
+ const RISKY_CATEGORIES = new Set([
25
+ "browser", "network", "deploy", "billing", "write", "external", "admin", "delete",
26
+ ]);
27
+
28
+ const CONTEXT_HEAVY_CATEGORIES = new Set([
29
+ "full_codebase", "repo_map", "large_context", "workspace_scan",
30
+ ]);
31
+
32
+ function toPosix(value) {
33
+ return String(value || "").replace(/\\/g, "/");
34
+ }
35
+
36
+ function sanitizeText(value, max = 220) {
37
+ const text = String(value || "")
38
+ .replace(/\s+/g, " ")
39
+ .replace(/(?:sk-[A-Za-z0-9_-]{16,}|gh[ps]_[A-Za-z0-9]{12,}|npm_[A-Za-z0-9]{12,}|AKIA[0-9A-Z]{16})/g, "[redacted-token]")
40
+ .replace(/(bearer\s+)[A-Za-z0-9._-]{8,}/ig, "$1[redacted]")
41
+ .replace(/((?:api[_ -]?key|token|password|secret|authorization)\s*[:=]\s*)([^\s'"]+)/ig, "$1[redacted]")
42
+ .trim();
43
+ if (!text) return null;
44
+ return text.length > max ? `${text.slice(0, max - 3).trimEnd()}...` : text;
45
+ }
46
+
47
+ function sanitizeRef(ref) {
48
+ const text = toPosix(String(ref || "").trim());
49
+ if (!text || text.startsWith("..")) return null;
50
+ return text;
51
+ }
52
+
53
+ function makeEvidenceRef(relPath, label) {
54
+ const base = sanitizeRef(relPath);
55
+ if (!base) return null;
56
+ const note = label ? ` (${sanitizeText(label, 80)})` : "";
57
+ return `${base}${note}`;
58
+ }
59
+
60
+ function severityRank(severity) {
61
+ if (severity === "block") return 3;
62
+ if (severity === "warn") return 2;
63
+ if (severity === "info") return 1;
64
+ return 0;
65
+ }
66
+
67
+ // ── Load capability kernel and related evidence ─────────────────────────────
68
+
69
+ function loadCapabilityRegistry(cwd) {
70
+ try {
71
+ // Only load kernel if cwd contains the capability registry
72
+ const regPath = path.join(cwd, "scripts", "lib", "capability-registry.js");
73
+ if (!fs.existsSync(regPath)) return [];
74
+ const reg = require("./capability-registry");
75
+ if (typeof reg.listCapabilities === "function") return reg.listCapabilities();
76
+ return [];
77
+ } catch {
78
+ return [];
79
+ }
80
+ }
81
+
82
+ function loadCapabilityManifests(cwd) {
83
+ const manifests = [];
84
+ const manifestDir = path.join(cwd, ".claude", "cco", "state");
85
+ try {
86
+ if (!fs.existsSync(manifestDir)) return manifests;
87
+ for (const entry of fs.readdirSync(manifestDir, { withFileTypes: true })) {
88
+ if (!entry.isFile() || !entry.name.endsWith(".json")) continue;
89
+ try {
90
+ const data = JSON.parse(fs.readFileSync(path.join(manifestDir, entry.name), "utf8").replace(/^/, ""));
91
+ if (data && typeof data === "object") {
92
+ manifests.push({ file: toPosix(`.claude/cco/state/${entry.name}`), data });
93
+ }
94
+ } catch {}
95
+ }
96
+ } catch {}
97
+ return manifests;
98
+ }
99
+
100
+ function loadGovernedExposure(cwd) {
101
+ return safeReadJson(cwd, ".claude/cco/orchestration/governed-action-exposure/latest-report.json", null);
102
+ }
103
+
104
+ function loadSkillsOperatingLayer(cwd) {
105
+ return safeReadJson(cwd, ".claude/cco/orchestration/skills-operating-layer/latest-report.json", null);
106
+ }
107
+
108
+ function loadCapabilityIntake(cwd) {
109
+ return safeReadJson(cwd, ".claude/cco/orchestration/capability-intake/latest-report.json", null);
110
+ }
111
+
112
+ // ── Core analysis ───────────────────────────────────────────────────────────
113
+
114
+ function buildCapabilityHygieneReport(cwd = process.cwd(), options = {}) {
115
+ const limitsApplied = [];
116
+ const findings = [];
117
+ const seenCodes = new Set();
118
+
119
+ function addFinding(severity, reasonCode, title, safeNextAction, evidenceRefs) {
120
+ if (findings.length >= MAX_FINDINGS) {
121
+ if (!limitsApplied.includes("MAX_FINDINGS_REACHED")) limitsApplied.push("MAX_FINDINGS_REACHED");
122
+ return;
123
+ }
124
+ if (seenCodes.has(reasonCode)) return;
125
+ seenCodes.add(reasonCode);
126
+ findings.push({
127
+ severity,
128
+ reasonCode,
129
+ title: sanitizeText(title, 220),
130
+ safeNextAction: sanitizeText(safeNextAction, 220),
131
+ evidenceRefs: (evidenceRefs || []).slice(0, MAX_EVIDENCE_REFS_PER_FINDING).filter(Boolean),
132
+ });
133
+ }
134
+
135
+ // Load evidence sources
136
+ const registry = loadCapabilityRegistry(cwd);
137
+ const manifests = loadCapabilityManifests(cwd);
138
+ const governedExposure = loadGovernedExposure(cwd);
139
+ const skillsLayer = loadSkillsOperatingLayer(cwd);
140
+ const capabilityIntake = loadCapabilityIntake(cwd);
141
+
142
+ const capabilitiesInspected = registry.length;
143
+
144
+ // No data path
145
+ if (capabilitiesInspected === 0 && manifests.length === 0) {
146
+ const emptyReport = buildEmptyReport(limitsApplied);
147
+ if (options.write !== false) {
148
+ safeWriteJson(cwd, REPORT_JSON_REL, emptyReport);
149
+ }
150
+ return emptyReport;
151
+ }
152
+
153
+ addFinding("info", "CAP_HYGIENE_KERNEL_FOUND", `Capability Kernel loaded with ${capabilitiesInspected} capabilities`, "Kernel is available for hygiene checks.", [makeEvidenceRef("scripts/lib/capability-registry.js", "kernel source")]);
154
+
155
+ // ── Check 1: too many capabilities ──
156
+ const MAX_REASONABLE = 40;
157
+ if (capabilitiesInspected > MAX_REASONABLE) {
158
+ addFinding("warn", "CAP_HYGIENE_TOO_MANY_CAPABILITIES", `${capabilitiesInspected} capabilities registered, which exceeds the ${MAX_REASONABLE}-capability hygiene threshold`, "Review whether all capabilities are needed for the current task scope.", [makeEvidenceRef("scripts/lib/capability-registry.js", `${capabilitiesInspected} capabilities`)]);
159
+ } else {
160
+ addFinding("info", "CAP_HYGIENE_CAPABILITY_COUNT_OK", `Capability count (${capabilitiesInspected}) within hygiene threshold`, "No action needed.", []);
161
+ }
162
+
163
+ // ── Check 2: duplicate capability families ──
164
+ const familySeen = new Map();
165
+ for (const cap of registry) {
166
+ const family = cap.familyId || cap.family || "unknown";
167
+ if (!familySeen.has(family)) {
168
+ familySeen.set(family, []);
169
+ }
170
+ familySeen.get(family).push(cap.id || cap.name || "unnamed");
171
+ }
172
+ for (const [family, ids] of familySeen) {
173
+ if (ids.length > 3) {
174
+ addFinding("warn", "CAP_HYGIENE_DUPLICATE_CAPABILITY", `Family '${family}' has ${ids.length} capabilities — possible duplication`, "Review whether multiple capabilities in this family serve distinct purposes.", [makeEvidenceRef("scripts/lib/capability-registry.js", `family: ${family}`)]);
175
+ }
176
+ }
177
+
178
+ // ── Check 3: stale capabilities ──
179
+ for (const cap of registry) {
180
+ const status = cap.productStatus || cap.status;
181
+ if (status === "gap" || status === "docs_only") {
182
+ addFinding("warn", "CAP_HYGIENE_STALE_CAPABILITY", `Capability '${cap.id || cap.name}' has status '${status}' — may be stale or unimplemented`, "Verify whether this capability is still needed or should be removed.", [makeEvidenceRef("scripts/lib/capability-registry.js", `${cap.id}: ${status}`)]);
183
+ }
184
+ }
185
+
186
+ // ── Check 4: missing dogfood evidence ──
187
+ const dogfoodDir = path.join(cwd, "docs", "dogfood");
188
+ const hasDogfoodDir = fs.existsSync(dogfoodDir);
189
+ if (!hasDogfoodDir) {
190
+ addFinding("warn", "CAP_HYGIENE_MISSING_DOGFOOD", "No docs/dogfood directory found — capabilities lack dogfood evidence", "Create dogfood docs for active capabilities.", []);
191
+ }
192
+
193
+ // ── Check 5: missing proof/evidence refs ──
194
+ const evidenceDir = path.join(cwd, ".claude", "cco", "evidence");
195
+ const hasEvidence = fs.existsSync(evidenceDir);
196
+ if (!hasEvidence) {
197
+ addFinding("warn", "CAP_HYGIENE_MISSING_PROOF", "No .claude/cco/evidence directory found — capabilities may lack proof references", "Run proof-generating commands to build evidence.", []);
198
+ }
199
+
200
+ // ── Check 6: external/write/browser/network/deploy/billing exposure ──
201
+ if (governedExposure && typeof governedExposure === "object") {
202
+ const exposedActions = governedExposure.exposedActions || governedExposure.actions || [];
203
+ for (const action of (Array.isArray(exposedActions) ? exposedActions : [])) {
204
+ const cat = String(action.category || action.type || "").toLowerCase();
205
+ if (EXTERNAL_WRITE_CATEGORIES.has(cat)) {
206
+ const gateFound = action.policyGate || action.approvalRequired || action.blocked;
207
+ if (!gateFound) {
208
+ addFinding("block", "CAP_HYGIENE_EXTERNAL_WRITE_EXPOSED", `External/write capability '${action.name || cat}' is exposed without a policy gate`, "Add a policy gate or approval requirement for this capability.", [makeEvidenceRef(".claude/cco/orchestration/governed-action-exposure/latest-report.json", cat)]);
209
+ } else {
210
+ addFinding("info", "CAP_HYGIENE_POLICY_GATE_FOUND", `Policy gate found for external capability '${action.name || cat}'`, "No action needed.", [makeEvidenceRef(".claude/cco/orchestration/governed-action-exposure/latest-report.json", cat)]);
211
+ }
212
+ }
213
+ if (cat === "browser") {
214
+ addFinding("warn", "CAP_HYGIENE_BROWSER_CAPABILITY_EXPOSED", `Browser capability '${action.name || "browser"}' is exposed`, "Verify browser capability is needed for current task.", [makeEvidenceRef(".claude/cco/orchestration/governed-action-exposure/latest-report.json", "browser")]);
215
+ }
216
+ if (cat === "deploy") {
217
+ addFinding("warn", "CAP_HYGIENE_DEPLOY_CAPABILITY_EXPOSED", `Deploy capability '${action.name || "deploy"}' is exposed`, "Verify deploy capability is needed for current task.", [makeEvidenceRef(".claude/cco/orchestration/governed-action-exposure/latest-report.json", "deploy")]);
218
+ }
219
+ if (cat === "billing") {
220
+ addFinding("warn", "CAP_HYGIENE_BILLING_CAPABILITY_EXPOSED", `Billing capability '${action.name || "billing"}' is exposed`, "Verify billing capability is needed for current task.", [makeEvidenceRef(".claude/cco/orchestration/governed-action-exposure/latest-report.json", "billing")]);
221
+ }
222
+ }
223
+ }
224
+
225
+ // ── Check 7: broad permissions for small tasks ──
226
+ if (governedExposure && typeof governedExposure === "object") {
227
+ const taskScope = governedExposure.taskScope || governedExposure.scope;
228
+ const scopeSize = String(taskScope || "").toLowerCase();
229
+ const exposedCount = Array.isArray(governedExposure.exposedActions) ? governedExposure.exposedActions.length : 0;
230
+ if ((scopeSize === "small" || scopeSize === "bounded") && exposedCount > 10) {
231
+ addFinding("warn", "CAP_HYGIENE_PERMISSION_TOO_BROAD", `${exposedCount} actions exposed for a '${scopeSize}' task — permissions may be too broad`, "Consider suppressing capabilities not needed for this task scope.", []);
232
+ }
233
+ }
234
+
235
+ // ── Check 8: context-heavy capability for small task ──
236
+ for (const cap of registry) {
237
+ const cat = String(cap.category || cap.familyId || "").toLowerCase();
238
+ if (CONTEXT_HEAVY_CATEGORIES.has(cat)) {
239
+ addFinding("warn", "CAP_HYGIENE_CONTEXT_HEAVY_FOR_TASK", `Context-heavy capability '${cap.id || cap.name}' is available — verify it's needed`, "Suppress if current task does not require full codebase context.", [makeEvidenceRef("scripts/lib/capability-registry.js", cap.id || cap.name)]);
240
+ }
241
+ }
242
+
243
+ // ── Check 9: policy gate missing for risky capabilities ──
244
+ for (const cap of registry) {
245
+ const surfaces = Array.isArray(cap.surfaces) ? cap.surfaces : [];
246
+ const hasApproval = surfaces.some(s => s === "approval" || s === "block");
247
+ const cat = String(cap.category || cap.familyId || "").toLowerCase();
248
+ if (RISKY_CATEGORIES.has(cat) && !hasApproval) {
249
+ addFinding("warn", "CAP_HYGIENE_POLICY_GATE_MISSING", `Risky capability '${cap.id || cap.name}' in category '${cat}' has no approval/block surface`, "Add an approval gate for this capability.", [makeEvidenceRef("scripts/lib/capability-registry.js", cap.id || cap.name)]);
250
+ }
251
+ }
252
+
253
+ // ── Build suppression recommendations ──
254
+ const kept = [];
255
+ const suppressed = [];
256
+ const approvalRequired = [];
257
+
258
+ for (const f of findings) {
259
+ if (f.reasonCode === "CAP_HYGIENE_EXTERNAL_WRITE_EXPOSED" && f.severity === "block") {
260
+ approvalRequired.push(f.title);
261
+ } else if (f.reasonCode.includes("SUPPRESSION") || f.reasonCode.includes("CONTEXT_HEAVY") || f.reasonCode.includes("BROWSER") || f.reasonCode.includes("DEPLOY") || f.reasonCode.includes("BILLING")) {
262
+ suppressed.push(f.title);
263
+ }
264
+ }
265
+
266
+ const keptCount = capabilitiesInspected - suppressed.length;
267
+ if (keptCount > 0) {
268
+ kept.push(`${keptCount} capabilities kept after hygiene review`);
269
+ }
270
+
271
+ // ── Determine overall status ──
272
+ const hasBlock = findings.some(f => f.severity === "block");
273
+ const hasWarn = findings.some(f => f.severity === "warn");
274
+ const status = hasBlock ? "blocked" : hasWarn ? "warn" : "pass";
275
+
276
+ const warnCount = findings.filter(f => f.severity === "warn").length;
277
+ const blockCount = findings.filter(f => f.severity === "block").length;
278
+ const infoCount = findings.filter(f => f.severity === "info").length;
279
+
280
+ const safeNextAction = hasBlock
281
+ ? "Resolve blocked capabilities before proceeding. Add policy gates for exposed external/write access."
282
+ : hasWarn
283
+ ? "Review warned capabilities and consider suppressing unused or overly broad ones."
284
+ : "Capability exposure is bounded and evidence-backed. Safe to proceed.";
285
+
286
+ const report = {
287
+ schemaVersion: CONTRACT,
288
+ generatedAt: nowIso(),
289
+ status,
290
+ redacted: true,
291
+ summary: {
292
+ title: "Capability Hygiene & Over-Skilling Control",
293
+ text: `${capabilitiesInspected} capabilities inspected. ${keptCount} kept, ${suppressed.length} suppressed, ${approvalRequired.length} need approval.`,
294
+ findingCounts: {
295
+ info: infoCount,
296
+ warn: warnCount,
297
+ block: blockCount,
298
+ },
299
+ safeNextAction,
300
+ },
301
+ surfaceEvidence: {
302
+ filesInspected: manifests.length,
303
+ artifactsInspected: manifests.length + (governedExposure ? 1 : 0) + (skillsLayer ? 1 : 0) + (capabilityIntake ? 1 : 0),
304
+ capabilitiesInspected,
305
+ limitsApplied,
306
+ },
307
+ findings: findings.sort((a, b) => severityRank(b.severity) - severityRank(a.severity)),
308
+ capabilityAnalysis: {
309
+ kept,
310
+ suppressed,
311
+ approvalRequired,
312
+ },
313
+ productHome: {
314
+ cardSource: "capability-hygiene",
315
+ status,
316
+ found: findings.filter(f => f.severity === "warn" || f.severity === "block").map(f => sanitizeText(f.title, 120)).slice(0, 5),
317
+ fixedOrPrepared: suppressed.length > 0 ? [`Prepared a smaller capability set (${suppressed.length} suppressed)`] : [],
318
+ savedOrProved: suppressed.length > 0 ? [`Suppressed ${suppressed.length} irrelevant capability candidate(s)`] : [],
319
+ forReview: approvalRequired.map(t => sanitizeText(t, 120)).slice(0, 3),
320
+ safeNextAction,
321
+ },
322
+ valueProof: {
323
+ implemented: true,
324
+ dogfooded: false,
325
+ measured: false,
326
+ measurementType: "heuristic",
327
+ publicClaimAllowed: false,
328
+ evidenceRefs: [makeEvidenceRef(REPORT_JSON_REL, "capability hygiene report")].filter(Boolean),
329
+ caveat: "Hygiene checks are heuristic-based static analysis. No exact token or cost savings measured.",
330
+ },
331
+ limits: {
332
+ localFirst: true,
333
+ deterministicFirst: true,
334
+ modelCalls: false,
335
+ networkCalls: false,
336
+ providerCalls: false,
337
+ registryCalls: false,
338
+ rawDump: false,
339
+ autoFix: false,
340
+ },
341
+ };
342
+
343
+ if (options.write !== false) {
344
+ safeWriteJson(cwd, REPORT_JSON_REL, report);
345
+ }
346
+
347
+ return report;
348
+ }
349
+
350
+ function buildEmptyReport(limitsApplied = []) {
351
+ return {
352
+ schemaVersion: CONTRACT,
353
+ generatedAt: nowIso(),
354
+ status: "no_data",
355
+ redacted: true,
356
+ summary: {
357
+ title: "Capability Hygiene & Over-Skilling Control",
358
+ text: "No capability or kernel evidence found.",
359
+ findingCounts: { info: 0, warn: 0, block: 0 },
360
+ safeNextAction: "No capability evidence available. Run capability registration or kernel commands first.",
361
+ },
362
+ surfaceEvidence: {
363
+ filesInspected: 0,
364
+ artifactsInspected: 0,
365
+ capabilitiesInspected: 0,
366
+ limitsApplied,
367
+ },
368
+ findings: [],
369
+ capabilityAnalysis: { kept: [], suppressed: [], approvalRequired: [] },
370
+ productHome: {
371
+ cardSource: "capability-hygiene",
372
+ status: "no_data",
373
+ found: [],
374
+ fixedOrPrepared: [],
375
+ savedOrProved: [],
376
+ forReview: [],
377
+ safeNextAction: "No capability evidence available.",
378
+ },
379
+ valueProof: {
380
+ implemented: true,
381
+ dogfooded: false,
382
+ measured: false,
383
+ measurementType: "unavailable",
384
+ publicClaimAllowed: false,
385
+ evidenceRefs: [],
386
+ caveat: "No data to measure against.",
387
+ },
388
+ limits: {
389
+ localFirst: true,
390
+ deterministicFirst: true,
391
+ modelCalls: false,
392
+ networkCalls: false,
393
+ providerCalls: false,
394
+ registryCalls: false,
395
+ rawDump: false,
396
+ autoFix: false,
397
+ },
398
+ };
399
+ }
400
+
401
+ // ── Generate / Load / Format / Surface ──────────────────────────────────────
402
+
403
+ function generateCapabilityHygiene(cwd = process.cwd(), options = {}) {
404
+ const report = buildCapabilityHygieneReport(cwd, options);
405
+ return { report, reportPath: path.join(cwd, REPORT_JSON_REL) };
406
+ }
407
+
408
+ function loadCapabilityHygiene(cwd = process.cwd()) {
409
+ return safeReadJson(cwd, REPORT_JSON_REL, null);
410
+ }
411
+
412
+ function formatCapabilityHygieneText(report) {
413
+ if (!report || report.schemaVersion !== CONTRACT) {
414
+ return [
415
+ "Avorelo Capability Hygiene & Over-Skilling Control",
416
+ "Status: NO DATA",
417
+ "No capability or kernel evidence found yet.",
418
+ "Safe next action: Run capability registration or kernel commands first.",
419
+ ].join("\n");
420
+ }
421
+
422
+ const lines = [
423
+ "Avorelo Capability Hygiene & Over-Skilling Control",
424
+ `Status: ${String(report.status || "no_data").toUpperCase()} · redacted=${report.redacted === true ? "yes" : "no"}`,
425
+ `Capabilities: ${report.surfaceEvidence?.capabilitiesInspected || 0} inspected · info=${report.summary?.findingCounts?.info || 0} · warn=${report.summary?.findingCounts?.warn || 0} · block=${report.summary?.findingCounts?.block || 0}`,
426
+ "Notes: local static analysis only · no model calls · no network calls",
427
+ ];
428
+
429
+ if (Array.isArray(report.findings) && report.findings.length > 0) {
430
+ lines.push("");
431
+ lines.push("Findings:");
432
+ for (const finding of report.findings.slice(0, 5)) {
433
+ lines.push(`- [${finding.severity}] ${finding.title}${finding.evidenceRefs?.length ? ` · ${finding.evidenceRefs[0]}` : ""}`);
434
+ }
435
+ if (report.findings.length > 5) {
436
+ lines.push(` ... and ${report.findings.length - 5} more`);
437
+ }
438
+ }
439
+
440
+ const analysis = report.capabilityAnalysis;
441
+ if (analysis) {
442
+ lines.push("");
443
+ if (analysis.kept.length) lines.push(`Kept: ${analysis.kept.join(", ")}`);
444
+ if (analysis.suppressed.length) lines.push(`Suppressed: ${analysis.suppressed.length} candidate(s)`);
445
+ if (analysis.approvalRequired.length) lines.push(`Approval required: ${analysis.approvalRequired.length} capability(s)`);
446
+ }
447
+
448
+ lines.push("");
449
+ lines.push(`Safe next action: ${report.summary?.safeNextAction || "Review capability exposure before proceeding."}`);
450
+ return lines.join("\n");
451
+ }
452
+
453
+ function formatCapabilityHygieneStatusLine(report) {
454
+ if (!report || report.schemaVersion !== CONTRACT) {
455
+ return "Capability hygiene: NOT RUN · run `avorelo capability-hygiene --text`";
456
+ }
457
+ return `Capability hygiene: ${String(report.status || "no_data").toUpperCase()}`
458
+ + ` · capabilities=${report.surfaceEvidence?.capabilitiesInspected || 0}`
459
+ + ` · warn=${report.summary?.findingCounts?.warn || 0}`
460
+ + ` · block=${report.summary?.findingCounts?.block || 0}`
461
+ + ` · next: ${sanitizeText(report.summary?.safeNextAction, 140) || "Review capability hygiene."}`;
462
+ }
463
+
464
+ function buildCapabilityHygieneSurface(cwd = process.cwd(), options = {}) {
465
+ const report = loadCapabilityHygiene(cwd) || (options.buildIfMissing ? buildCapabilityHygieneReport(cwd, { write: false }) : null);
466
+ if (!report) {
467
+ return {
468
+ status: "not_run",
469
+ capabilitiesInspected: 0,
470
+ warnCount: 0,
471
+ blockCount: 0,
472
+ nextBestAction: "Run `avorelo capability-hygiene --text` to check capability exposure.",
473
+ statusLine: "Capability hygiene: NOT RUN · run `avorelo capability-hygiene --text`",
474
+ showInStatus: true,
475
+ showInDashboard: true,
476
+ evidenceRef: null,
477
+ limitations: ["Local heuristic analysis only. No model or network calls."],
478
+ };
479
+ }
480
+
481
+ return {
482
+ status: report.status,
483
+ capabilitiesInspected: report.surfaceEvidence?.capabilitiesInspected || 0,
484
+ warnCount: report.summary?.findingCounts?.warn || 0,
485
+ blockCount: report.summary?.findingCounts?.block || 0,
486
+ nextBestAction: report.summary?.safeNextAction,
487
+ statusLine: formatCapabilityHygieneStatusLine(report),
488
+ showInStatus: true,
489
+ showInDashboard: true,
490
+ evidenceRef: REPORT_JSON_REL,
491
+ limitations: ["Local heuristic analysis only. No model or network calls."],
492
+ };
493
+ }
494
+
495
+ module.exports = {
496
+ CONTRACT,
497
+ REPORT_JSON_REL,
498
+ buildCapabilityHygieneReport,
499
+ generateCapabilityHygiene,
500
+ loadCapabilityHygiene,
501
+ formatCapabilityHygieneText,
502
+ formatCapabilityHygieneStatusLine,
503
+ buildCapabilityHygieneSurface,
504
+ };