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.
- package/dist/cli/config-manager/parse-opencode-config-file.d.ts +2 -1
- package/dist/cli/doctor/checks/system-plugin.d.ts +4 -3
- package/dist/cli/index.js +309 -182
- package/dist/cli-node/index.js +332 -182
- package/dist/features/team-mode/tools/messaging-fallback-wake.d.ts +15 -0
- package/dist/hooks/todo-continuation-enforcer/types.d.ts +1 -0
- package/dist/index.js +1958 -1668
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/legacy-plugin-warning.d.ts +2 -1
- package/dist/shared/plugin-entry-migrator.d.ts +4 -3
- package/dist/shared/plugin-entry-shape.d.ts +6 -0
- package/dist/skills/data-scientist/SKILL.md +99 -239
- package/dist/skills/data-scientist/references/execution-surfaces.md +91 -0
- package/dist/skills/data-scientist/references/placement.md +74 -0
- package/dist/skills/data-scientist/references/polars-lane.md +95 -0
- package/dist/skills/data-scientist/references/uv-setup.md +1 -1
- package/dist/skills/data-scientist/references/visualization.md +64 -0
- package/dist/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
- package/dist/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
- package/dist/skills/debugging/SKILL.md +2 -0
- package/dist/skills/debugging/references/methodology/00-setup.md +12 -0
- package/dist/skills/debugging/references/methodology/02-investigate.md +21 -0
- package/dist/skills/debugging/references/runtimes/go.md +15 -1
- package/dist/skills/debugging/references/runtimes/native-binary.md +38 -0
- package/dist/skills/debugging/references/runtimes/node.md +25 -0
- package/dist/skills/debugging/references/runtimes/python.md +13 -0
- package/dist/skills/debugging/references/runtimes/rust.md +41 -0
- package/dist/skills/debugging/references/scripts/dap.mjs +267 -0
- package/dist/skills/debugging/references/scripts/dap.test.ts +86 -0
- package/dist/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
- package/dist/skills/debugging/references/tools/dap.md +103 -0
- package/dist/skills/debugging/references/tools/frida.md +193 -0
- package/dist/skills/ulw-research/SKILL.md +3 -1
- package/dist/tools/delegate-task/types.d.ts +3 -0
- package/dist/tui.d.ts +12 -0
- package/dist/tui.js +106 -15
- package/package.json +18 -15
- package/packages/lsp-core/src/index.ts +1 -0
- package/packages/lsp-core/src/lsp/client-wrapper.ts +25 -5
- package/packages/lsp-core/src/lsp/client.ts +26 -0
- package/packages/lsp-core/src/lsp/connection.ts +16 -0
- package/packages/lsp-core/src/lsp/constants.ts +1 -0
- package/packages/lsp-core/src/lsp/format-document.test.ts +143 -0
- package/packages/lsp-core/src/lsp/format-document.ts +90 -0
- package/packages/lsp-core/src/lsp/manager-max-clients.test.ts +151 -0
- package/packages/lsp-core/src/lsp/manager.ts +34 -1
- package/packages/lsp-core/src/lsp/server-definitions.ts +29 -0
- package/packages/lsp-core/src/lsp/server-installation.test.ts +376 -0
- package/packages/lsp-core/src/lsp/server-installation.ts +200 -27
- package/packages/lsp-core/src/lsp/server-resolution-local-binary.test.ts +170 -0
- package/packages/lsp-core/src/lsp/server-resolution.ts +18 -5
- package/packages/lsp-core/src/lsp/transport.ts +9 -0
- package/packages/lsp-core/src/lsp/types.ts +8 -0
- package/packages/lsp-core/src/request-context.test.ts +29 -0
- package/packages/lsp-core/src/request-context.ts +1 -1
- package/packages/lsp-core/src/tool-surface.test.ts +13 -1
- package/packages/lsp-core/src/tools/definitions.ts +14 -0
- package/packages/lsp-core/src/tools/format.test.ts +56 -0
- package/packages/lsp-core/src/tools/format.ts +56 -0
- package/packages/lsp-core/src/tools/index.ts +1 -0
- package/packages/lsp-core/src/tools/types.ts +10 -0
- package/packages/lsp-daemon/dist/cli.js +433 -145
- package/packages/lsp-daemon/dist/client.d.ts +10 -0
- package/packages/lsp-daemon/dist/client.js +402 -108
- package/packages/lsp-daemon/dist/daemon-client.d.ts +1 -0
- package/packages/lsp-daemon/dist/daemon-client.js +3 -0
- package/packages/lsp-daemon/dist/index.js +396 -108
- package/packages/lsp-tools-mcp/dist/cli.js +385 -100
- package/packages/lsp-tools-mcp/dist/lsp/manager.js +53 -0
- package/packages/lsp-tools-mcp/dist/mcp.js +385 -100
- package/packages/lsp-tools-mcp/dist/request-context.js +1 -1
- package/packages/lsp-tools-mcp/dist/tools.js +386 -100
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +2 -2
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +69 -35
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +21 -2
- package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
- package/packages/omo-codex/plugin/components/lsp/dist/cli.js +404 -121
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/dist/cli.js +3 -3
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +3 -3
- package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +4 -4
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +30 -15
- package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +30 -15
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-ulw-execute-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/model-catalog.json +3 -3
- package/packages/omo-codex/plugin/package-lock.json +13 -13
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +3 -3
- package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +99 -239
- package/packages/omo-codex/plugin/skills/data-scientist/references/execution-surfaces.md +91 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/placement.md +74 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/polars-lane.md +95 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/uv-setup.md +1 -1
- package/packages/omo-codex/plugin/skills/data-scientist/references/visualization.md +64 -0
- package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
- package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
- package/packages/omo-codex/plugin/skills/debugging/SKILL.md +2 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/00-setup.md +12 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +21 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/go.md +15 -1
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/native-binary.md +38 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/node.md +25 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/python.md +13 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/rust.md +41 -0
- package/packages/omo-codex/plugin/skills/debugging/references/scripts/dap.mjs +267 -0
- package/packages/omo-codex/plugin/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
- package/packages/omo-codex/plugin/skills/debugging/references/tools/dap.md +103 -0
- package/packages/omo-codex/plugin/skills/debugging/references/tools/frida.md +193 -0
- package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +3 -1
- package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/auto-update.test.mjs +2 -2
- package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +8 -8
- package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +2 -2
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +38 -23
- package/packages/shared-skills/skills/data-scientist/SKILL.md +99 -239
- package/packages/shared-skills/skills/data-scientist/references/execution-surfaces.md +91 -0
- package/packages/shared-skills/skills/data-scientist/references/placement.md +74 -0
- package/packages/shared-skills/skills/data-scientist/references/polars-lane.md +95 -0
- package/packages/shared-skills/skills/data-scientist/references/uv-setup.md +1 -1
- package/packages/shared-skills/skills/data-scientist/references/visualization.md +64 -0
- package/packages/shared-skills/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
- package/packages/shared-skills/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
- package/packages/shared-skills/skills/debugging/SKILL.md +2 -0
- package/packages/shared-skills/skills/debugging/references/methodology/00-setup.md +12 -0
- package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +21 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/go.md +15 -1
- package/packages/shared-skills/skills/debugging/references/runtimes/native-binary.md +38 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/node.md +25 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/python.md +13 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/rust.md +41 -0
- package/packages/shared-skills/skills/debugging/references/scripts/dap.mjs +267 -0
- package/packages/shared-skills/skills/debugging/references/scripts/dap.test.ts +86 -0
- package/packages/shared-skills/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
- package/packages/shared-skills/skills/debugging/references/tools/dap.md +103 -0
- package/packages/shared-skills/skills/debugging/references/tools/frida.md +193 -0
- package/packages/shared-skills/skills/ulw-research/SKILL.md +3 -1
- package/dist/skills/data-scientist/references/common-scenarios.md +0 -176
- package/dist/skills/data-scientist/references/execution-templates.md +0 -197
- package/dist/skills/data-scientist/references/integration-patterns.md +0 -153
- package/dist/skills/data-scientist/references/performance-benchmarks.md +0 -37
- package/packages/omo-codex/plugin/skills/data-scientist/references/common-scenarios.md +0 -176
- package/packages/omo-codex/plugin/skills/data-scientist/references/execution-templates.md +0 -197
- package/packages/omo-codex/plugin/skills/data-scientist/references/integration-patterns.md +0 -153
- package/packages/omo-codex/plugin/skills/data-scientist/references/performance-benchmarks.md +0 -37
- package/packages/shared-skills/skills/data-scientist/references/common-scenarios.md +0 -176
- package/packages/shared-skills/skills/data-scientist/references/execution-templates.md +0 -197
- package/packages/shared-skills/skills/data-scientist/references/integration-patterns.md +0 -153
- package/packages/shared-skills/skills/data-scientist/references/performance-benchmarks.md +0 -37
|
@@ -55,7 +55,7 @@ test("#given stale root reasoning config #when ensuring config #then replaces st
|
|
|
55
55
|
assert.equal(result.match(/^model_reasoning_effort\s*=/gm)?.length, 1);
|
|
56
56
|
assert.equal(result.match(/^plan_mode_reasoning_effort\s*=/gm)?.length, 1);
|
|
57
57
|
assert.match(result, /model = "gpt-5\.6-sol"/);
|
|
58
|
-
assert.match(result, /model_context_window =
|
|
58
|
+
assert.match(result, /model_context_window = 650000/);
|
|
59
59
|
assert.match(result, /model_reasoning_effort = "high"/);
|
|
60
60
|
assert.match(result, /plan_mode_reasoning_effort = "xhigh"/);
|
|
61
61
|
assert.doesNotMatch(result, /gpt-5\.2/);
|
|
@@ -80,7 +80,7 @@ test("#given section settings reuse managed root keys #when ensuring config #the
|
|
|
80
80
|
);
|
|
81
81
|
|
|
82
82
|
assert.match(result, /^model = "gpt-5\.6-sol"$/m);
|
|
83
|
-
assert.match(result, /^model_context_window =
|
|
83
|
+
assert.match(result, /^model_context_window = 650000$/m);
|
|
84
84
|
assert.match(result, /\[model_providers\.openai\]\nmodel = "provider-scoped-value"\nmodel_context_window = 123456/);
|
|
85
85
|
assert.match(result, /\[profiles\.review\]\nmodel_reasoning_effort = "medium"\nplan_mode_reasoning_effort = "medium"/);
|
|
86
86
|
});
|
|
@@ -162,7 +162,7 @@ test("#given global and project-local stale Codex configs #when migrating #then
|
|
|
162
162
|
|
|
163
163
|
assert.deepEqual(result.changed.sort(), [join(codexHome, "config.toml"), projectConfig].sort());
|
|
164
164
|
assert.match(await readFile(join(codexHome, "config.toml"), "utf8"), /model = "gpt-5\.6-sol"/);
|
|
165
|
-
assert.match(await readFile(projectConfig, "utf8"), /model_context_window =
|
|
165
|
+
assert.match(await readFile(projectConfig, "utf8"), /model_context_window = 650000/);
|
|
166
166
|
});
|
|
167
167
|
|
|
168
168
|
test("#given model catalog is unavailable and stale 272k config #when migrating #then fallback catalog still upgrades it", async () => {
|
|
@@ -184,7 +184,7 @@ test("#given model catalog is unavailable and stale 272k config #when migrating
|
|
|
184
184
|
const content = await readFile(join(codexHome, "config.toml"), "utf8");
|
|
185
185
|
assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
|
|
186
186
|
assert.match(content, /model = "gpt-5\.6-sol"/);
|
|
187
|
-
assert.match(content, /model_context_window =
|
|
187
|
+
assert.match(content, /model_context_window = 650000/);
|
|
188
188
|
});
|
|
189
189
|
|
|
190
190
|
test("#given model catalog is malformed and stale config #when migrating #then fallback catalog still upgrades it", async () => {
|
|
@@ -207,7 +207,7 @@ test("#given model catalog is malformed and stale config #when migrating #then f
|
|
|
207
207
|
const content = await readFile(join(codexHome, "config.toml"), "utf8");
|
|
208
208
|
assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
|
|
209
209
|
assert.match(content, /model = "gpt-5\.6-sol"/);
|
|
210
|
-
assert.match(content, /model_context_window =
|
|
210
|
+
assert.match(content, /model_context_window = 650000/);
|
|
211
211
|
});
|
|
212
212
|
|
|
213
213
|
test("#given user-customized Codex model config #when migrating #then user values are preserved without root multi-agent mode", async () => {
|
|
@@ -262,7 +262,7 @@ test("#given managed config state is malformed #when migrating #then migration i
|
|
|
262
262
|
const content = await readFile(join(codexHome, "config.toml"), "utf8");
|
|
263
263
|
const state = JSON.parse(await readFile(statePath, "utf8"));
|
|
264
264
|
assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
|
|
265
|
-
assert.match(content, /model_context_window =
|
|
265
|
+
assert.match(content, /model_context_window = 650000/);
|
|
266
266
|
assert.equal(state.files[join(codexHome, "config.toml")].managed, true);
|
|
267
267
|
});
|
|
268
268
|
|
|
@@ -671,14 +671,14 @@ test("#given global config starts with inline-comment features table #when full
|
|
|
671
671
|
const parsed = parseTomlWithPython(content);
|
|
672
672
|
assert.equal("multi_agent_mode" in parsed, false);
|
|
673
673
|
assert.equal(parsed.model, "gpt-5.6-sol");
|
|
674
|
-
assert.equal(parsed.model_context_window,
|
|
674
|
+
assert.equal(parsed.model_context_window, 650000);
|
|
675
675
|
assert.equal(parsed.model_reasoning_effort, "high");
|
|
676
676
|
assert.equal(parsed.plan_mode_reasoning_effort, "xhigh");
|
|
677
677
|
assert.equal(parsed.features.plugins, true);
|
|
678
678
|
assert.equal("multi_agent_mode" in parsed.features, false);
|
|
679
679
|
assert.equal("model" in parsed.features, false);
|
|
680
680
|
assert.equal("model_context_window" in parsed.features, false);
|
|
681
|
-
assert.match(content, /^model = "gpt-5\.6-sol"\nmodel_context_window =
|
|
681
|
+
assert.match(content, /^model = "gpt-5\.6-sol"\nmodel_context_window = 650000/m);
|
|
682
682
|
assert.doesNotMatch(content, /^\s*multi_agent_mode\s*=/m);
|
|
683
683
|
assert.match(content, /\[features\] # keep comment\nplugins = true/);
|
|
684
684
|
});
|
|
@@ -23,7 +23,7 @@ test("#given empty Codex config #when script installer updates config #then sets
|
|
|
23
23
|
// then
|
|
24
24
|
const content = await readFile(configPath, "utf8");
|
|
25
25
|
assert.match(content, /model = "gpt-5\.6-sol"/);
|
|
26
|
-
assert.match(content, /model_context_window =
|
|
26
|
+
assert.match(content, /model_context_window = 650000/);
|
|
27
27
|
assert.match(content, /model_reasoning_effort = "high"/);
|
|
28
28
|
assert.match(content, /plan_mode_reasoning_effort = "xhigh"/);
|
|
29
29
|
});
|
|
@@ -62,7 +62,7 @@ test("#given existing model and reasoning config #when script installer updates
|
|
|
62
62
|
assert.equal(content.match(/^model_reasoning_effort\s*=/gm)?.length, 1);
|
|
63
63
|
assert.equal(content.match(/^plan_mode_reasoning_effort\s*=/gm)?.length, 1);
|
|
64
64
|
assert.match(content, /model = "gpt-5\.6-sol"/);
|
|
65
|
-
assert.match(content, /model_context_window =
|
|
65
|
+
assert.match(content, /model_context_window = 650000/);
|
|
66
66
|
assert.match(content, /model_reasoning_effort = "high"/);
|
|
67
67
|
assert.match(content, /plan_mode_reasoning_effort = "xhigh"/);
|
|
68
68
|
assert.doesNotMatch(content, /model = "gpt-5\.2"/);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// omo-codex-install:
|
|
2
|
+
// omo-codex-install:819e258f7485f9ccdcbb64a54ac0097bf81cd8e2980d7f907017f224b1f99b98:c7cf2301eb62bcb863c4e5844198424f235d9a88b5621bbf03436d1ef66c3491
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __returnValue = (v) => v;
|
|
5
5
|
function __exportSetter(name, newValue) {
|
|
@@ -47,9 +47,12 @@ import {
|
|
|
47
47
|
fsyncSync,
|
|
48
48
|
openSync,
|
|
49
49
|
renameSync,
|
|
50
|
+
rmSync,
|
|
50
51
|
unlinkSync,
|
|
51
52
|
writeFileSync
|
|
52
53
|
} from "node:fs";
|
|
54
|
+
import { randomUUID } from "node:crypto";
|
|
55
|
+
import { dirname as dirname10 } from "node:path";
|
|
53
56
|
function isToleratedFsyncError(error) {
|
|
54
57
|
if (!(error instanceof Error))
|
|
55
58
|
return false;
|
|
@@ -65,24 +68,36 @@ function tolerantFsyncSync(fileDescriptor, fsyncImpl) {
|
|
|
65
68
|
}
|
|
66
69
|
}
|
|
67
70
|
function writeFileAtomically(filePath, content, options = {}) {
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
const
|
|
71
|
-
try {
|
|
72
|
-
tolerantFsyncSync(tempFileDescriptor, options.fsyncSync ?? fsyncSync);
|
|
73
|
-
} finally {
|
|
74
|
-
closeSync(tempFileDescriptor);
|
|
75
|
-
}
|
|
71
|
+
const platform = options.platform ?? process.platform;
|
|
72
|
+
const fsyncImpl = options.fsyncSync ?? fsyncSync;
|
|
73
|
+
const tempPath = `${filePath}.${process.pid}.${randomUUID()}.tmp`;
|
|
76
74
|
try {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
75
|
+
writeFileSync(tempPath, content, "utf-8");
|
|
76
|
+
const tempFileDescriptor = openSync(tempPath, "r+");
|
|
77
|
+
try {
|
|
78
|
+
tolerantFsyncSync(tempFileDescriptor, fsyncImpl);
|
|
79
|
+
} finally {
|
|
80
|
+
closeSync(tempFileDescriptor);
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
renameSync(tempPath, filePath);
|
|
84
|
+
} catch (error) {
|
|
85
|
+
const isPermissionError = error instanceof Error && (error.message.includes("EPERM") || error.message.includes("EACCES"));
|
|
86
|
+
if (platform !== "win32" || !isPermissionError)
|
|
87
|
+
throw error;
|
|
81
88
|
unlinkSync(filePath);
|
|
82
89
|
renameSync(tempPath, filePath);
|
|
90
|
+
}
|
|
91
|
+
if (platform === "win32")
|
|
83
92
|
return;
|
|
93
|
+
const directoryFileDescriptor = openSync(dirname10(filePath), "r");
|
|
94
|
+
try {
|
|
95
|
+
tolerantFsyncSync(directoryFileDescriptor, fsyncImpl);
|
|
96
|
+
} finally {
|
|
97
|
+
closeSync(directoryFileDescriptor);
|
|
84
98
|
}
|
|
85
|
-
|
|
99
|
+
} finally {
|
|
100
|
+
rmSync(tempPath, { force: true });
|
|
86
101
|
}
|
|
87
102
|
}
|
|
88
103
|
var TOLERATED_FSYNC_CODES;
|
|
@@ -348,7 +363,7 @@ var init_env = __esm(() => {
|
|
|
348
363
|
});
|
|
349
364
|
|
|
350
365
|
// node_modules/.bun/posthog-node@5.51.1/node_modules/posthog-node/dist/extensions/error-tracking/modifiers/module.node.mjs
|
|
351
|
-
import { dirname as
|
|
366
|
+
import { dirname as dirname11, posix as posix2, sep as sep7 } from "node:path";
|
|
352
367
|
function createModulerModifier() {
|
|
353
368
|
const getModuleFromFileName = createGetModuleFromFilename();
|
|
354
369
|
return async (frames) => {
|
|
@@ -357,7 +372,7 @@ function createModulerModifier() {
|
|
|
357
372
|
return frames;
|
|
358
373
|
};
|
|
359
374
|
}
|
|
360
|
-
function createGetModuleFromFilename(basePath = process.argv[1] ?
|
|
375
|
+
function createGetModuleFromFilename(basePath = process.argv[1] ? dirname11(process.argv[1]) : process.cwd(), isWindows = sep7 === "\\") {
|
|
361
376
|
const normalizedBase = isWindows ? normalizeWindowsPath(basePath) : basePath;
|
|
362
377
|
return (filename) => {
|
|
363
378
|
if (!filename)
|
|
@@ -7962,7 +7977,7 @@ var package_default;
|
|
|
7962
7977
|
var init_package = __esm(() => {
|
|
7963
7978
|
package_default = {
|
|
7964
7979
|
name: "@oh-my-opencode/omo-codex",
|
|
7965
|
-
version: "5.0.0-beta.
|
|
7980
|
+
version: "5.0.0-beta.28",
|
|
7966
7981
|
type: "module",
|
|
7967
7982
|
private: true,
|
|
7968
7983
|
description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
|
|
@@ -8182,7 +8197,7 @@ var init_telemetry = __esm(() => {
|
|
|
8182
8197
|
|
|
8183
8198
|
// packages/omo-codex/src/install/install-local-cli.ts
|
|
8184
8199
|
import { readFile as readFile23 } from "node:fs/promises";
|
|
8185
|
-
import { dirname as
|
|
8200
|
+
import { dirname as dirname13, join as join40, resolve as resolve10 } from "node:path";
|
|
8186
8201
|
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
8187
8202
|
|
|
8188
8203
|
// packages/utils/src/runtime/spawn.ts
|
|
@@ -11029,14 +11044,14 @@ import { join as join17 } from "node:path";
|
|
|
11029
11044
|
var FALLBACK_CODEX_MODEL_CATALOG = {
|
|
11030
11045
|
current: {
|
|
11031
11046
|
model: "gpt-5.6-sol",
|
|
11032
|
-
modelContextWindow:
|
|
11047
|
+
modelContextWindow: 650000,
|
|
11033
11048
|
modelReasoningEffort: "high",
|
|
11034
11049
|
planModeReasoningEffort: "xhigh"
|
|
11035
11050
|
},
|
|
11036
11051
|
managedProfiles: [
|
|
11037
11052
|
{
|
|
11038
11053
|
model: "gpt-5.5",
|
|
11039
|
-
modelContextWindow:
|
|
11054
|
+
modelContextWindow: 650000,
|
|
11040
11055
|
modelReasoningEffort: "high",
|
|
11041
11056
|
planModeReasoningEffort: "xhigh"
|
|
11042
11057
|
},
|
|
@@ -13540,7 +13555,7 @@ function shellQuote(value) {
|
|
|
13540
13555
|
// packages/omo-codex/src/install/lazycodex-manual-update.ts
|
|
13541
13556
|
import { spawn as spawn3, spawnSync as spawnSync3 } from "node:child_process";
|
|
13542
13557
|
import { readFileSync as readFileSync4 } from "node:fs";
|
|
13543
|
-
import { dirname as
|
|
13558
|
+
import { dirname as dirname12, join as join38 } from "node:path";
|
|
13544
13559
|
import { createInterface as createInterface2 } from "node:readline/promises";
|
|
13545
13560
|
import { fileURLToPath } from "node:url";
|
|
13546
13561
|
|
|
@@ -13649,7 +13664,7 @@ function resolveArgs(env2) {
|
|
|
13649
13664
|
function resolveCurrentVersion(env2) {
|
|
13650
13665
|
if (env2.LAZYCODEX_CURRENT_VERSION?.trim())
|
|
13651
13666
|
return env2.LAZYCODEX_CURRENT_VERSION.trim();
|
|
13652
|
-
const pluginRoot =
|
|
13667
|
+
const pluginRoot = dirname12(dirname12(fileURLToPath(import.meta.url)));
|
|
13653
13668
|
return readVersionManifest(resolveInstalledVersionPath(env2, pluginRoot)) ?? readVersionManifest(join38(pluginRoot, "..", "..", "..", "package.json")) ?? readVersionManifest(join38(pluginRoot, ".codex-plugin", "plugin.json"));
|
|
13654
13669
|
}
|
|
13655
13670
|
function resolveLatestVersion(env2) {
|
|
@@ -13829,7 +13844,7 @@ async function installMarketplaceLocally(options = {}) {
|
|
|
13829
13844
|
return runCodexInstaller(options);
|
|
13830
13845
|
}
|
|
13831
13846
|
function resolveDefaultRepoRootForEntrypoint(entrypointPath) {
|
|
13832
|
-
return resolve10(
|
|
13847
|
+
return resolve10(dirname13(entrypointPath), "..", "..", "..");
|
|
13833
13848
|
}
|
|
13834
13849
|
function resolveDefaultRepoRoot() {
|
|
13835
13850
|
return resolveDefaultRepoRootForEntrypoint(fileURLToPath2(import.meta.url));
|
|
@@ -1,243 +1,103 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: data-scientist
|
|
3
|
-
description: "Expert data processing
|
|
3
|
+
description: "Expert data processing with a hybrid engine strategy: resident-kernel engines first - DuckDB plus a resident Python stack (Polars/numpy/matplotlib) in persistent js/py eval kernels where the harness has them, bun/uv one-shots elsewhere - and per-action placement judgment (in-memory vs streaming vs remote-in-place). Triggers: 'analyze the data', 'what is in this CSV/parquet/json', 'summarize this', 'group by', 'filter rows', 'sort by', 'join these files', 'merge datasets', 'time series trend', 'compare yesterday and today', 'distribution/histogram', 'correlation', 'clean duplicates', 'handle missing values', 'dataset larger than RAM', 'SQL query on files', 'DataFrame operations', 'chart/plot this data', DuckDB vs Polars selection, quick data exploration CLI. NOT for plain text/code inspection, configs, or tiny inline math."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Data Scientist:
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
-
|
|
61
|
-
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
##
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
import duckdb
|
|
105
|
-
# Query file directly - no memory load
|
|
106
|
-
result = duckdb.sql("""
|
|
107
|
-
SELECT category, SUM(amount) as total
|
|
108
|
-
FROM 'data.csv'
|
|
109
|
-
GROUP BY category
|
|
110
|
-
""").pl() # .pl() -> Polars via Arrow. Requires pyarrow. Never .df() (pandas).
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
### Polars Lazy Evaluation
|
|
114
|
-
|
|
115
|
-
```python
|
|
116
|
-
import polars as pl
|
|
117
|
-
# Lazy scan - optimizes and executes once
|
|
118
|
-
result = (
|
|
119
|
-
pl.scan_csv('data.csv')
|
|
120
|
-
.filter(pl.col('value') > 100)
|
|
121
|
-
.sort('value', descending=True)
|
|
122
|
-
.collect()
|
|
123
|
-
)
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
### Zero-Copy DuckDB → Polars
|
|
127
|
-
|
|
128
|
-
```python
|
|
129
|
-
import duckdb
|
|
130
|
-
# Direct conversion via Arrow (pyarrow required in the package set)
|
|
131
|
-
df_polars = duckdb.sql("SELECT * FROM 'data.csv'").pl()
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
### Hybrid Approach
|
|
135
|
-
|
|
136
|
-
```python
|
|
137
|
-
import duckdb
|
|
138
|
-
import polars as pl
|
|
139
|
-
|
|
140
|
-
# Phase 1: DuckDB for joins
|
|
141
|
-
joined = duckdb.sql(
|
|
142
|
-
"SELECT * FROM 'orders.csv' o "
|
|
143
|
-
"JOIN 'customers.csv' c ON o.customer_id = c.customer_id"
|
|
144
|
-
).pl()
|
|
145
|
-
|
|
146
|
-
# Phase 2: Polars for filtering
|
|
147
|
-
filtered = joined.filter(pl.col('amount') > 100)
|
|
148
|
-
|
|
149
|
-
# Phase 3: Back to DuckDB for aggregation
|
|
150
|
-
duckdb.register('filtered_data', filtered)
|
|
151
|
-
final = duckdb.sql('SELECT category, SUM(amount) FROM filtered_data GROUP BY category').pl()
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
## Quick Query CLI
|
|
155
|
-
|
|
156
|
-
For ad-hoc data exploration, use the built-in query runner:
|
|
157
|
-
|
|
158
|
-
```bash
|
|
159
|
-
# SQL query (uses DuckDB)
|
|
160
|
-
uv run scripts/quick-query.py data.csv "SELECT category, COUNT(*) FROM data GROUP BY category"
|
|
161
|
-
|
|
162
|
-
# Filter expression — Polars SQL syntax, e.g. "amount > 100" (NOT Python: never passes through eval)
|
|
163
|
-
uv run scripts/quick-query.py data.csv --filter "amount > 100"
|
|
164
|
-
|
|
165
|
-
# Auto-describe (schema + stats)
|
|
166
|
-
uv run scripts/quick-query.py data.parquet --describe
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
Supports CSV, Parquet, JSON, NDJSON. Cross-platform (macOS, Linux, Windows). Excel files are not read directly — export to CSV or Parquet first.
|
|
170
|
-
|
|
171
|
-
## Reference Documentation
|
|
172
|
-
|
|
173
|
-
For detailed guidance, consult these reference files:
|
|
174
|
-
|
|
175
|
-
- **Environment setup per platform**: See [uv-setup.md](references/uv-setup.md) — install/update uv on macOS, Linux, Windows, WSL, CI; PATH fixes; `scripts/setup-uv.sh` / `scripts/setup-uv.ps1` automate it.
|
|
176
|
-
- **Performance benchmarks and operation detection**: See [performance-benchmarks.md](references/performance-benchmarks.md)
|
|
177
|
-
- **Integration patterns and best practices**: See [integration-patterns.md](references/integration-patterns.md)
|
|
178
|
-
- **Execution templates**: See [execution-templates.md](references/execution-templates.md)
|
|
179
|
-
- **Common scenarios**: See [common-scenarios.md](references/common-scenarios.md)
|
|
180
|
-
|
|
181
|
-
## Quality Assurance Process
|
|
182
|
-
|
|
183
|
-
### Before Execution
|
|
184
|
-
1. **Analyze request** → Detect operation types (filter, join, aggregate, etc.)
|
|
185
|
-
2. **Select optimal tool** → Apply decision tree based on detected operations
|
|
186
|
-
3. **Verify approach** → Confirm tool selection matches the benchmark heuristics
|
|
187
|
-
4. **Check package list** → Ensure numpy AND pyarrow are included
|
|
188
|
-
|
|
189
|
-
### During Execution
|
|
190
|
-
1. **Use lazy evaluation** when possible (Polars `scan_*`, DuckDB direct queries)
|
|
191
|
-
2. **Monitor for errors** and have fallback strategy ready
|
|
192
|
-
3. **Provide progress updates** for long operations
|
|
193
|
-
|
|
194
|
-
### After Execution
|
|
195
|
-
1. **Report performance** → Show processing time and row counts
|
|
196
|
-
2. **Validate results** → Confirm output matches expectations
|
|
197
|
-
3. **Document tool choice** → Explain why specific tool was selected
|
|
198
|
-
|
|
199
|
-
## Activation Context
|
|
200
|
-
|
|
201
|
-
**Automatic activation triggers:**
|
|
202
|
-
|
|
203
|
-
### Exploratory Questions
|
|
204
|
-
- "Analyze the data" / "What's in the data" / "What's in this file"
|
|
205
|
-
- "Show me the data" / "Take a look at this file" / "Check the file contents"
|
|
206
|
-
|
|
207
|
-
### Temporal/Historical Analysis
|
|
208
|
-
- "What happened in the past N days?" / "How's last week's data?"
|
|
209
|
-
- "What's the trend for the last 30 days?" / "Compare yesterday and today"
|
|
210
|
-
|
|
211
|
-
### Aggregation/Summary Requests
|
|
212
|
-
- "Summarize this" / "What's the total?" / "What's the average?"
|
|
213
|
-
- "Show by category" / "Show statistics" / "How many?"
|
|
214
|
-
|
|
215
|
-
### Filtering/Search Patterns
|
|
216
|
-
- "Show only above 100" / "Find specific conditions" / "Top 10"
|
|
217
|
-
|
|
218
|
-
### Comparison/Correlation
|
|
219
|
-
- "Compare A and B" / "What's the difference?" / "Is there a correlation?" / "Merge two files"
|
|
220
|
-
|
|
221
|
-
### Transformation/Cleaning
|
|
222
|
-
- "Clean this up" / "Remove duplicates" / "Handle missing values" / "Convert format"
|
|
223
|
-
|
|
224
|
-
### Technical Patterns
|
|
225
|
-
- Working with CSV, Parquet, JSON, NDJSON, or `.duckdb` files
|
|
226
|
-
- File paths ending in `.csv`, `.parquet`, `.json`, `.jsonl`, `.ndjson`, `.tsv`, `.duckdb`
|
|
227
|
-
- Requests involving calculations or aggregations
|
|
228
|
-
- Joining, filtering, sorting, or transforming datasets
|
|
229
|
-
- Processing large datasets that may exceed memory
|
|
230
|
-
- Comparing or analyzing data from multiple sources
|
|
231
|
-
- Performance-critical data operations
|
|
232
|
-
- SQL queries or DataFrame operations mentioned
|
|
233
|
-
|
|
234
|
-
### When NOT to Activate
|
|
235
|
-
- Simple file reading for text/code inspection (use the harness's file-read surface)
|
|
236
|
-
- Non-data files (images, videos, binaries)
|
|
237
|
-
- Configuration files (YAML, TOML, JSON configs) unless specifically for data analysis
|
|
238
|
-
- Small inline calculations (run them directly)
|
|
239
|
-
- Excel files — convert to CSV/Parquet first
|
|
240
|
-
|
|
241
|
-
---
|
|
242
|
-
|
|
243
|
-
**Core execution principle:** Always apply intelligent tool selection based on operation characteristics, never use pandas, and always include numpy and pyarrow in the execution environment.
|
|
6
|
+
# Data Scientist: Hybrid-Engine Data Processing
|
|
7
|
+
|
|
8
|
+
Answer data questions through the cheapest engine and surface that can prove the answer, and
|
|
9
|
+
decide where the computation should live before touching the data.
|
|
10
|
+
|
|
11
|
+
## Execution surfaces: resident kernel first
|
|
12
|
+
|
|
13
|
+
A persistent REPL/eval kernel (many harnesses expose one for JavaScript and Python) is the
|
|
14
|
+
default surface. Reason: each one-shot process pays roughly a second of spawn-plus-import
|
|
15
|
+
overhead and re-scans the input file, while a resident connection amortizes both — after a
|
|
16
|
+
one-time load, repeat queries return in milliseconds. Exploration is repeat queries, so this
|
|
17
|
+
difference dominates the session.
|
|
18
|
+
|
|
19
|
+
1. **JavaScript kernel (Bun)**: run `scripts/ensure-js-deps.sh` once; it prints the absolute
|
|
20
|
+
import path for `@duckdb/node-api`. Dynamic-import it, connect once, query across cells.
|
|
21
|
+
2. **Python kernel**: the default surface for Python work. duckdb/numpy/matplotlib are
|
|
22
|
+
typically resident; Polars and pyarrow come from `scripts/ensure-py-deps.sh`, which
|
|
23
|
+
installs them once into a user cache keyed to the kernel's interpreter —
|
|
24
|
+
`sys.path.insert` the printed directory and import. The interpreter itself is never
|
|
25
|
+
mutated.
|
|
26
|
+
3. **uv lane** (`uv run --with ...`): isolation for a heavy or crash-prone one-shot that
|
|
27
|
+
should not take the kernel down.
|
|
28
|
+
4. **No kernel** (plain-shell harness): the same engines as one-shots — `bun -e` for
|
|
29
|
+
DuckDB-js, `uv run python -c` for the Python stack — batching several questions per
|
|
30
|
+
process.
|
|
31
|
+
|
|
32
|
+
Per-surface patterns and pitfalls: read `references/execution-surfaces.md` before first use.
|
|
33
|
+
|
|
34
|
+
## Engine selection
|
|
35
|
+
|
|
36
|
+
- **DuckDB** for SQL-shaped work: direct file queries, joins, aggregation, subqueries,
|
|
37
|
+
window functions. It queries CSV/Parquet/JSON in place without loading, spills to disk
|
|
38
|
+
past its memory limit, and reads remote files with the same syntax.
|
|
39
|
+
- **Polars** when the pipeline is DataFrame-shaped: expression-chain transforms, reshapes,
|
|
40
|
+
streaming datasets past RAM — resident in the Python kernel via `ensure-py-deps.sh`.
|
|
41
|
+
Read `references/polars-lane.md` — the current 1.x API differs from widely-memorized
|
|
42
|
+
older spellings.
|
|
43
|
+
- **numpy** when numeric work goes beyond SQL/DataFrame aggregation: statistical tests,
|
|
44
|
+
linear algebra, FFT, random sampling.
|
|
45
|
+
- **matplotlib** for every chart — read `references/visualization.md` first; it carries the
|
|
46
|
+
quality bar and a mandatory visual check.
|
|
47
|
+
|
|
48
|
+
Performance folklore ("X is Nx faster at filtering") varies with data shape, cardinality,
|
|
49
|
+
and hardware. When the engine choice materially matters, measure on the actual data instead
|
|
50
|
+
of trusting remembered multipliers.
|
|
51
|
+
|
|
52
|
+
## Placement: decide where the computation lives
|
|
53
|
+
|
|
54
|
+
Probe before you compute — one cell: file size, free RAM, and (when unclear) a row count via
|
|
55
|
+
a direct scan. Then place the work:
|
|
56
|
+
|
|
57
|
+
- **Load into memory** when the working set stays within roughly a quarter of free RAM AND
|
|
58
|
+
the session will run repeated queries: `CREATE TABLE t AS SELECT ...` (or a collected
|
|
59
|
+
DataFrame) once, then iterate. One scan up front converts every later query from a file
|
|
60
|
+
re-scan into milliseconds.
|
|
61
|
+
- **Query in place / stream** when the question is single-pass, or the data exceeds RAM:
|
|
62
|
+
DuckDB reads files directly (`FROM 'data.csv'`); past RAM, cap DuckDB's memory and let it
|
|
63
|
+
spill, or use Polars' streaming engine in the Python kernel. NEVER load a larger-than-RAM
|
|
64
|
+
dataset fully into memory — swapping stalls the whole machine, while streaming merely
|
|
65
|
+
takes longer.
|
|
66
|
+
- **Query remotely, in place** when the data lives elsewhere: DuckDB reads http(s)/S3
|
|
67
|
+
Parquet and CSV with projection and predicate pushdown, so fetch the columns and rows the
|
|
68
|
+
question needs, never the whole file. When data sits on another machine you can execute
|
|
69
|
+
on, ship the query to the data and return the small result. Rule: result much smaller
|
|
70
|
+
than data — move the query; repeated local iteration planned — move a pruned copy of the
|
|
71
|
+
data once.
|
|
72
|
+
|
|
73
|
+
Sizing heuristics and recipes: `references/placement.md`.
|
|
74
|
+
|
|
75
|
+
## Hard rules
|
|
76
|
+
|
|
77
|
+
- **NEVER use pandas.** DuckDB and Polars beat it decisively on every workload this skill
|
|
78
|
+
covers, and the environments this skill assumes do not ship it — `.df()` on a DuckDB
|
|
79
|
+
result raises unless pandas is installed; convert with `.pl()` via Arrow instead.
|
|
80
|
+
- Excel files are not read directly: export to CSV or Parquet first.
|
|
81
|
+
|
|
82
|
+
## Output contract
|
|
83
|
+
|
|
84
|
+
Answer the question; report row counts and timing for anything heavy; then stop — no bonus
|
|
85
|
+
charts, no extra exploration passes beyond what the question needed. Chart when asked, or
|
|
86
|
+
when the answer is a shape (trend, distribution, comparison) that prose cannot carry — then
|
|
87
|
+
follow `references/visualization.md` including its visual QA step.
|
|
88
|
+
|
|
89
|
+
## References
|
|
90
|
+
|
|
91
|
+
| Read | When |
|
|
92
|
+
| --- | --- |
|
|
93
|
+
| `references/execution-surfaces.md` | before the first query on any surface: kernel patterns, one-shot recipes, escalation rules |
|
|
94
|
+
| `references/polars-lane.md` | DataFrame-shaped pipeline or data past RAM: current API, Arrow handoff, package sets |
|
|
95
|
+
| `references/placement.md` | before heavy or remote work: sizing probe, memory limits, remote reads |
|
|
96
|
+
| `references/visualization.md` | before any chart: type selection, quality bar, CJK fonts, visual QA |
|
|
97
|
+
| `references/uv-setup.md` | uv missing or broken on this machine |
|
|
98
|
+
|
|
99
|
+
## CLI fallback
|
|
100
|
+
|
|
101
|
+
When no kernel or REPL surface exists, `uv run scripts/quick-query.py <file> [SQL]`
|
|
102
|
+
(`--filter <polars-sql-expr>`, `--describe`) answers ad-hoc questions with zero code.
|
|
103
|
+
Supports CSV, Parquet, JSON, NDJSON.
|