@oneie/claude 0.7.0 → 0.9.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 (263) hide show
  1. package/agents/abm-strategist.md +89 -0
  2. package/agents/ads-meta.md +97 -0
  3. package/agents/analyst.md +173 -0
  4. package/agents/architect.md +280 -0
  5. package/agents/brand-guardian.md +88 -0
  6. package/agents/brand-strategist.md +92 -0
  7. package/agents/campaign-content.md +90 -0
  8. package/agents/campaign-email.md +88 -0
  9. package/agents/campaign-sms.md +87 -0
  10. package/agents/campaign-social.md +87 -0
  11. package/agents/cco.md +99 -0
  12. package/agents/ceo.md +106 -0
  13. package/agents/chairman.md +120 -0
  14. package/agents/cmo.md +101 -0
  15. package/agents/community-greeter.md +89 -0
  16. package/agents/community-moderator.md +92 -0
  17. package/agents/compliance.md +92 -0
  18. package/agents/copywriter.md +100 -0
  19. package/agents/creative-strategist.md +95 -0
  20. package/agents/cro.md +98 -0
  21. package/agents/cto.md +267 -0
  22. package/agents/customer-interviewer.md +93 -0
  23. package/agents/customer-researcher.md +89 -0
  24. package/agents/customer-success-manager.md +90 -0
  25. package/agents/customer-trainer.md +90 -0
  26. package/agents/cxo.md +100 -0
  27. package/agents/demand-creator.md +89 -0
  28. package/agents/demo-mover.md +83 -0
  29. package/agents/demo-specialist.md +89 -0
  30. package/agents/demo-thai-family-law.md +87 -0
  31. package/agents/designer.md +112 -0
  32. package/agents/discovery-caller.md +98 -0
  33. package/agents/doctor.md +139 -0
  34. package/agents/educate-coach.md +100 -0
  35. package/agents/elevate-tutor.md +83 -0
  36. package/agents/email-lifecycle-marketer.md +91 -0
  37. package/agents/engage-specialist.md +99 -0
  38. package/agents/events-coordinator.md +90 -0
  39. package/agents/foundation-builder.md +94 -0
  40. package/agents/funnel-architect.md +89 -0
  41. package/agents/gift-creator.md +100 -0
  42. package/agents/google-ads.md +103 -0
  43. package/agents/guide.md +292 -0
  44. package/agents/helpdesk-dispatcher.md +88 -0
  45. package/agents/hook-specialist.md +91 -0
  46. package/agents/identify-optimizer.md +101 -0
  47. package/agents/implementer.md +305 -0
  48. package/agents/incident-commander.md +120 -0
  49. package/agents/insights-lead.md +93 -0
  50. package/agents/journey-runner.md +113 -0
  51. package/agents/linkedin-ads.md +123 -0
  52. package/agents/live-sales-chat.md +90 -0
  53. package/agents/market-researcher.md +88 -0
  54. package/agents/media-buyer.md +96 -0
  55. package/agents/movers-customer-researcher.md +95 -0
  56. package/agents/movers-foundation-builder.md +96 -0
  57. package/agents/movers-market-researcher.md +97 -0
  58. package/agents/movers-pricing-strategist.md +171 -0
  59. package/agents/nurture-architect.md +99 -0
  60. package/agents/offer-architect.md +92 -0
  61. package/agents/onboarder.md +222 -0
  62. package/agents/onboarding-specialist.md +92 -0
  63. package/agents/operations-dashboard.md +98 -0
  64. package/agents/perf-engineer.md +348 -0
  65. package/agents/playbook-writer.md +71 -0
  66. package/agents/plg-strategist.md +91 -0
  67. package/agents/positioning-architect.md +88 -0
  68. package/agents/press-officer.md +89 -0
  69. package/agents/pricing-strategist.md +94 -0
  70. package/agents/privacy-officer.md +92 -0
  71. package/agents/referral-manager.md +91 -0
  72. package/agents/refine-analyst.md +102 -0
  73. package/agents/release-manager.md +261 -0
  74. package/agents/renewals-upsell-rep.md +90 -0
  75. package/agents/review-engineer.md +327 -0
  76. package/agents/rewards-steward.md +82 -0
  77. package/agents/sales-call-coach.md +94 -0
  78. package/agents/sales-closer.md +98 -0
  79. package/agents/security-auditor.md +313 -0
  80. package/agents/sell-closer.md +101 -0
  81. package/agents/share-amplifier.md +99 -0
  82. package/agents/social-media-manager.md +92 -0
  83. package/agents/storyteller.md +250 -0
  84. package/agents/strategist.md +83 -0
  85. package/agents/strategy-aligner.md +94 -0
  86. package/agents/support-agent.md +90 -0
  87. package/agents/tagger.md +245 -0
  88. package/agents/tech-writer.md +216 -0
  89. package/agents/test-engineer.md +243 -0
  90. package/agents/tiktok-ads.md +105 -0
  91. package/agents/tracking-engineer.md +92 -0
  92. package/agents/upsell-strategist.md +101 -0
  93. package/agents/voice.md +85 -0
  94. package/agents/w4-tools.md +153 -0
  95. package/agents/w4-verify.md +20 -138
  96. package/agents/workflow-optimiser.md +84 -0
  97. package/commands/close.md +814 -160
  98. package/commands/create.md +2 -2
  99. package/commands/deploy.md +554 -175
  100. package/commands/do.md +119 -109
  101. package/commands/fast.md +67 -0
  102. package/commands/improve.md +2 -2
  103. package/commands/one.md +418 -0
  104. package/commands/see.md +1 -1
  105. package/commands/sync.md +1 -1
  106. package/commands/tasks.md +222 -0
  107. package/commands/vespio.md +110 -0
  108. package/commands/vespio.remote.md +227 -0
  109. package/hooks/hooks.json +25 -79
  110. package/hooks/lib/governor-escape-match.sh +88 -0
  111. package/hooks/lib/hook.sh +4 -13
  112. package/hooks/lib/signal.sh +9 -2
  113. package/hooks/scripts/branch-pin.sh +6 -0
  114. package/hooks/scripts/config-protect.sh +6 -0
  115. package/hooks/scripts/do-outcome-gate.sh +19 -2
  116. package/hooks/scripts/git-add-guard.sh +43 -2
  117. package/hooks/scripts/governor-escape.sh +96 -0
  118. package/hooks/scripts/load-guard.sh +127 -0
  119. package/hooks/scripts/post-edit-check.sh +36 -29
  120. package/hooks/scripts/session-start.sh +34 -80
  121. package/hooks/scripts/task-complete-verify.sh +46 -40
  122. package/package.json +1 -1
  123. package/rules/documentation.md +9 -0
  124. package/scripts/ad-copy-lint.sh +656 -0
  125. package/scripts/agentverse-audit.sh +256 -0
  126. package/scripts/asi-walk.sh +435 -0
  127. package/scripts/astro-build-cached.sh +143 -0
  128. package/scripts/blocks-manifest-cached.sh +100 -0
  129. package/scripts/blocks-manifest.mjs +497 -0
  130. package/scripts/blocks-ratchet.sh +116 -0
  131. package/scripts/blocks-render-probe.mjs +529 -0
  132. package/scripts/blocks-usage.mjs +334 -0
  133. package/scripts/chat-context-check.sh +89 -0
  134. package/scripts/close-metrics.sh +558 -0
  135. package/scripts/close-owner.sh +268 -0
  136. package/scripts/db-sync-lock-check.sh +116 -0
  137. package/scripts/deploy-dev.sh +35 -0
  138. package/scripts/deploy-emit.sh +298 -0
  139. package/scripts/deploy-gate-check.sh +128 -0
  140. package/scripts/deploy-ready.sh +78 -0
  141. package/scripts/deploy-record.sh +605 -0
  142. package/scripts/deploy.sh +1273 -0
  143. package/scripts/do-auto.sh +598 -48
  144. package/scripts/do-brief.sh +113 -0
  145. package/scripts/do-close.sh +1137 -0
  146. package/scripts/do-commit.sh +75 -0
  147. package/scripts/do-consumer-sweep.sh +18 -1
  148. package/scripts/do-cycle-shape-check.sh +160 -0
  149. package/scripts/do-decide.sh +476 -0
  150. package/scripts/do-derive-check.sh +436 -0
  151. package/scripts/do-fleet.sh +106 -28
  152. package/scripts/do-folder.sh +10 -1
  153. package/scripts/do-next.sh +106 -0
  154. package/scripts/do-orchestrate.sh +17 -5
  155. package/scripts/do-plan-json.mjs +201 -0
  156. package/scripts/do-plan-json.sh +8 -0
  157. package/scripts/do-preflight.sh +117 -0
  158. package/scripts/do-project.sh +157 -0
  159. package/scripts/do-prove-selftest.sh +108 -0
  160. package/scripts/do-prove.sh +295 -23
  161. package/scripts/do-rank.py +31 -1
  162. package/scripts/do-recon-cache.sh +7 -1
  163. package/scripts/do-recon-pack.sh +196 -0
  164. package/scripts/do-reconcile.sh +121 -4
  165. package/scripts/do-signal.sh +280 -23
  166. package/scripts/do-smoke.sh +18 -1
  167. package/scripts/do-test-gate.sh +80 -0
  168. package/scripts/do-tick.sh +102 -0
  169. package/scripts/do-tier.sh +6 -0
  170. package/scripts/do-triage.sh +182 -0
  171. package/scripts/do-ui-gate.sh +1 -1
  172. package/scripts/do-w4-gates.sh +451 -0
  173. package/scripts/do-walk.sh +12 -1
  174. package/scripts/env-sync.sh +173 -0
  175. package/scripts/factory-brief-check.sh +330 -0
  176. package/scripts/factory-check.sh +68 -14
  177. package/scripts/factory-close-check.sh +257 -0
  178. package/scripts/factory-emit.sh +211 -0
  179. package/scripts/factory-executor-check.mjs +353 -0
  180. package/scripts/factory-peak.sh +301 -0
  181. package/scripts/factory-repo.sh +118 -3
  182. package/scripts/factory-review-check.mjs +61 -0
  183. package/scripts/factory-ship.sh +61 -0
  184. package/scripts/factory-tasks-check.sh +18 -1
  185. package/scripts/factory-turn.sh +326 -0
  186. package/scripts/factory-walk.sh +396 -0
  187. package/scripts/factory-width.sh +57 -0
  188. package/scripts/fade-toxic.sh +4 -3
  189. package/scripts/fixtures/factory-brief-real.md +44 -0
  190. package/scripts/fixtures/triage-dupe.md +5 -0
  191. package/scripts/fleet-manifest.mjs +108 -0
  192. package/scripts/fleet-status.sh +110 -0
  193. package/scripts/full-suite-paths-check.sh +144 -0
  194. package/scripts/gate-reaper-check.sh +98 -0
  195. package/scripts/gate-reaper.sh +125 -0
  196. package/scripts/gate-run.sh +73 -0
  197. package/scripts/gc-content-check.sh +140 -0
  198. package/scripts/gen-dev-config.py +20 -0
  199. package/scripts/govern-bound-check.sh +60 -0
  200. package/scripts/govern-claims-check.sh +233 -0
  201. package/scripts/govern-mem-check.sh +290 -0
  202. package/scripts/governor-doors-check.sh +362 -0
  203. package/scripts/governor-escape-check.sh +171 -0
  204. package/scripts/health.sh +413 -0
  205. package/scripts/id-inventory.mjs +418 -0
  206. package/scripts/land.sh +551 -0
  207. package/scripts/lib/gc-finished.sh +77 -0
  208. package/scripts/lib/govern.sh +361 -0
  209. package/scripts/lib/govern.ts +756 -0
  210. package/scripts/lighthouse-run.sh +187 -0
  211. package/scripts/livekit-live-check.sh +61 -0
  212. package/scripts/livekit-ratchet.sh +46 -0
  213. package/scripts/load-guard-check.sh +49 -0
  214. package/scripts/machine-check.sh +102 -0
  215. package/scripts/machine-watch.sh +177 -0
  216. package/scripts/one-agents.mjs +415 -0
  217. package/scripts/one-resume.sh +78 -0
  218. package/scripts/orphan-baseline.json +182 -0
  219. package/scripts/orphan-modules.mjs +179 -0
  220. package/scripts/pr-body.sh +335 -0
  221. package/scripts/preview-fd-check.sh +289 -0
  222. package/scripts/promise-manifest.mjs +24 -1
  223. package/scripts/release.sh +322 -0
  224. package/scripts/roles-check.sh +946 -0
  225. package/scripts/sdk-build-cached.sh +64 -0
  226. package/scripts/signal-watch.sh +241 -0
  227. package/scripts/skills-publish.sh +94 -0
  228. package/scripts/speed-cache-check.sh +173 -0
  229. package/scripts/speed-check.mjs +907 -0
  230. package/scripts/speed-parity-check.sh +648 -0
  231. package/scripts/speed-waterfall-check.sh +355 -0
  232. package/scripts/substrate-env-parity.mjs +156 -0
  233. package/scripts/tasks-claim-race.mjs +108 -0
  234. package/scripts/tasks-loop.sh +185 -0
  235. package/scripts/test-cached.sh +255 -0
  236. package/scripts/test-full.sh +87 -0
  237. package/scripts/test-honesty.mjs +137 -0
  238. package/scripts/test-lanes.sh +166 -0
  239. package/scripts/test-speed.sh +94 -0
  240. package/scripts/triage-shape-check.sh +149 -0
  241. package/scripts/tsc-cached.sh +179 -0
  242. package/scripts/typedb-flake-check.sh +197 -0
  243. package/scripts/urls-lint.sh +15 -0
  244. package/scripts/verify-fast.sh +445 -0
  245. package/scripts/vespio-sync.sh +149 -0
  246. package/scripts/wf-check.mjs +104 -1
  247. package/scripts/worktree-preview.sh +879 -0
  248. package/scripts/worktree-up.sh +208 -0
  249. package/skills/livekit-agents/SKILL.md +285 -0
  250. package/skills/livekit-agents/references/freshness-rules.md +168 -0
  251. package/skills/shadcn/SKILL.md +1 -1
  252. package/skills/signal/SKILL.md +0 -1
  253. package/skills/voice/SKILL.md +94 -6
  254. package/skills/voice/corpus-check.sh +87 -0
  255. package/hooks/scripts/compact-hint.sh +0 -35
  256. package/hooks/scripts/gate-guard.sh +0 -83
  257. package/hooks/scripts/read-tracker.sh +0 -26
  258. package/hooks/scripts/session-end-verify.sh +0 -51
  259. package/hooks/scripts/stop-reflect.sh +0 -140
  260. package/hooks/scripts/sync-priority-todo.sh +0 -57
  261. package/hooks/scripts/sync-todo-docs.sh +0 -46
  262. package/hooks/scripts/tool-signal.sh +0 -48
  263. package/scripts/do-tasks-bridge.py +0 -366
@@ -0,0 +1,182 @@
1
+ {
2
+ "count": 176,
3
+ "files": [
4
+ "src/components/AddDeviceButton.tsx",
5
+ "src/components/ErrorBoundary.tsx",
6
+ "src/components/InboxBell.tsx",
7
+ "src/components/MobileHandoff.tsx",
8
+ "src/components/PersonalizedHero.tsx",
9
+ "src/components/ReportButton.tsx",
10
+ "src/components/SpeedReceipt.tsx",
11
+ "src/components/agents/AgentDrawer.tsx",
12
+ "src/components/agents/VerifiedBadge.tsx",
13
+ "src/components/analytics/SuggestedPopulations.tsx",
14
+ "src/components/auth/BrandLoader.tsx",
15
+ "src/components/auth/CloudRestorePanel.tsx",
16
+ "src/components/auth/InviteButton.tsx",
17
+ "src/components/auth/RecoveryPhraseModal.tsx",
18
+ "src/components/auth/WalletSignIn.tsx",
19
+ "src/components/billing/CancelModal.tsx",
20
+ "src/components/billing/CrossChainPayout.tsx",
21
+ "src/components/cards/CourseCard.tsx",
22
+ "src/components/cards/LessonCard.tsx",
23
+ "src/components/cards/StatMetricsCard.tsx",
24
+ "src/components/cards/TimelineCard.tsx",
25
+ "src/components/chat/ChatIdentityBadge.tsx",
26
+ "src/components/chat/PtcorpCardRenderer.tsx",
27
+ "src/components/chat/ToolResultPart.tsx",
28
+ "src/components/course/CountdownTimer.tsx",
29
+ "src/components/course/EnhancedCourseCard.tsx",
30
+ "src/components/course/EnhancedQuiz.tsx",
31
+ "src/components/course/EnhancedVideoPlayer.tsx",
32
+ "src/components/crm/ContactEdit.tsx",
33
+ "src/components/crm/ContactIdentity.tsx",
34
+ "src/components/dashboard/ClientsCard.tsx",
35
+ "src/components/data/KeyValueGrid.tsx",
36
+ "src/components/do/BuildFunnelByAxis.tsx",
37
+ "src/components/do/CheaperPerCycle.tsx",
38
+ "src/components/do/FourSCompounding.tsx",
39
+ "src/components/do/RouterBrain.tsx",
40
+ "src/components/editor/index.ts",
41
+ "src/components/features/Gate.tsx",
42
+ "src/components/features/StageSwitch.tsx",
43
+ "src/components/in/AgentSupervisionScreen.tsx",
44
+ "src/components/in/DestRail.tsx",
45
+ "src/components/in/EntityActionBar.tsx",
46
+ "src/components/in/FunctionTabs.tsx",
47
+ "src/components/in/HeaderPillRow.tsx",
48
+ "src/components/in/InboxRail.tsx",
49
+ "src/components/in/NewThreadPane.tsx",
50
+ "src/components/in/OwnershipFilter.tsx",
51
+ "src/components/in/PersonScreen.tsx",
52
+ "src/components/in/composer/TemplatePicker.tsx",
53
+ "src/components/layout/DetailHeader.tsx",
54
+ "src/components/media/VideoEmbed.astro",
55
+ "src/components/motion/ScrollScene.tsx",
56
+ "src/components/motion/demo/CounterDemo.tsx",
57
+ "src/components/motion/demo/GlowGrid.tsx",
58
+ "src/components/motion/demo/TypewriterDemo.tsx",
59
+ "src/components/org/AddMemberButton.tsx",
60
+ "src/components/org/CreateOrgDrawer.tsx",
61
+ "src/components/org/CustomAgentButton.tsx",
62
+ "src/components/org/DeleteAgencyButton.tsx",
63
+ "src/components/pages/PagesListIsland.tsx",
64
+ "src/components/pay/CheckoutAppearance.ts",
65
+ "src/components/peer/LocalControls.tsx",
66
+ "src/components/pulse/PulseAtlas.tsx",
67
+ "src/components/research/StudyPanel.tsx",
68
+ "src/components/settings/AppearanceSettings.tsx",
69
+ "src/components/settings/BillingSettings.tsx",
70
+ "src/components/settings/ChannelsAdmin.tsx",
71
+ "src/components/settings/ChatSettings.tsx",
72
+ "src/components/settings/ClientManager.tsx",
73
+ "src/components/settings/DetailTabsEditor.tsx",
74
+ "src/components/settings/ListCTAsEditor.tsx",
75
+ "src/components/settings/NavSettings.tsx",
76
+ "src/components/settings/ProfileCompletionEditor.tsx",
77
+ "src/components/settings/RevenueSection.tsx",
78
+ "src/components/settings/TeamManager.tsx",
79
+ "src/components/sidebar/ClientsPane.tsx",
80
+ "src/components/sidebar/GroupSwitcherTree.tsx",
81
+ "src/components/sidebar/InvitesPane.tsx",
82
+ "src/components/studio/PlanBuilder.tsx",
83
+ "src/components/ui/EmptyCard.tsx",
84
+ "src/components/ui/animated-tooltip.tsx",
85
+ "src/components/ui/bounce-button.tsx",
86
+ "src/components/ui/kbd.tsx",
87
+ "src/components/ui/magnetic-button.tsx",
88
+ "src/components/ui/motion-checkbox.tsx",
89
+ "src/components/ui/motion-radio-group.tsx",
90
+ "src/components/ui/motion-switch.tsx",
91
+ "src/components/ui/motion-tabs.tsx",
92
+ "src/components/ui/navigation-menu.tsx",
93
+ "src/components/ui/pagination.tsx",
94
+ "src/components/ui/radio-group.tsx",
95
+ "src/components/ui/rating.tsx",
96
+ "src/components/ui/shimmer-button.tsx",
97
+ "src/components/views/OptionSelect.tsx",
98
+ "src/content.config.ts",
99
+ "src/engine/rubric.ts",
100
+ "src/hooks/use-inline-edit.ts",
101
+ "src/hooks/use-keyboard-shortcuts.ts",
102
+ "src/lib/ab.ts",
103
+ "src/lib/account-lockout.ts",
104
+ "src/lib/analytics/instruments.ts",
105
+ "src/lib/artifacts/a2a.ts",
106
+ "src/lib/artifacts/did.ts",
107
+ "src/lib/artifacts/erc8004.ts",
108
+ "src/lib/artifacts/mcp-server-json.ts",
109
+ "src/lib/artifacts/sigstore.ts",
110
+ "src/lib/auth-plugins/wallet-link.ts",
111
+ "src/lib/billing/index.ts",
112
+ "src/lib/blocks/render/chat.ts",
113
+ "src/lib/blocks/render/react.tsx",
114
+ "src/lib/booking-cta.ts",
115
+ "src/lib/branding.ts",
116
+ "src/lib/broadcast/serialize.ts",
117
+ "src/lib/campaign-notify.ts",
118
+ "src/lib/campaign-starters.ts",
119
+ "src/lib/campaign-touchpoints.ts",
120
+ "src/lib/can-delegate.ts",
121
+ "src/lib/cap-context.tsx",
122
+ "src/lib/cascade.ts",
123
+ "src/lib/competence/index.ts",
124
+ "src/lib/config.ts",
125
+ "src/lib/cro/abandonment.ts",
126
+ "src/lib/cro/disclosure.ts",
127
+ "src/lib/cro/friction.ts",
128
+ "src/lib/cro/social-proof.ts",
129
+ "src/lib/data/migrate.ts",
130
+ "src/lib/departments.ts",
131
+ "src/lib/dnd-rules.ts",
132
+ "src/lib/do-autonomous.ts",
133
+ "src/lib/foundation/derive.ts",
134
+ "src/lib/foundation/execute-skill.ts",
135
+ "src/lib/foundation/executor.ts",
136
+ "src/lib/funnel.ts",
137
+ "src/lib/funnel/attribution.ts",
138
+ "src/lib/funnel/segmentation.ts",
139
+ "src/lib/funnel/stats.ts",
140
+ "src/lib/gbp/alerts.ts",
141
+ "src/lib/gbp/cross-post.ts",
142
+ "src/lib/gbp/image-intake.ts",
143
+ "src/lib/gbp/strategy.ts",
144
+ "src/lib/generated/substrate-client.ts",
145
+ "src/lib/idempotency.ts",
146
+ "src/lib/in/channels.ts",
147
+ "src/lib/in/composer-submit.ts",
148
+ "src/lib/in/create-prompts.ts",
149
+ "src/lib/in/overview.ts",
150
+ "src/lib/in/writethrough.ts",
151
+ "src/lib/integrations/salesforce.ts",
152
+ "src/lib/journey.ts",
153
+ "src/lib/keyboard/defaults.ts",
154
+ "src/lib/learning/dream-source.ts",
155
+ "src/lib/notify/templates/magic-link.ts",
156
+ "src/lib/notify/templates/reset-password.ts",
157
+ "src/lib/notify/templates/verify-email.ts",
158
+ "src/lib/pagination.ts",
159
+ "src/lib/persona-prompts.ts",
160
+ "src/lib/pheromone.ts",
161
+ "src/lib/pick-delegate.ts",
162
+ "src/lib/problem.ts",
163
+ "src/lib/promises/contract.ts",
164
+ "src/lib/ptcorp-catalog.ts",
165
+ "src/lib/puck/chat-block-bound.ts",
166
+ "src/lib/puck/pickable-records.ts",
167
+ "src/lib/schema-version.ts",
168
+ "src/lib/shim.ts",
169
+ "src/lib/skill/discovery.ts",
170
+ "src/lib/social-schedule.ts",
171
+ "src/lib/ssr-logprob.ts",
172
+ "src/lib/starters.ts",
173
+ "src/lib/use-chat-nudge.ts",
174
+ "src/lib/use-segment.ts",
175
+ "src/lib/wallet-custody.ts",
176
+ "src/lib/wallet-master.ts",
177
+ "src/lib/well-known-door.ts",
178
+ "src/lib/workflow-flow.ts",
179
+ "src/lib/x402.ts"
180
+ ],
181
+ "at": "2026-08-25"
182
+ }
@@ -0,0 +1,179 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * orphan-modules.mjs — every module under src/ must be reachable from something
4
+ * that is not a test.
5
+ *
6
+ * WHY THIS EXISTS. On 2026-08-26 an audit found that `693ba76b4` ("land nine
7
+ * fleets' work") took 35 of 70 files — keeping 12/19 tests but only 10/40
8
+ * source. Two failure modes came out of it:
9
+ *
10
+ * dropped CALLEE -> red test visible, three suites caught it
11
+ * dropped CALLER -> green test, dead INVISIBLE to every gate that existed
12
+ *
13
+ * The second is what this catches. `foundation/derive.ts`, `executor.ts` and
14
+ * `execute-skill.ts` all landed, all have passing tests, and NOTHING in src/
15
+ * imports any of them — their only caller was dropped. The suite went green
16
+ * over a dead feature. Measured: the test suite caught roughly a TENTH of the
17
+ * 28 missing files.
18
+ *
19
+ * The tempting check is test-import-integrity. The data refutes it: it misses
20
+ * the wallet case (master-wiring reads source as TEXT, so there are no imports
21
+ * to resolve) and it misses the foundation case (those imports resolve fine).
22
+ * Reachability is the property that actually distinguishes live from dead.
23
+ *
24
+ * SUBSTRING MATCHING IS NOT ENOUGH and was the first thing tried — grepping for
25
+ * `derive` matched 216 files. This resolves real import specifiers.
26
+ *
27
+ * node .claude/scripts/orphan-modules.mjs # report orphans
28
+ * node .claude/scripts/orphan-modules.mjs --check # exit 1 if any
29
+ * node .claude/scripts/orphan-modules.mjs --check-red # prove it can fail
30
+ */
31
+ import { readFileSync, readdirSync, statSync, existsSync, writeFileSync, mkdtempSync, rmSync, mkdirSync } from 'node:fs'
32
+ import { join, resolve, dirname, relative, extname } from 'node:path'
33
+ import { tmpdir } from 'node:os'
34
+
35
+ const MODE = process.argv[2] ?? ''
36
+
37
+ // Entry points are reached by the FRAMEWORK, not by an import, so an
38
+ // un-imported one is correct rather than orphaned. Getting this list wrong in
39
+ // the permissive direction hides real orphans; wrong in the strict direction
40
+ // produces noise nobody will read. Keep it narrow and justified.
41
+ const ENTRY = [
42
+ /^src\/pages\//, // Astro routes + API routes
43
+ /^src\/middleware\.ts$/, // Astro middleware
44
+ /^src\/workers\//, // CF worker entry points
45
+ /^src\/env\.d\.ts$/,
46
+ /^src\/types\//, // ambient/type-only, erased at runtime
47
+ /^src\/content\//, // content collections
48
+ /^src\/styles\//,
49
+ ]
50
+ const SRC_EXT = new Set(['.ts', '.tsx', '.astro', '.mjs'])
51
+
52
+ function walk(dir, out = []) {
53
+ for (const e of readdirSync(dir)) {
54
+ if (e === 'node_modules' || e === 'dist' || e.startsWith('.')) continue
55
+ const p = join(dir, e)
56
+ if (statSync(p).isDirectory()) walk(p, out)
57
+ else if (SRC_EXT.has(extname(e))) out.push(p)
58
+ }
59
+ return out
60
+ }
61
+
62
+ // Import specifiers: static imports, `export ... from`, dynamic import(), and
63
+ // Astro frontmatter (which is just TS between the fences).
64
+ const SPEC_RE = /(?:import|export)\s[^;]*?from\s*['"]([^'"]+)['"]|import\s*\(\s*['"]([^'"]+)['"]\s*\)|import\s*['"]([^'"]+)['"]/g
65
+
66
+ function specifiersOf(file) {
67
+ const src = readFileSync(file, 'utf8')
68
+ const out = []
69
+ for (const m of src.matchAll(SPEC_RE)) out.push(m[1] ?? m[2] ?? m[3])
70
+ return out.filter(Boolean)
71
+ }
72
+
73
+ /** Resolve a specifier to a real file, honouring the `@/` alias and extensionless imports. */
74
+ function resolveSpec(spec, fromFile, root) {
75
+ let base
76
+ if (spec.startsWith('@/')) base = join(root, 'src', spec.slice(2))
77
+ else if (spec.startsWith('.')) base = resolve(dirname(fromFile), spec)
78
+ else return null // bare package
79
+ // TS lets you write .js for a .ts file
80
+ const stripped = base.replace(/\.js$/, '')
81
+ for (const c of [base, stripped,
82
+ ...['.ts', '.tsx', '.astro', '.mjs'].flatMap(e => [stripped + e, join(stripped, 'index' + e)])]) {
83
+ if (existsSync(c) && statSync(c).isFile()) return c
84
+ }
85
+ return null
86
+ }
87
+
88
+ function analyse(root) {
89
+ const files = walk(join(root, 'src'))
90
+ const rel = f => relative(root, f).split('\\').join('/')
91
+ const isTest = f => /\.(test|spec)\.[tj]sx?$/.test(f) || rel(f).includes('/tests/')
92
+ const isEntry = f => ENTRY.some(re => re.test(rel(f)))
93
+
94
+ // Reached by a NON-TEST file. A module imported only by its own test is
95
+ // exactly the dead-feature shape, so tests must not count as reachability.
96
+ const reached = new Set()
97
+ for (const f of files) {
98
+ if (isTest(f)) continue
99
+ for (const s of specifiersOf(f)) {
100
+ const t = resolveSpec(s, f, root)
101
+ if (t && t !== f) reached.add(t)
102
+ }
103
+ }
104
+ const orphans = files.filter(f => !isTest(f) && !isEntry(f) && !reached.has(f)).map(rel).sort()
105
+ return { total: files.length, orphans }
106
+ }
107
+
108
+ // ── --check-red: prove the checker can fail ──────────────────────────────────
109
+ // A checker you have only ever seen pass is not evidence (doctrine: prove RED).
110
+ if (MODE === '--check-red') {
111
+ const tmp = mkdtempSync(join(tmpdir(), 'orphan-red-'))
112
+ try {
113
+ const s = join(tmp, 'src')
114
+ for (const d of ['lib', 'pages']) mkdirSync(join(s, d), { recursive: true })
115
+ writeFileSync(join(s, 'lib', 'used.ts'), 'export const a = 1\n')
116
+ writeFileSync(join(s, 'lib', 'orphan.ts'), 'export const b = 2\n')
117
+ writeFileSync(join(s, 'pages', 'index.astro'), '---\nimport { a } from "@/lib/used"\n---\n<p>{a}</p>\n')
118
+ let fails = 0
119
+ const r1 = analyse(tmp)
120
+ if (r1.orphans.includes('src/lib/orphan.ts')) console.log(' arm orphan present caught')
121
+ else { console.log(' arm orphan present MISSED'); fails++ }
122
+ if (!r1.orphans.includes('src/lib/used.ts')) console.log(' arm used module not flagged (correct)')
123
+ else { console.log(' arm used module FALSE POSITIVE'); fails++ }
124
+ if (!r1.orphans.includes('src/pages/index.astro')) console.log(' arm entry point exempt (correct)')
125
+ else { console.log(' arm entry point FALSE POSITIVE'); fails++ }
126
+ // a module imported ONLY by a test is still an orphan — the whole point
127
+ writeFileSync(join(s, 'lib', 'testonly.ts'), 'export const c = 3\n')
128
+ mkdirSync(join(tmp, 'tests'), { recursive: true })
129
+ writeFileSync(join(tmp, 'tests', 'x.test.ts'), 'import { c } from "@/lib/testonly"\n')
130
+ const r2 = analyse(tmp)
131
+ if (r2.orphans.includes('src/lib/testonly.ts')) console.log(' arm test-only import caught (the dead-feature shape)')
132
+ else { console.log(' arm test-only import MISSED — this is the shape it exists for'); fails++ }
133
+ console.log(fails === 0
134
+ ? 'check-red: all four arms behaved — the checker CAN go red, and does not cry wolf'
135
+ : `check-red: ${fails} assertion(s) failed`)
136
+ process.exit(fails === 0 ? 0 : 1)
137
+ } finally { rmSync(tmp, { recursive: true, force: true }) }
138
+ }
139
+
140
+ const root = resolve(process.argv.includes('--root')
141
+ ? process.argv[process.argv.indexOf('--root') + 1]
142
+ : join(dirname(new URL(import.meta.url).pathname), '..', '..', 'one.ie', 'web'))
143
+
144
+ if (!existsSync(join(root, 'src'))) {
145
+ console.error(`orphan-modules: no src/ at ${root} — this is UNMEASURED, not ok`)
146
+ process.exit(2)
147
+ }
148
+
149
+ const { total, orphans } = analyse(root)
150
+ console.log(`orphan-modules: ${total} files scanned, ${orphans.length} orphan(s)`)
151
+ for (const o of orphans) console.log(` ${o}`)
152
+ // A RATCHET, not a hard gate. 178 orphans exist today and some are reached in
153
+ // ways this resolver cannot see (a registry map, a Puck block table, a string
154
+ // key). Gating on zero would cry wolf on day one and be muted by day three.
155
+ // Gating on "no NEW orphan" is the same monotonic shape /do already runs: the
156
+ // count can only fall. That is what catches the next dropped caller.
157
+ const BASELINE = join(dirname(new URL(import.meta.url).pathname), 'orphan-baseline.json')
158
+ if (MODE === '--check') {
159
+ let base = { count: Infinity, files: [] }
160
+ if (existsSync(BASELINE)) base = JSON.parse(readFileSync(BASELINE, 'utf8'))
161
+ const known = new Set(base.files ?? [])
162
+ const fresh = orphans.filter(o => !known.has(o))
163
+ if (fresh.length) {
164
+ console.log(`\nRED — ${fresh.length} NEW orphan(s) since the baseline:`)
165
+ for (const f of fresh) console.log(` + ${f}`)
166
+ console.log('\nA new orphan means a module landed with no caller — the shape that')
167
+ console.log('dropped 28 files on 2026-08-26 and showed GREEN the whole time.')
168
+ console.log('Wire it, delete it, or add it to ENTRY with a reason.')
169
+ process.exit(1)
170
+ }
171
+ if (orphans.length < base.count) {
172
+ console.log(`ratchet ROSE: ${base.count} -> ${orphans.length}. Re-baseline with --baseline.`)
173
+ }
174
+ console.log(`ok — no new orphans (baseline ${base.count})`)
175
+ }
176
+ if (MODE === '--baseline') {
177
+ writeFileSync(BASELINE, JSON.stringify({ count: orphans.length, files: orphans, at: new Date().toISOString().slice(0,10) }, null, 2) + '\n')
178
+ console.log(`baseline written: ${orphans.length} orphan(s)`)
179
+ }