ultimate-pi 0.12.0 → 0.13.1

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 (31) hide show
  1. package/.agents/skills/ccc/SKILL.md +136 -0
  2. package/.agents/skills/ccc/references/management.md +110 -0
  3. package/.agents/skills/ccc/references/settings.md +126 -0
  4. package/.agents/skills/harness-orchestration/SKILL.md +4 -4
  5. package/.pi/PACKAGING.md +1 -0
  6. package/.pi/SYSTEM.md +21 -20
  7. package/.pi/agents/harness/planning/scout-graphify.md +2 -0
  8. package/.pi/agents/harness/planning/scout-semantic.md +13 -6
  9. package/.pi/extensions/harness-run-context.ts +5 -0
  10. package/.pi/extensions/harness-subagents.ts +16 -5
  11. package/.pi/extensions/lib/harness-cocoindex-refresh.ts +49 -0
  12. package/.pi/extensions/lib/harness-subagent-policy.ts +5 -1
  13. package/.pi/extensions/lib/harness-subagents-bridge.ts +9 -63
  14. package/.pi/harness/docs/adrs/0033-parent-orchestrated-planning.md +1 -1
  15. package/.pi/prompts/harness-plan.md +10 -5
  16. package/.pi/prompts/harness-setup.md +15 -11
  17. package/.pi/scripts/README.md +1 -0
  18. package/.pi/scripts/harness-cli-verify.sh +24 -14
  19. package/.pi/scripts/harness-cocoindex-bootstrap.sh +182 -0
  20. package/.pi/scripts/harness-verify.mjs +10 -0
  21. package/.pi/skills/ast-grep/SKILL.md +2 -2
  22. package/CHANGELOG.md +16 -0
  23. package/THIRD_PARTY_NOTICES.md +7 -0
  24. package/package.json +3 -2
  25. package/vendor/pi-subagents/LICENSE +21 -0
  26. package/vendor/pi-subagents/UPSTREAM_PIN.md +11 -0
  27. package/vendor/pi-subagents/src/agents.ts +357 -0
  28. package/vendor/pi-subagents/src/subagents.ts +1463 -0
  29. package/.agents/skills/ck-search/SKILL.md +0 -99
  30. package/.agents/skills/obsidian-bases/SKILL.md +0 -299
  31. package/.agents/skills/obsidian-markdown/SKILL.md +0 -237
@@ -1,99 +0,0 @@
1
- ---
2
- name: ck-search
3
- description: "Semantic code search using ck. Use when exploring codebases, finding related code, or searching by concept rather than exact text. Triggers on: search for, find code that, where is, look for patterns, find all files related to, find similar code, explore codebase, semantic search."
4
- ---
5
-
6
- # ck-search: Semantic Code Search
7
-
8
- ## When to Use
9
-
10
- Use `ck` instead of `grep`/`find` for **any codebase exploration**. Reserve raw grep for only: exact literal string match (specific error message, exact function name).
11
-
12
- ## Quick Reference
13
-
14
- ```bash
15
- # Hybrid (best default — lexical + semantic fused via RRF)
16
- ck --hybrid "query" .
17
-
18
- # Semantic only (conceptual — finds by meaning)
19
- ck --sem "concept" src/
20
-
21
- # Lexical BM25 (phrase-based, better than grep for multi-word)
22
- ck --lex "phrase" .
23
-
24
- # Grep-compatible (exact match, same flags as grep)
25
- ck "exact string" -rn src/
26
- ```
27
-
28
- ## Search Decision Tree
29
-
30
- ```
31
- Agent needs to find code
32
- ├─ Exact literal string (error msg, function name) → grep/rg
33
- ├─ Conceptual / multi-word → ck --hybrid
34
- ├─ Find similar patterns → ck --sem
35
- └─ Unsure → ck --hybrid (safe default)
36
- ```
37
-
38
- ## Key Flags
39
-
40
- | Flag | Purpose | When |
41
- |------|---------|------|
42
- | `--hybrid` | BM25 + semantic RRF fusion | **Default for exploration** |
43
- | `--sem` | Semantic only (embedding similarity) | Conceptual: "error handling", "auth flow" |
44
- | `--lex` | BM25 lexical only | Phrase search without regex |
45
- | `--limit N` | Top N results | Keep output lean (default 10) |
46
- | `--threshold 0.7` | Min similarity score | Filter low-confidence results |
47
- | `--json` | Machine-readable output | When piping to other tools |
48
- | `-n` | Line numbers | Same as grep |
49
- | `-C N` | Context lines | Same as grep |
50
- | `-r` | Recursive | Same as grep |
51
- | `-l` | Files with matches | List matching files only |
52
-
53
- ## Index Management
54
-
55
- ```bash
56
- ck --status . # Check if index exists
57
- ck index . # Build/rebuild full index
58
- ck --add file.ts # Add single file to index
59
- ck --clean . # Remove index (rebuild from scratch)
60
- ck --switch-model MODEL # Rebuild with different embedding model
61
- ```
62
-
63
- ## Usage Patterns
64
-
65
- ### Find related code
66
- ```bash
67
- ck --hybrid "retry logic with exponential backoff" .
68
- ```
69
-
70
- ### Find authentication code
71
- ```bash
72
- ck --sem "authentication middleware" src/ --limit 20
73
- ```
74
-
75
- ### Find error handling patterns
76
- ```bash
77
- ck --hybrid "error handling and recovery" src/ --limit 15
78
- ```
79
-
80
- ### Find database code
81
- ```bash
82
- ck --sem "database connection pool" src/
83
- ```
84
-
85
- ### Exact function name (still use grep)
86
- ```bash
87
- grep -rn "processPayment" src/
88
- ```
89
-
90
- ## Integration Notes
91
-
92
- - **Index location**: `.ck/index/` in project root (gitignored)
93
- - **First search auto-indexes**: `ck --sem` builds index on first run if missing
94
- - **Fully offline**: No API keys, no network, embeddings run locally
95
- - **MCP mode**: `ck --serve` exposes ck_search/ck_get/ck_info/ck_reindex as MCP tools (future integration)
96
-
97
- ## Token Efficiency
98
-
99
- ck results are ranked and scored. Use `--limit` to cap output. A typical ck --hybrid call returns 10 results (~500-1000 tokens) vs raw grep which can return hundreds of unranked matches (~5000-20000 tokens).
@@ -1,299 +0,0 @@
1
- ---
2
- name: obsidian-bases
3
- description: "Create and edit Obsidian Bases (.base files): Obsidian's native database layer for dynamic tables, card views, list views, filters, formulas, and summaries over vault notes. Triggers on: create a base, add a base file, obsidian bases, base view, filter notes, formula, database view, dynamic table, task tracker base, reading list base."
4
- allowed-tools: Read Write
5
- ---
6
-
7
- # obsidian-bases: Obsidian's Database Layer
8
-
9
- Obsidian Bases (launched 2025) turns vault notes into queryable, dynamic views. Tables, cards, lists, maps. Defined in `.base` files. No plugin required; it is a core Obsidian feature.
10
-
11
- **Authoritative reference**: If the kepano/obsidian-skills plugin is installed, prefer its canonical obsidian-bases skill. Otherwise, use the reference below. Official docs: https://help.obsidian.md/bases/syntax
12
-
13
- ---
14
-
15
- ## Wiki Path Resolution
16
-
17
- All `wiki/` paths in this skill (in `.base` filter expressions like `file.inFolder("wiki/")`) are relative to the wiki directory inside the Obsidian vault. Obsidian Bases operate on the vault directly; the `wiki/` prefix in filter expressions reflects the folder name within the vault. If your wiki folder has a different name, adjust filter paths accordingly.
18
-
19
- ---
20
-
21
- ## File Format
22
-
23
- `.base` files contain valid YAML. The root keys are `filters`, `formulas`, `properties`, `summaries`, and `views`.
24
-
25
- ```yaml
26
- # Global filters: apply to ALL views
27
- filters:
28
- and:
29
- - file.hasTag("wiki")
30
- - 'status != "archived"'
31
-
32
- # Computed properties
33
- formulas:
34
- age_days: '(now() - file.ctime).days.round(0)'
35
- status_icon: 'if(status == "mature", "✅", "🔄")'
36
-
37
- # Display name overrides for properties panel
38
- properties:
39
- status:
40
- displayName: "Status"
41
- formula.age_days:
42
- displayName: "Age (days)"
43
-
44
- # One or more views
45
- views:
46
- - type: table
47
- name: "All Pages"
48
- order:
49
- - file.name
50
- - type
51
- - status
52
- - updated
53
- - formula.age_days
54
- ```
55
-
56
- ---
57
-
58
- ## Filters
59
-
60
- Filters select which notes appear. Applied globally or per-view.
61
-
62
- ```yaml
63
- # Single string filter
64
- filters: 'status == "current"'
65
-
66
- # AND: all must be true
67
- filters:
68
- and:
69
- - 'status != "archived"'
70
- - file.hasTag("wiki")
71
-
72
- # OR: any can be true
73
- filters:
74
- or:
75
- - file.hasTag("concept")
76
- - file.hasTag("entity")
77
-
78
- # NOT: exclude matches
79
- filters:
80
- not:
81
- - file.inFolder("wiki/meta")
82
-
83
- # Nested
84
- filters:
85
- and:
86
- - file.inFolder("wiki/")
87
- - or:
88
- - 'type == "concept"'
89
- - 'type == "entity"'
90
- ```
91
-
92
- ### Filter operators
93
-
94
- `==` `!=` `>` `<` `>=` `<=`
95
-
96
- ### Useful filter functions
97
-
98
- | Function | Example |
99
- |----------|---------|
100
- | `file.hasTag("x")` | Notes with tag `x` |
101
- | `file.inFolder("path/")` | Notes in folder |
102
- | `file.hasLink("Note")` | Notes linking to Note |
103
-
104
- ---
105
-
106
- ## Properties
107
-
108
- Three types:
109
- - **Note properties**: from frontmatter: `status`, `type`, `updated`
110
- - **File properties**: metadata: `file.name`, `file.mtime`, `file.size`, `file.ctime`, `file.tags`, `file.folder`
111
- - **Formula properties**: computed: `formula.age_days`
112
-
113
- ---
114
-
115
- ## Formulas
116
-
117
- Defined in `formulas:`. Referenced as `formula.name` in `order:` and `properties:`.
118
-
119
- ```yaml
120
- formulas:
121
- # Days since created
122
- age_days: '(now() - file.ctime).days.round(0)'
123
-
124
- # Days until a date property
125
- days_until: 'if(due_date, (date(due_date) - today()).days, "")'
126
-
127
- # Conditional label
128
- status_icon: 'if(status == "mature", "✅", if(status == "developing", "🔄", "🌱"))'
129
-
130
- # Word count estimate
131
- word_est: '(file.size / 5).round(0)'
132
- ```
133
-
134
- **Key rule**: Subtracting two dates returns a `Duration`. Not a number. Always access `.days` first:
135
- ```yaml
136
- # CORRECT
137
- age: '(now() - file.ctime).days'
138
-
139
- # WRONG: crashes
140
- age: '(now() - file.ctime).round(0)'
141
- ```
142
-
143
- **Always guard nullable properties with `if()`**:
144
- ```yaml
145
- # CORRECT
146
- days_left: 'if(due_date, (date(due_date) - today()).days, "")'
147
- ```
148
-
149
- ---
150
-
151
- ## View Types
152
-
153
- ### Table
154
- ```yaml
155
- views:
156
- - type: table
157
- name: "Wiki Index"
158
- limit: 100
159
- order:
160
- - file.name
161
- - type
162
- - status
163
- - updated
164
- groupBy:
165
- property: type
166
- direction: ASC
167
- ```
168
-
169
- ### Cards
170
- ```yaml
171
- views:
172
- - type: cards
173
- name: "Gallery"
174
- order:
175
- - file.name
176
- - tags
177
- - status
178
- ```
179
-
180
- ### List
181
- ```yaml
182
- views:
183
- - type: list
184
- name: "Quick List"
185
- order:
186
- - file.name
187
- - status
188
- ```
189
-
190
- ---
191
-
192
- ## Wiki Vault Templates
193
-
194
- ### Wiki content dashboard (all non-meta pages)
195
-
196
- ```yaml
197
- filters:
198
- and:
199
- - file.inFolder("wiki/")
200
- - not:
201
- - file.inFolder("wiki/meta")
202
-
203
- formulas:
204
- age: '(now() - file.ctime).days.round(0)'
205
-
206
- properties:
207
- formula.age:
208
- displayName: "Age (days)"
209
-
210
- views:
211
- - type: table
212
- name: "All Wiki Pages"
213
- order:
214
- - file.name
215
- - type
216
- - status
217
- - updated
218
- - formula.age
219
- groupBy:
220
- property: type
221
- direction: ASC
222
- ```
223
-
224
- ### Entity index (people, orgs, repos)
225
-
226
- ```yaml
227
- filters:
228
- and:
229
- - file.inFolder("wiki/entities/")
230
- - 'file.ext == "md"'
231
-
232
- views:
233
- - type: table
234
- name: "Entities"
235
- order:
236
- - file.name
237
- - entity_type
238
- - status
239
- - updated
240
- groupBy:
241
- property: entity_type
242
- direction: ASC
243
- ```
244
-
245
- ### Recent ingests
246
-
247
- ```yaml
248
- filters:
249
- and:
250
- - file.inFolder("wiki/sources/")
251
-
252
- views:
253
- - type: table
254
- name: "Sources"
255
- order:
256
- - file.name
257
- - source_type
258
- - created
259
- - status
260
- groupBy:
261
- property: source_type
262
- direction: ASC
263
- ```
264
-
265
- ---
266
-
267
- ## Embedding in Notes
268
-
269
- ```markdown
270
- ![[MyBase.base]]
271
-
272
- ![[MyBase.base#View Name]]
273
- ```
274
-
275
- ---
276
-
277
- ## Where to Save
278
-
279
- Store `.base` files in `wiki/meta/` for vault dashboards:
280
- - `wiki/meta/dashboard.base`: main content view
281
- - `wiki/meta/entities.base`: entity tracker
282
- - `wiki/meta/sources.base`: ingestion log
283
-
284
- ---
285
-
286
- ## YAML Quoting Rules
287
-
288
- - Formulas with double quotes → wrap in single quotes: `'if(done, "Yes", "No")'`
289
- - Strings with colons or special chars → wrap in double quotes: `"Status: Active"`
290
- - Unquoted strings with `:` break YAML parsing
291
-
292
- ---
293
-
294
- ## What Not to Do
295
-
296
- - Do not use `from:` or `where:`: those are Dataview syntax, not Obsidian Bases
297
- - Do not use `sort:` at the root level: sorting is per-view via `order:` and `groupBy:`
298
- - Do not put `.base` files outside the vault: they only render inside Obsidian
299
- - Do not reference `formula.X` in `order:` without defining `X` in `formulas:`
@@ -1,237 +0,0 @@
1
- ---
2
- name: obsidian-markdown
3
- description: "Write correct Obsidian Flavored Markdown: wikilinks, embeds, callouts, properties, tags, highlights, math, and canvas syntax. Reference this when creating or editing any wiki page. Triggers on: write obsidian note, obsidian syntax, wikilink, callout, embed, obsidian markdown, wikilink format, callout syntax, embed syntax, obsidian formatting, how to write obsidian markdown."
4
- allowed-tools: Read Write Edit
5
- ---
6
-
7
- # obsidian-markdown: Obsidian Flavored Markdown
8
-
9
- Reference this skill when writing any wiki page. Obsidian extends standard Markdown with wikilinks, embeds, callouts, and properties. Getting syntax wrong causes broken links, invisible callouts, or malformed frontmatter.
10
-
11
- **Cross-reference**: If the kepano/obsidian-skills plugin is installed, prefer its canonical obsidian-markdown skill for authoritative Obsidian syntax reference. Otherwise, use the reference below. See also [github.com/kepano/obsidian-skills](https://github.com/kepano/obsidian-skills).
12
-
13
- ---
14
-
15
- ## Wiki Path Resolution
16
-
17
- This skill provides Obsidian syntax reference. It does NOT perform file operations itself. When invoked by other skills (wiki-ingest, wiki-save, etc.), those skills handle wiki path resolution via `VAULT_WIKI_PATH`.
18
-
19
- ---
20
-
21
- ## Wikilinks
22
-
23
- Internal links use double brackets. The filename without extension.
24
-
25
- | Syntax | What it does |
26
- |---|---|
27
- | `[[Note Name]]` | Basic link |
28
- | `[[Note Name\|Display Text]]` | Aliased link (shows "Display Text") |
29
- | `[[Note Name#Heading]]` | Link to a specific heading |
30
- | `[[Note Name#^block-id]]` | Link to a specific block |
31
-
32
- Rules:
33
- - Case-sensitive on some systems. Match the exact filename.
34
- - No path needed: Obsidian resolves by filename uniqueness.
35
- - If two files have the same name, use `[[Folder/Note Name]]` to disambiguate.
36
-
37
- ---
38
-
39
- ## Embeds
40
-
41
- Embeds use `!` before the wikilink. They display the content inline.
42
-
43
- | Syntax | What it does |
44
- |---|---|
45
- | `![[Note Name]]` | Embed a full note |
46
- | `![[Note Name#Heading]]` | Embed a section |
47
- | `![[image.png]]` | Embed an image |
48
- | `![[image.png\|300]]` | Embed image with width 300px |
49
- | `![[document.pdf]]` | Embed a PDF (Obsidian renders natively) |
50
- | `![[audio.mp3]]` | Embed audio |
51
-
52
- ---
53
-
54
- ## Callouts
55
-
56
- Callouts are blockquotes with a type keyword. They render as styled alert boxes.
57
-
58
- ```markdown
59
- > [!note]
60
- > Default informational callout.
61
-
62
- > [!note] Custom Title
63
- > Callout with a custom title.
64
-
65
- > [!note]- Collapsible (closed by default)
66
- > Click to expand.
67
-
68
- > [!note]+ Collapsible (open by default)
69
- > Click to collapse.
70
- ```
71
-
72
- ### All callout types
73
-
74
- | Type | Aliases | Use for |
75
- |------|---------|---------|
76
- | `note` |: | General notes |
77
- | `abstract` | `summary`, `tldr` | Summaries |
78
- | `info` |: | Information |
79
- | `todo` |: | Action items |
80
- | `tip` | `hint`, `important` | Tips and highlights |
81
- | `success` | `check`, `done` | Positive outcomes |
82
- | `question` | `help`, `faq` | Open questions |
83
- | `warning` | `caution`, `attention` | Warnings |
84
- | `failure` | `fail`, `missing` | Errors or failures |
85
- | `danger` | `error` | Critical issues |
86
- | `bug` |: | Known bugs |
87
- | `example` |: | Examples |
88
- | `quote` | `cite` | Quotations |
89
- | `contradiction` |: | Conflicting information (wiki convention) |
90
-
91
- ---
92
-
93
- ## Properties (Frontmatter)
94
-
95
- Obsidian renders YAML frontmatter as a Properties panel. Rules:
96
-
97
- ```yaml
98
- ---
99
- type: concept # plain string
100
- title: "Note Title" # quoted if it contains special chars
101
- created: 2026-04-08 # date as YYYY-MM-DD (not ISO datetime)
102
- updated: 2026-04-08
103
- tags:
104
- - tag-one # list items use - format
105
- - tag-two
106
- status: developing
107
- related:
108
- - "[[Other Note]]" # wikilinks must be quoted in YAML
109
- sources:
110
- - "[[source-page]]"
111
- ---
112
- ```
113
-
114
- Rules:
115
- - Flat YAML only. Never nest objects.
116
- - Dates as `YYYY-MM-DD`, not `2026-04-08T00:00:00`.
117
- - Lists as `- item`, not inline `[a, b, c]`.
118
- - Wikilinks in YAML must be quoted: `"[[Page]]"`.
119
- - `tags` field: Obsidian reads this as the tag list, searchable in vault.
120
-
121
- ---
122
-
123
- ## Tags
124
-
125
- Two valid forms:
126
-
127
- ```markdown
128
- #tag-name : inline tag anywhere in the body
129
- #parent/child-tag : nested tag (shows hierarchy in tag pane)
130
- ```
131
-
132
- In frontmatter:
133
- ```yaml
134
- tags:
135
- - research
136
- - ai/obsidian
137
- ```
138
-
139
- Do not use `#` inside frontmatter tag lists. Just the tag name.
140
-
141
- ---
142
-
143
- ## Text Formatting
144
-
145
- Standard Markdown plus Obsidian extensions:
146
-
147
- | Syntax | Result |
148
- |---|---|
149
- | `**bold**` | Bold |
150
- | `*italic*` | Italic |
151
- | `~~strikethrough~~` | Strikethrough |
152
- | `==highlight==` | Highlighted text (yellow in Obsidian) |
153
- | `` `inline code` `` | Inline code |
154
-
155
- ---
156
-
157
- ## Math
158
-
159
- Obsidian uses MathJax/KaTeX:
160
-
161
- Inline math:
162
- ```markdown
163
- $E = mc^2$
164
- ```
165
-
166
- Block math:
167
- ```markdown
168
- $$
169
- \int_0^\infty e^{-x} dx = 1
170
- $$
171
- ```
172
-
173
- ---
174
-
175
- ## Code Blocks
176
-
177
- Standard fenced code blocks. Obsidian highlights all common languages:
178
-
179
- ````markdown
180
- ```python
181
- def hello():
182
- return "world"
183
- ```
184
- ````
185
-
186
- ---
187
-
188
- ## Tables
189
-
190
- Standard Markdown tables:
191
-
192
- ```markdown
193
- | Column A | Column B | Column C |
194
- |----------|----------|----------|
195
- | Value | Value | Value |
196
- | Value | Value | Value |
197
- ```
198
-
199
- Obsidian renders tables natively. No plugin needed.
200
-
201
- ---
202
-
203
- ## Mermaid Diagrams
204
-
205
- Obsidian renders Mermaid natively:
206
-
207
- ````markdown
208
- ```mermaid
209
- graph TD
210
- A[Start] --> B{Decision}
211
- B -->|Yes| C[End]
212
- B -->|No| D[Loop]
213
- D --> A
214
- ```
215
- ````
216
-
217
- Supported: `graph`, `sequenceDiagram`, `gantt`, `classDiagram`, `pie`, `flowchart`.
218
-
219
- ---
220
-
221
- ## Footnotes
222
-
223
- ```markdown
224
- This sentence has a footnote.[^1]
225
-
226
- [^1]: The footnote text goes here.
227
- ```
228
-
229
- ---
230
-
231
- ## What NOT to Do
232
-
233
- - Do not use `[link text](path/to/note.md)` for internal links: use `[[Note Name]]` instead.
234
- - Do not use HTML inside callouts: stick to Markdown.
235
- - Do not use `##` inside a callout body: headings don't render inside callouts.
236
- - Do not write `tags: [a, b, c]` inline in frontmatter: Obsidian prefers the list format.
237
- - Do not write ISO datetimes in frontmatter (`2026-04-08T00:00:00Z`): use `2026-04-08`.