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,580 @@
1
+ "use strict";
2
+
3
+ const fs = require("fs");
4
+ const path = require("path");
5
+ const { buildSkillRegistry, GENERATED_SKILL_REGISTRY_REL_PATH } = require("./avorelo-skill-registry");
6
+ const { appendProductLearningEvent } = require("./product-learning-events");
7
+ const { ensureCcoDirs, nowIso, safeReadJson, safeWriteJson } = require("./fsx");
8
+
9
+ const SKILLS_CONTRACT = "avorelo.skillsOperatingLayer.v1";
10
+ const SKILLS_SCHEMA_VERSION = 1;
11
+ const LATEST_SOURCE_ADOPTION_RECEIPT_REL_PATH = ".claude/cco/skills/latest-source-adoption.json";
12
+ const LATEST_SKILL_ROUTE_RECEIPT_REL_PATH = ".claude/cco/skills/latest-route.json";
13
+ const LATEST_ADAPTER_SYNC_RECEIPT_REL_PATH = ".claude/cco/skills/latest-adapter-sync.json";
14
+ const LATEST_SKILL_HYGIENE_RECEIPT_REL_PATH = ".claude/cco/skills/latest-hygiene.json";
15
+ const LATEST_SKILL_INTAKE_CHECK_REL_PATH = ".claude/cco/skills/latest-intake-check.json";
16
+
17
+ function unique(values) {
18
+ return [...new Set((values || []).filter(Boolean))];
19
+ }
20
+
21
+ function receiptPath(cwd, relPath) {
22
+ return path.join(cwd, relPath);
23
+ }
24
+
25
+ function topWarningCodes(registry) {
26
+ const counts = new Map();
27
+ (registry.skills || []).forEach((skill) => {
28
+ (skill.warnings || []).forEach((warning) => {
29
+ counts.set(warning.code, (counts.get(warning.code) || 0) + 1);
30
+ });
31
+ });
32
+ return Array.from(counts.entries())
33
+ .sort((left, right) => right[1] - left[1])
34
+ .slice(0, 5)
35
+ .map(([code]) => code);
36
+ }
37
+
38
+ function sourceCountsFromRegistry(registry) {
39
+ const summary = registry?.summary || {};
40
+ return {
41
+ reviewedSourceIds: unique(summary.reviewedSourceIds || []),
42
+ deferredSourceIds: unique(summary.deferredSourceIds || []),
43
+ blockedSourceIds: unique(summary.blockedSourceIds || []),
44
+ };
45
+ }
46
+
47
+ function writeReceipt(cwd, relPath, payload) {
48
+ ensureCcoDirs(cwd);
49
+ safeWriteJson(cwd, relPath, payload);
50
+ return relPath;
51
+ }
52
+
53
+ function buildSourceAdoptionReceipt(cwd, registry) {
54
+ const counts = sourceCountsFromRegistry(registry);
55
+ const payload = {
56
+ schemaVersion: SKILLS_SCHEMA_VERSION,
57
+ contract: SKILLS_CONTRACT,
58
+ receiptType: "source_adoption",
59
+ createdAt: nowIso(),
60
+ registryPath: GENERATED_SKILL_REGISTRY_REL_PATH,
61
+ reviewedSources: counts.reviewedSourceIds,
62
+ deferredSources: counts.deferredSourceIds,
63
+ blockedSources: counts.blockedSourceIds,
64
+ importedSkillIds: (registry.skills || []).filter((skill) => skill.packId !== "avorelo").map((skill) => skill.id),
65
+ parsedSkills: registry.summary?.totalSkills || 0,
66
+ warnings: registry.warnings || [],
67
+ topWarningCodes: topWarningCodes(registry),
68
+ redacted: true,
69
+ };
70
+ return {
71
+ path: writeReceipt(cwd, LATEST_SOURCE_ADOPTION_RECEIPT_REL_PATH, payload),
72
+ receipt: payload,
73
+ };
74
+ }
75
+
76
+ function buildSkillRouteReceipt(cwd, routeResult) {
77
+ const payload = {
78
+ schemaVersion: SKILLS_SCHEMA_VERSION,
79
+ contract: SKILLS_CONTRACT,
80
+ receiptType: "skill_route",
81
+ createdAt: nowIso(),
82
+ task: routeResult.task,
83
+ primarySkillId: routeResult.primarySkill?.id || null,
84
+ supportingSkillIds: (routeResult.supportingSkills || []).map((skill) => skill.id),
85
+ selectedCapabilities: routeResult.selectedCapabilities || [],
86
+ deferredSources: routeResult.deferredSources || [],
87
+ skippedSkills: (routeResult.skippedSkills || []).slice(0, 10),
88
+ evidenceRequirements: routeResult.evidenceRequirements || [],
89
+ verificationRequirements: routeResult.verificationRequirements || [],
90
+ skillContextWarnings: routeResult.skillContextWarnings || [],
91
+ contextWeight: routeResult.contextWeight || null,
92
+ nextAction: routeResult.nextAction || "",
93
+ redacted: true,
94
+ };
95
+ return {
96
+ path: writeReceipt(cwd, LATEST_SKILL_ROUTE_RECEIPT_REL_PATH, payload),
97
+ receipt: payload,
98
+ };
99
+ }
100
+
101
+ function buildAdapterSyncReceipt(cwd, result, registry) {
102
+ const counts = sourceCountsFromRegistry(registry);
103
+ const payload = {
104
+ schemaVersion: SKILLS_SCHEMA_VERSION,
105
+ contract: SKILLS_CONTRACT,
106
+ receiptType: "adapter_sync",
107
+ createdAt: nowIso(),
108
+ generatedFiles: result.generatedFiles || [],
109
+ skippedFiles: result.skippedFiles || result.skipped || [],
110
+ parsedSkills: registry.summary?.totalSkills || 0,
111
+ reviewedSources: counts.reviewedSourceIds.length,
112
+ deferredSources: counts.deferredSourceIds.length,
113
+ provenanceLineIncluded: true,
114
+ redacted: true,
115
+ };
116
+ return {
117
+ path: writeReceipt(cwd, LATEST_ADAPTER_SYNC_RECEIPT_REL_PATH, payload),
118
+ receipt: payload,
119
+ };
120
+ }
121
+
122
+ function appendSourceAdoptionEvents(cwd, registry, receiptPathValue) {
123
+ const counts = sourceCountsFromRegistry(registry);
124
+ counts.reviewedSourceIds.forEach((sourceId) => {
125
+ appendProductLearningEvent(cwd, {
126
+ eventName: "source_reviewed",
127
+ category: "skills_reference_adoption",
128
+ surface: "avorelo_skills_cli",
129
+ status: "pass",
130
+ payload: { sourceId },
131
+ });
132
+ });
133
+ counts.deferredSourceIds.forEach((sourceId) => {
134
+ appendProductLearningEvent(cwd, {
135
+ eventName: "source_deferred",
136
+ category: "skills_reference_adoption",
137
+ surface: "avorelo_skills_cli",
138
+ status: "warn",
139
+ payload: { sourceId },
140
+ });
141
+ });
142
+ counts.blockedSourceIds.forEach((sourceId) => {
143
+ appendProductLearningEvent(cwd, {
144
+ eventName: "source_blocked",
145
+ category: "skills_reference_adoption",
146
+ surface: "avorelo_skills_cli",
147
+ status: "block",
148
+ payload: { sourceId },
149
+ });
150
+ });
151
+ (registry.skills || []).forEach((skill) => {
152
+ appendProductLearningEvent(cwd, {
153
+ eventName: "skill_parsed",
154
+ category: "skills_reference_adoption",
155
+ surface: "avorelo_skills_cli",
156
+ status: skill.warnings?.length ? "warn" : "pass",
157
+ payload: {
158
+ skillId: skill.id,
159
+ packId: skill.packId,
160
+ warningCount: skill.warnings?.length || 0,
161
+ },
162
+ });
163
+ if (skill.warnings?.length) {
164
+ appendProductLearningEvent(cwd, {
165
+ eventName: "skill_parse_warning",
166
+ category: "skills_reference_adoption",
167
+ surface: "avorelo_skills_cli",
168
+ status: "warn",
169
+ payload: {
170
+ skillId: skill.id,
171
+ warningCodes: (skill.warnings || []).map((warning) => warning.code).slice(0, 5),
172
+ },
173
+ });
174
+ }
175
+ if ((skill.capabilityBindingSuggestions || []).length) {
176
+ appendProductLearningEvent(cwd, {
177
+ eventName: "skill_bound",
178
+ category: "skills_reference_adoption",
179
+ surface: "avorelo_skills_cli",
180
+ status: "pass",
181
+ payload: {
182
+ skillId: skill.id,
183
+ capabilityCount: skill.capabilityBindingSuggestions.length,
184
+ },
185
+ });
186
+ }
187
+ });
188
+ appendProductLearningEvent(cwd, {
189
+ eventName: "source_adoption_receipt_written",
190
+ category: "skills_reference_adoption",
191
+ surface: "avorelo_skills_cli",
192
+ status: "pass",
193
+ payload: {
194
+ receiptPath: receiptPathValue,
195
+ parsedSkills: registry.summary?.totalSkills || 0,
196
+ reviewedSources: counts.reviewedSourceIds.length,
197
+ deferredSources: counts.deferredSourceIds.length,
198
+ },
199
+ });
200
+ }
201
+
202
+ function appendRouteEvents(cwd, routeResult, receiptPathValue) {
203
+ if (routeResult.primarySkill) {
204
+ appendProductLearningEvent(cwd, {
205
+ eventName: "skill_router_hit",
206
+ category: "skills_reference_adoption",
207
+ surface: "avorelo_skills_cli",
208
+ status: "pass",
209
+ payload: {
210
+ skillId: routeResult.primarySkill.id,
211
+ supportingSkillCount: (routeResult.supportingSkills || []).length,
212
+ contextWeight: routeResult.contextWeight?.label || "low",
213
+ },
214
+ });
215
+ } else {
216
+ appendProductLearningEvent(cwd, {
217
+ eventName: "skill_router_skipped",
218
+ category: "skills_reference_adoption",
219
+ surface: "avorelo_skills_cli",
220
+ status: "warn",
221
+ payload: {
222
+ reason: "no_match",
223
+ deferredSourceCount: (routeResult.deferredSources || []).length,
224
+ },
225
+ });
226
+ }
227
+ appendProductLearningEvent(cwd, {
228
+ eventName: "source_adoption_receipt_written",
229
+ category: "skills_reference_adoption",
230
+ surface: "avorelo_skills_cli",
231
+ status: "pass",
232
+ payload: {
233
+ receiptPath: receiptPathValue,
234
+ receiptType: "skill_route",
235
+ },
236
+ });
237
+ }
238
+
239
+ function appendAdapterEvents(cwd, result, receiptPathValue) {
240
+ if ((result.generatedFiles || []).length > 0) {
241
+ appendProductLearningEvent(cwd, {
242
+ eventName: "adapter_generated",
243
+ category: "skills_reference_adoption",
244
+ surface: "adapter_sync",
245
+ status: "pass",
246
+ payload: {
247
+ fileCount: result.generatedFiles.length,
248
+ },
249
+ });
250
+ }
251
+ if ((result.skippedFiles || result.skipped || []).length > 0) {
252
+ appendProductLearningEvent(cwd, {
253
+ eventName: "adapter_generation_skipped",
254
+ category: "skills_reference_adoption",
255
+ surface: "adapter_sync",
256
+ status: "warn",
257
+ payload: {
258
+ fileCount: (result.skippedFiles || result.skipped || []).length,
259
+ },
260
+ });
261
+ }
262
+ appendProductLearningEvent(cwd, {
263
+ eventName: "source_adoption_receipt_written",
264
+ category: "skills_reference_adoption",
265
+ surface: "adapter_sync",
266
+ status: "pass",
267
+ payload: {
268
+ receiptPath: receiptPathValue,
269
+ receiptType: "adapter_sync",
270
+ },
271
+ });
272
+ }
273
+
274
+ function buildSkillHygieneReceipt(cwd, hygiene) {
275
+ const payload = {
276
+ schemaVersion: SKILLS_SCHEMA_VERSION,
277
+ contract: hygiene.contract || "avorelo.skillHygiene.v1",
278
+ receiptType: "skill_hygiene",
279
+ createdAt: nowIso(),
280
+ hygieneStatus: hygiene.hygieneStatus,
281
+ summary: hygiene.summary || {},
282
+ duplicateGroupCount: (hygiene.duplicateGroups || []).length,
283
+ conflictGroupCount: (hygiene.conflictGroups || []).length,
284
+ shadowCandidateCount: (hygiene.shadowCandidates || []).length,
285
+ acceptedContributionCount: hygiene.summary?.acceptedContributions || 0,
286
+ rejectedContributionCount: hygiene.summary?.rejectedContributions || 0,
287
+ contextHeavySkillCount: (hygiene.contextHeavySkills || []).length,
288
+ unsafeSkillCount: (hygiene.unsafeSkills || []).length,
289
+ topReasonCodes: hygiene.topReasonCodes || [],
290
+ nextAction: hygiene.nextAction || "",
291
+ redacted: true,
292
+ };
293
+ return {
294
+ path: writeReceipt(cwd, LATEST_SKILL_HYGIENE_RECEIPT_REL_PATH, payload),
295
+ receipt: payload,
296
+ };
297
+ }
298
+
299
+ function buildSkillIntakeCheckReceipt(cwd, check) {
300
+ const payload = {
301
+ schemaVersion: SKILLS_SCHEMA_VERSION,
302
+ contract: check.contract || "avorelo.skillIntakeCheck.v1",
303
+ receiptType: "skill_intake_check",
304
+ createdAt: nowIso(),
305
+ candidatePath: check.candidatePath,
306
+ candidateSkillId: check.candidateSkillId || null,
307
+ decision: check.decision,
308
+ reasonCodes: check.reasonCodes || [],
309
+ duplicateMatchCount: (check.duplicateMatches || []).length,
310
+ conflictMatchCount: (check.conflictMatches || []).length,
311
+ securityFlagCount: (check.securityFlags || []).length,
312
+ redacted: true,
313
+ };
314
+ return {
315
+ path: writeReceipt(cwd, LATEST_SKILL_INTAKE_CHECK_REL_PATH, payload),
316
+ receipt: payload,
317
+ };
318
+ }
319
+
320
+ function appendHygieneEvents(cwd, hygiene, receiptPath) {
321
+ const { appendProductLearningEvent } = require("./product-learning-events");
322
+ appendProductLearningEvent(cwd, {
323
+ eventName: "skill_hygiene_completed",
324
+ category: "skills_hygiene",
325
+ surface: "avorelo_skills_cli",
326
+ status: hygiene.hygieneStatus === "clean" ? "pass" : hygiene.hygieneStatus === "action_needed" ? "warn" : "pass",
327
+ payload: {
328
+ hygieneStatus: hygiene.hygieneStatus,
329
+ duplicateGroups: hygiene.summary?.duplicateGroups || 0,
330
+ conflictGroups: hygiene.summary?.conflictGroups || 0,
331
+ shadowCandidates: hygiene.summary?.shadowCandidates || 0,
332
+ acceptedContributions: hygiene.summary?.acceptedContributions || 0,
333
+ contextHeavySkills: hygiene.summary?.contextHeavySkills || 0,
334
+ unsafeSkills: hygiene.summary?.unsafeSkills || 0,
335
+ topReasonCodes: (hygiene.topReasonCodes || []).slice(0, 5),
336
+ },
337
+ });
338
+ if ((hygiene.duplicateGroups || []).length > 0) {
339
+ appendProductLearningEvent(cwd, {
340
+ eventName: "skill_duplicate_group_detected",
341
+ category: "skills_hygiene",
342
+ surface: "avorelo_skills_cli",
343
+ status: "warn",
344
+ payload: { count: hygiene.duplicateGroups.length },
345
+ });
346
+ }
347
+ if ((hygiene.shadowCandidates || []).length > 0) {
348
+ appendProductLearningEvent(cwd, {
349
+ eventName: "skill_shadow_candidate_detected",
350
+ category: "skills_hygiene",
351
+ surface: "avorelo_skills_cli",
352
+ status: "warn",
353
+ payload: { count: hygiene.shadowCandidates.length },
354
+ });
355
+ }
356
+ if (hygiene.summary?.acceptedContributions > 0) {
357
+ appendProductLearningEvent(cwd, {
358
+ eventName: "skill_bounded_contribution_accepted",
359
+ category: "skills_hygiene",
360
+ surface: "avorelo_skills_cli",
361
+ status: "pass",
362
+ payload: { count: hygiene.summary.acceptedContributions },
363
+ });
364
+ }
365
+ if (hygiene.summary?.rejectedContributions > 0) {
366
+ appendProductLearningEvent(cwd, {
367
+ eventName: "skill_bounded_contribution_rejected",
368
+ category: "skills_hygiene",
369
+ surface: "avorelo_skills_cli",
370
+ status: "warn",
371
+ payload: { count: hygiene.summary.rejectedContributions },
372
+ });
373
+ }
374
+ if ((hygiene.conflictGroups || []).length > 0) {
375
+ appendProductLearningEvent(cwd, {
376
+ eventName: "skill_conflict_detected",
377
+ category: "skills_hygiene",
378
+ surface: "avorelo_skills_cli",
379
+ status: "warn",
380
+ payload: { count: hygiene.conflictGroups.length },
381
+ });
382
+ }
383
+ if ((hygiene.contextHeavySkills || []).length > 0) {
384
+ appendProductLearningEvent(cwd, {
385
+ eventName: "skill_context_heavy_detected",
386
+ category: "skills_hygiene",
387
+ surface: "avorelo_skills_cli",
388
+ status: "warn",
389
+ payload: { count: hygiene.contextHeavySkills.length },
390
+ });
391
+ }
392
+ if ((hygiene.unsafeSkills || []).length > 0) {
393
+ appendProductLearningEvent(cwd, {
394
+ eventName: "skill_security_hygiene_detected",
395
+ category: "skills_hygiene",
396
+ surface: "avorelo_skills_cli",
397
+ status: "warn",
398
+ payload: { count: hygiene.unsafeSkills.length },
399
+ });
400
+ }
401
+ }
402
+
403
+ function appendSkillIntakeEvents(cwd, check, receiptPath) {
404
+ const { appendProductLearningEvent } = require("./product-learning-events");
405
+ appendProductLearningEvent(cwd, {
406
+ eventName: "skill_intake_checked",
407
+ category: "skills_hygiene",
408
+ surface: "avorelo_skills_cli",
409
+ status: check.decision === "allow" ? "pass" : check.decision === "block" ? "block" : "warn",
410
+ payload: {
411
+ decision: check.decision,
412
+ reasonCodes: (check.reasonCodes || []).slice(0, 5),
413
+ duplicateMatchCount: (check.duplicateMatches || []).length,
414
+ conflictMatchCount: (check.conflictMatches || []).length,
415
+ },
416
+ });
417
+ if (check.decision === "block") {
418
+ appendProductLearningEvent(cwd, {
419
+ eventName: "skill_intake_blocked",
420
+ category: "skills_hygiene",
421
+ surface: "avorelo_skills_cli",
422
+ status: "block",
423
+ payload: { reasonCodes: (check.reasonCodes || []).slice(0, 5) },
424
+ });
425
+ }
426
+ if (check.decision === "merge_recommended") {
427
+ appendProductLearningEvent(cwd, {
428
+ eventName: "skill_intake_merge_recommended",
429
+ category: "skills_hygiene",
430
+ surface: "avorelo_skills_cli",
431
+ status: "warn",
432
+ payload: { duplicateMatchCount: (check.duplicateMatches || []).length },
433
+ });
434
+ }
435
+ }
436
+
437
+ function appendRouteHygieneEvents(cwd, hygieneResult) {
438
+ const { appendProductLearningEvent } = require("./product-learning-events");
439
+ if (hygieneResult.suppressedDuplicateSkills?.length > 0) {
440
+ appendProductLearningEvent(cwd, {
441
+ eventName: "skill_route_deduped",
442
+ category: "skills_hygiene",
443
+ surface: "avorelo_skills_cli",
444
+ status: "pass",
445
+ payload: {
446
+ primarySkill: hygieneResult.primarySkill,
447
+ suppressedCount: hygieneResult.suppressedDuplicateSkills.length,
448
+ reasonCodes: (hygieneResult.reasonCodes || []).slice(0, 5),
449
+ },
450
+ });
451
+ }
452
+ if (hygieneResult.hygieneDecision === "blocked_from_auto_route") {
453
+ appendProductLearningEvent(cwd, {
454
+ eventName: "skill_route_blocked_by_hygiene",
455
+ category: "skills_hygiene",
456
+ surface: "avorelo_skills_cli",
457
+ status: "block",
458
+ payload: {
459
+ primarySkill: hygieneResult.primarySkill,
460
+ reasonCodes: (hygieneResult.reasonCodes || []).slice(0, 5),
461
+ },
462
+ });
463
+ }
464
+ }
465
+
466
+ function readLatestSkillHygieneReceipt(cwd) {
467
+ return safeReadJson(cwd, LATEST_SKILL_HYGIENE_RECEIPT_REL_PATH, null);
468
+ }
469
+
470
+ function readLatestSkillIntakeCheckReceipt(cwd) {
471
+ return safeReadJson(cwd, LATEST_SKILL_INTAKE_CHECK_REL_PATH, null);
472
+ }
473
+
474
+ function readLatestSourceAdoptionReceipt(cwd) {
475
+ return safeReadJson(cwd, LATEST_SOURCE_ADOPTION_RECEIPT_REL_PATH, null);
476
+ }
477
+
478
+ function readLatestSkillRouteReceipt(cwd) {
479
+ return safeReadJson(cwd, LATEST_SKILL_ROUTE_RECEIPT_REL_PATH, null);
480
+ }
481
+
482
+ function readLatestAdapterSyncReceipt(cwd) {
483
+ return safeReadJson(cwd, LATEST_ADAPTER_SYNC_RECEIPT_REL_PATH, null);
484
+ }
485
+
486
+ function registryForSurface(cwd) {
487
+ const existing = safeReadJson(cwd, GENERATED_SKILL_REGISTRY_REL_PATH, null);
488
+ if (existing && Array.isArray(existing.skills)) return existing;
489
+ return buildSkillRegistry(cwd);
490
+ }
491
+
492
+ function buildSkillsOperatingLayerSurface(cwd) {
493
+ const registry = registryForSurface(cwd);
494
+ const counts = sourceCountsFromRegistry(registry);
495
+ const latestSourceReceipt = readLatestSourceAdoptionReceipt(cwd);
496
+ const latestRouteReceipt = readLatestSkillRouteReceipt(cwd);
497
+ const latestAdapterReceipt = readLatestAdapterSyncReceipt(cwd);
498
+ const latestHygieneReceipt = readLatestSkillHygieneReceipt(cwd);
499
+ const latestIntakeCheckReceipt = readLatestSkillIntakeCheckReceipt(cwd);
500
+ const reviewedSources = counts.reviewedSourceIds.length;
501
+ const deferredSources = counts.deferredSourceIds.length;
502
+ const blockedSources = counts.blockedSourceIds.length;
503
+ const parsedSkills = registry.summary?.totalSkills || 0;
504
+ const skillsWithWarnings = registry.summary?.skillsWithWarnings || 0;
505
+ const capabilityBoundSkills = registry.summary?.capabilityBoundSkills || 0;
506
+ const status = parsedSkills > 0 ? "foundation" : "partial";
507
+ const nextAction = deferredSources > 0
508
+ ? "Review deferred sources before enabling broader source-backed routing."
509
+ : "Use `avorelo skills route --task \"<task>\"` to select a reviewed skill path before broad work.";
510
+
511
+ const hygieneStatus = latestHygieneReceipt?.hygieneStatus || null;
512
+ const hygieneSummary = latestHygieneReceipt?.summary || null;
513
+ const hygieneStatusLine = hygieneStatus
514
+ ? `Skills Hygiene: ${hygieneStatus.toUpperCase()} · deduped=${hygieneSummary?.duplicateGroups || 0} · shadow=${hygieneSummary?.shadowCandidates || 0} · contributions=${hygieneSummary?.acceptedContributions || 0} · conflicts=${hygieneSummary?.conflictGroups || 0}`
515
+ : null;
516
+ const hygieneNextAction = latestHygieneReceipt?.nextAction || null;
517
+
518
+ return {
519
+ status,
520
+ reviewedSources,
521
+ deferredSources,
522
+ blockedSources,
523
+ parsedSkills,
524
+ skillsWithWarnings,
525
+ capabilityBoundSkills,
526
+ reviewedSkillSources: reviewedSources,
527
+ deferredSkillSources: deferredSources,
528
+ blockedSkillSources: blockedSources,
529
+ latestSourceAdoptionReceiptPath: latestSourceReceipt ? LATEST_SOURCE_ADOPTION_RECEIPT_REL_PATH : null,
530
+ latestSkillRouteReceiptPath: latestRouteReceipt ? LATEST_SKILL_ROUTE_RECEIPT_REL_PATH : null,
531
+ latestAdapterSyncReceiptPath: latestAdapterReceipt ? LATEST_ADAPTER_SYNC_RECEIPT_REL_PATH : null,
532
+ latestRouteReceiptPath: latestRouteReceipt ? LATEST_SKILL_ROUTE_RECEIPT_REL_PATH : null,
533
+ latestAdapterReceiptPath: latestAdapterReceipt ? LATEST_ADAPTER_SYNC_RECEIPT_REL_PATH : null,
534
+ latestSkillHygieneReceiptPath: latestHygieneReceipt ? LATEST_SKILL_HYGIENE_RECEIPT_REL_PATH : null,
535
+ latestSkillIntakeCheckReceiptPath: latestIntakeCheckReceipt ? LATEST_SKILL_INTAKE_CHECK_REL_PATH : null,
536
+ topWarningCodes: topWarningCodes(registry),
537
+ hygieneStatus,
538
+ duplicateGroups: hygieneSummary?.duplicateGroups ?? null,
539
+ conflictGroups: hygieneSummary?.conflictGroups ?? null,
540
+ shadowCandidates: hygieneSummary?.shadowCandidates ?? null,
541
+ acceptedContributions: hygieneSummary?.acceptedContributions ?? null,
542
+ rejectedContributions: hygieneSummary?.rejectedContributions ?? null,
543
+ contextHeavySkills: hygieneSummary?.contextHeavySkills ?? null,
544
+ unsafeSkills: hygieneSummary?.unsafeSkills ?? null,
545
+ topHygieneReasonCodes: latestHygieneReceipt?.topReasonCodes || null,
546
+ hygieneNextAction,
547
+ nextAction,
548
+ showInStatus: true,
549
+ showInDashboard: true,
550
+ statusLine: `Skills / Reference Adoption: ${status.toUpperCase()} · reviewed=${reviewedSources} · deferred=${deferredSources} · blocked=${blockedSources} · parsed=${parsedSkills} · bound=${capabilityBoundSkills}`,
551
+ hygieneStatusLine,
552
+ };
553
+ }
554
+
555
+ module.exports = {
556
+ SKILLS_CONTRACT,
557
+ SKILLS_SCHEMA_VERSION,
558
+ LATEST_SOURCE_ADOPTION_RECEIPT_REL_PATH,
559
+ LATEST_SKILL_ROUTE_RECEIPT_REL_PATH,
560
+ LATEST_ADAPTER_SYNC_RECEIPT_REL_PATH,
561
+ LATEST_SKILL_HYGIENE_RECEIPT_REL_PATH,
562
+ LATEST_SKILL_INTAKE_CHECK_REL_PATH,
563
+ buildSourceAdoptionReceipt,
564
+ buildSkillRouteReceipt,
565
+ buildAdapterSyncReceipt,
566
+ buildSkillHygieneReceipt,
567
+ buildSkillIntakeCheckReceipt,
568
+ appendSourceAdoptionEvents,
569
+ appendRouteEvents,
570
+ appendAdapterEvents,
571
+ appendHygieneEvents,
572
+ appendSkillIntakeEvents,
573
+ appendRouteHygieneEvents,
574
+ readLatestSourceAdoptionReceipt,
575
+ readLatestSkillRouteReceipt,
576
+ readLatestAdapterSyncReceipt,
577
+ readLatestSkillHygieneReceipt,
578
+ readLatestSkillIntakeCheckReceipt,
579
+ buildSkillsOperatingLayerSurface,
580
+ };