oh-my-opencode 5.0.0-beta.25 → 5.0.0-beta.28

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 (193) hide show
  1. package/dist/cli/config-manager/parse-opencode-config-file.d.ts +2 -1
  2. package/dist/cli/doctor/checks/system-plugin.d.ts +4 -3
  3. package/dist/cli/index.js +309 -182
  4. package/dist/cli-node/index.js +332 -182
  5. package/dist/features/team-mode/tools/messaging-fallback-wake.d.ts +15 -0
  6. package/dist/hooks/todo-continuation-enforcer/types.d.ts +1 -0
  7. package/dist/index.js +1958 -1668
  8. package/dist/shared/index.d.ts +1 -0
  9. package/dist/shared/legacy-plugin-warning.d.ts +2 -1
  10. package/dist/shared/plugin-entry-migrator.d.ts +4 -3
  11. package/dist/shared/plugin-entry-shape.d.ts +6 -0
  12. package/dist/skills/data-scientist/SKILL.md +99 -239
  13. package/dist/skills/data-scientist/references/execution-surfaces.md +91 -0
  14. package/dist/skills/data-scientist/references/placement.md +74 -0
  15. package/dist/skills/data-scientist/references/polars-lane.md +95 -0
  16. package/dist/skills/data-scientist/references/uv-setup.md +1 -1
  17. package/dist/skills/data-scientist/references/visualization.md +64 -0
  18. package/dist/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  19. package/dist/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  20. package/dist/skills/debugging/SKILL.md +2 -0
  21. package/dist/skills/debugging/references/methodology/00-setup.md +12 -0
  22. package/dist/skills/debugging/references/methodology/02-investigate.md +21 -0
  23. package/dist/skills/debugging/references/runtimes/go.md +15 -1
  24. package/dist/skills/debugging/references/runtimes/native-binary.md +38 -0
  25. package/dist/skills/debugging/references/runtimes/node.md +25 -0
  26. package/dist/skills/debugging/references/runtimes/python.md +13 -0
  27. package/dist/skills/debugging/references/runtimes/rust.md +41 -0
  28. package/dist/skills/debugging/references/scripts/dap.mjs +267 -0
  29. package/dist/skills/debugging/references/scripts/dap.test.ts +86 -0
  30. package/dist/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  31. package/dist/skills/debugging/references/tools/dap.md +103 -0
  32. package/dist/skills/debugging/references/tools/frida.md +193 -0
  33. package/dist/skills/ulw-research/SKILL.md +3 -1
  34. package/dist/tools/delegate-task/types.d.ts +3 -0
  35. package/dist/tui.d.ts +12 -0
  36. package/dist/tui.js +106 -15
  37. package/package.json +18 -15
  38. package/packages/lsp-core/src/index.ts +1 -0
  39. package/packages/lsp-core/src/lsp/client-wrapper.ts +25 -5
  40. package/packages/lsp-core/src/lsp/client.ts +26 -0
  41. package/packages/lsp-core/src/lsp/connection.ts +16 -0
  42. package/packages/lsp-core/src/lsp/constants.ts +1 -0
  43. package/packages/lsp-core/src/lsp/format-document.test.ts +143 -0
  44. package/packages/lsp-core/src/lsp/format-document.ts +90 -0
  45. package/packages/lsp-core/src/lsp/manager-max-clients.test.ts +151 -0
  46. package/packages/lsp-core/src/lsp/manager.ts +34 -1
  47. package/packages/lsp-core/src/lsp/server-definitions.ts +29 -0
  48. package/packages/lsp-core/src/lsp/server-installation.test.ts +376 -0
  49. package/packages/lsp-core/src/lsp/server-installation.ts +200 -27
  50. package/packages/lsp-core/src/lsp/server-resolution-local-binary.test.ts +170 -0
  51. package/packages/lsp-core/src/lsp/server-resolution.ts +18 -5
  52. package/packages/lsp-core/src/lsp/transport.ts +9 -0
  53. package/packages/lsp-core/src/lsp/types.ts +8 -0
  54. package/packages/lsp-core/src/request-context.test.ts +29 -0
  55. package/packages/lsp-core/src/request-context.ts +1 -1
  56. package/packages/lsp-core/src/tool-surface.test.ts +13 -1
  57. package/packages/lsp-core/src/tools/definitions.ts +14 -0
  58. package/packages/lsp-core/src/tools/format.test.ts +56 -0
  59. package/packages/lsp-core/src/tools/format.ts +56 -0
  60. package/packages/lsp-core/src/tools/index.ts +1 -0
  61. package/packages/lsp-core/src/tools/types.ts +10 -0
  62. package/packages/lsp-daemon/dist/cli.js +433 -145
  63. package/packages/lsp-daemon/dist/client.d.ts +10 -0
  64. package/packages/lsp-daemon/dist/client.js +402 -108
  65. package/packages/lsp-daemon/dist/daemon-client.d.ts +1 -0
  66. package/packages/lsp-daemon/dist/daemon-client.js +3 -0
  67. package/packages/lsp-daemon/dist/index.js +396 -108
  68. package/packages/lsp-tools-mcp/dist/cli.js +385 -100
  69. package/packages/lsp-tools-mcp/dist/lsp/manager.js +53 -0
  70. package/packages/lsp-tools-mcp/dist/mcp.js +385 -100
  71. package/packages/lsp-tools-mcp/dist/request-context.js +1 -1
  72. package/packages/lsp-tools-mcp/dist/tools.js +386 -100
  73. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  74. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +2 -2
  75. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  76. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  77. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +69 -35
  78. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +21 -2
  79. package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
  80. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  81. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  82. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  83. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  84. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  85. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  86. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
  87. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +404 -121
  88. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  89. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  90. package/packages/omo-codex/plugin/components/rules/dist/cli.js +3 -3
  91. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  92. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  93. package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +3 -3
  94. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +4 -4
  95. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  96. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  97. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +30 -15
  98. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +30 -15
  99. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  100. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  101. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  102. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  103. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +2 -2
  104. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  105. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  106. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  107. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  108. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  109. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  110. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  111. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  112. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  113. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  114. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  115. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  116. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  117. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  118. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  119. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  120. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  121. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  122. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  123. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  124. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  125. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-ulw-execute-continuation.json +1 -1
  126. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  127. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  128. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  129. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  130. package/packages/omo-codex/plugin/model-catalog.json +3 -3
  131. package/packages/omo-codex/plugin/package-lock.json +13 -13
  132. package/packages/omo-codex/plugin/package.json +1 -1
  133. package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +3 -3
  134. package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +99 -239
  135. package/packages/omo-codex/plugin/skills/data-scientist/references/execution-surfaces.md +91 -0
  136. package/packages/omo-codex/plugin/skills/data-scientist/references/placement.md +74 -0
  137. package/packages/omo-codex/plugin/skills/data-scientist/references/polars-lane.md +95 -0
  138. package/packages/omo-codex/plugin/skills/data-scientist/references/uv-setup.md +1 -1
  139. package/packages/omo-codex/plugin/skills/data-scientist/references/visualization.md +64 -0
  140. package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  141. package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  142. package/packages/omo-codex/plugin/skills/debugging/SKILL.md +2 -0
  143. package/packages/omo-codex/plugin/skills/debugging/references/methodology/00-setup.md +12 -0
  144. package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +21 -0
  145. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/go.md +15 -1
  146. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/native-binary.md +38 -0
  147. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/node.md +25 -0
  148. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/python.md +13 -0
  149. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/rust.md +41 -0
  150. package/packages/omo-codex/plugin/skills/debugging/references/scripts/dap.mjs +267 -0
  151. package/packages/omo-codex/plugin/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  152. package/packages/omo-codex/plugin/skills/debugging/references/tools/dap.md +103 -0
  153. package/packages/omo-codex/plugin/skills/debugging/references/tools/frida.md +193 -0
  154. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +3 -1
  155. package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +1 -1
  156. package/packages/omo-codex/plugin/test/auto-update.test.mjs +2 -2
  157. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +8 -8
  158. package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +2 -2
  159. package/packages/omo-codex/scripts/install-dist/install-local.mjs +38 -23
  160. package/packages/shared-skills/skills/data-scientist/SKILL.md +99 -239
  161. package/packages/shared-skills/skills/data-scientist/references/execution-surfaces.md +91 -0
  162. package/packages/shared-skills/skills/data-scientist/references/placement.md +74 -0
  163. package/packages/shared-skills/skills/data-scientist/references/polars-lane.md +95 -0
  164. package/packages/shared-skills/skills/data-scientist/references/uv-setup.md +1 -1
  165. package/packages/shared-skills/skills/data-scientist/references/visualization.md +64 -0
  166. package/packages/shared-skills/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  167. package/packages/shared-skills/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  168. package/packages/shared-skills/skills/debugging/SKILL.md +2 -0
  169. package/packages/shared-skills/skills/debugging/references/methodology/00-setup.md +12 -0
  170. package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +21 -0
  171. package/packages/shared-skills/skills/debugging/references/runtimes/go.md +15 -1
  172. package/packages/shared-skills/skills/debugging/references/runtimes/native-binary.md +38 -0
  173. package/packages/shared-skills/skills/debugging/references/runtimes/node.md +25 -0
  174. package/packages/shared-skills/skills/debugging/references/runtimes/python.md +13 -0
  175. package/packages/shared-skills/skills/debugging/references/runtimes/rust.md +41 -0
  176. package/packages/shared-skills/skills/debugging/references/scripts/dap.mjs +267 -0
  177. package/packages/shared-skills/skills/debugging/references/scripts/dap.test.ts +86 -0
  178. package/packages/shared-skills/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  179. package/packages/shared-skills/skills/debugging/references/tools/dap.md +103 -0
  180. package/packages/shared-skills/skills/debugging/references/tools/frida.md +193 -0
  181. package/packages/shared-skills/skills/ulw-research/SKILL.md +3 -1
  182. package/dist/skills/data-scientist/references/common-scenarios.md +0 -176
  183. package/dist/skills/data-scientist/references/execution-templates.md +0 -197
  184. package/dist/skills/data-scientist/references/integration-patterns.md +0 -153
  185. package/dist/skills/data-scientist/references/performance-benchmarks.md +0 -37
  186. package/packages/omo-codex/plugin/skills/data-scientist/references/common-scenarios.md +0 -176
  187. package/packages/omo-codex/plugin/skills/data-scientist/references/execution-templates.md +0 -197
  188. package/packages/omo-codex/plugin/skills/data-scientist/references/integration-patterns.md +0 -153
  189. package/packages/omo-codex/plugin/skills/data-scientist/references/performance-benchmarks.md +0 -37
  190. package/packages/shared-skills/skills/data-scientist/references/common-scenarios.md +0 -176
  191. package/packages/shared-skills/skills/data-scientist/references/execution-templates.md +0 -197
  192. package/packages/shared-skills/skills/data-scientist/references/integration-patterns.md +0 -153
  193. package/packages/shared-skills/skills/data-scientist/references/performance-benchmarks.md +0 -37
@@ -0,0 +1,193 @@
1
+ # Frida — Hook a Live Process and See Real Values at Runtime
2
+
3
+ **https://frida.re**
4
+
5
+ Frida injects a JavaScript engine into a running process and lets you intercept function calls, read arguments, patch return values, and trace execution without touching the binary on disk. **When static analysis in Ghidra shows you *what* a function does, Frida shows you what it does *right now*, with real inputs.** The two compose naturally: use Ghidra to find the target function and its offset, then use Frida to hook it and watch live traffic.
6
+
7
+ Choose Frida over Ghidra when you need runtime values (actual arguments, return codes, heap contents) or when the binary's control flow is too obfuscated for static analysis to resolve.
8
+
9
+ ---
10
+
11
+ ## Install
12
+
13
+ ```bash
14
+ pip install frida-tools # Python 3 required
15
+ frida --version # verify
16
+ ```
17
+
18
+ On macOS, attaching to another user's process needs root (`sudo frida ...`). SIP-protected system binaries (`/usr/bin/*`, `/usr/sbin/*`) are off-limits entirely. On Linux, you may need `ptrace` permissions: run as root or set `kernel.yama.ptrace_scope=0`.
19
+
20
+ ---
21
+
22
+ ## Target discovery with `frida-ps`
23
+
24
+ ```bash
25
+ frida-ps # list local processes
26
+ frida-ps -U # USB-connected device (iOS/Android)
27
+ frida-ps | grep -i target # find your target by name
28
+ ```
29
+
30
+ ---
31
+
32
+ ## `frida-trace` — zero-code entry point
33
+
34
+ `frida-trace` auto-generates JavaScript handler stubs for every matched function. You don't write any code to start.
35
+
36
+ ```bash
37
+ frida-trace -p <pid> -i "recv*" # trace exported functions by glob
38
+ frida-trace -p <pid> -m "-[NSURLSession dataTaskWithRequest:*]" # Objective-C method
39
+ frida-trace -U -p <pid> -j "com.example.App!login*" # Java method (Android)
40
+ frida-trace -f ./target -i "open" # spawn + trace from start
41
+ ```
42
+
43
+ Generated handler files land in `__handlers__/`. Each looks like:
44
+
45
+ ```js
46
+ // __handlers__/libSystem.B.dylib/open.js
47
+ {
48
+ onEnter(log, args, state) {
49
+ // args[0] is the first argument (a pointer)
50
+ log(`open("${args[0].readUtf8String()}")`);
51
+ },
52
+ onLeave(log, retval, state) {
53
+ log(` => ${retval}`);
54
+ }
55
+ }
56
+ ```
57
+
58
+ Edit that file, save, and `frida-trace` hot-reloads it. This is the fastest path from "I wonder what this function receives" to a concrete answer.
59
+
60
+ ---
61
+
62
+ ## The JS agent API
63
+
64
+ When `frida-trace` isn't enough, you write a JS agent and load it with `frida` or from a Python host script. These are the building blocks.
65
+
66
+ ### Find a function
67
+
68
+ ```js
69
+ // By exported symbol name
70
+ const openPtr = Module.getExportByName(null, "open"); // null = any module
71
+ const sslWritePtr = Module.getExportByName("libssl.so", "SSL_write");
72
+
73
+ // By offset in a stripped binary (get the offset from Ghidra)
74
+ const base = Module.getBaseAddress("target");
75
+ const funcPtr = base.add(0x1a3c);
76
+ ```
77
+
78
+ ### Intercept calls
79
+
80
+ ```js
81
+ Interceptor.attach(openPtr, {
82
+ onEnter(args) {
83
+ // args[0], args[1], ... are NativePointer objects
84
+ const path = args[0].readUtf8String();
85
+ const flags = args[1].toInt32();
86
+ send({ event: "open", path: path, flags: flags });
87
+ },
88
+ onLeave(retval) {
89
+ // retval is the return value as a NativePointer
90
+ send({ event: "open_ret", fd: retval.toInt32() });
91
+ }
92
+ });
93
+ ```
94
+
95
+ ### Read memory
96
+
97
+ ```js
98
+ args[0].readUtf8String() // read a UTF-8 C string from a pointer
99
+ args[0].readCString() // read a raw C string (stops at null)
100
+ args[1].readByteArray(len) // read len raw bytes (returns ArrayBuffer)
101
+ ```
102
+
103
+ ### Replace / stub a function
104
+
105
+ ```js
106
+ // Force a function to always return 0 (e.g. bypass a license check)
107
+ Interceptor.replace(checkLicensePtr, new NativeCallback(function () {
108
+ return 0;
109
+ }, 'int', []));
110
+ ```
111
+
112
+ Use `Interceptor.replace` sparingly. It changes program behavior, so always note in your journal that you patched something and why.
113
+
114
+ ---
115
+
116
+ ## Python host script
117
+
118
+ A host script lets you load a JS agent, receive `send()` messages, and post-process results from the Python side.
119
+
120
+ ```python
121
+ import frida, sys
122
+
123
+ with open("agent.js") as f:
124
+ agent_source = f.read()
125
+
126
+ def on_message(message, data):
127
+ if message["type"] == "send":
128
+ print(f"[*] {message['payload']}")
129
+ else:
130
+ print(f"[!] {message}")
131
+
132
+ session = frida.attach(int(sys.argv[1]))
133
+ script = session.create_script(agent_source)
134
+ script.on("message", on_message)
135
+ script.load()
136
+
137
+ try:
138
+ sys.stdin.read() # block until Ctrl+C
139
+ except KeyboardInterrupt:
140
+ session.detach()
141
+ ```
142
+
143
+ The agent runs inside the target; the host script stays in your terminal and prints structured output.
144
+
145
+ ---
146
+
147
+ ## Output-budget discipline
148
+
149
+ **Hooking a hot function (e.g. `malloc`, `read`) will flood your context with thousands of lines.** Don't print every call. Aggregate in the agent and report a summary.
150
+
151
+ ```js
152
+ // Count calls, report every 1000
153
+ let callCount = 0;
154
+ Interceptor.attach(mallocPtr, {
155
+ onEnter(args) {
156
+ callCount++;
157
+ if (callCount % 1000 === 0) {
158
+ send({ event: "malloc_summary", total_calls: callCount });
159
+ }
160
+ }
161
+ });
162
+ ```
163
+
164
+ Alternatives: filter by argument value, only log calls from a specific caller module, or batch into an array and `send()` on a timer.
165
+
166
+ ---
167
+
168
+ ## ⚠️ Gotchas
169
+
170
+ **Attach vs. spawn.** `frida -p <pid>` attaches to an already-running process. If you need to catch early initialization (constructors, `main` entry), spawn the process with `frida -f ./target`. Frida pauses it at startup. Resume with `%resume` in the REPL or by calling `device.resume(pid)` from Python.
171
+
172
+ **Stripped binaries have no symbol names.** `Module.getExportByName` returns null for internal functions. You must find the function offset in Ghidra, then compute the address at runtime:
173
+
174
+ ```js
175
+ const addr = Module.getBaseAddress("target").add(0x4a20);
176
+ Interceptor.attach(addr, { /* ... */ });
177
+ ```
178
+
179
+ **A crashing target kills your session.** If the target segfaults or aborts, Frida's agent dies with it. Script a respawn loop on the Python side if you expect crashes.
180
+
181
+ **Thread safety.** `onEnter`/`onLeave` fire on multiple threads. Keep shared state to simple counters.
182
+
183
+ ---
184
+
185
+ ## Cleanup
186
+
187
+ ```bash
188
+ kill <pid> # kill any process you spawned with -f
189
+ rm -rf __handlers__/ # remove generated handler stubs
190
+ rm -f agent.js host.py # remove session-specific scripts
191
+ ```
192
+
193
+ Always note in your journal which processes you attached to and whether you replaced any functions. A forgotten `Interceptor.replace` in a long-running target will cause confusing behavior later.
@@ -161,7 +161,9 @@ Record the answer in the journal; Phase 5 opens by turning it into `design-spec.
161
161
 
162
162
  ## Phase 1 — Saturation wave
163
163
 
164
- Launch the entire first wave in one turn — every axis at once, as team members if you formed a team, else as background workers. Sequential launches and "start with one and see" defeat the mode.
164
+ **When the user asked for MASS research, the wave is sized by the topic's angles, not by the roster ceiling.** "mass ulw research", "mulw research", "ulw mass research" — in any language — order over-collection that a team of 8 cannot produce. Where the harness has a dependency-graph surface (the `mass-ulw` skill and its `references/planning.md`), run collection through it instead: a 60+ node opening wave covering every angle the topic has, routed across the whole difficulty ladder in one graph — mechanical sweeps and per-item harvest batches on the cheapest tier, judgment-shaped angles a step up, cross-territory angles a step above that, and the deepest tier reserved for genuinely hairy contradictions. Each wave's EXPAND leads define the next wave's nodes, and the synthesis reduces through several parallel architect-tier nodes into ONE architect-tier reducer (the strongest reasoning tier substitutes wherever no architect tier exists). Absent that surface, hold the same shape with background workers in batched waves. Everything else in this skill still binds: the format gate, the journal, the claim graph, the convergence rules, and the delivery gates.
165
+
166
+ Otherwise launch the entire first wave in one turn — every axis at once, as team members if you formed a team, else as background workers. Sequential launches and "start with one and see" defeat the mode.
165
167
 
166
168
  Scaling floor — more angles always justify more workers:
167
169
 
@@ -1,176 +0,0 @@
1
- # Common Scenarios with Tool Selection
2
-
3
- ## Scenario 1: Simple Calculation
4
-
5
- **Decision: Python (always)**
6
-
7
- ```python
8
- uv run --with numpy python -c "
9
- import numpy as np
10
- result = np.sum([1, 2, 3, 4, 5])
11
- print(f'Result: {result}')
12
- "
13
- ```
14
-
15
- ## Scenario 2: CSV Quick Analysis
16
-
17
- **Decision: DuckDB (direct query, no memory load)**
18
-
19
- ```python
20
- uv run --with numpy --with duckdb python -c "
21
- import duckdb
22
- result = duckdb.sql('''
23
- SELECT * FROM 'data.csv'
24
- LIMIT 10
25
- ''').pl()
26
- print(result)
27
- "
28
- ```
29
-
30
- ## Scenario 3: Filter + Sort on Large Dataset
31
-
32
- **Decision: Polars (128x faster filtering, 12x faster sorting)**
33
-
34
- ```python
35
- uv run --with numpy --with polars python -c "
36
- import polars as pl
37
- result = (
38
- pl.scan_csv('large.csv')
39
- .filter(pl.col('value') > 1000)
40
- .sort('value', descending=True)
41
- .head(100)
42
- .collect()
43
- )
44
- print(result)
45
- "
46
- ```
47
-
48
- ## Scenario 4: Multi-Table Join + Aggregation
49
-
50
- **Decision: DuckDB (best for joins and aggregations)**
51
-
52
- ```python
53
- uv run --with numpy --with duckdb python -c "
54
- import duckdb
55
- result = duckdb.sql('''
56
- SELECT
57
- a.category,
58
- COUNT(*) as count,
59
- SUM(b.amount) as total
60
- FROM 'table1.csv' a
61
- JOIN 'table2.csv' b ON a.id = b.id
62
- GROUP BY a.category
63
- ORDER BY total DESC
64
- ''').pl()
65
- print(result)
66
- "
67
- ```
68
-
69
- ## Scenario 5: Data Exploration
70
-
71
- **Decision: DuckDB for quick exploration**
72
-
73
- ```python
74
- uv run --with numpy --with duckdb python -c "
75
- import duckdb
76
-
77
- # Show first few rows
78
- print('**Sample Data**')
79
- print(duckdb.sql('SELECT * FROM \"data.csv\" LIMIT 5').pl())
80
-
81
- # Show summary statistics
82
- print('\\n**Summary Statistics**')
83
- print(duckdb.sql('DESCRIBE SELECT * FROM \"data.csv\"').pl())
84
-
85
- # Show row count
86
- print('\\n**Row Count**')
87
- print(duckdb.sql('SELECT COUNT(*) as total_rows FROM \"data.csv\"').pl())
88
- "
89
- ```
90
-
91
- ## Scenario 6: Time-Series Analysis
92
-
93
- **Decision: DuckDB for aggregation + matplotlib for visualization**
94
-
95
- ```python
96
- uv run --with numpy --with duckdb --with pyarrow --with matplotlib python -c "
97
- import duckdb
98
- import matplotlib.pyplot as plt
99
-
100
- # Aggregate by date
101
- result = duckdb.sql('''
102
- SELECT
103
- DATE_TRUNC('day', timestamp) as date,
104
- COUNT(*) as count,
105
- AVG(value) as avg_value
106
- FROM 'timeseries.csv'
107
- GROUP BY date
108
- ORDER BY date
109
- ''').pl()
110
-
111
- # Plot
112
- plt.figure(figsize=(12, 6))
113
- plt.subplot(2, 1, 1)
114
- plt.plot(result['date'], result['count'])
115
- plt.title('Daily Count')
116
-
117
- plt.subplot(2, 1, 2)
118
- plt.plot(result['date'], result['avg_value'])
119
- plt.title('Daily Average Value')
120
-
121
- plt.tight_layout()
122
- plt.savefig('timeseries.png')
123
- print('Saved to timeseries.png')
124
- "
125
- ```
126
-
127
- ## Scenario 7: Complex Transformation
128
-
129
- **Decision: Polars for efficient transformations**
130
-
131
- ```python
132
- uv run --with numpy --with polars python -c "
133
- import polars as pl
134
-
135
- result = (
136
- pl.scan_csv('data.csv')
137
- .with_columns([
138
- # Create new calculated columns
139
- (pl.col('price') * pl.col('quantity')).alias('total'),
140
- pl.col('date').str.strptime(pl.Date, '%Y-%m-%d').alias('parsed_date'),
141
- pl.col('name').str.to_uppercase().alias('upper_name'),
142
- ])
143
- .filter(pl.col('total') > 100)
144
- .select(['parsed_date', 'upper_name', 'total'])
145
- .collect()
146
- )
147
-
148
- print(result)
149
- "
150
- ```
151
-
152
- ## Scenario 8: Large File Processing
153
-
154
- **Decision: Polars streaming mode**
155
-
156
- ```python
157
- uv run --with numpy --with polars python -c "
158
- import polars as pl
159
-
160
- # Process file larger than RAM
161
- result = (
162
- pl.scan_csv('huge_file.csv')
163
- .filter(pl.col('active') == True)
164
- .groupby('category')
165
- .agg([
166
- pl.count().alias('count'),
167
- pl.sum('amount').alias('total'),
168
- pl.mean('amount').alias('average'),
169
- ])
170
- .collect(streaming=True) # Streaming mode
171
- )
172
-
173
- print(result)
174
- print(f'\\nProcessed {result[\"count\"].sum():,} rows')
175
- "
176
- ```
@@ -1,197 +0,0 @@
1
- # Execution Templates
2
-
3
- ## Template 1: DuckDB for Simple/Complex SQL Queries
4
-
5
- **Use when:**
6
- - Simple aggregation on single file
7
- - Complex multi-table joins
8
- - Heavy GROUP BY operations
9
- - Window functions with complex SQL logic
10
- - Ad-hoc exploration queries
11
-
12
- ```python
13
- uv run --with numpy --with duckdb python -c "
14
- import duckdb
15
-
16
- # Simple query - direct file access
17
- result = duckdb.sql('''
18
- SELECT
19
- category,
20
- COUNT(*) as count,
21
- AVG(amount) as avg_amount,
22
- SUM(amount) as total
23
- FROM 'data.csv'
24
- WHERE date >= '2024-01-01'
25
- GROUP BY category
26
- ORDER BY total DESC
27
- LIMIT 10
28
- ''').pl()
29
-
30
- print('**Results**')
31
- print(result)
32
- print(f'\\nProcessed {len(result)} categories')
33
- "
34
- ```
35
-
36
- ## Template 2: Polars for Filtering & Sorting
37
-
38
- **Use when:**
39
- - Primary operation is filtering large dataset
40
- - Sorting required
41
- - Chain transformations
42
- - Memory-efficient processing needed
43
-
44
- ```python
45
- uv run --with numpy --with polars python -c "
46
- import polars as pl
47
-
48
- # Lazy evaluation for optimal performance
49
- result = (
50
- pl.scan_csv('data.csv') # Lazy scan
51
- .filter(
52
- (pl.col('amount') > 1000) &
53
- (pl.col('status') == 'active') &
54
- (pl.col('date') >= '2024-01-01')
55
- )
56
- .sort('amount', descending=True)
57
- .head(100)
58
- .collect() # Execute optimized plan
59
- )
60
-
61
- print('**Filtered and Sorted Results**')
62
- print(result)
63
- print(f'\\nFound {len(result)} matching rows')
64
- "
65
- ```
66
-
67
- ## Template 3: Hybrid Approach (Best of Both)
68
-
69
- **Use when:**
70
- - Need joins AND heavy filtering
71
- - Complex SQL followed by transformations
72
- - Optimize different operation stages
73
-
74
- ```python
75
- uv run --with numpy --with duckdb --with polars --with pyarrow python -c "
76
- import duckdb
77
- import polars as pl
78
-
79
- print('Phase 1: DuckDB for complex join (3x faster)')
80
- # DuckDB excels at joins
81
- joined = duckdb.sql('''
82
- SELECT
83
- o.order_id,
84
- o.amount,
85
- c.customer_id,
86
- c.region,
87
- p.category
88
- FROM 'orders.csv' o
89
- JOIN 'customers.csv' c ON o.customer_id = c.customer_id
90
- JOIN 'products.csv' p ON o.product_id = p.product_id
91
- WHERE o.date >= '2024-01-01'
92
- ''').pl() # Convert to Polars
93
-
94
- print(f'Joined {len(joined):,} rows')
95
-
96
- print('\\nPhase 2: Polars for ultra-fast filtering (128x faster)')
97
- # Polars excels at filtering
98
- filtered = (
99
- joined
100
- .filter(
101
- (pl.col('amount') > 100) &
102
- (pl.col('region').is_in(['North', 'South', 'East']))
103
- )
104
- .with_columns([
105
- (pl.col('amount') * 1.1).alias('amount_with_tax')
106
- ])
107
- )
108
-
109
- print(f'Filtered to {len(filtered):,} rows')
110
-
111
- print('\\nPhase 3: DuckDB for final aggregation (4x faster)')
112
- # Back to DuckDB for aggregation
113
- duckdb.register('filtered_data', filtered)
114
- final = duckdb.sql('''
115
- SELECT
116
- region,
117
- category,
118
- COUNT(DISTINCT customer_id) as customers,
119
- SUM(amount_with_tax) as total_revenue,
120
- AVG(amount_with_tax) as avg_transaction
121
- FROM filtered_data
122
- GROUP BY region, category
123
- HAVING total_revenue > 10000
124
- ORDER BY total_revenue DESC
125
- ''').pl()
126
-
127
- print('\\n**Final Results**')
128
- print(final)
129
- "
130
- ```
131
-
132
- ## Template 4: Polars Streaming for Large Files
133
-
134
- **Use when:**
135
- - Dataset larger than available RAM
136
- - Need to process data in batches
137
- - Memory constraints
138
-
139
- ```python
140
- uv run --with numpy --with polars python -c "
141
- import polars as pl
142
-
143
- # Streaming mode - processes data in chunks
144
- result = (
145
- pl.scan_csv('huge_file.csv')
146
- .filter(pl.col('status') == 'active')
147
- .with_columns([
148
- (pl.col('amount') * 1.1).alias('adjusted_amount')
149
- ])
150
- .groupby('category')
151
- .agg([
152
- pl.sum('adjusted_amount').alias('total'),
153
- pl.count().alias('count')
154
- ])
155
- .collect(streaming=True) # Streaming mode for large data
156
- )
157
-
158
- print('**Streaming Results**')
159
- print(result)
160
- print(f'\\nProcessed {result[\"count\"].sum():,} total rows')
161
- "
162
- ```
163
-
164
- ## Template 5: Visualization with Matplotlib
165
-
166
- **Use when:**
167
- - User requests charts, graphs, or plots
168
- - Exploratory data analysis (EDA)
169
- - Time-series or distribution analysis
170
-
171
- ```python
172
- uv run --with numpy --with duckdb --with polars --with pyarrow --with matplotlib python -c "
173
- import duckdb
174
- import matplotlib.pyplot as plt
175
-
176
- # Query data
177
- result = duckdb.sql('''
178
- SELECT
179
- date,
180
- SUM(amount) as total
181
- FROM 'data.csv'
182
- GROUP BY date
183
- ORDER BY date
184
- ''').pl()
185
-
186
- # Create visualization
187
- plt.figure(figsize=(10, 6))
188
- plt.plot(result['date'], result['total'])
189
- plt.xlabel('Date')
190
- plt.ylabel('Total Amount')
191
- plt.title('Daily Total Trends')
192
- plt.xticks(rotation=45)
193
- plt.tight_layout()
194
- plt.savefig('output.png')
195
- print('Chart saved to output.png')
196
- "
197
- ```