@plainconceptsplatform/agent-harness 3.4.1 → 3.5.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.
Files changed (50) hide show
  1. package/cli/commands/update.js +121 -121
  2. package/cli/fragments/archive/az.md +97 -97
  3. package/cli/fragments/archive/gh.md +96 -96
  4. package/cli/fragments/archive/gl.md +96 -96
  5. package/cli/fragments/archive/none.md +75 -75
  6. package/cli/fragments/guardrails/codegraph.md +5 -5
  7. package/cli/fragments/guardrails/humanizer.md +4 -4
  8. package/cli/fragments/guardrails/memory.md +4 -4
  9. package/cli/fragments/guardrails/rtk.md +3 -3
  10. package/cli/fragments/guardrails/simple-english.md +4 -4
  11. package/cli/fragments/ops-ship/az.md +81 -81
  12. package/cli/presets/agents-content.json +34 -34
  13. package/cli/presets/browser.json +10 -10
  14. package/cli/steps/browser/index.js +48 -48
  15. package/cli/steps/copy/commands.js +79 -79
  16. package/cli/steps/copy/index.js +88 -88
  17. package/cli/steps/metadata/index.js +115 -115
  18. package/cli/steps/models/write.js +38 -38
  19. package/harness/.opencode/commands/init.md +5 -5
  20. package/harness/.opencode/commands/make-architecture.md +5 -5
  21. package/harness/.opencode/commands/make-design.md +5 -5
  22. package/harness/.opencode/commands/make-engineer.md +5 -5
  23. package/harness/.opencode/commands/make-guardrails.md +5 -5
  24. package/harness/.opencode/commands/make-user-model.md +5 -5
  25. package/harness/.opencode/commands/plan-apply.md +9 -9
  26. package/harness/.opencode/commands/plan-goal.md +5 -5
  27. package/harness/.opencode/commands/repo-initialize.md +5 -5
  28. package/harness/.opencode/commands/repo-onboard.md +5 -5
  29. package/harness/.opencode/commands/repo-verify.md +5 -5
  30. package/harness/.opencode/scripts/check-diff.mjs +9 -1
  31. package/harness/AGENTS.md +49 -49
  32. package/package.json +1 -1
  33. package/skills/README.md +18 -18
  34. package/skills/browser-automation/SKILL.md +72 -72
  35. package/skills/pc-make-architecture/SKILL.md +32 -32
  36. package/skills/pc-make-design/SKILL.md +45 -45
  37. package/skills/pc-make-engineer/signal-mapping.md +53 -53
  38. package/skills/pc-make-guardrails/SKILL.md +44 -44
  39. package/skills/pc-make-user-model/SKILL.md +56 -56
  40. package/skills/pc-plan-apply/SKILL.md +2 -0
  41. package/skills/pc-plan-archive/SKILL.md +66 -66
  42. package/skills/pc-plan-goal/branching.md +39 -39
  43. package/skills/pc-plan-goal/output.md +71 -71
  44. package/skills/pc-plan-story/SKILL.md +93 -93
  45. package/skills/pc-repo-initialize/SKILL.md +119 -119
  46. package/skills/pc-repo-onboard/SKILL.md +32 -32
  47. package/skills/pc-userstory-az/SKILL.md +71 -71
  48. package/skills/pc-userstory-browser/SKILL.md +64 -64
  49. package/skills/pc-userstory-gh/SKILL.md +63 -63
  50. package/skills/pc-userstory-jira/SKILL.md +74 -74
@@ -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
@@ -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.
@@ -1,56 +1,56 @@
1
- ---
2
- name: pc-make-user-model
3
- description: Set the model for a tier (plan, build, or fast). Team-wide or user-local override. Invoked by the /make-user-model command.
4
- license: MIT
5
- ---
6
-
7
- Point one tier at one model, in the team config or in a machine-local override.
8
-
9
- ## Rules
10
-
11
- - Only `models.<tier>` in `.opencode/harness.json` or `.opencode/harness.user.json` changes. Agent files, `opencode.jsonc` and `tasks.md` are not this command's business, and tier variants are rebuilt from these configs at startup anyway.
12
- - Never guess the id behind `current`: read it from the status line. A guessed id writes a model that does not exist into the team's config.
13
- - Never write anything when the arguments do not parse. Print the usage and stop.
14
- - Preserve the file's other fields and its 2-space formatting.
15
-
16
- ## Contract
17
-
18
- ```
19
- /make-user-model <tier> <model>
20
- /make-user-model user <tier> <model>
21
- ```
22
-
23
- `user` writes `.opencode/harness.user.json`, which is gitignored and wins on this machine only; without it the target is `.opencode/harness.json`, which is shared. `<tier>` is exactly `plan`, `build` or `fast`. `<model>` is a fully-qualified id (`opencode/big-pickle`) or `current` for the model this session is running.
24
-
25
- No arguments means show the `models` block from both files, team first, then the usage. Change nothing.
26
-
27
- A team config that does not exist yet is a stop: onboarding has not run. A missing user config is created as `{ "models": {} }`.
28
-
29
- An id with no `/` in it is malformed; confirm before writing it:
30
-
31
- ```json
32
- {
33
- "questions": [
34
- {
35
- "header": "Malformed model id",
36
- "question": "\"<model>\" doesn't look like a valid model id (expected provider/model-id). Write it anyway?",
37
- "options": [
38
- { "label": "yes", "description": "Write the value as-is to the config file." },
39
- { "label": "no", "description": "Cancel. Do not write anything." }
40
- ]
41
- }
42
- ]
43
- }
44
- ```
45
-
46
- ## Report
47
-
48
- ```
49
- <team|user> config updated
50
- <tier> model -> <resolved-id>
51
- file: <path written>
52
- ```
53
-
54
- The change lands on the next opencode start, when `pc-subagent-tiers` reads the configs and rebuilds the tier variants.
55
-
56
- Arguments: `$ARGUMENTS`
1
+ ---
2
+ name: pc-make-user-model
3
+ description: Set the model for a tier (plan, build, or fast). Team-wide or user-local override. Invoked by the /make-user-model command.
4
+ license: MIT
5
+ ---
6
+
7
+ Point one tier at one model, in the team config or in a machine-local override.
8
+
9
+ ## Rules
10
+
11
+ - Only `models.<tier>` in `.opencode/harness.json` or `.opencode/harness.user.json` changes. Agent files, `opencode.jsonc` and `tasks.md` are not this command's business, and tier variants are rebuilt from these configs at startup anyway.
12
+ - Never guess the id behind `current`: read it from the status line. A guessed id writes a model that does not exist into the team's config.
13
+ - Never write anything when the arguments do not parse. Print the usage and stop.
14
+ - Preserve the file's other fields and its 2-space formatting.
15
+
16
+ ## Contract
17
+
18
+ ```
19
+ /make-user-model <tier> <model>
20
+ /make-user-model user <tier> <model>
21
+ ```
22
+
23
+ `user` writes `.opencode/harness.user.json`, which is gitignored and wins on this machine only; without it the target is `.opencode/harness.json`, which is shared. `<tier>` is exactly `plan`, `build` or `fast`. `<model>` is a fully-qualified id (`opencode/big-pickle`) or `current` for the model this session is running.
24
+
25
+ No arguments means show the `models` block from both files, team first, then the usage. Change nothing.
26
+
27
+ A team config that does not exist yet is a stop: onboarding has not run. A missing user config is created as `{ "models": {} }`.
28
+
29
+ An id with no `/` in it is malformed; confirm before writing it:
30
+
31
+ ```json
32
+ {
33
+ "questions": [
34
+ {
35
+ "header": "Malformed model id",
36
+ "question": "\"<model>\" doesn't look like a valid model id (expected provider/model-id). Write it anyway?",
37
+ "options": [
38
+ { "label": "yes", "description": "Write the value as-is to the config file." },
39
+ { "label": "no", "description": "Cancel. Do not write anything." }
40
+ ]
41
+ }
42
+ ]
43
+ }
44
+ ```
45
+
46
+ ## Report
47
+
48
+ ```
49
+ <team|user> config updated
50
+ <tier> model -> <resolved-id>
51
+ file: <path written>
52
+ ```
53
+
54
+ The change lands on the next opencode start, when `pc-subagent-tiers` reads the configs and rebuilds the tier variants.
55
+
56
+ Arguments: `$ARGUMENTS`