@groeponline/pi-wishcraft 1.16.0 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +10 -0
- package/CHANGELOG.md +7 -0
- package/build-stamp.json +1 -1
- package/docs/agents/domain.md +60 -0
- package/docs/agents/issue-tracker.md +88 -0
- package/package.json +1 -1
- package/src/extension/core/peer-guard.ts +2 -2
package/AGENTS.md
CHANGED
|
@@ -322,3 +322,13 @@ scripts/docker-test.sh -n 4 # 4 parallel containers
|
|
|
322
322
|
```
|
|
323
323
|
|
|
324
324
|
Each container runs `typecheck + test + circular` with a shared read-only `node_modules` bind mount.
|
|
325
|
+
|
|
326
|
+
## Agent skills
|
|
327
|
+
|
|
328
|
+
### Issue tracker
|
|
329
|
+
|
|
330
|
+
Dual-tracker: Linear for planning/features, GitHub for bugs/triage. See `docs/agents/issue-tracker.md`.
|
|
331
|
+
|
|
332
|
+
### Domain docs
|
|
333
|
+
|
|
334
|
+
Single-context. Current domain source: AGENTS.md. CONTEXT.md and docs/adr/ to be added via `/domain-modeling` when needed. See `docs/agents/domain.md`.
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [1.17.0] - 2026-10-27
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
- Bash paste-while-running (issue #72): a bracketed paste performed while a command runs is stripped of its markers and forwarded to the child stdin — including split delivery across input chunks — instead of silently queuing in the editor buffer behind the command.
|
|
9
|
+
- PTY/transcript memory bounds (from jan `fix/runtime-pty-bounds`): a single unterminated output line is capped at a 64 KiB UTF-8 tail with a one-time notice, the partial-escape tail is bounded, and the active transcript command trims head lines/bytes within limits instead of growing unbounded.
|
|
10
|
+
- Segment-options spread hygiene (CodeFactor #86–89): `normalizeSegmentOptions` assigns fields imperatively instead of spreading conditional empty objects.
|
|
11
|
+
|
|
5
12
|
## [1.16.0] - 2026-10-03
|
|
6
13
|
|
|
7
14
|
### Known limitations
|
package/build-stamp.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"source_sha":"
|
|
1
|
+
{"source_sha":"0c1a77045865dbb0dd6138ac1d0b381c067d0395"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Domain Docs
|
|
2
|
+
|
|
3
|
+
How the engineering skills should consume this repo's domain documentation when exploring the codebase.
|
|
4
|
+
|
|
5
|
+
## Before exploring, read these
|
|
6
|
+
|
|
7
|
+
- **`AGENTS.md`** at the repo root — the current domain documentation source with architecture, data flow, and conventions.
|
|
8
|
+
- **`CONTEXT.md`** at the repo root, if it exists (currently absent).
|
|
9
|
+
- **`CONTEXT-MAP.md`** at the repo root if it exists: it points at one `CONTEXT.md` per context. Read each one relevant to the topic.
|
|
10
|
+
- **`docs/adr/`**: read ADRs that touch the area you're about to work in. In multi-context repos, also check `src/<context>/docs/adr/` for context-scoped decisions.
|
|
11
|
+
|
|
12
|
+
If `CONTEXT.md` or `docs/adr/` don't exist, **proceed silently**. Don't flag their absence; don't suggest creating them upfront. The `/domain-modeling` skill (reached via `/grill-with-docs` and `/improve-codebase-architecture`) creates them lazily when terms or decisions actually get resolved.
|
|
13
|
+
|
|
14
|
+
## File structure
|
|
15
|
+
|
|
16
|
+
Single-context repo (this repo):
|
|
17
|
+
|
|
18
|
+
**Current state:**
|
|
19
|
+
- `AGENTS.md` — Primary domain documentation (architecture, data flow, conventions)
|
|
20
|
+
- `docs/` — Operator guides and design specs (no ADRs currently)
|
|
21
|
+
- `CONTEXT.md` — Not yet created (add via `/domain-modeling` when needed)
|
|
22
|
+
|
|
23
|
+
**Target state (when CONTEXT.md exists):**
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
/
|
|
27
|
+
├── AGENTS.md
|
|
28
|
+
├── CONTEXT.md
|
|
29
|
+
├── docs/adr/
|
|
30
|
+
│ ├── 0001-event-sourced-orders.md
|
|
31
|
+
│ └── 0002-postgres-for-write-model.md
|
|
32
|
+
└── src/
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Multi-context repo (presence of `CONTEXT-MAP.md` at the root):
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
/
|
|
39
|
+
├── CONTEXT-MAP.md
|
|
40
|
+
├── docs/adr/ ← system-wide decisions
|
|
41
|
+
└── src/
|
|
42
|
+
├── ordering/
|
|
43
|
+
│ ├── CONTEXT.md
|
|
44
|
+
│ └── docs/adr/ ← context-specific decisions
|
|
45
|
+
└── billing/
|
|
46
|
+
├── CONTEXT.md
|
|
47
|
+
└── docs/adr/
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Use the glossary's vocabulary
|
|
51
|
+
|
|
52
|
+
When your output names a domain concept (in an issue title, a refactor proposal, a hypothesis, a test name), use the term as defined in `AGENTS.md` (current domain source) or `CONTEXT.md` (if it exists). Don't drift to synonyms the glossary explicitly avoids.
|
|
53
|
+
|
|
54
|
+
If the concept you need isn't in the glossary yet, that's a signal: either you're inventing language the project doesn't use (reconsider) or there's a real gap (note it for `/domain-modeling`).
|
|
55
|
+
|
|
56
|
+
## Flag ADR conflicts
|
|
57
|
+
|
|
58
|
+
If your output contradicts an existing ADR, surface it explicitly rather than silently overriding:
|
|
59
|
+
|
|
60
|
+
> _Contradicts ADR-0007 (event-sourced orders), but worth reopening because…_
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Issue tracker: Linear + GitHub
|
|
2
|
+
|
|
3
|
+
This repo uses a dual-tracker workflow:
|
|
4
|
+
- **Linear**: Long-term planning, roadmap, feature tracking
|
|
5
|
+
- **GitHub**: Bug reports, PR-linked issues, immediate triage
|
|
6
|
+
|
|
7
|
+
## Conventions
|
|
8
|
+
|
|
9
|
+
### GitHub (primary for bugs and triage)
|
|
10
|
+
- **Create an issue**: `gh issue create --title "..." --body "..."`. Use a heredoc for multi-line bodies.
|
|
11
|
+
- **Read an issue**: `gh issue view <number> --comments`, filtering comments by `jq` and also fetching labels.
|
|
12
|
+
- **List issues**: `gh issue list --state open --json number,title,body,labels,comments --jq '[.[] | {number, title, body, labels: [.labels[].name], comments: [.comments[].body]}]'` with appropriate `--label` and `--state` filters.
|
|
13
|
+
- **Comment on an issue**: `gh issue comment <number> --body "..."`
|
|
14
|
+
- **Apply / remove labels**: `gh issue edit <number> --add-label "..."` / `--remove-label "..."`
|
|
15
|
+
- **Close**: `gh issue close <number> --comment "..."`
|
|
16
|
+
|
|
17
|
+
Infer the repo from `git remote -v`; `gh` does this automatically when run inside a clone.
|
|
18
|
+
|
|
19
|
+
### Linear (for planning and features)
|
|
20
|
+
- **Create a ticket**: `linear issue create --title "..." --description "..." --team <team-id>`. Use `linear teams list` to find team IDs.
|
|
21
|
+
- **Read a ticket**: `linear issue view <ticket-id>` or `linear issue search --query "<title>"`.
|
|
22
|
+
- **List tickets**: `linear issue list --team <team-id> --state <state>` with appropriate filters (e.g., `--state Backlog`, `--state In Progress`).
|
|
23
|
+
- **Comment on a ticket**: `linear comment create <ticket-id> --body "..."`
|
|
24
|
+
- **Change state**: `linear issue update <ticket-id> --state <state>`
|
|
25
|
+
- **Assign**: `linear issue update <ticket-id> --assignee <user-id>`
|
|
26
|
+
- **Link to GitHub**: Add a GitHub issue URL in the Linear ticket description, or use Linear's GitHub integration if configured.
|
|
27
|
+
|
|
28
|
+
Use Linear for feature planning, roadmap items, and long-term tracking. Reference Linear tickets in GitHub issue bodies when applicable. Link GitHub PRs to related Linear tickets for traceability.
|
|
29
|
+
|
|
30
|
+
### Linear conventions
|
|
31
|
+
|
|
32
|
+
**Labels** (create in Linear):
|
|
33
|
+
- `type:feature` — New features or enhancements
|
|
34
|
+
- `type:bug` — Bugs that belong in the roadmap (not urgent)
|
|
35
|
+
- `type:refactor` — Technical debt or architectural work
|
|
36
|
+
- `type:research` — Investigation or exploration tasks
|
|
37
|
+
- `priority:high` / `priority:medium` / `priority:low` — Priority levels
|
|
38
|
+
|
|
39
|
+
**States** (use Linear's default workflow or customize):
|
|
40
|
+
- `Backlog` — Planned but not started
|
|
41
|
+
- `In Progress` — Active work
|
|
42
|
+
- `In Review` — Awaiting review
|
|
43
|
+
- `Done` — Completed
|
|
44
|
+
- `Canceled` — Declined or superseded
|
|
45
|
+
|
|
46
|
+
## Pull requests as a triage surface
|
|
47
|
+
|
|
48
|
+
**PRs as a request surface: no.** _(Set to `yes` if this repo treats external PRs as feature requests; `/triage` reads this flag.)_
|
|
49
|
+
|
|
50
|
+
When set to `yes`, PRs run through the same labels and states as issues, using the `gh pr` equivalents:
|
|
51
|
+
|
|
52
|
+
- **Read a PR**: `gh pr view <number> --comments` and `gh pr diff <number>` for the diff.
|
|
53
|
+
- **List external PRs for triage**: `gh pr list --state open --json number,title,body,labels,author,comments` then fetch `authorAssociation` per PR with `gh api repos/:owner/:repo/pulls/<number> --jq '.author_association'` (the `gh pr list --json` field set does not include `authorAssociation`), keeping only `CONTRIBUTOR`, `FIRST_TIME_CONTRIBUTOR`, or `NONE` (drop `OWNER`/`MEMBER`/`COLLABORATOR`).
|
|
54
|
+
- **Comment / label / close**: `gh pr comment`, `gh pr edit --add-label`/`--remove-label`, `gh pr close`.
|
|
55
|
+
|
|
56
|
+
GitHub shares one number space across issues and PRs, so a bare `#42` may be either: resolve with `gh pr view 42` and fall back to `gh issue view 42`.
|
|
57
|
+
|
|
58
|
+
## When a skill says "publish to the issue tracker"
|
|
59
|
+
|
|
60
|
+
**Use GitHub when:**
|
|
61
|
+
- Bug reports or regressions
|
|
62
|
+
- Urgent issues requiring immediate triage
|
|
63
|
+
- PR-linked issues or feedback from code review
|
|
64
|
+
- Questions or clarifications about implementation
|
|
65
|
+
|
|
66
|
+
**Use Linear when:**
|
|
67
|
+
- Feature proposals or enhancements
|
|
68
|
+
- Roadmap items or long-term planning
|
|
69
|
+
- Research tasks or investigations
|
|
70
|
+
- Technical debt or architectural refactoring
|
|
71
|
+
- Multi-step work that benefits from project tracking
|
|
72
|
+
|
|
73
|
+
If unsure, default to GitHub for bugs/immediate work, Linear for features/planning.
|
|
74
|
+
|
|
75
|
+
## When a skill says "fetch the relevant ticket"
|
|
76
|
+
|
|
77
|
+
Run `gh issue view <number> --comments` for GitHub issues. For Linear tickets, use the Linear CLI or API.
|
|
78
|
+
|
|
79
|
+
## Wayfinding operations
|
|
80
|
+
|
|
81
|
+
Used by `/wayfinder`. The **map** is a single Linear ticket with **child** tickets as tasks.
|
|
82
|
+
|
|
83
|
+
- **Map**: a single Linear ticket labelled `wayfinder:map`, holding the Notes / Decisions-so-far / Fog body. `linear issue create --title "Map: <topic>" --description "..." --team <team-id> --label wayfinder:map`.
|
|
84
|
+
- **Child ticket**: a Linear ticket linked to the map as a parent using Linear's parent-child relationship. Add the child to the map's sub-issues and put `Part of <map-id>` at the top of the child description. Labels: `wayfinder:<type>` (`research`/`prototype`/`grilling`/`task`). Once claimed, the ticket is assigned to the driving dev.
|
|
85
|
+
- **Blocking**: Use Linear's **native issue dependencies**. Add a blocker with `linear issue update <child> --blocking <blocker-id>`. Linear reports blocking status in the UI. A ticket is unblocked when every blocker is resolved.
|
|
86
|
+
- **Frontier query**: list the map's open children (`linear issue list --team <team-id> --parent <map-id> --state Backlog,In Progress`), drop any with an open blocker or an assignee; first in map order wins.
|
|
87
|
+
- **Claim**: `linear issue update <ticket-id> --assignee @me`, the session's first write.
|
|
88
|
+
- **Resolve**: `linear comment create <ticket-id> --body "<answer>"`, then `linear issue update <ticket-id> --state Done`, then append a context pointer (gist + link) to the map's Decisions-so-far.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@groeponline/pi-wishcraft",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.17.0",
|
|
4
4
|
"description": "Pi coding agent extension: operator cockpit with a live powerline status bar, idea queue, skill search, sticky Bash, hooks, policy guardrails, and TUI session UX.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -130,7 +130,7 @@ export function findMissingPeerSymbols(
|
|
|
130
130
|
}
|
|
131
131
|
|
|
132
132
|
/** The live peer namespaces, collected for the runtime check. */
|
|
133
|
-
|
|
133
|
+
function collectPeerExports(): Record<PeerPackage, unknown> {
|
|
134
134
|
return {
|
|
135
135
|
"@earendil-works/pi-ai": piAi,
|
|
136
136
|
"@earendil-works/pi-coding-agent": piCodingAgent,
|
|
@@ -166,7 +166,7 @@ export function formatPeerGuardNotice(
|
|
|
166
166
|
}
|
|
167
167
|
|
|
168
168
|
/** Actionable error for a call site that cannot degrade gracefully. */
|
|
169
|
-
|
|
169
|
+
function missingSymbolError(symbol: string): Error {
|
|
170
170
|
const requirement = PEER_SYMBOL_REQUIREMENTS.find(
|
|
171
171
|
(r) => r.symbol === symbol,
|
|
172
172
|
);
|