opencodekit 0.19.4 → 0.19.6
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/index.js +1 -1
- package/dist/template/.opencode/agent/vision.md +5 -5
- package/dist/template/.opencode/command/compound.md +4 -3
- package/dist/template/.opencode/command/create.md +6 -11
- package/dist/template/.opencode/command/design.md +3 -3
- package/dist/template/.opencode/command/handoff.md +4 -2
- package/dist/template/.opencode/command/init-context.md +79 -55
- package/dist/template/.opencode/command/init-user.md +11 -6
- package/dist/template/.opencode/command/init.md +1 -3
- package/dist/template/.opencode/command/lfg.md +4 -2
- package/dist/template/.opencode/command/plan.md +9 -9
- package/dist/template/.opencode/command/pr.md +5 -1
- package/dist/template/.opencode/command/resume.md +4 -4
- package/dist/template/.opencode/command/review-codebase.md +4 -4
- package/dist/template/.opencode/command/ship.md +5 -7
- package/dist/template/.opencode/command/start.md +8 -10
- package/dist/template/.opencode/command/status.md +1 -1
- package/dist/template/.opencode/command/ui-slop-check.md +6 -6
- package/dist/template/.opencode/command/verify.md +4 -4
- package/dist/template/.opencode/dcp-prompts/defaults/compress-message.md +11 -12
- package/dist/template/.opencode/dcp-prompts/defaults/compress-range.md +1 -1
- package/dist/template/.opencode/dcp-prompts/defaults/context-limit-nudge.md +3 -9
- package/dist/template/.opencode/dcp-prompts/defaults/iteration-nudge.md +0 -2
- package/dist/template/.opencode/dcp-prompts/defaults/system.md +0 -13
- package/dist/template/.opencode/dcp-prompts/defaults/turn-nudge.md +1 -2
- package/dist/template/.opencode/dcp.jsonc +9 -3
- package/dist/template/.opencode/memory.db +0 -0
- package/dist/template/.opencode/memory.db-shm +0 -0
- package/dist/template/.opencode/memory.db-wal +0 -0
- package/dist/template/.opencode/opencode.json +6 -14
- package/dist/template/.opencode/skill/context-initialization/SKILL.md +16 -17
- package/dist/template/.opencode/skill/pencil/SKILL.md +36 -32
- package/dist/template/.opencode/skill/tilth-cli/SKILL.md +47 -20
- package/package.json +1 -1
|
@@ -10,7 +10,7 @@ Execute PRD tasks, verify each passes, run review, close the bead.
|
|
|
10
10
|
|
|
11
11
|
> **Workflow:** `/create` → `/start <id>` → **`/ship <id>`**
|
|
12
12
|
>
|
|
13
|
-
>
|
|
13
|
+
> Bead MUST be `in_progress` with `prd.md`. Run `/start` first if not.
|
|
14
14
|
|
|
15
15
|
## Load Skills
|
|
16
16
|
|
|
@@ -43,7 +43,7 @@ skill({ name: "verification-before-completion" });
|
|
|
43
43
|
| `explore` | Finding patterns in codebase, prior art |
|
|
44
44
|
| `scout` | External research, best practices |
|
|
45
45
|
| `lsp` | Finding symbol definitions, references |
|
|
46
|
-
| `
|
|
46
|
+
| `tilth_tilth_search` | Finding code patterns |
|
|
47
47
|
| `task` | Spawning subagents for parallel execution |
|
|
48
48
|
|
|
49
49
|
## Phase 1: Guards
|
|
@@ -59,9 +59,7 @@ Verify:
|
|
|
59
59
|
|
|
60
60
|
Check what artifacts exist:
|
|
61
61
|
|
|
62
|
-
|
|
63
|
-
ls .beads/artifacts/$ARGUMENTS/
|
|
64
|
-
```
|
|
62
|
+
Read `.beads/artifacts/$ARGUMENTS/` to check what artifacts exist.
|
|
65
63
|
|
|
66
64
|
## Phase 2: Route to Execution
|
|
67
65
|
|
|
@@ -203,7 +201,7 @@ Follow the [Verification Protocol](../skill/verification-before-completion/refer
|
|
|
203
201
|
- All 4 gates must pass before proceeding to commit/push
|
|
204
202
|
- Also run PRD `Verify:` commands
|
|
205
203
|
|
|
206
|
-
## Phase
|
|
204
|
+
## Phase 5: Review
|
|
207
205
|
|
|
208
206
|
Load and run the review skill:
|
|
209
207
|
|
|
@@ -267,7 +265,7 @@ return Response.json({ok: true}) // Static, not query result
|
|
|
267
265
|
|
|
268
266
|
If any artifact fails Level 2 or 3 → fix → re-verify.
|
|
269
267
|
|
|
270
|
-
## Phase
|
|
268
|
+
## Phase 6: Close
|
|
271
269
|
|
|
272
270
|
Ask user before closing:
|
|
273
271
|
|
|
@@ -56,9 +56,10 @@ br list --status=in_progress
|
|
|
56
56
|
|
|
57
57
|
```bash
|
|
58
58
|
br show $ARGUMENTS
|
|
59
|
-
ls .beads/artifacts/$ARGUMENTS/
|
|
60
59
|
```
|
|
61
60
|
|
|
61
|
+
Read `.beads/artifacts/$ARGUMENTS/` to check what artifacts exist.
|
|
62
|
+
|
|
62
63
|
Verify `prd.md` exists and has real content (not just placeholders). If missing or incomplete, tell user to run `/create` first.
|
|
63
64
|
|
|
64
65
|
## Phase 3: Claim
|
|
@@ -107,18 +108,15 @@ Map bead type to branch prefix:
|
|
|
107
108
|
| task | task |
|
|
108
109
|
| epic | epic |
|
|
109
110
|
|
|
111
|
+
Create the branch:
|
|
112
|
+
|
|
110
113
|
```bash
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
bug) echo "fix" ;;
|
|
114
|
-
task) echo "task" ;;
|
|
115
|
-
epic) echo "epic" ;;
|
|
116
|
-
*) echo "task" ;;
|
|
117
|
-
esac)
|
|
118
|
-
TITLE_SLUG=$(echo "$TITLE" | tr '[:upper:]' '[:lower:]' | tr ' ' '-')
|
|
119
|
-
git checkout -b $PREFIX/$ARGUMENTS-$TITLE_SLUG
|
|
114
|
+
# Example: feat/br-42-add-auth
|
|
115
|
+
git checkout -b $PREFIX/$BEAD_ID-$TITLE_SLUG
|
|
120
116
|
```
|
|
121
117
|
|
|
118
|
+
Slugify the title (lowercase, spaces to hyphens) and use the bead type to determine the prefix.
|
|
119
|
+
|
|
122
120
|
**If worktree selected:**
|
|
123
121
|
|
|
124
122
|
```typescript
|
|
@@ -19,12 +19,12 @@ skill({ name: "accessibility-audit" }); // Keyboard/focus/contrast checks
|
|
|
19
19
|
|
|
20
20
|
## Parse Arguments
|
|
21
21
|
|
|
22
|
-
| Argument | Default | Description
|
|
23
|
-
| --------------- | ------- |
|
|
24
|
-
| `[path
|
|
25
|
-
| `--staged` | false | Audit staged changes only (`git diff --cached`)
|
|
26
|
-
| `--since=<ref>` | `HEAD` | Compare against ref (`main`, `HEAD~1`, commit SHA)
|
|
27
|
-
| `--full-report` | false | Include all categories even when no issues found
|
|
22
|
+
| Argument | Default | Description |
|
|
23
|
+
| --------------- | ------- | ------------------------------------------------------------- |
|
|
24
|
+
| `[path\|auto]` | `auto` | Specific file/dir to audit, or auto-detect changed UI files |
|
|
25
|
+
| `--staged` | false | Audit staged changes only (`git diff --cached`) |
|
|
26
|
+
| `--since=<ref>` | `HEAD` | Compare against ref (`main`, `HEAD~1`, commit SHA) |
|
|
27
|
+
| `--full-report` | false | Include all categories even when no issues found |
|
|
28
28
|
|
|
29
29
|
## Phase 1: Resolve Target Files
|
|
30
30
|
|
|
@@ -45,11 +45,10 @@ skill({ name: "verification-before-completion" });
|
|
|
45
45
|
Before running any gates, check if a recent verification is still valid:
|
|
46
46
|
|
|
47
47
|
```bash
|
|
48
|
-
# Compute current state fingerprint (commit hash +
|
|
49
|
-
CURRENT_STAMP=$(printf '%s\n%s
|
|
48
|
+
# Compute current state fingerprint (commit hash + diff)
|
|
49
|
+
CURRENT_STAMP=$(printf '%s\n%s' \
|
|
50
50
|
"$(git rev-parse HEAD)" \
|
|
51
51
|
"$(git diff HEAD -- '*.ts' '*.tsx' '*.js' '*.jsx')" \
|
|
52
|
-
"$(git ls-files --others --exclude-standard -- '*.ts' '*.tsx' '*.js' '*.jsx' | xargs cat 2>/dev/null)" \
|
|
53
52
|
| shasum -a 256 | cut -d' ' -f1)
|
|
54
53
|
LAST_STAMP=$(tail -1 .beads/verify.log 2>/dev/null | awk '{print $1}')
|
|
55
54
|
```
|
|
@@ -70,9 +69,10 @@ Verification: cached PASS (no changes since <timestamp from verify.log>)
|
|
|
70
69
|
|
|
71
70
|
```bash
|
|
72
71
|
br show $ARGUMENTS
|
|
73
|
-
ls .beads/artifacts/$ARGUMENTS/
|
|
74
72
|
```
|
|
75
73
|
|
|
74
|
+
Read `.beads/artifacts/$ARGUMENTS/` to check what artifacts exist.
|
|
75
|
+
|
|
76
76
|
Read the PRD and any other artifacts (plan.md, research.md, design.md).
|
|
77
77
|
|
|
78
78
|
**Verify guards:**
|
|
@@ -8,6 +8,7 @@ When a selected message contains user intent, preserve that intent with extra ca
|
|
|
8
8
|
Directly quote short user instructions when that best preserves exact meaning.
|
|
9
9
|
|
|
10
10
|
Yet be LEAN. Strip away the noise: failed attempts that led nowhere, verbose tool output, and repetition. What remains should be pure signal - golden nuggets of detail that preserve full understanding with zero ambiguity.
|
|
11
|
+
If a message contains no significant technical decisions, code changes, or user requirements, produce a minimal one-line summary rather than a detailed one.
|
|
11
12
|
|
|
12
13
|
MESSAGE IDS
|
|
13
14
|
You specify individual raw messages by ID using the injected IDs visible in the conversation:
|
|
@@ -15,9 +16,10 @@ You specify individual raw messages by ID using the injected IDs visible in the
|
|
|
15
16
|
- `mNNNN` IDs identify raw messages
|
|
16
17
|
|
|
17
18
|
Each message has an ID inside XML metadata tags like `<dcp-message-id priority="high">m0007</dcp-message-id>`.
|
|
18
|
-
The ID tag appears
|
|
19
|
+
The same ID tag appears in every tool output of the message it belongs to — each unique ID identifies one complete message.
|
|
19
20
|
Treat these tags as message metadata only, not as content to summarize. Use only the inner `mNNNN` value as the `messageId`.
|
|
20
|
-
The `priority` attribute indicates relative context cost.
|
|
21
|
+
The `priority` attribute indicates relative context cost. You MUST compress high-priority messages when their full text is no longer necessary for the active task.
|
|
22
|
+
If prior compress-tool results are present, always compress and summarize them minimally only as part of a broader compression pass. Do not invoke the compress tool solely to re-compress an earlier compression result.
|
|
21
23
|
Messages marked as `<dcp-message-id>BLOCKED</dcp-message-id>` cannot be compressed.
|
|
22
24
|
|
|
23
25
|
Rules:
|
|
@@ -25,18 +27,15 @@ Rules:
|
|
|
25
27
|
- Pick each `messageId` directly from injected IDs visible in context.
|
|
26
28
|
- Only use raw message IDs of the form `mNNNN`.
|
|
27
29
|
- Ignore XML attributes such as `priority` when copying the ID; use only the inner `mNNNN` value.
|
|
28
|
-
- Do NOT use compressed block IDs like `bN`.
|
|
29
30
|
- Do not invent IDs. Use only IDs that are present in context.
|
|
30
|
-
- Do not target prior compressed blocks or block summaries.
|
|
31
31
|
|
|
32
32
|
BATCHING
|
|
33
|
-
Select MANY messages in a single tool call when they are
|
|
33
|
+
Select MANY messages in a single tool call when they are safe to compress.
|
|
34
34
|
Each entry should summarize exactly one message, and the tool can receive as many entries as needed in one batch.
|
|
35
|
-
When several messages are equally safe to compress, prefer higher-priority messages first.
|
|
36
35
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
36
|
+
GENERAL CLEANUP
|
|
37
|
+
Use the topic "general cleanup" for broad cleanup passes.
|
|
38
|
+
During general cleanup, compress all medium and high-priority messages that are not relevant to the active task.
|
|
39
|
+
Optimize for reducing context footprint, not for grouping messages by topic.
|
|
40
|
+
Do not compress away still-active instructions, unresolved questions, or constraints that are likely to matter soon.
|
|
41
|
+
Prioritize the earliest messages in the context as they will be the least relevant to the active task.
|
|
@@ -45,7 +45,7 @@ You specify boundaries by ID using the injected IDs visible in the conversation:
|
|
|
45
45
|
- `bN` IDs identify previously compressed blocks
|
|
46
46
|
|
|
47
47
|
Each message has an ID inside XML metadata tags like `<dcp-message-id>...</dcp-message-id>`.
|
|
48
|
-
The ID tag appears
|
|
48
|
+
The same ID tag appears in every tool output of the message it belongs to — each unique ID identifies one complete message.
|
|
49
49
|
Treat these tags as boundary metadata only, not as tool result content.
|
|
50
50
|
|
|
51
51
|
Rules:
|
|
@@ -6,16 +6,10 @@ You MUST use the `compress` tool now. Do not continue normal exploration until c
|
|
|
6
6
|
|
|
7
7
|
If you are in the middle of a critical atomic operation, finish that atomic step first, then compress immediately.
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
Prioritize one large, closed, high-yield compression range first.
|
|
11
|
-
This overrides the normal preference for many small compressions.
|
|
12
|
-
Only split into multiple compressions if one large range would reduce summary quality or make boundary selection unsafe.
|
|
13
|
-
|
|
14
|
-
RANGE SELECTION
|
|
9
|
+
SELECTION PROCESS
|
|
15
10
|
Start from older, resolved history and capture as much stale context as safely possible in one pass.
|
|
16
|
-
Avoid the newest active working
|
|
17
|
-
Use visible injected boundary IDs for compression (`mNNNN` for messages, `bN` for compressed blocks), and ensure `startId` appears before `endId`.
|
|
11
|
+
Avoid the newest active working messages unless it is clearly closed.
|
|
18
12
|
|
|
19
13
|
SUMMARY REQUIREMENTS
|
|
20
|
-
Your summary
|
|
14
|
+
Your summary MUST cover all essential details from the selected messages so work can continue.
|
|
21
15
|
If the compressed range includes user messages, preserve user intent exactly. Prefer direct quotes for short user messages to avoid semantic drift.
|
|
@@ -1,5 +1,3 @@
|
|
|
1
1
|
You've been iterating for a while after the last user message.
|
|
2
2
|
|
|
3
3
|
If there is a closed portion that is unlikely to be referenced immediately (for example, finished research before implementation), use the compress tool on it now.
|
|
4
|
-
|
|
5
|
-
Prefer multiple short, closed ranges over one large range when several independent slices are ready.
|
|
@@ -9,19 +9,6 @@ THE PHILOSOPHY OF COMPRESS
|
|
|
9
9
|
|
|
10
10
|
Think of compression as phase transitions: raw exploration becomes refined understanding. The original context served its purpose; your summary now carries that understanding forward.
|
|
11
11
|
|
|
12
|
-
OPERATING STANCE
|
|
13
|
-
Prefer short, closed, summary-safe compressions.
|
|
14
|
-
When multiple independent stale sections exist, prefer several focused compressions (in parallel when possible) over one broad compression.
|
|
15
|
-
|
|
16
|
-
Use `compress` as steady housekeeping while you work.
|
|
17
|
-
|
|
18
|
-
CADENCE, SIGNALS, AND LATENCY
|
|
19
|
-
|
|
20
|
-
- No fixed threshold mandates compression
|
|
21
|
-
- Prioritize closedness and independence over raw size
|
|
22
|
-
- Prefer smaller, regular compressions over infrequent massive compressions for better latency and summary quality
|
|
23
|
-
- When multiple independent stale sections are ready, batch compressions in parallel
|
|
24
|
-
|
|
25
12
|
COMPRESS WHEN
|
|
26
13
|
|
|
27
14
|
A section is genuinely closed and the raw conversation has served its purpose:
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
Evaluate the conversation for compressible ranges.
|
|
2
2
|
|
|
3
|
-
If any
|
|
3
|
+
If any messages are cleanly closed and unlikely to be needed again, use the compress tool on them.
|
|
4
4
|
If direction has shifted, compress earlier ranges that are now less relevant.
|
|
5
5
|
|
|
6
|
-
Prefer small, closed-range compressions over one broad compression.
|
|
7
6
|
The goal is to filter noise and distill key information so context accumulation stays under control.
|
|
8
7
|
Keep active context uncompressed.
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"compress": {
|
|
37
37
|
// "range" (stable) compresses spans into block summaries
|
|
38
38
|
// "message" (experimental) compresses individual raw messages
|
|
39
|
-
"mode": "
|
|
39
|
+
"mode": "range",
|
|
40
40
|
// "allow" (no prompt) | "ask" (prompt) | "deny" (tool not registered)
|
|
41
41
|
"permission": "allow",
|
|
42
42
|
"showCompression": false,
|
|
@@ -53,7 +53,10 @@
|
|
|
53
53
|
"github-copilot/claude-sonnet-4.6": 192000,
|
|
54
54
|
"github-copilot/claude-sonnet-4.5": 192000,
|
|
55
55
|
"github-copilot/claude-sonnet-4": 192000,
|
|
56
|
-
"github-copilot/claude-haiku-4.5": 172000
|
|
56
|
+
"github-copilot/claude-haiku-4.5": 172000,
|
|
57
|
+
"github-copilot/gpt-5.4": 192000,
|
|
58
|
+
"github-copilot/gpt-5.3-codex": 192000,
|
|
59
|
+
"github-copilot/gemini-3.1-pro-preview": 192000
|
|
57
60
|
},
|
|
58
61
|
// Soft lower threshold: below this, turn/iteration reminders are off
|
|
59
62
|
"minContextLimit": "35%",
|
|
@@ -64,7 +67,10 @@
|
|
|
64
67
|
"github-copilot/claude-sonnet-4.6": "35%",
|
|
65
68
|
"github-copilot/claude-sonnet-4.5": "35%",
|
|
66
69
|
"github-copilot/claude-sonnet-4": "35%",
|
|
67
|
-
"github-copilot/claude-haiku-4.5": "25%"
|
|
70
|
+
"github-copilot/claude-haiku-4.5": "25%",
|
|
71
|
+
"github-copilot/gpt-5.4": "30%",
|
|
72
|
+
"github-copilot/gpt-5.3-codex": "30%",
|
|
73
|
+
"github-copilot/gemini-3.1-pro-preview": "30%"
|
|
68
74
|
},
|
|
69
75
|
// How often context-limit nudge fires above maxContextLimit (1 = every fetch)
|
|
70
76
|
"nudgeFrequency": 5,
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -82,8 +82,6 @@
|
|
|
82
82
|
".opencode/memory/project/user.md",
|
|
83
83
|
".opencode/memory/project/tech-stack.md",
|
|
84
84
|
".opencode/memory/project/project.md",
|
|
85
|
-
".opencode/memory/project/roadmap.md",
|
|
86
|
-
".opencode/memory/project/state.md",
|
|
87
85
|
".opencode/context/git-context.md"
|
|
88
86
|
],
|
|
89
87
|
"keybinds": {
|
|
@@ -92,7 +90,7 @@
|
|
|
92
90
|
},
|
|
93
91
|
"mcp": {
|
|
94
92
|
"tilth": {
|
|
95
|
-
"command": ["tilth", "--mcp", "--edit"],
|
|
93
|
+
"command": ["npx", "-y", "tilth", "--mcp", "--edit"],
|
|
96
94
|
"enabled": true,
|
|
97
95
|
"environment": {
|
|
98
96
|
"TILTH_THREADS": "8"
|
|
@@ -106,22 +104,16 @@
|
|
|
106
104
|
"timeout": 120000,
|
|
107
105
|
"type": "local"
|
|
108
106
|
},
|
|
109
|
-
"pencil": {
|
|
110
|
-
"command": [
|
|
111
|
-
"/Applications/Pencil.app/Contents/Resources/app.asar.unpacked/out/mcp-server-darwin-arm64",
|
|
112
|
-
"--app",
|
|
113
|
-
"desktop"
|
|
114
|
-
],
|
|
115
|
-
"enabled": true,
|
|
116
|
-
"environment": {},
|
|
117
|
-
"timeout": 120000,
|
|
118
|
-
"type": "local"
|
|
119
|
-
},
|
|
120
107
|
"webclaw": {
|
|
121
108
|
"command": ["webclaw-mcp"],
|
|
122
109
|
"enabled": true,
|
|
123
110
|
"timeout": 120000,
|
|
124
111
|
"type": "local"
|
|
112
|
+
},
|
|
113
|
+
"pencil": {
|
|
114
|
+
"command": ["openpencil-mcp"],
|
|
115
|
+
"enabled": false,
|
|
116
|
+
"type": "local"
|
|
125
117
|
}
|
|
126
118
|
},
|
|
127
119
|
"model": "opencode/minimax-m2.5-free",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: context-initialization
|
|
3
|
-
description: Initialize
|
|
4
|
-
version:
|
|
3
|
+
description: Initialize project context files from templates. Creates on-demand planning files (roadmap.md, state.md) and updates auto-injected project.md.
|
|
4
|
+
version: 2.0.0
|
|
5
5
|
tags: [context, workflow]
|
|
6
6
|
dependencies: []
|
|
7
7
|
---
|
|
@@ -11,20 +11,19 @@ dependencies: []
|
|
|
11
11
|
## When to Use
|
|
12
12
|
|
|
13
13
|
- When initializing project context files (project.md, roadmap.md, state.md) from templates.
|
|
14
|
+
- project.md is auto-injected into every prompt; roadmap.md and state.md are on-demand.
|
|
14
15
|
|
|
15
16
|
## When NOT to Use
|
|
16
17
|
|
|
17
18
|
- When context files already exist and only need minor manual edits.
|
|
18
19
|
|
|
19
|
-
|
|
20
20
|
## Process
|
|
21
21
|
|
|
22
22
|
### 1. Verify Templates
|
|
23
23
|
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
test -f .opencode/memory/_templates/state.md
|
|
24
|
+
```typescript
|
|
25
|
+
tilth_tilth_files({ pattern: "*.md", scope: ".opencode/memory/_templates" });
|
|
26
|
+
// Required templates: project.md, roadmap.md, state.md
|
|
28
27
|
```
|
|
29
28
|
|
|
30
29
|
Stop if missing.
|
|
@@ -43,28 +42,28 @@ Skip if `--skip-questions` flag set.
|
|
|
43
42
|
|
|
44
43
|
### 3. Create Files
|
|
45
44
|
|
|
46
|
-
**project.md**
|
|
45
|
+
**project.md** (auto-injected — keep concise)
|
|
47
46
|
|
|
48
|
-
- Read template
|
|
47
|
+
- Read template via `Read({ filePath: ".opencode/memory/_templates/project.md" })`
|
|
49
48
|
- Fill with answers
|
|
50
|
-
- Write
|
|
49
|
+
- Write via `memory-update({ file: "project/project", content: ..., mode: "replace" })`
|
|
51
50
|
|
|
52
|
-
**roadmap.md**
|
|
51
|
+
**roadmap.md** (on-demand — access via `memory-read({ file: "project/roadmap" })`)
|
|
53
52
|
|
|
54
53
|
- Read template
|
|
55
54
|
- Parse phases into table
|
|
56
|
-
- Write
|
|
55
|
+
- Write via `memory-update({ file: "project/roadmap", content: ..., mode: "replace" })`
|
|
57
56
|
|
|
58
|
-
**state.md**
|
|
57
|
+
**state.md** (on-demand — access via `memory-read({ file: "project/state" })`)
|
|
59
58
|
|
|
60
59
|
- Read template
|
|
61
60
|
- Set initial state
|
|
62
|
-
- Write
|
|
61
|
+
- Write via `memory-update({ file: "project/state", content: ..., mode: "replace" })`
|
|
63
62
|
|
|
64
63
|
### 4. Verify
|
|
65
64
|
|
|
66
|
-
```
|
|
67
|
-
|
|
65
|
+
```typescript
|
|
66
|
+
tilth_tilth_files({ pattern: "*.md", scope: ".opencode/memory/project" });
|
|
68
67
|
```
|
|
69
68
|
|
|
70
|
-
Report created files.
|
|
69
|
+
Report created files with their injection status (auto-injected vs on-demand).
|
|
@@ -1,68 +1,72 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: pencil
|
|
3
|
-
description:
|
|
3
|
+
description: OpenPencil design-as-code workflow (legacy skill name: pencil). Create/edit .op files, export code, and use desktop-bundled MCP.
|
|
4
4
|
version: 1.0.0
|
|
5
|
-
tags: [design,
|
|
5
|
+
tags: [design, openpencil, mcp, cli]
|
|
6
6
|
mcp:
|
|
7
7
|
pencil:
|
|
8
|
-
command:
|
|
9
|
-
args: ["--app", "desktop"]
|
|
8
|
+
command: openpencil-mcp
|
|
10
9
|
---
|
|
11
10
|
|
|
12
|
-
#
|
|
11
|
+
# OpenPencil Skill
|
|
12
|
+
|
|
13
|
+
Legacy skill name: `pencil`.
|
|
13
14
|
|
|
14
15
|
## When to Use
|
|
15
16
|
|
|
16
|
-
- Create or modify UI designs as code using `.
|
|
17
|
-
- Export
|
|
18
|
-
-
|
|
17
|
+
- Create or modify UI designs as code using `.op` files.
|
|
18
|
+
- Export production code or visuals from the terminal.
|
|
19
|
+
- Use OpenPencil's desktop-bundled MCP server after installing the app.
|
|
19
20
|
|
|
20
21
|
## Prerequisites
|
|
21
22
|
|
|
22
23
|
### Install CLI
|
|
23
24
|
|
|
24
25
|
```bash
|
|
25
|
-
npm install -g @
|
|
26
|
-
|
|
26
|
+
npm install -g @zseven-w/openpencil
|
|
27
|
+
op status
|
|
27
28
|
```
|
|
28
29
|
|
|
29
|
-
###
|
|
30
|
+
### Install Desktop App for MCP
|
|
30
31
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
- Install the OpenPencil desktop app from the ZSeven-W/openpencil releases page.
|
|
33
|
+
- Open **Agent Settings** inside OpenPencil and use the one-click MCP install for OpenCode/Claude Code/Codex/etc.
|
|
34
|
+
- The npm CLI install does **not** provide `openpencil-mcp`; that binary is bundled with the desktop app.
|
|
34
35
|
|
|
35
36
|
### MCP Server
|
|
36
37
|
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
-
|
|
38
|
+
- OpenPencil ships a built-in MCP server for agent tooling.
|
|
39
|
+
- The server command is `openpencil-mcp` once the desktop app has installed/exposed it.
|
|
40
|
+
- Keep MCP disabled in template config until OpenPencil desktop is installed locally.
|
|
40
41
|
|
|
41
42
|
## Quick Start
|
|
42
43
|
|
|
43
44
|
```bash
|
|
44
45
|
# Create new design
|
|
45
|
-
|
|
46
|
+
op design @landing.txt
|
|
46
47
|
|
|
47
|
-
#
|
|
48
|
-
|
|
48
|
+
# Start the desktop app
|
|
49
|
+
op start
|
|
49
50
|
|
|
50
|
-
# Export
|
|
51
|
-
|
|
51
|
+
# Export code
|
|
52
|
+
op export react --out .
|
|
52
53
|
|
|
53
|
-
#
|
|
54
|
-
|
|
54
|
+
# Import a Figma file
|
|
55
|
+
op import:figma design.fig
|
|
55
56
|
```
|
|
56
57
|
|
|
57
|
-
## Core
|
|
58
|
+
## Core CLI Commands
|
|
58
59
|
|
|
59
|
-
- `
|
|
60
|
-
- `
|
|
61
|
-
- `
|
|
62
|
-
- `
|
|
63
|
-
- `
|
|
60
|
+
- `op design @brief.txt`
|
|
61
|
+
- `op design:skeleton`
|
|
62
|
+
- `op design:content`
|
|
63
|
+
- `op design:refine --root-id <id>`
|
|
64
|
+
- `op export react --out .`
|
|
65
|
+
- `op import:figma design.fig`
|
|
64
66
|
|
|
65
67
|
## Notes
|
|
66
68
|
|
|
67
|
-
-
|
|
68
|
-
-
|
|
69
|
+
- OpenPencil uses `.op` files as the source of truth.
|
|
70
|
+
- CLI install is published on npm as `@zseven-w/openpencil` and exposes the `op` binary.
|
|
71
|
+
- MCP is a desktop-app-bundled feature, not a standalone npm package.
|
|
72
|
+
- Use taste-skill for design quality, OpenPencil for execution.
|