oh-my-opencode 4.19.3 → 4.19.4

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 (150) hide show
  1. package/.agents/command/get-unpublished-changes.md +2 -0
  2. package/.agents/command/omomomo.md +1 -1
  3. package/.agents/command/publish.md +7 -0
  4. package/.agents/skills/get-unpublished-changes/SKILL.md +2 -0
  5. package/.agents/skills/hyperplan/SKILL.md +3 -3
  6. package/.agents/skills/omomomo/SKILL.md +1 -1
  7. package/.agents/skills/publish/SKILL.md +7 -0
  8. package/.opencode/command/get-unpublished-changes.md +2 -0
  9. package/.opencode/command/omomomo.md +1 -1
  10. package/.opencode/command/publish.md +7 -0
  11. package/.opencode/skills/hyperplan/SKILL.md +3 -3
  12. package/dist/agents/sisyphus-junior/agent.d.ts +1 -1
  13. package/dist/cli/doctor/checks/deprecated-reasoning-keys.d.ts +2 -0
  14. package/dist/cli/index.js +1625 -1368
  15. package/dist/cli-node/index.js +1625 -1368
  16. package/dist/config/schema/agent-overrides.d.ts +800 -0
  17. package/dist/config/schema/categories.d.ts +132 -0
  18. package/dist/config/schema/fallback-models.d.ts +50 -0
  19. package/dist/config/schema/oh-my-opencode-config.d.ts +818 -2
  20. package/dist/config-migration/index.d.ts +1 -0
  21. package/dist/config-migration/migration-plans.d.ts +1 -0
  22. package/dist/config-migration/reasoning-unification.d.ts +3 -0
  23. package/dist/features/team-mode/tools/lifecycle-test-fixture.d.ts +2 -0
  24. package/dist/hooks/codegraph-bootstrap/command-runner.d.ts +1 -0
  25. package/dist/hooks/model-fallback/next-fallback.d.ts +1 -0
  26. package/dist/hooks/runtime-fallback/constants.d.ts +1 -1
  27. package/dist/index.js +3558 -3241
  28. package/dist/oh-my-opencode.schema.json +1672 -8
  29. package/dist/plugin-handlers/prometheus-agent-config-builder.d.ts +1 -0
  30. package/dist/shared/agent-variant.d.ts +11 -0
  31. package/dist/shared/session-prompt-params-helpers.d.ts +6 -1
  32. package/dist/skills/coding-agent-sessions/SKILL.md +4 -3
  33. package/dist/skills/coding-agent-sessions/references/all-platforms.md +3 -1
  34. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/aside_scanner.py +140 -0
  35. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +3 -0
  36. package/dist/skills/data-scientist/SKILL.md +243 -0
  37. package/dist/skills/data-scientist/references/common-scenarios.md +176 -0
  38. package/dist/skills/data-scientist/references/execution-templates.md +197 -0
  39. package/dist/skills/data-scientist/references/integration-patterns.md +153 -0
  40. package/dist/skills/data-scientist/references/performance-benchmarks.md +37 -0
  41. package/dist/skills/data-scientist/references/uv-setup.md +78 -0
  42. package/dist/skills/data-scientist/scripts/quick-query.py +111 -0
  43. package/dist/skills/data-scientist/scripts/setup-uv.ps1 +53 -0
  44. package/dist/skills/data-scientist/scripts/setup-uv.sh +60 -0
  45. package/dist/skills/debugging/SKILL.md +1 -1
  46. package/dist/skills/programming/SKILL.md +1 -2
  47. package/dist/skills/ulw-plan/SKILL.md +1 -1
  48. package/dist/skills/ulw-research/SKILL.md +122 -11
  49. package/dist/tools/delegate-task/builtin-categories.d.ts +1 -0
  50. package/dist/tools/delegate-task/builtin-category-definition.d.ts +1 -0
  51. package/dist/tools/delegate-task/constants.d.ts +1 -1
  52. package/dist/tui.js +974 -1090
  53. package/package.json +13 -13
  54. package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +2 -2
  55. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  56. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +21 -3
  57. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  58. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  59. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +279 -58
  60. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +230 -41
  61. package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
  62. package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +6 -0
  63. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  64. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  65. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  66. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  67. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  68. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  69. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  70. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  71. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  72. package/packages/omo-codex/plugin/components/rules/dist/cli.js +1 -1
  73. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  74. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  75. package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +1 -1
  76. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  77. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  78. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  79. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  80. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  81. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  82. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  83. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  84. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +1 -1
  85. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  86. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  87. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  88. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  89. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  90. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  91. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  92. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  93. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  94. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  95. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  96. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  97. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  98. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  99. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  100. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  101. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  102. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  103. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
  104. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  105. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
  106. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  107. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  108. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  109. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  110. package/packages/omo-codex/plugin/package-lock.json +13 -13
  111. package/packages/omo-codex/plugin/package.json +1 -1
  112. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +6 -0
  113. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +4 -3
  114. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +3 -1
  115. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/aside_scanner.py +140 -0
  116. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +3 -0
  117. package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +243 -0
  118. package/packages/omo-codex/plugin/skills/data-scientist/agents/openai.yaml +2 -0
  119. package/packages/omo-codex/plugin/skills/data-scientist/references/common-scenarios.md +176 -0
  120. package/packages/omo-codex/plugin/skills/data-scientist/references/execution-templates.md +197 -0
  121. package/packages/omo-codex/plugin/skills/data-scientist/references/integration-patterns.md +153 -0
  122. package/packages/omo-codex/plugin/skills/data-scientist/references/performance-benchmarks.md +37 -0
  123. package/packages/omo-codex/plugin/skills/data-scientist/references/uv-setup.md +78 -0
  124. package/packages/omo-codex/plugin/skills/data-scientist/scripts/quick-query.py +111 -0
  125. package/packages/omo-codex/plugin/skills/data-scientist/scripts/setup-uv.ps1 +53 -0
  126. package/packages/omo-codex/plugin/skills/data-scientist/scripts/setup-uv.sh +60 -0
  127. package/packages/omo-codex/plugin/skills/debugging/SKILL.md +1 -1
  128. package/packages/omo-codex/plugin/skills/programming/SKILL.md +1 -2
  129. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +1 -1
  130. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +121 -11
  131. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +7 -0
  132. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +12 -0
  133. package/packages/omo-codex/scripts/install-dist/install-local.mjs +24 -5
  134. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +4 -3
  135. package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +3 -1
  136. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/aside_scanner.py +140 -0
  137. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +3 -0
  138. package/packages/shared-skills/skills/data-scientist/SKILL.md +243 -0
  139. package/packages/shared-skills/skills/data-scientist/references/common-scenarios.md +176 -0
  140. package/packages/shared-skills/skills/data-scientist/references/execution-templates.md +197 -0
  141. package/packages/shared-skills/skills/data-scientist/references/integration-patterns.md +153 -0
  142. package/packages/shared-skills/skills/data-scientist/references/performance-benchmarks.md +37 -0
  143. package/packages/shared-skills/skills/data-scientist/references/uv-setup.md +78 -0
  144. package/packages/shared-skills/skills/data-scientist/scripts/quick-query.py +111 -0
  145. package/packages/shared-skills/skills/data-scientist/scripts/setup-uv.ps1 +53 -0
  146. package/packages/shared-skills/skills/data-scientist/scripts/setup-uv.sh +60 -0
  147. package/packages/shared-skills/skills/debugging/SKILL.md +1 -1
  148. package/packages/shared-skills/skills/programming/SKILL.md +1 -2
  149. package/packages/shared-skills/skills/ulw-plan/SKILL.md +1 -1
  150. package/packages/shared-skills/skills/ulw-research/SKILL.md +122 -11
@@ -0,0 +1,153 @@
1
+ # Integration Patterns: DuckDB ↔ Polars
2
+
3
+ ## Zero-Copy Conversions (FASTEST)
4
+
5
+ ### DuckDB → Polars (Recommended)
6
+
7
+ ```python
8
+ import duckdb
9
+ import polars as pl
10
+
11
+ # Direct conversion with .pl() - zero-copy via Arrow
12
+ df_polars = duckdb.sql("""
13
+ SELECT * FROM 'data.parquet'
14
+ WHERE amount > 100
15
+ """).pl() # Returns Polars DataFrame directly
16
+
17
+ # Lazy version for large datasets
18
+ lazy_df = duckdb.sql("SELECT * FROM 'data.parquet'").pl(lazy=True)
19
+ result = lazy_df.filter(pl.col('status') == 'active').collect()
20
+ ```
21
+
22
+ ### Polars → DuckDB (Direct Reference)
23
+
24
+ ```python
25
+ import duckdb
26
+ import polars as pl
27
+
28
+ # DuckDB can query Polars DataFrames directly by name
29
+ df = pl.read_parquet('data.parquet')
30
+
31
+ result = duckdb.sql("""
32
+ SELECT category, SUM(amount) as total
33
+ FROM df
34
+ GROUP BY category
35
+ ORDER BY total DESC
36
+ """).pl() # Query df directly, return as Polars
37
+ ```
38
+
39
+ ### Via Arrow (When Needed)
40
+
41
+ ```python
42
+ # Polars → Arrow → DuckDB
43
+ df_polars = pl.read_csv('data.csv')
44
+ duckdb.register('my_table', df_polars.to_arrow())
45
+
46
+ # DuckDB → Arrow → Polars
47
+ arrow_table = duckdb.sql("SELECT * FROM data").arrow()
48
+ df_polars = pl.from_arrow(arrow_table)
49
+ ```
50
+
51
+ ## WRONG vs RIGHT Patterns
52
+
53
+ ### ❌ NEVER - Using Pandas
54
+
55
+ ```python
56
+ # FORBIDDEN - decisively slower than Polars/DuckDB on every operation!
57
+ import pandas as pd
58
+ df = pd.read_csv('data.csv')
59
+ result = df.groupby('category')['amount'].sum()
60
+ ```
61
+
62
+ ### ✅ CORRECT - DuckDB for simple aggregation query
63
+
64
+ ```python
65
+ import duckdb
66
+ # Direct file query - no memory loading!
67
+ result = duckdb.sql("""
68
+ SELECT category, SUM(amount) as total
69
+ FROM 'data.csv'
70
+ GROUP BY category
71
+ """).pl() # Fast, memory-efficient
72
+ ```
73
+
74
+ ### ❌ NEVER - Loading file before DuckDB query
75
+
76
+ ```python
77
+ # WRONG - Unnecessary memory usage
78
+ import polars as pl
79
+ import duckdb
80
+ df = pl.read_csv('data.csv') # Loads entire file
81
+ result = duckdb.sql("SELECT * FROM df WHERE amount > 100").pl()
82
+ ```
83
+
84
+ ### ✅ CORRECT - Let DuckDB query directly
85
+
86
+ ```python
87
+ import duckdb
88
+ # DuckDB queries file directly - much faster!
89
+ result = duckdb.sql("""
90
+ SELECT * FROM 'data.csv'
91
+ WHERE amount > 100
92
+ """).pl()
93
+ ```
94
+
95
+ ### ❌ NEVER - Eager evaluation in Polars
96
+
97
+ ```python
98
+ # WRONG - Loads everything immediately
99
+ import polars as pl
100
+ df = pl.read_csv('large_data.csv') # Eager load
101
+ filtered = df.filter(pl.col('value') > 100)
102
+ ```
103
+
104
+ ### ✅ CORRECT - Lazy evaluation
105
+
106
+ ```python
107
+ import polars as pl
108
+ # Lazy - builds query plan, optimizes, executes once
109
+ df = pl.scan_csv('large_data.csv') # Lazy
110
+ result = (
111
+ df
112
+ .filter(pl.col('value') > 100)
113
+ .groupby('category')
114
+ .agg(pl.sum('value'))
115
+ .collect() # Execute optimized plan
116
+ )
117
+ ```
118
+
119
+ ### ❌ NEVER - Unnecessary Conversions
120
+
121
+ ```python
122
+ # WASTEFUL (DuckDB → Pandas → Polars)
123
+ import duckdb, pandas as pd, polars as pl
124
+ df_pd = duckdb.sql("SELECT * FROM 'data.csv'").df() # requires pandas - the skill never ships it
125
+ df_pl = pl.from_pandas(df_pd)
126
+ ```
127
+
128
+ ### ✅ CORRECT - Direct conversion
129
+
130
+ ```python
131
+ # DIRECT (DuckDB → Polars via Arrow)
132
+ import duckdb
133
+ df_pl = duckdb.sql("SELECT * FROM 'data.csv'").pl()
134
+ ```
135
+
136
+ ### ❌ NEVER - Wrong tool for heavy filtering
137
+
138
+ ```python
139
+ # SLOW (DuckDB not optimal for filtering)
140
+ import duckdb
141
+ result = duckdb.sql("""
142
+ SELECT * FROM 'huge.csv'
143
+ WHERE complex_filter = true
144
+ """).pl()
145
+ ```
146
+
147
+ ### ✅ CORRECT - Use Polars for filtering
148
+
149
+ ```python
150
+ # FAST (Polars 128x faster for filtering)
151
+ import polars as pl
152
+ result = pl.scan_csv('huge.csv').filter(pl.col('complex_filter')).collect()
153
+ ```
@@ -0,0 +1,37 @@
1
+ # Performance Benchmarks
2
+
3
+ Routing heuristics distilled from public 2024-2025 results in the [db-benchmark suite](https://github.com/h2oai/db-benchmark) (rendered at [h2oai.github.io/db-benchmark](https://h2oai.github.io/db-benchmark/)) and from the vendors' own documentation ([duckdb.org](https://duckdb.org/), [pola.rs](https://pola.rs/)).
4
+
5
+ **Read these as routing guidance, not guarantees.** Multipliers vary with dataset size, cardinality, data types, and hardware. When the choice materially matters, measure on the actual data.
6
+
7
+ ## Operation Performance Comparison
8
+
9
+ | Operation Type | Winner | Indicative advantage | When to Use |
10
+ |---------------------|-------------|----------------------|------------------------------------------------|
11
+ | **Filtering** | **Polars** | often the fastest by a wide margin (SIMD, predicate pushdown) | Single-table filters |
12
+ | **Sorting** | **Polars** | typically the fastest | ORDER BY operations, ranking |
13
+ | **Joins** | **DuckDB** | typically faster; richer join types | Multi-table joins, especially complex joins |
14
+ | **Aggregations** | **DuckDB** | typically faster on large datasets | GROUP BY, complex aggregations |
15
+ | **Window Funcs** | **Polars** | typically faster | RANK, LAG/LEAD, running totals |
16
+ | **Transformations** | **Polars** | typically faster | Pivot, melt, string operations |
17
+ | **Direct Query** | **DuckDB** | avoids loading to memory entirely | Ad-hoc exploration without loading to memory |
18
+ | **Streaming** | **Polars** | handles datasets larger than RAM | Datasets larger than RAM |
19
+
20
+ Both tools are decisively faster than pandas on 1M+ row workloads, which is why pandas is banned outright in this skill.
21
+
22
+ ## Operation Detection Keywords
23
+
24
+ Automatically detect operation types from user requests:
25
+
26
+ - **Filter**: "where", "filter", "condition", "select rows", "find"
27
+ - **Sort**: "sort", "order", "top", "bottom", "rank"
28
+ - **Join**: "join", "merge", "combine tables"
29
+ - **Aggregate**: "group", "sum", "avg", "count", "mean", "total", "aggregate"
30
+ - **Transform**: "pivot", "melt", "reshape", "string operations", "clean", "transform"
31
+ - **Window**: "running", "cumulative", "lag", "lead", "rank", "partition"
32
+
33
+ ## Benchmarking Notes
34
+
35
+ - Public suites exercise typical analytical workloads (1M-100M rows).
36
+ - Performance advantages are approximate and vary by dataset characteristics.
37
+ - Real-world performance depends on data types, cardinality, and hardware.
@@ -0,0 +1,78 @@
1
+ # uv Setup — Per-Platform
2
+
3
+ This skill runs every data operation through `uv run --with ...`. If `uv --version` fails, set uv up with the automated scripts or the manual commands below, then verify.
4
+
5
+ ## Automated (recommended)
6
+
7
+ | Platform | Command |
8
+ |---|---|
9
+ | macOS / Linux / WSL / Git Bash | `bash scripts/setup-uv.sh` |
10
+ | Windows (PowerShell) | `powershell -ExecutionPolicy Bypass -File scripts/setup-uv.ps1` |
11
+
12
+ Both scripts: detect OS + architecture → install uv to the latest release when missing → upgrade it when present (`uv self update`) → make it resolvable for the current shell → verify with `uv --version`. They are idempotent — safe to re-run any time.
13
+
14
+ ## Manual install per platform
15
+
16
+ ### macOS
17
+
18
+ ```bash
19
+ curl -LsSf https://astral.sh/uv/install.sh | sh # official installer → ~/.local/bin/uv
20
+ # or, with Homebrew:
21
+ brew install uv
22
+ ```
23
+
24
+ ### Linux (x86_64 / aarch64)
25
+
26
+ ```bash
27
+ curl -LsSf https://astral.sh/uv/install.sh | sh # official installer → ~/.local/bin/uv
28
+ ```
29
+
30
+ The installer detects glibc vs musl and downloads the right static binary. On minimal containers, ensure `curl` (or `wget`) exists; `wget -qO- https://astral.sh/uv/install.sh | sh` is the fallback.
31
+
32
+ ### Windows (native)
33
+
34
+ ```powershell
35
+ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
36
+ # or, with winget:
37
+ winget install --id=astral-sh.uv -e
38
+ ```
39
+
40
+ ### Windows Subsystem for Linux / Git Bash
41
+
42
+ Use the Linux/macOS installer inside the Unix shell, not the PowerShell installer:
43
+
44
+ ```bash
45
+ curl -LsSf https://astral.sh/uv/install.sh | sh
46
+ ```
47
+
48
+ ### CI
49
+
50
+ ```yaml
51
+ # GitHub Actions
52
+ - uses: astral-sh/setup-uv@v5
53
+ # or plain shell anywhere:
54
+ - run: curl -LsSf https://astral.sh/uv/install.sh | sh
55
+ ```
56
+
57
+ ## PATH notes
58
+
59
+ - The official installers put the binary in `~/.local/bin` (Unix) or `%USERPROFILE%\.local\bin` (Windows). New shells get it automatically on most setups; an already-open shell needs `export PATH="$HOME/.local/bin:$PATH"` (Unix) or `$env:Path = "$env:USERPROFILE\.local\bin;$env:Path"` (PowerShell) once.
60
+ - Homebrew and winget install into their own prefixes that are already on PATH.
61
+
62
+ ## Upgrade to latest
63
+
64
+ ```bash
65
+ uv self update
66
+ ```
67
+
68
+ `uv self update` only works for official-installer binaries; Homebrew/winget installs upgrade through their package manager (`brew upgrade uv` / `winget upgrade astral-sh.uv`). The setup scripts handle this automatically.
69
+
70
+ ## Verify
71
+
72
+ ```bash
73
+ uv --version
74
+ ```
75
+
76
+ ## Offline / air-gapped
77
+
78
+ Download the matching archive from the uv GitHub releases page, extract it, and put the `uv` binary anywhere on PATH. `uv run --with <pkg>` still needs network for first-time package resolution unless a mirror is configured via `UV_INDEX_URL`.
@@ -0,0 +1,111 @@
1
+ #!/usr/bin/env -S uv run --script
2
+ # /// script
3
+ # requires-python = ">=3.11"
4
+ # dependencies = [
5
+ # "duckdb",
6
+ # "polars",
7
+ # "numpy",
8
+ # "pyarrow",
9
+ # "typer",
10
+ # "rich",
11
+ # ]
12
+ # ///
13
+
14
+ """Quick data query runner. SQL arg -> DuckDB; --filter (Polars SQL) -> Polars; --describe -> schema + stats."""
15
+
16
+ from __future__ import annotations
17
+
18
+ from pathlib import Path
19
+
20
+ import typer
21
+ from rich import print as rprint
22
+ from rich.table import Table
23
+
24
+
25
+ def _run_duckdb(file_path: Path, sql: str) -> None:
26
+ import duckdb
27
+
28
+ table_ref = f"'{file_path}'"
29
+ stem = file_path.stem
30
+ query = sql
31
+ for alias in ("data", "df", stem):
32
+ query = query.replace(f"FROM {alias} ", f"FROM {table_ref} ")
33
+ query = query.replace(f"FROM {alias}\n", f"FROM {table_ref}\n")
34
+ query = query.replace(f"from {alias} ", f"from {table_ref} ")
35
+ query = query.replace(f"from {alias}\n", f"from {table_ref}\n")
36
+ if query.endswith(f"FROM {alias}") or query.endswith(f"from {alias}"):
37
+ query = query[: -len(alias)] + table_ref
38
+
39
+ result = duckdb.sql(query)
40
+ df = result.pl()
41
+ _print_polars(df)
42
+
43
+
44
+ def _run_polars_filter(file_path: Path, expr: str) -> None:
45
+ import polars as pl
46
+
47
+ df = _read_file(file_path)
48
+ filtered = df.filter(pl.sql_expr(expr))
49
+ _print_polars(filtered)
50
+
51
+
52
+ def _run_describe(file_path: Path) -> None:
53
+ df = _read_file(file_path)
54
+
55
+ rprint(f"\n[bold]Schema:[/bold] {file_path.name} ({len(df)} rows × {len(df.columns)} cols)")
56
+ for name, dtype in zip(df.columns, df.dtypes):
57
+ rprint(f" {name}: [cyan]{dtype}[/cyan]")
58
+
59
+ rprint("\n[bold]Statistics:[/bold]")
60
+ _print_polars(df.describe())
61
+
62
+
63
+ def _read_file(file_path: Path): # noqa: ANN202
64
+ import polars as pl
65
+
66
+ suffix = file_path.suffix.lower()
67
+ if suffix == ".csv":
68
+ return pl.read_csv(file_path)
69
+ if suffix == ".parquet":
70
+ return pl.read_parquet(file_path)
71
+ if suffix == ".json":
72
+ return pl.read_json(file_path)
73
+ if suffix in (".jsonl", ".ndjson"):
74
+ return pl.read_ndjson(file_path)
75
+ rprint(f"[red]Unsupported format:[/red] {suffix} (Excel: export to CSV or Parquet first)")
76
+ raise SystemExit(1)
77
+
78
+
79
+ def _print_polars(df) -> None: # noqa: ANN001
80
+ table = Table(show_lines=False)
81
+ for col_name in df.columns:
82
+ table.add_column(col_name)
83
+ for row in df.iter_rows():
84
+ table.add_row(*(str(v) for v in row))
85
+ rprint(table)
86
+ rprint(f"[dim]{df.shape[0]} rows × {df.shape[1]} cols[/dim]")
87
+
88
+
89
+ def main(
90
+ file: Path = typer.Argument(help="Data file (csv, parquet, json, ndjson)"),
91
+ sql: str = typer.Argument(None, help="SQL query (uses DuckDB). Use 'data' as table name."),
92
+ filter_expr: str = typer.Option(None, "--filter", "-f", help="Polars SQL filter, e.g. 'amount > 100'"),
93
+ describe: bool = typer.Option(False, "--describe", "-d", help="Print schema + stats"),
94
+ ) -> None:
95
+ """Query data files with DuckDB (SQL) or Polars (SQL filter expressions)."""
96
+ if not file.exists():
97
+ rprint(f"[red]File not found:[/red] {file}")
98
+ raise SystemExit(1)
99
+
100
+ if describe:
101
+ _run_describe(file)
102
+ elif filter_expr:
103
+ _run_polars_filter(file, filter_expr)
104
+ elif sql:
105
+ _run_duckdb(file, sql)
106
+ else:
107
+ _run_describe(file)
108
+
109
+
110
+ if __name__ == "__main__":
111
+ typer.run(main)
@@ -0,0 +1,53 @@
1
+ [CmdletBinding()]
2
+ param()
3
+ Set-StrictMode -Version Latest
4
+ $ErrorActionPreference = 'Stop'
5
+
6
+ function Write-Step([string]$Message) { Write-Host "[setup-uv] $Message" }
7
+
8
+ Write-Step "detected os=$([System.Runtime.InteropServices.RuntimeInformation]::OSDescription) arch=$([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture)"
9
+
10
+ $uv = Get-Command uv -ErrorAction SilentlyContinue
11
+ if ($null -ne $uv) {
12
+ $current = (& uv --version) | Select-Object -First 1
13
+ Write-Step "uv already installed ($current) - upgrading"
14
+ & uv self update 2>$null
15
+ if ($LASTEXITCODE -ne 0) {
16
+ Write-Step "uv self update unavailable (package-manager install) - trying winget"
17
+ if (Get-Command winget -ErrorAction SilentlyContinue) {
18
+ & winget upgrade --id=astral-sh.uv -e --accept-source-agreements --accept-package-agreements 2>$null
19
+ if ($LASTEXITCODE -ne 0) { & winget install --id=astral-sh.uv -e --accept-source-agreements --accept-package-agreements }
20
+ } else {
21
+ Write-Step "no winget; keeping current uv (already functional)"
22
+ }
23
+ }
24
+ } else {
25
+ Write-Step "uv not found - installing latest via the official installer"
26
+ $installed = $false
27
+ try {
28
+ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
29
+ $installed = $true
30
+ } catch {
31
+ Write-Step "official installer failed ($($_.Exception.Message)) - trying winget"
32
+ if (Get-Command winget -ErrorAction SilentlyContinue) {
33
+ & winget install --id=astral-sh.uv -e --accept-source-agreements --accept-package-agreements
34
+ $installed = ($LASTEXITCODE -eq 0)
35
+ }
36
+ }
37
+ if (-not $installed -and $null -eq (Get-Command uv -ErrorAction SilentlyContinue)) {
38
+ Write-Step "FAIL: could not install uv - install it manually per references/uv-setup.md"
39
+ exit 1
40
+ }
41
+ }
42
+
43
+ if ($null -eq (Get-Command uv -ErrorAction SilentlyContinue)) {
44
+ $localBin = Join-Path $env:USERPROFILE '.local\bin'
45
+ if (Test-Path (Join-Path $localBin 'uv.exe')) { $env:Path = "$localBin;$env:Path" }
46
+ }
47
+
48
+ if ($null -eq (Get-Command uv -ErrorAction SilentlyContinue)) {
49
+ Write-Step "FAIL: uv still not on PATH after install - add %USERPROFILE%\.local\bin to PATH and retry"
50
+ exit 1
51
+ }
52
+
53
+ Write-Step "OK: $((& uv --version) | Select-Object -First 1)"
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ log() { printf '[setup-uv] %s\n' "$*"; }
5
+
6
+ os="$(uname -s 2>/dev/null || echo unknown)"
7
+ arch="$(uname -m 2>/dev/null || echo unknown)"
8
+ log "detected os=${os} arch=${arch}"
9
+
10
+ case "$os" in
11
+ Darwin|Linux) ;;
12
+ MINGW*|MSYS*|CYGWIN*)
13
+ log "Git Bash / MSYS environment detected - installing the Windows build is not supported here."
14
+ log "Use the Linux installer inside WSL, or run scripts/setup-uv.ps1 in PowerShell instead."
15
+ exit 1
16
+ ;;
17
+ *)
18
+ log "unsupported OS: ${os} - see references/uv-setup.md for manual steps."
19
+ exit 1
20
+ ;;
21
+ esac
22
+
23
+ if command -v uv >/dev/null 2>&1; then
24
+ current="$(uv --version 2>/dev/null | head -n1)"
25
+ log "uv already installed (${current}) - upgrading"
26
+ if uv self update >/dev/null 2>&1; then
27
+ log "uv self update succeeded"
28
+ else
29
+ log "uv self update unavailable (package-manager install) - trying Homebrew"
30
+ if command -v brew >/dev/null 2>&1; then
31
+ brew upgrade uv >/dev/null 2>&1 || brew install uv
32
+ else
33
+ log "no Homebrew; keeping current uv (already functional)"
34
+ fi
35
+ fi
36
+ else
37
+ log "uv not found - installing latest via the official installer"
38
+ if command -v curl >/dev/null 2>&1; then
39
+ curl -LsSf https://astral.sh/uv/install.sh | sh
40
+ elif command -v wget >/dev/null 2>&1; then
41
+ wget -qO- https://astral.sh/uv/install.sh | sh
42
+ elif command -v brew >/dev/null 2>&1; then
43
+ log "no curl/wget - installing via Homebrew"
44
+ brew install uv
45
+ else
46
+ log "neither curl, wget, nor brew available - install one of them and re-run."
47
+ exit 1
48
+ fi
49
+ fi
50
+
51
+ if ! command -v uv >/dev/null 2>&1; then
52
+ export PATH="$HOME/.local/bin:$PATH"
53
+ fi
54
+
55
+ if ! command -v uv >/dev/null 2>&1; then
56
+ log "FAIL: uv still not on PATH after install - add \$HOME/.local/bin to PATH and retry."
57
+ exit 1
58
+ fi
59
+
60
+ log "OK: $(uv --version)"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: debugging
3
- description: "MUST USE for any real runtime debugging across ANY language or binary — crashes, silent failures, wrong responses, stuck processes, memory leaks, async misbehavior, unexplained timing, reverse engineering. Runs a hypothesis-driven loop: form ≥3 hypotheses, investigate in parallel, after 2 failed rounds spawn Oracles from orthogonal angles, confirm root cause, lock with a failing test, fix minimally, QA by actually USING the system, scrub artifacts. The actual HOW lives in `references/` — READ THEM. Triggers: 'debug this', 'why is X not working', 'hanging', 'attach a debugger', 'reverse engineer', 'pwndbg', 'gdb', 'lldb', 'node inspect', 'tsx debug', 'pdb', 'dlv', 'delve', 'rust-gdb', 'set a breakpoint', 'context window exploded', 'why is the response empty', 'why is this happening', 'trace this bug', 'reproduce and fix', 'silent failure', 'HTTP 200 but empty', 'why did it stop', 'inspect the binary', 'playwright', 'flaky test', 'fails intermittently', 'passes in isolation', 'only fails in CI'."
3
+ description: "MUST USE for any real runtime debugging across ANY language or binary — crashes, silent failures, wrong responses, stuck processes, memory leaks, async misbehavior, unexplained timing, reverse engineering. Runs a hypothesis-driven loop: form ≥3 hypotheses, investigate in parallel, after 2 failed rounds spawn Oracles from orthogonal angles, confirm root cause, lock with a failing test, fix minimally, QA by actually USING the system, scrub artifacts. The actual HOW lives in `references/` — READ THEM. Triggers: 'debug this', 'why is X not working', 'hanging', 'attach a debugger', 'reverse engineer', 'pwndbg', 'gdb', 'lldb', 'node inspect', 'pdb', 'dlv', 'delve', 'rust-gdb', 'set a breakpoint', 'context window exploded', 'why is the response empty', 'why is this happening', 'trace this bug', 'reproduce and fix', 'silent failure', 'HTTP 200 but empty', 'why did it stop', 'inspect the binary', 'playwright', 'flaky test', 'fails intermittently', 'passes in isolation', 'only fails in CI'."
4
4
  ---
5
5
 
6
6
  # Debugging
@@ -238,8 +238,7 @@ Logging is part of the code you ship, and it has iron rules of its own: levels c
238
238
  ## DEPENDENCY UPGRADES — CROSS-CUTTING RULES
239
239
 
240
240
  - **`0.x` minor = major.** Semver promises nothing below 1.0: treat `0.N → 0.N+1` as a breaking upgrade — read the changelog, build, and run the full suite before trusting it. A required field appearing in a public options type is a routine `0.x` "minor".
241
- - **Version literals live outside the manifest.** Before committing a bump, grep the repo for the old version string: Dockerfiles pinning a global CLI, CI workflows, docs, and contract tests all carry copies. A bump that updates only the package manifest ships a split-brain deploy.
242
- - **Pin-parity contract tests are a pattern, not a nuisance.** A small test asserting the lockfile-resolved version equals the deploy artifact's pin (Dockerfile, image tag) turns silent drift into a red test. If the project has one, update it deliberately; if the bump reveals unguarded drift, add the test with the bump.
241
+ - **Version literals live outside the manifest.** Before committing a bump, grep the repo for the old version string: Dockerfiles pinning a global CLI, CI workflows, and docs all carry copies. A bump that updates only the package manifest ships a split-brain deploy.
243
242
  - **Never hand-merge a lockfile.** On conflict, take either side whole and regenerate with the package manager — the resolver owns that file, not you.
244
243
 
245
244
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ulw-plan
3
- description: "MUST USE for planning before coding when design uncertainty remains after discovery: ambiguous scope, competing decompositions, unclear boundaries, uncertain dependency ordering, architecture decisions, a vague 'just make it good / figure out what to build' brief, or any request to plan, interview, or break work down. Explore-first planning consultant (Prometheus) that grounds in the codebase, asks only the forks exploration cannot resolve - or researches them to best practice when the intent is fuzzy - waits for explicit approval, then writes ONE decision-complete work plan a worker executes with zero further interview. Triggers: ulw-plan, plan this, make a plan, plan before coding, interview me, break this down, start planning, plan mode, just make it good, figure out what to build."
3
+ description: "ACTIVATES ONLY on an explicit user request for the ulw-plan workflow: the user themselves saying ulw-plan, ulw plan, /skill:ulw-plan, or asking in their own words for a work plan before coding. NEVER self-activates: a bare ulw/ultrawork run, an agent-side routing decision, or reading this file is not a request, and the plan-gated reviewers (metis/momus) stay locked without a user request plus a written .omo/plans plan file. Explore-first planning consultant (Prometheus) that grounds in the codebase, asks only the forks exploration cannot resolve - or researches them to best practice when the intent is fuzzy - waits for explicit approval, then writes ONE decision-complete work plan a worker executes with zero further interview. Triggers: ulw-plan, ulw plan, plan this, make a plan, plan before coding, interview me, break this down, start planning, plan mode."
4
4
  metadata:
5
5
  short-description: Explore-first planning consultant that waits for your okay before planning
6
6
  ---