@plainconceptsplatform/agent-harness 3.1.1 → 3.2.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/README.md +452 -434
- package/cli/commands/update.js +121 -121
- package/cli/fragments/archive/az.md +97 -97
- package/cli/fragments/archive/gh.md +96 -96
- package/cli/fragments/archive/gl.md +96 -96
- package/cli/fragments/archive/none.md +75 -75
- package/cli/fragments/guardrails/codegraph.md +5 -5
- package/cli/fragments/guardrails/humanizer.md +4 -4
- package/cli/fragments/guardrails/memory.md +4 -4
- package/cli/fragments/guardrails/rtk.md +3 -3
- package/cli/fragments/guardrails/simple-english.md +4 -4
- package/cli/fragments/ops-ship/az.md +81 -81
- package/cli/presets/agents-content.json +34 -34
- package/cli/presets/browser.json +10 -10
- package/cli/steps/browser/index.js +48 -48
- package/cli/steps/copy/commands.js +79 -79
- package/cli/steps/copy/index.js +88 -88
- package/cli/steps/copy/skills.js +307 -307
- package/cli/steps/metadata/index.js +115 -115
- package/cli/steps/models/write.js +38 -38
- package/cli/utils/copy.js +5 -2
- package/cli/utils/paths.js +80 -80
- package/harness/.opencode/_gitignore +9 -9
- package/harness/.opencode/commands/init.md +5 -5
- package/harness/.opencode/commands/make-architecture.md +5 -5
- package/harness/.opencode/commands/make-design.md +5 -5
- package/harness/.opencode/commands/make-engineer.md +5 -5
- package/harness/.opencode/commands/make-guardrails.md +5 -5
- package/harness/.opencode/commands/make-user-model.md +5 -5
- package/harness/.opencode/commands/plan-apply.md +9 -9
- package/harness/.opencode/commands/plan-goal.md +5 -5
- package/harness/.opencode/commands/plan-quick.md +5 -5
- package/harness/.opencode/commands/plan-story.md +9 -9
- package/harness/.opencode/commands/repo-audit.md +5 -5
- package/harness/.opencode/commands/repo-initialize.md +5 -5
- package/harness/.opencode/commands/repo-onboard.md +5 -5
- package/harness/.opencode/commands/repo-verify.md +5 -5
- package/harness/.opencode/scripts/check-diff.mjs +225 -0
- package/harness/.opencode/scripts/code-rules.mjs +280 -0
- package/harness/AGENTS.md +49 -49
- package/package.json +1 -1
- package/skills/README.md +18 -18
- package/skills/browser-automation/SKILL.md +72 -72
- package/skills/pc-guardrails-generic/SKILL.md +2 -1
- package/skills/pc-make-architecture/SKILL.md +32 -32
- package/skills/pc-make-design/SKILL.md +45 -45
- package/skills/pc-make-engineer/signal-mapping.md +53 -53
- package/skills/pc-make-guardrails/SKILL.md +44 -44
- package/skills/pc-make-user-model/SKILL.md +56 -56
- package/skills/pc-plan-apply/SKILL.md +1 -1
- package/skills/pc-plan-apply/simple-mode.md +21 -21
- package/skills/pc-plan-archive/SKILL.md +66 -66
- package/skills/pc-plan-goal/branching.md +39 -39
- package/skills/pc-plan-goal/output.md +71 -71
- package/skills/pc-plan-quick/SKILL.md +46 -46
- package/skills/pc-plan-story/SKILL.md +93 -93
- package/skills/pc-repo-help/SKILL.md +87 -87
- package/skills/pc-repo-initialize/SKILL.md +119 -119
- package/skills/pc-repo-onboard/SKILL.md +32 -32
- package/skills/pc-repo-verify/SKILL.md +150 -150
- package/skills/pc-userstory-az/SKILL.md +71 -71
- package/skills/pc-userstory-browser/SKILL.md +64 -64
- package/skills/pc-userstory-gh/SKILL.md +63 -63
- package/skills/pc-userstory-jira/SKILL.md +74 -74
package/skills/README.md
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
# skills/
|
|
2
|
-
|
|
3
|
-
Two kinds of skills live here, both discoverable by `npx skills`:
|
|
4
|
-
|
|
5
|
-
| Kind | Directories | Purpose |
|
|
6
|
-
| --- | --- | --- |
|
|
7
|
-
| Installable `pc-*` + `browser-automation` | `pc-*`, `browser-automation` | What the CLI copies into a target project under `.agents/skills/` during onboarding. Plain Concepts' own skills. |
|
|
8
|
-
| CLI-self | `agent-harness-cli` | Skills for agents working on THIS CLI repo (driving `npx @plainconceptsplatform/agent-harness`). Never copied into target projects. |
|
|
9
|
-
|
|
10
|
-
Discoverability: any `SKILL.md` in a subdirectory here is auto-discovered by OpenCode, Claude Code, and `npx skills` (which scans `./skills/` as a recognized project-skill location).
|
|
11
|
-
|
|
12
|
-
## Using one
|
|
13
|
-
|
|
14
|
-
Point your agent at the directory, or copy a skill into wherever your tool discovers skills:
|
|
15
|
-
|
|
16
|
-
```bash
|
|
17
|
-
cp -r skills/agent-harness-cli ~/.claude/skills/
|
|
18
|
-
```
|
|
1
|
+
# skills/
|
|
2
|
+
|
|
3
|
+
Two kinds of skills live here, both discoverable by `npx skills`:
|
|
4
|
+
|
|
5
|
+
| Kind | Directories | Purpose |
|
|
6
|
+
| --- | --- | --- |
|
|
7
|
+
| Installable `pc-*` + `browser-automation` | `pc-*`, `browser-automation` | What the CLI copies into a target project under `.agents/skills/` during onboarding. Plain Concepts' own skills. |
|
|
8
|
+
| CLI-self | `agent-harness-cli` | Skills for agents working on THIS CLI repo (driving `npx @plainconceptsplatform/agent-harness`). Never copied into target projects. |
|
|
9
|
+
|
|
10
|
+
Discoverability: any `SKILL.md` in a subdirectory here is auto-discovered by OpenCode, Claude Code, and `npx skills` (which scans `./skills/` as a recognized project-skill location).
|
|
11
|
+
|
|
12
|
+
## Using one
|
|
13
|
+
|
|
14
|
+
Point your agent at the directory, or copy a skill into wherever your tool discovers skills:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
cp -r skills/agent-harness-cli ~/.claude/skills/
|
|
18
|
+
```
|
|
@@ -1,72 +1,72 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: browser-automation
|
|
3
|
-
description: Reliable, composable browser automation using agent-browser. Use when capturing screenshots of a locally running app, clicking UI elements, reading page content, or automating browser interactions on localhost.
|
|
4
|
-
license: MIT
|
|
5
|
-
compatibility: Requires agent-browser CLI installed (Rust binary) and running.
|
|
6
|
-
metadata:
|
|
7
|
-
author: copilots
|
|
8
|
-
version: "2.0"
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
This skill operates on `localhost` URLs only. Screenshots, clicks, typing, scrolling, and reads on locally running apps are in scope. External services (github.com, dev.azure.com, npmjs.com, etc.) are out of scope for browser tools.
|
|
12
|
-
|
|
13
|
-
The only exception: when the user selects "Others (Browser)" as their backlog platform during onboarding, the `pc-userstory` skill may navigate to work item URLs the user explicitly provides. That is the sole case where external navigation is permitted, and only to URLs the user explicitly gives you.
|
|
14
|
-
|
|
15
|
-
## Best-practice workflow
|
|
16
|
-
|
|
17
|
-
1. Open the page: `agent-browser open <url>` (launches its own Chrome; reuses the running daemon)
|
|
18
|
-
2. Take a snapshot: `agent-browser snapshot` to get the accessibility tree with `@ref` handles
|
|
19
|
-
3. Interact by ref: `agent-browser click @e2`, `agent-browser fill @e3 "text"`
|
|
20
|
-
4. Wait when needed: `agent-browser wait --load networkidle` or `agent-browser wait <selector>`
|
|
21
|
-
5. Confirm the result with a fresh `snapshot`, `get text`, or `screenshot`
|
|
22
|
-
|
|
23
|
-
Refs like `@e2` come from the last snapshot and go stale after page changes: retake the snapshot after navigation or dynamic updates before reusing them. When a click fails because another element covers the target (consent banner, modal), dismiss or interact with the covering element, then take a fresh snapshot before retrying.
|
|
24
|
-
|
|
25
|
-
## Tool access
|
|
26
|
-
|
|
27
|
-
- MCP tools (inside OpenCode): `agent_browser_open`, `agent_browser_snapshot`, `agent_browser_click`, `agent_browser_fill`, `agent_browser_type`, `agent_browser_wait_for_selector`, `agent_browser_screenshot`, `agent_browser_eval`, `agent_browser_close` — configured in `opencode.jsonc` with `--tools core`
|
|
28
|
-
- CLI (any agent, any host): every command below works identically via bash
|
|
29
|
-
- Diagnose the install: `agent-browser doctor`
|
|
30
|
-
|
|
31
|
-
## Selecting elements
|
|
32
|
-
|
|
33
|
-
- Prefer refs from `snapshot` (`@e1`, `@e2`, ...) over CSS selectors
|
|
34
|
-
- CSS selectors also work: `agent-browser click "#submit"`, `agent-browser fill "#email" "text"`
|
|
35
|
-
- Semantic locators: `agent-browser find role button click --name "Submit"`, `find text "Sign In" click`, `find label "Email" fill "value"`, `find testid <id> click`
|
|
36
|
-
- Native selects: `agent-browser select <sel> <value>`
|
|
37
|
-
|
|
38
|
-
## Reading state
|
|
39
|
-
|
|
40
|
-
- `agent-browser get text <sel>` — text content of an element
|
|
41
|
-
- `agent-browser get value <sel>` — input value
|
|
42
|
-
- `agent-browser snapshot` — structured accessibility tree (preferred for parsing)
|
|
43
|
-
- `agent-browser screenshot [path]` — `--full` for full page, `--annotate` for numbered labels
|
|
44
|
-
- `agent-browser read` — agent-readable markdown of the active tab (no Chrome launch for URL reads)
|
|
45
|
-
|
|
46
|
-
## Tabs and sessions
|
|
47
|
-
|
|
48
|
-
- `agent-browser tab` lists tabs with stable `t1`, `t2` ids; `tab new --label <name>` and `tab <label>` switch
|
|
49
|
-
- `agent-browser close` closes the browser; `close --all` closes every session
|
|
50
|
-
|
|
51
|
-
## CLI-first debugging
|
|
52
|
-
|
|
53
|
-
- `agent-browser doctor` — diagnose install, Chrome, and daemon state
|
|
54
|
-
- `agent-browser console` — view console messages; `agent-browser errors` — uncaught exceptions
|
|
55
|
-
- `agent-browser eval "<js>"` — run JavaScript in the page
|
|
56
|
-
- `agent-browser network requests --filter api` — inspect tracked requests
|
|
57
|
-
|
|
58
|
-
## Troubleshooting
|
|
59
|
-
|
|
60
|
-
- Stale ref: take a fresh `snapshot` after any navigation or DOM change
|
|
61
|
-
- Covered click: the error names the covering element; dismiss it, re-snapshot, retry
|
|
62
|
-
- Selector fails: confirm the content exists with `agent-browser get text` or a snapshot before retrying
|
|
63
|
-
- Daemon or Chrome issues: run `agent-browser doctor`
|
|
64
|
-
|
|
65
|
-
## Scope
|
|
66
|
-
|
|
67
|
-
- Screenshots of locally running app on `localhost` URLs: in scope
|
|
68
|
-
- Click, type, scroll, read on `localhost` pages: in scope
|
|
69
|
-
- Navigate to work item URLs the user explicitly provides (when backlog platform is "Others (Browser)"): in scope
|
|
70
|
-
- Navigate to external services for non-work-item purposes: out of scope
|
|
71
|
-
- DevOps or GitHub CLI operations via browser tools: out of scope
|
|
72
|
-
- Reading or modifying production systems via browser tools: out of scope
|
|
1
|
+
---
|
|
2
|
+
name: browser-automation
|
|
3
|
+
description: Reliable, composable browser automation using agent-browser. Use when capturing screenshots of a locally running app, clicking UI elements, reading page content, or automating browser interactions on localhost.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Requires agent-browser CLI installed (Rust binary) and running.
|
|
6
|
+
metadata:
|
|
7
|
+
author: copilots
|
|
8
|
+
version: "2.0"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
This skill operates on `localhost` URLs only. Screenshots, clicks, typing, scrolling, and reads on locally running apps are in scope. External services (github.com, dev.azure.com, npmjs.com, etc.) are out of scope for browser tools.
|
|
12
|
+
|
|
13
|
+
The only exception: when the user selects "Others (Browser)" as their backlog platform during onboarding, the `pc-userstory` skill may navigate to work item URLs the user explicitly provides. That is the sole case where external navigation is permitted, and only to URLs the user explicitly gives you.
|
|
14
|
+
|
|
15
|
+
## Best-practice workflow
|
|
16
|
+
|
|
17
|
+
1. Open the page: `agent-browser open <url>` (launches its own Chrome; reuses the running daemon)
|
|
18
|
+
2. Take a snapshot: `agent-browser snapshot` to get the accessibility tree with `@ref` handles
|
|
19
|
+
3. Interact by ref: `agent-browser click @e2`, `agent-browser fill @e3 "text"`
|
|
20
|
+
4. Wait when needed: `agent-browser wait --load networkidle` or `agent-browser wait <selector>`
|
|
21
|
+
5. Confirm the result with a fresh `snapshot`, `get text`, or `screenshot`
|
|
22
|
+
|
|
23
|
+
Refs like `@e2` come from the last snapshot and go stale after page changes: retake the snapshot after navigation or dynamic updates before reusing them. When a click fails because another element covers the target (consent banner, modal), dismiss or interact with the covering element, then take a fresh snapshot before retrying.
|
|
24
|
+
|
|
25
|
+
## Tool access
|
|
26
|
+
|
|
27
|
+
- MCP tools (inside OpenCode): `agent_browser_open`, `agent_browser_snapshot`, `agent_browser_click`, `agent_browser_fill`, `agent_browser_type`, `agent_browser_wait_for_selector`, `agent_browser_screenshot`, `agent_browser_eval`, `agent_browser_close` — configured in `opencode.jsonc` with `--tools core`
|
|
28
|
+
- CLI (any agent, any host): every command below works identically via bash
|
|
29
|
+
- Diagnose the install: `agent-browser doctor`
|
|
30
|
+
|
|
31
|
+
## Selecting elements
|
|
32
|
+
|
|
33
|
+
- Prefer refs from `snapshot` (`@e1`, `@e2`, ...) over CSS selectors
|
|
34
|
+
- CSS selectors also work: `agent-browser click "#submit"`, `agent-browser fill "#email" "text"`
|
|
35
|
+
- Semantic locators: `agent-browser find role button click --name "Submit"`, `find text "Sign In" click`, `find label "Email" fill "value"`, `find testid <id> click`
|
|
36
|
+
- Native selects: `agent-browser select <sel> <value>`
|
|
37
|
+
|
|
38
|
+
## Reading state
|
|
39
|
+
|
|
40
|
+
- `agent-browser get text <sel>` — text content of an element
|
|
41
|
+
- `agent-browser get value <sel>` — input value
|
|
42
|
+
- `agent-browser snapshot` — structured accessibility tree (preferred for parsing)
|
|
43
|
+
- `agent-browser screenshot [path]` — `--full` for full page, `--annotate` for numbered labels
|
|
44
|
+
- `agent-browser read` — agent-readable markdown of the active tab (no Chrome launch for URL reads)
|
|
45
|
+
|
|
46
|
+
## Tabs and sessions
|
|
47
|
+
|
|
48
|
+
- `agent-browser tab` lists tabs with stable `t1`, `t2` ids; `tab new --label <name>` and `tab <label>` switch
|
|
49
|
+
- `agent-browser close` closes the browser; `close --all` closes every session
|
|
50
|
+
|
|
51
|
+
## CLI-first debugging
|
|
52
|
+
|
|
53
|
+
- `agent-browser doctor` — diagnose install, Chrome, and daemon state
|
|
54
|
+
- `agent-browser console` — view console messages; `agent-browser errors` — uncaught exceptions
|
|
55
|
+
- `agent-browser eval "<js>"` — run JavaScript in the page
|
|
56
|
+
- `agent-browser network requests --filter api` — inspect tracked requests
|
|
57
|
+
|
|
58
|
+
## Troubleshooting
|
|
59
|
+
|
|
60
|
+
- Stale ref: take a fresh `snapshot` after any navigation or DOM change
|
|
61
|
+
- Covered click: the error names the covering element; dismiss it, re-snapshot, retry
|
|
62
|
+
- Selector fails: confirm the content exists with `agent-browser get text` or a snapshot before retrying
|
|
63
|
+
- Daemon or Chrome issues: run `agent-browser doctor`
|
|
64
|
+
|
|
65
|
+
## Scope
|
|
66
|
+
|
|
67
|
+
- Screenshots of locally running app on `localhost` URLs: in scope
|
|
68
|
+
- Click, type, scroll, read on `localhost` pages: in scope
|
|
69
|
+
- Navigate to work item URLs the user explicitly provides (when backlog platform is "Others (Browser)"): in scope
|
|
70
|
+
- Navigate to external services for non-work-item purposes: out of scope
|
|
71
|
+
- DevOps or GitHub CLI operations via browser tools: out of scope
|
|
72
|
+
- Reading or modifying production systems via browser tools: out of scope
|
|
@@ -15,7 +15,7 @@ The marker sections below name the optimization skills this project selected. Lo
|
|
|
15
15
|
|
|
16
16
|
## Code
|
|
17
17
|
|
|
18
|
-
-
|
|
18
|
+
- Zero comments by default. Write one only for what the code cannot show and we do not control: a vendor bug, an external contract, a legal rule. Leave every file you touch with no comment slop, old or new.
|
|
19
19
|
- Never add a file that collects unrelated things — `constants.js`, `types.ts`, `utils.ts`. One responsibility per file, split by domain. A file importing from many unrelated modules is already the symptom.
|
|
20
20
|
|
|
21
21
|
## Temporary files
|
|
@@ -28,6 +28,7 @@ The marker sections below name the optimization skills this project selected. Lo
|
|
|
28
28
|
- Never write more tests than the change requires. A bug fix gets one regression test. A new function gets tests for its public contract, not every internal branch. Never aim for a coverage number.
|
|
29
29
|
- Never test framework or library internals. Test your code's contract, not that EF Core saves a tracked entity.
|
|
30
30
|
- Never generate integration, e2e, or snapshot tests unless explicitly asked. Mock nothing you do not own — use a fake that records state. Never add a test that duplicates a type-check or linter rule.
|
|
31
|
+
- `node .opencode/scripts/check-diff.mjs` enforces the comment and test rules on the diff and must exit 0.
|
|
31
32
|
|
|
32
33
|
<!-- PC-GUARDRAILS-RTK-START -->
|
|
33
34
|
<!-- PC-GUARDRAILS-RTK-END -->
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: pc-make-architecture
|
|
3
|
-
description: Generate or update ARCHITECTURE.md by analyzing the codebase structure. Safe to run at any time. Invoked by the /make-architecture command and the repo-initialize flow.
|
|
4
|
-
license: MIT
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Make Architecture
|
|
8
|
-
|
|
9
|
-
Write `ARCHITECTURE.md` in the project root from what the codebase actually contains, following the [structure template](structure-template.md).
|
|
10
|
-
|
|
11
|
-
## Rules
|
|
12
|
-
|
|
13
|
-
- Never regenerate over a file that carries a `<!-- Last updated:` footer. That footer is what makes the next run incremental, and a full rewrite silently drops whatever a human added by hand. Read the file first and pick the mode.
|
|
14
|
-
- Never analyze outside `.opencode/source-roots.json` when it exists, plus this repo's own docs and config.
|
|
15
|
-
- The footer is the file's last line, and it is the run's own ISO timestamp: `<!-- Last updated: <ISO date> -->`.
|
|
16
|
-
- Follow the writing rules and self-check defined in the [structure template](structure-template.md). After generating, re-read each section: if a section only describes what exists without stating what breaks when its constraints are violated, rewrite it as constraint-embedded prose or cut it. The file is not written until the self-check passes.
|
|
17
|
-
|
|
18
|
-
## Modes
|
|
19
|
-
|
|
20
|
-
| The existing file | Mode |
|
|
21
|
-
|---|---|
|
|
22
|
-
| Missing, or a placeholder with no real content | Generate |
|
|
23
|
-
| Has content and a `<!-- Last updated:` footer | Update |
|
|
24
|
-
| Has content but no footer | Warn the user, then Generate |
|
|
25
|
-
|
|
26
|
-
**Generate.** Discover the architecture with the file tools: `glob` for structure, `grep` for routes, models and schemas, `read` for config, CI workflows, Dockerfiles, README, changelogs and ADRs.
|
|
27
|
-
|
|
28
|
-
**Update.** `git log --oneline --since="<footer date>" -- <source roots>` says what moved. Nothing changed means nothing to write: say "Architecture unchanged since last update" and stop. Otherwise rewrite only the affected sections and leave the rest, including anything hand-written, as it stands. Past roughly 40% of sections affected, fall back to Generate.
|
|
29
|
-
|
|
30
|
-
## Report
|
|
31
|
-
|
|
32
|
-
Whether the file was generated or updated and which sections changed, the top-level components found, and that `/make-architecture` can be re-run whenever the architecture moves.
|
|
1
|
+
---
|
|
2
|
+
name: pc-make-architecture
|
|
3
|
+
description: Generate or update ARCHITECTURE.md by analyzing the codebase structure. Safe to run at any time. Invoked by the /make-architecture command and the repo-initialize flow.
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Make Architecture
|
|
8
|
+
|
|
9
|
+
Write `ARCHITECTURE.md` in the project root from what the codebase actually contains, following the [structure template](structure-template.md).
|
|
10
|
+
|
|
11
|
+
## Rules
|
|
12
|
+
|
|
13
|
+
- Never regenerate over a file that carries a `<!-- Last updated:` footer. That footer is what makes the next run incremental, and a full rewrite silently drops whatever a human added by hand. Read the file first and pick the mode.
|
|
14
|
+
- Never analyze outside `.opencode/source-roots.json` when it exists, plus this repo's own docs and config.
|
|
15
|
+
- The footer is the file's last line, and it is the run's own ISO timestamp: `<!-- Last updated: <ISO date> -->`.
|
|
16
|
+
- Follow the writing rules and self-check defined in the [structure template](structure-template.md). After generating, re-read each section: if a section only describes what exists without stating what breaks when its constraints are violated, rewrite it as constraint-embedded prose or cut it. The file is not written until the self-check passes.
|
|
17
|
+
|
|
18
|
+
## Modes
|
|
19
|
+
|
|
20
|
+
| The existing file | Mode |
|
|
21
|
+
|---|---|
|
|
22
|
+
| Missing, or a placeholder with no real content | Generate |
|
|
23
|
+
| Has content and a `<!-- Last updated:` footer | Update |
|
|
24
|
+
| Has content but no footer | Warn the user, then Generate |
|
|
25
|
+
|
|
26
|
+
**Generate.** Discover the architecture with the file tools: `glob` for structure, `grep` for routes, models and schemas, `read` for config, CI workflows, Dockerfiles, README, changelogs and ADRs.
|
|
27
|
+
|
|
28
|
+
**Update.** `git log --oneline --since="<footer date>" -- <source roots>` says what moved. Nothing changed means nothing to write: say "Architecture unchanged since last update" and stop. Otherwise rewrite only the affected sections and leave the rest, including anything hand-written, as it stands. Past roughly 40% of sections affected, fall back to Generate.
|
|
29
|
+
|
|
30
|
+
## Report
|
|
31
|
+
|
|
32
|
+
Whether the file was generated or updated and which sections changed, the top-level components found, and that `/make-architecture` can be re-run whenever the architecture moves.
|
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: pc-make-design
|
|
3
|
-
description: Generate or update DESIGN.md by analyzing the codebase design system (Tailwind, CSS vars, tokens, UI framework config). Safe to run at any time. Invoked by the /make-design command and the repo-initialize flow.
|
|
4
|
-
license: MIT
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Make Design
|
|
8
|
-
|
|
9
|
-
Write `DESIGN.md` in the project root from the design system the codebase actually uses.
|
|
10
|
-
|
|
11
|
-
The format is Google's design.md spec:
|
|
12
|
-
|
|
13
|
-
- Overview: https://stitch.withgoogle.com/docs/design-md/overview/
|
|
14
|
-
- Format: https://stitch.withgoogle.com/docs/design-md/format/
|
|
15
|
-
- Spec and examples: https://github.com/google-labs-code/design.md
|
|
16
|
-
|
|
17
|
-
## Rules
|
|
18
|
-
|
|
19
|
-
- Never regenerate over a file that carries a `<!-- Last updated:` footer. That footer is what makes the next run incremental, and a full rewrite silently drops whatever a human added by hand. Read the file first and pick the mode.
|
|
20
|
-
- Never reference a file, variable or path from the codebase. `DESIGN.md` is handed to tools that cannot see this repository, so it has to stand alone.
|
|
21
|
-
- Never analyze outside `.opencode/source-roots.json` when it exists.
|
|
22
|
-
|
|
23
|
-
## Contract
|
|
24
|
-
|
|
25
|
-
YAML frontmatter holding every structured token (colours, typography, spacing, elevation, motion, radii, shadows), valid as YAML design tokens. Then free-form Markdown for the look and feel, which is where intent that token values cannot carry belongs. The last line is the run's own ISO timestamp:
|
|
26
|
-
|
|
27
|
-
```
|
|
28
|
-
<!-- Last updated: <ISO date> -->
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
## Modes
|
|
32
|
-
|
|
33
|
-
| The existing file | Mode |
|
|
34
|
-
|---|---|
|
|
35
|
-
| Missing, or a placeholder with no real content | Generate |
|
|
36
|
-
| Has content and a `<!-- Last updated:` footer | Update |
|
|
37
|
-
| Has content but no footer | Warn the user, then Generate |
|
|
38
|
-
|
|
39
|
-
**Generate.** `glob` for CSS, Tailwind and PostCSS config, component files, token definitions (JS, TS, JSON, YAML), theme files, and UI framework config (shadcn, MUI, Chakra).
|
|
40
|
-
|
|
41
|
-
**Update.** `git log --oneline --since="<footer date>" -- <source roots>` says what moved. Nothing changed means nothing to write: say "Design system unchanged since last update" and stop. Otherwise update only the affected tokens and sections. A replaced token system is a Generate.
|
|
42
|
-
|
|
43
|
-
## Report
|
|
44
|
-
|
|
45
|
-
Whether the file was generated or updated and which tokens changed, the palette, fonts and spacing scale found, and that `/make-design` can be re-run whenever the design system moves.
|
|
1
|
+
---
|
|
2
|
+
name: pc-make-design
|
|
3
|
+
description: Generate or update DESIGN.md by analyzing the codebase design system (Tailwind, CSS vars, tokens, UI framework config). Safe to run at any time. Invoked by the /make-design command and the repo-initialize flow.
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Make Design
|
|
8
|
+
|
|
9
|
+
Write `DESIGN.md` in the project root from the design system the codebase actually uses.
|
|
10
|
+
|
|
11
|
+
The format is Google's design.md spec:
|
|
12
|
+
|
|
13
|
+
- Overview: https://stitch.withgoogle.com/docs/design-md/overview/
|
|
14
|
+
- Format: https://stitch.withgoogle.com/docs/design-md/format/
|
|
15
|
+
- Spec and examples: https://github.com/google-labs-code/design.md
|
|
16
|
+
|
|
17
|
+
## Rules
|
|
18
|
+
|
|
19
|
+
- Never regenerate over a file that carries a `<!-- Last updated:` footer. That footer is what makes the next run incremental, and a full rewrite silently drops whatever a human added by hand. Read the file first and pick the mode.
|
|
20
|
+
- Never reference a file, variable or path from the codebase. `DESIGN.md` is handed to tools that cannot see this repository, so it has to stand alone.
|
|
21
|
+
- Never analyze outside `.opencode/source-roots.json` when it exists.
|
|
22
|
+
|
|
23
|
+
## Contract
|
|
24
|
+
|
|
25
|
+
YAML frontmatter holding every structured token (colours, typography, spacing, elevation, motion, radii, shadows), valid as YAML design tokens. Then free-form Markdown for the look and feel, which is where intent that token values cannot carry belongs. The last line is the run's own ISO timestamp:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
<!-- Last updated: <ISO date> -->
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Modes
|
|
32
|
+
|
|
33
|
+
| The existing file | Mode |
|
|
34
|
+
|---|---|
|
|
35
|
+
| Missing, or a placeholder with no real content | Generate |
|
|
36
|
+
| Has content and a `<!-- Last updated:` footer | Update |
|
|
37
|
+
| Has content but no footer | Warn the user, then Generate |
|
|
38
|
+
|
|
39
|
+
**Generate.** `glob` for CSS, Tailwind and PostCSS config, component files, token definitions (JS, TS, JSON, YAML), theme files, and UI framework config (shadcn, MUI, Chakra).
|
|
40
|
+
|
|
41
|
+
**Update.** `git log --oneline --since="<footer date>" -- <source roots>` says what moved. Nothing changed means nothing to write: say "Design system unchanged since last update" and stop. Otherwise update only the affected tokens and sections. A replaced token system is a Generate.
|
|
42
|
+
|
|
43
|
+
## Report
|
|
44
|
+
|
|
45
|
+
Whether the file was generated or updated and which tokens changed, the palette, fonts and spacing scale found, and that `/make-design` can be re-run whenever the design system moves.
|
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
# Signal-to-query mapping
|
|
2
|
-
|
|
3
|
-
Every uncovered signal gets its own search.
|
|
4
|
-
|
|
5
|
-
| Signal type | Search query |
|
|
6
|
-
|---|---|
|
|
7
|
-
| Language | `npx skills find "<language-name>"` (e.g. `typescript`, `csharp`, `python`) |
|
|
8
|
-
| Framework | `npx skills find "<framework-name>"` (e.g. `react`, `ink`, `angular`, `django`) |
|
|
9
|
-
| Architecture | Use the known direct sources below. Optionally also `npx skills find "<pattern-name>"` |
|
|
10
|
-
| Testing | `npx skills find "<test-framework> testing"` (e.g. `vitest testing`, `jest testing`) |
|
|
11
|
-
| Styling | `npx skills find "<css-framework>"` (e.g. `tailwind`, `css modules`, `design tokens`) |
|
|
12
|
-
| Linting | `npx skills find "eslint prettier"` or `"lint format"` |
|
|
13
|
-
| CI/CD | `npx skills find "ci cd pipeline"` or `"<platform> actions"` |
|
|
14
|
-
| Cloud / IaC | `npx skills find "<cloud-provider> infrastructure"` (e.g. `azure infrastructure`) |
|
|
15
|
-
| Monitoring | `npx skills find "observability monitoring"` |
|
|
16
|
-
| i18n | `npx skills find "i18n internationalization"` |
|
|
17
|
-
| Data layer | `npx skills find "<orm-or-db> orm"` (e.g. `entity framework orm`, `prisma orm`) |
|
|
18
|
-
| Dependency Injection | `npx skills find "<di-framework>"` (e.g. `inversify`, `autofac`) |
|
|
19
|
-
|
|
20
|
-
A signal that fits no row derives its query from its own value: `npx skills find "<signal-value>"`.
|
|
21
|
-
|
|
22
|
-
## Known direct sources (architecture and patterns)
|
|
23
|
-
|
|
24
|
-
These live in dedicated repos and install by `owner/repo`, so `npx skills find` never surfaces them. They are the option list for the architecture question, and the source for it when the user picks one.
|
|
25
|
-
|
|
26
|
-
| Selection | Install command | Skill(s) to pick |
|
|
27
|
-
|---|---|---|
|
|
28
|
-
| Feature-Sliced Design (FSD) | `npx skills add -y feature-sliced/skills` | `feature-sliced-design` |
|
|
29
|
-
| Design patterns | `npx skills add -y PatternsDev/skills --skill <name>` | `hooks-pattern`, `hoc-pattern`, `compound-pattern`, `render-props-pattern`, `provider-pattern`, `observer-pattern`, `factory-pattern`, `module-pattern` |
|
|
30
|
-
| Rendering patterns | `npx skills add -y PatternsDev/skills --skill <name>` | `server-side-rendering`, `client-side-rendering`, `static-rendering`, `streaming-ssr`, `react-server-components`, `progressive-hydration`, `islands-architecture` |
|
|
31
|
-
| Performance patterns | `npx skills add -y PatternsDev/skills --skill <name>` | `bundle-splitting`, `tree-shaking`, `dynamic-import`, `route-based`, `js-performance-patterns`, `react-render-optimization` |
|
|
32
|
-
| Modern React (2026 stack) | `npx skills add -y PatternsDev/skills --skill <name>` | `react-2026`, `react-composition-2026`, `react-data-fetching` |
|
|
33
|
-
| Microservices, monolith / layered | `npx skills find "<pattern-name> architecture"` | best result per the quality filter |
|
|
34
|
-
|
|
35
|
-
Take only what the persona and the user's selection call for, at most two or three patterns.dev picks (full catalog: https://www.patterns.dev/ai/skills/catalog/). These sources are curated, so the install-count filter does not apply to them.
|
|
36
|
-
|
|
37
|
-
## Quality filter
|
|
38
|
-
|
|
39
|
-
From each search result, in order:
|
|
40
|
-
|
|
41
|
-
1. Install count at least 100, preferably 1000. Below 100, record "no quality skill found on skills.sh for \<signal\>" and move on.
|
|
42
|
-
2. Prefer an official or canonical source (`vercel-labs`, `anthropics`, `microsoft`, `feature-sliced`, `wshobson`, `github`) over an unknown author.
|
|
43
|
-
3. The description has to match the signal. A React skill with 500K installs does not cover TypeScript.
|
|
44
|
-
4. No redundancy: skip a candidate whose scope an already-selected skill covers, unless it goes genuinely deeper on a different concern.
|
|
45
|
-
|
|
46
|
-
One skill per detected signal is the floor, five to eight is the usual range, ten is the cap: past that, rank by install count and source and keep the top ten. Fewer than five found is worth saying out loud, since the user can add more in the confirmation form.
|
|
47
|
-
|
|
48
|
-
## Verifying an install
|
|
49
|
-
|
|
50
|
-
`npx skills add` is not proof of anything. Read back both `.agents/skills/<skill-name>/SKILL.md` and `skills-lock.json`.
|
|
51
|
-
|
|
52
|
-
- Skill present, lockfile entry missing: add the entry with the Edit tool, matching the existing keys' naming, as `"source": "<owner/repo>", "sourceType": "github", "skillPath": "skills/<skill-name>/SKILL.md", "computedHash": "<skill-name>-placeholder"`, then re-read the file to confirm it is still valid JSON.
|
|
53
|
-
- Skill missing: retry once, then drop it from the set and report the failure.
|
|
1
|
+
# Signal-to-query mapping
|
|
2
|
+
|
|
3
|
+
Every uncovered signal gets its own search.
|
|
4
|
+
|
|
5
|
+
| Signal type | Search query |
|
|
6
|
+
|---|---|
|
|
7
|
+
| Language | `npx skills find "<language-name>"` (e.g. `typescript`, `csharp`, `python`) |
|
|
8
|
+
| Framework | `npx skills find "<framework-name>"` (e.g. `react`, `ink`, `angular`, `django`) |
|
|
9
|
+
| Architecture | Use the known direct sources below. Optionally also `npx skills find "<pattern-name>"` |
|
|
10
|
+
| Testing | `npx skills find "<test-framework> testing"` (e.g. `vitest testing`, `jest testing`) |
|
|
11
|
+
| Styling | `npx skills find "<css-framework>"` (e.g. `tailwind`, `css modules`, `design tokens`) |
|
|
12
|
+
| Linting | `npx skills find "eslint prettier"` or `"lint format"` |
|
|
13
|
+
| CI/CD | `npx skills find "ci cd pipeline"` or `"<platform> actions"` |
|
|
14
|
+
| Cloud / IaC | `npx skills find "<cloud-provider> infrastructure"` (e.g. `azure infrastructure`) |
|
|
15
|
+
| Monitoring | `npx skills find "observability monitoring"` |
|
|
16
|
+
| i18n | `npx skills find "i18n internationalization"` |
|
|
17
|
+
| Data layer | `npx skills find "<orm-or-db> orm"` (e.g. `entity framework orm`, `prisma orm`) |
|
|
18
|
+
| Dependency Injection | `npx skills find "<di-framework>"` (e.g. `inversify`, `autofac`) |
|
|
19
|
+
|
|
20
|
+
A signal that fits no row derives its query from its own value: `npx skills find "<signal-value>"`.
|
|
21
|
+
|
|
22
|
+
## Known direct sources (architecture and patterns)
|
|
23
|
+
|
|
24
|
+
These live in dedicated repos and install by `owner/repo`, so `npx skills find` never surfaces them. They are the option list for the architecture question, and the source for it when the user picks one.
|
|
25
|
+
|
|
26
|
+
| Selection | Install command | Skill(s) to pick |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| Feature-Sliced Design (FSD) | `npx skills add -y feature-sliced/skills` | `feature-sliced-design` |
|
|
29
|
+
| Design patterns | `npx skills add -y PatternsDev/skills --skill <name>` | `hooks-pattern`, `hoc-pattern`, `compound-pattern`, `render-props-pattern`, `provider-pattern`, `observer-pattern`, `factory-pattern`, `module-pattern` |
|
|
30
|
+
| Rendering patterns | `npx skills add -y PatternsDev/skills --skill <name>` | `server-side-rendering`, `client-side-rendering`, `static-rendering`, `streaming-ssr`, `react-server-components`, `progressive-hydration`, `islands-architecture` |
|
|
31
|
+
| Performance patterns | `npx skills add -y PatternsDev/skills --skill <name>` | `bundle-splitting`, `tree-shaking`, `dynamic-import`, `route-based`, `js-performance-patterns`, `react-render-optimization` |
|
|
32
|
+
| Modern React (2026 stack) | `npx skills add -y PatternsDev/skills --skill <name>` | `react-2026`, `react-composition-2026`, `react-data-fetching` |
|
|
33
|
+
| Microservices, monolith / layered | `npx skills find "<pattern-name> architecture"` | best result per the quality filter |
|
|
34
|
+
|
|
35
|
+
Take only what the persona and the user's selection call for, at most two or three patterns.dev picks (full catalog: https://www.patterns.dev/ai/skills/catalog/). These sources are curated, so the install-count filter does not apply to them.
|
|
36
|
+
|
|
37
|
+
## Quality filter
|
|
38
|
+
|
|
39
|
+
From each search result, in order:
|
|
40
|
+
|
|
41
|
+
1. Install count at least 100, preferably 1000. Below 100, record "no quality skill found on skills.sh for \<signal\>" and move on.
|
|
42
|
+
2. Prefer an official or canonical source (`vercel-labs`, `anthropics`, `microsoft`, `feature-sliced`, `wshobson`, `github`) over an unknown author.
|
|
43
|
+
3. The description has to match the signal. A React skill with 500K installs does not cover TypeScript.
|
|
44
|
+
4. No redundancy: skip a candidate whose scope an already-selected skill covers, unless it goes genuinely deeper on a different concern.
|
|
45
|
+
|
|
46
|
+
One skill per detected signal is the floor, five to eight is the usual range, ten is the cap: past that, rank by install count and source and keep the top ten. Fewer than five found is worth saying out loud, since the user can add more in the confirmation form.
|
|
47
|
+
|
|
48
|
+
## Verifying an install
|
|
49
|
+
|
|
50
|
+
`npx skills add` is not proof of anything. Read back both `.agents/skills/<skill-name>/SKILL.md` and `skills-lock.json`.
|
|
51
|
+
|
|
52
|
+
- Skill present, lockfile entry missing: add the entry with the Edit tool, matching the existing keys' naming, as `"source": "<owner/repo>", "sourceType": "github", "skillPath": "skills/<skill-name>/SKILL.md", "computedHash": "<skill-name>-placeholder"`, then re-read the file to confirm it is still valid JSON.
|
|
53
|
+
- Skill missing: retry once, then drop it from the set and report the failure.
|
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: pc-make-guardrails
|
|
3
|
-
description: Generate or update the pc-guardrails-project skill from ARCHITECTURE.md and relevant project files, then wire it into every engineer agent. Invoked by the /make-guardrails command and the repo-initialize flow.
|
|
4
|
-
license: MIT
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Make Guardrails
|
|
8
|
-
|
|
9
|
-
Turn this project's own documentation into `.agents/skills/pc-guardrails-project/SKILL.md`: the rules and constraints its agents work under, per the [category reference](category-reference.md).
|
|
10
|
-
|
|
11
|
-
## Rules
|
|
12
|
-
|
|
13
|
-
- Never regenerate over a file that carries a `<!-- Last updated:` footer. `pc-guardrails-project` is the one skill a team is expected to hand-edit, and a full rewrite silently drops that work. Read the file first and pick the mode.
|
|
14
|
-
- Never invent a rule the project does not state somewhere. A guardrail that came from nowhere is one nobody agreed to, and it will be followed anyway.
|
|
15
|
-
- Never write an empty category. Omit it.
|
|
16
|
-
- Never touch a tier variant (`*-engineer.build.md`, `*-engineer.fast.md`, `*-engineer.plan.md`): they are regenerated from the base templates every startup.
|
|
17
|
-
- Before writing the file, run the self-check defined in the [category reference](category-reference.md): count rules, cut positive phrasing and reference facts, strip anything already enforced by tooling or by `pc-guardrails-generic`, and re-count. The file is not written until the self-check passes.
|
|
18
|
-
|
|
19
|
-
## Sources
|
|
20
|
-
|
|
21
|
-
`ARCHITECTURE.md` is the primary one. Then whatever else exists: `DESIGN.md`, `AGENTS.md`, `README.md`, `CONTRIBUTING.md`, `.opencode/harness.json`, `openspec/config.yaml`, the root manifests (`package.json`, `tsconfig.json`, `biome.json`, `.eslintrc*`, `Cargo.toml`, `go.mod`, `pyproject.toml`, `pom.xml`), and the CI definitions (`.github/workflows/*`, `azure-pipelines.yml`). Lint and formatter config is where the conventions are actually enforced, so it outranks any document that describes them.
|
|
22
|
-
|
|
23
|
-
## Modes
|
|
24
|
-
|
|
25
|
-
| The existing skill file | Mode |
|
|
26
|
-
|---|---|
|
|
27
|
-
| Missing | Generate |
|
|
28
|
-
| Has a `<!-- Last updated:` footer | Update |
|
|
29
|
-
| Exists with no footer | Generate |
|
|
30
|
-
|
|
31
|
-
**Update.** If `ARCHITECTURE.md` has not changed since the footer date, say "Guardrails up to date" and stop. Otherwise `git log --oneline --since="<footer date>" -- <config, lint config, CI workflows>`, update only the affected categories, and leave the rest, including hand-written rules, as they stand. A new architecture, framework or platform is a Generate.
|
|
32
|
-
|
|
33
|
-
## Wiring
|
|
34
|
-
|
|
35
|
-
Every `*-engineer.md` in `.opencode/agents/` gets `@pc-guardrails-project` on its Guardrails line, right after `@pc-guardrails-generic`, with its existing entries untouched:
|
|
36
|
-
|
|
37
|
-
```markdown
|
|
38
|
-
## Abilities
|
|
39
|
-
- Guardrails: @pc-guardrails-generic, @pc-guardrails-project[, ...existing entries unchanged]
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
## Report
|
|
43
|
-
|
|
44
|
-
Whether the skill was generated or updated and which categories changed, the rule count per category, how many agent files were wired, and that `/make-guardrails` can be re-run whenever the conventions move.
|
|
1
|
+
---
|
|
2
|
+
name: pc-make-guardrails
|
|
3
|
+
description: Generate or update the pc-guardrails-project skill from ARCHITECTURE.md and relevant project files, then wire it into every engineer agent. Invoked by the /make-guardrails command and the repo-initialize flow.
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Make Guardrails
|
|
8
|
+
|
|
9
|
+
Turn this project's own documentation into `.agents/skills/pc-guardrails-project/SKILL.md`: the rules and constraints its agents work under, per the [category reference](category-reference.md).
|
|
10
|
+
|
|
11
|
+
## Rules
|
|
12
|
+
|
|
13
|
+
- Never regenerate over a file that carries a `<!-- Last updated:` footer. `pc-guardrails-project` is the one skill a team is expected to hand-edit, and a full rewrite silently drops that work. Read the file first and pick the mode.
|
|
14
|
+
- Never invent a rule the project does not state somewhere. A guardrail that came from nowhere is one nobody agreed to, and it will be followed anyway.
|
|
15
|
+
- Never write an empty category. Omit it.
|
|
16
|
+
- Never touch a tier variant (`*-engineer.build.md`, `*-engineer.fast.md`, `*-engineer.plan.md`): they are regenerated from the base templates every startup.
|
|
17
|
+
- Before writing the file, run the self-check defined in the [category reference](category-reference.md): count rules, cut positive phrasing and reference facts, strip anything already enforced by tooling or by `pc-guardrails-generic`, and re-count. The file is not written until the self-check passes.
|
|
18
|
+
|
|
19
|
+
## Sources
|
|
20
|
+
|
|
21
|
+
`ARCHITECTURE.md` is the primary one. Then whatever else exists: `DESIGN.md`, `AGENTS.md`, `README.md`, `CONTRIBUTING.md`, `.opencode/harness.json`, `openspec/config.yaml`, the root manifests (`package.json`, `tsconfig.json`, `biome.json`, `.eslintrc*`, `Cargo.toml`, `go.mod`, `pyproject.toml`, `pom.xml`), and the CI definitions (`.github/workflows/*`, `azure-pipelines.yml`). Lint and formatter config is where the conventions are actually enforced, so it outranks any document that describes them.
|
|
22
|
+
|
|
23
|
+
## Modes
|
|
24
|
+
|
|
25
|
+
| The existing skill file | Mode |
|
|
26
|
+
|---|---|
|
|
27
|
+
| Missing | Generate |
|
|
28
|
+
| Has a `<!-- Last updated:` footer | Update |
|
|
29
|
+
| Exists with no footer | Generate |
|
|
30
|
+
|
|
31
|
+
**Update.** If `ARCHITECTURE.md` has not changed since the footer date, say "Guardrails up to date" and stop. Otherwise `git log --oneline --since="<footer date>" -- <config, lint config, CI workflows>`, update only the affected categories, and leave the rest, including hand-written rules, as they stand. A new architecture, framework or platform is a Generate.
|
|
32
|
+
|
|
33
|
+
## Wiring
|
|
34
|
+
|
|
35
|
+
Every `*-engineer.md` in `.opencode/agents/` gets `@pc-guardrails-project` on its Guardrails line, right after `@pc-guardrails-generic`, with its existing entries untouched:
|
|
36
|
+
|
|
37
|
+
```markdown
|
|
38
|
+
## Abilities
|
|
39
|
+
- Guardrails: @pc-guardrails-generic, @pc-guardrails-project[, ...existing entries unchanged]
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Report
|
|
43
|
+
|
|
44
|
+
Whether the skill was generated or updated and which categories changed, the rule count per category, how many agent files were wired, and that `/make-guardrails` can be re-run whenever the conventions move.
|