@plainconceptsplatform/agent-harness 3.9.0 → 3.11.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/LICENSE +21 -21
- package/README.md +555 -551
- package/cli/commands/join.js +259 -259
- package/cli/commands/migrate.js +310 -310
- package/cli/commands/shared.js +27 -27
- package/cli/commands/single.js +79 -79
- package/cli/commands/update.js +121 -121
- package/cli/commands/wizard.js +134 -134
- 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-backlog/az.md +28 -28
- package/cli/fragments/ops-backlog/gh.md +28 -28
- package/cli/fragments/ops-backlog/jira.md +28 -28
- package/cli/fragments/ops-review/az.md +62 -62
- package/cli/fragments/ops-review/gh.md +51 -51
- package/cli/fragments/ops-review/gl.md +55 -55
- package/cli/fragments/ops-ship/az.md +81 -81
- package/cli/fragments/ops-ship/gh.md +67 -67
- package/cli/fragments/ops-ship/gl.md +84 -84
- package/cli/index.js +116 -116
- package/cli/presets/agents-content.json +34 -34
- package/cli/presets/browser.json +10 -10
- package/cli/presets/clean.json +21 -21
- package/cli/presets/models.json +68 -68
- package/cli/presets/optimization.json +32 -32
- package/cli/presets/platforms.json +76 -76
- package/cli/presets/source.json +23 -23
- package/cli/steps/browser/index.js +52 -48
- package/cli/steps/clean/index.js +120 -120
- package/cli/steps/copy/agents.js +176 -176
- package/cli/steps/copy/commands.js +79 -79
- package/cli/steps/copy/fullstack-engineer.js +81 -81
- package/cli/steps/copy/index.js +88 -88
- package/cli/steps/copy/opencode-json.js +359 -324
- package/cli/steps/copy/skills.js +353 -316
- package/cli/steps/metadata/index.js +115 -115
- package/cli/steps/models/format.js +88 -88
- package/cli/steps/models/index.js +64 -64
- package/cli/steps/models/write.js +38 -38
- package/cli/steps/openspec/index.js +136 -136
- package/cli/steps/optimization/codegraph.js +141 -141
- package/cli/steps/optimization/detect.js +66 -66
- package/cli/steps/optimization/humanizer.js +17 -17
- package/cli/steps/optimization/index.js +158 -158
- package/cli/steps/optimization/memory.js +91 -91
- package/cli/steps/optimization/patch-guardrails.js +111 -111
- package/cli/steps/optimization/simple-english.js +17 -17
- package/cli/steps/optimization/skills-lock.js +30 -30
- package/cli/steps/platform/index.js +109 -109
- package/cli/steps/source/index.js +123 -123
- package/cli/utils/agent-color.js +111 -111
- package/cli/utils/copy.js +134 -134
- package/cli/utils/exec-spinner.js +47 -47
- package/cli/utils/exec.js +134 -134
- package/cli/utils/legacy-check.js +30 -30
- package/cli/utils/models-cache.js +58 -58
- package/cli/utils/models-pricing.js +42 -42
- package/cli/utils/paths.js +82 -82
- package/cli/utils/process.js +3 -3
- package/cli/utils/terminal.js +6 -6
- package/cli/utils/update-manifest.js +75 -75
- package/harness/.opencode/_gitignore +12 -12
- 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/ops-backlog.md +10 -10
- package/harness/.opencode/commands/ops-review.md +10 -10
- package/harness/.opencode/commands/ops-ship.md +9 -9
- package/harness/.opencode/commands/plan-apply.md +9 -9
- package/harness/.opencode/commands/plan-archive.md +7 -7
- package/harness/.opencode/commands/plan-explore.md +11 -11
- package/harness/.opencode/commands/plan-goal.md +5 -5
- package/harness/.opencode/commands/plan-mockup.md +11 -0
- package/harness/.opencode/commands/plan-propose.md +11 -11
- package/harness/.opencode/commands/plan-quick.md +7 -7
- package/harness/.opencode/commands/plan-story.md +11 -11
- package/harness/.opencode/commands/repo-audit.md +7 -7
- package/harness/.opencode/commands/repo-help.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/plugins/pc-commit-coauthor.js +41 -41
- package/harness/.opencode/plugins/pc-subagent-monitor.js +184 -184
- package/harness/.opencode/plugins/pc-system-reminders.js +424 -424
- package/harness/.opencode/scripts/check-diff.mjs +305 -305
- package/harness/.opencode/scripts/code-rules.mjs +288 -288
- package/harness/.opencode/scripts/platform-contract.mjs +366 -366
- package/harness/AGENTS.md +55 -55
- package/harness/ARCHITECTURE.md +13 -13
- package/harness/DESIGN.md +13 -13
- package/harness/opencode.jsonc +37 -36
- package/harness/openspec/config.yaml +20 -20
- package/harness/skills-lock.json +23 -17
- package/package.json +14 -12
- package/skills/README.md +18 -18
- package/skills/agent-harness-cli/SKILL.md +86 -86
- package/skills/browser-automation/SKILL.md +100 -72
- package/skills/pc-guardrails-generic/SKILL.md +53 -53
- package/skills/pc-guardrails-project/SKILL.md +8 -8
- package/skills/pc-make-architecture/SKILL.md +33 -33
- package/skills/pc-make-architecture/structure-template.md +64 -64
- package/skills/pc-make-design/SKILL.md +45 -45
- package/skills/pc-make-engineer/SKILL.md +59 -59
- package/skills/pc-make-engineer/signal-mapping.md +53 -53
- package/skills/pc-make-engineer/template.md +36 -36
- package/skills/pc-make-guardrails/SKILL.md +44 -44
- package/skills/pc-make-guardrails/category-reference.md +112 -112
- package/skills/pc-make-merge-risk-assess/SKILL.md +70 -70
- package/skills/pc-make-merge-risk-assess/category-reference.md +114 -114
- package/skills/pc-make-user-model/SKILL.md +56 -56
- package/skills/pc-ops-ship/SKILL.md +22 -22
- package/skills/pc-plan-apply/SKILL.md +92 -90
- package/skills/pc-plan-apply/simple-mode.md +21 -21
- package/skills/pc-plan-archive/SKILL.md +66 -66
- package/skills/pc-plan-explore/SKILL.md +22 -21
- package/skills/pc-plan-goal/SKILL.md +91 -91
- package/skills/pc-plan-goal/branching.md +39 -39
- package/skills/pc-plan-goal/failure-policy.md +30 -30
- package/skills/pc-plan-goal/output-mode.md +10 -10
- package/skills/pc-plan-goal/output.md +71 -71
- package/skills/pc-plan-mockup/SKILL.md +85 -0
- package/skills/pc-plan-mockup/mockup-contract.md +65 -0
- package/skills/pc-plan-propose/SKILL.md +127 -127
- package/skills/pc-plan-propose/task-annotation.md +39 -39
- package/skills/pc-plan-quick/SKILL.md +46 -46
- package/skills/pc-plan-story/SKILL.md +96 -93
- package/skills/pc-repo-audit/SKILL.md +44 -44
- package/skills/pc-repo-help/SKILL.md +90 -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 +73 -64
- package/skills/pc-userstory-gh/SKILL.md +63 -63
- package/skills/pc-userstory-jira/SKILL.md +74 -74
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: pc-make-engineer
|
|
3
|
-
description: Create a custom engineer agent via persona-driven interactive design. Invoked by the /make-engineer command.
|
|
4
|
-
license: MIT
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
Create one file, `.opencode/agents/{persona}-engineer.md`, from the [template](template.md). The research behind it is for choosing the right skills, not for filling the file: expertise notes, architecture, conventions, file maps and workflow steps belong in skills.
|
|
8
|
-
|
|
9
|
-
## Rules
|
|
10
|
-
|
|
11
|
-
- Never write the agent file before the user has confirmed the skill set and it is installed. An engineer whose abilities do not exist cannot work.
|
|
12
|
-
- Never write `model:` or `color:`. `pc-subagent-tiers` injects both at startup, so a hand-picked colour is overwritten.
|
|
13
|
-
- Never create `*.build.md`, `*.fast.md`, `*.plan.md`, `build.md` or `plan.md`. The plugin regenerates all of them every startup and anything written there is lost.
|
|
14
|
-
- `mode: subagent`. Engineers are reached through the subagent tool, and a primary would clutter the two-entry list a human picks from.
|
|
15
|
-
- The only `##` heading is `## Abilities`, and the identity paragraph is two or three sentences carrying no project knowledge.
|
|
16
|
-
- Every `@skill` under `## Abilities` exists in `.agents/skills/` and in `skills-lock.json`. A name that is not installed is skipped rather than blocking the worker, so a typo costs the agent that ability in silence.
|
|
17
|
-
- Project-local installs only: `npx skills add -y ...`, never `-g`.
|
|
18
|
-
- At most five form questions, and only where more than one option was detected. A signal with one option is used without asking.
|
|
19
|
-
|
|
20
|
-
## Contracts
|
|
21
|
-
|
|
22
|
-
Personas: `frontend`, `layout`, `backend`, `data`, `devops`, `security`, `mobile`, `api`, `qa`. A persona passed as an argument (`/make-engineer frontend`) or typed by the user is taken as given.
|
|
23
|
-
|
|
24
|
-
Signals to detect: language, framework, data layer, testing, styling, architecture, i18n, CI/CD, cloud and IaC, monitoring, linting, dependency injection.
|
|
25
|
-
|
|
26
|
-
Discovery needs `find-skills`, and has no fallback without it:
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
npx skills add -y vercel-labs/skills@find-skills
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
When `.opencode/agents/{persona}-engineer.md` already exists, ask before touching it:
|
|
33
|
-
|
|
34
|
-
```json
|
|
35
|
-
{
|
|
36
|
-
"questions": [
|
|
37
|
-
{
|
|
38
|
-
"header": "Overwrite engineer",
|
|
39
|
-
"question": "An engineer named \"{persona}-engineer\" already exists. Overwrite or cancel?",
|
|
40
|
-
"options": [
|
|
41
|
-
{ "label": "Overwrite", "description": "Rewrite the file from the template." },
|
|
42
|
-
{ "label": "Cancel", "description": "Stop. Do not modify the existing file." }
|
|
43
|
-
]
|
|
44
|
-
}
|
|
45
|
-
]
|
|
46
|
-
}
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
`fullstack-engineer.md` is the body `pc-subagent-tiers` copies into `build.md` and `plan.md`, so every skill listed there reaches both primaries. Merge into it additively: add only skills it does not already list, put them in the category lines that already exist where they fit, and leave its frontmatter, identity paragraph and existing ability lines alone.
|
|
50
|
-
|
|
51
|
-
## Flow
|
|
52
|
-
|
|
53
|
-
1. **Persona.** Ask with the `question` tool unless it arrived as an argument. The answer decides what to detect, what to ask, and which skills to look for.
|
|
54
|
-
2. **Signals.** Read `.opencode/source-roots.json` (if it is missing or empty, ask which directories to scan), then `ARCHITECTURE.md`, `DESIGN.md`, and the manifests (`package.json`, `tsconfig.json`, `*.csproj`, `pyproject.toml`, `go.mod`, `Cargo.toml`). Detect what the persona needs and report the inventory.
|
|
55
|
-
3. **Form.** Present the detected options with the `question` tool, pre-selected and marked `(Recommended)`. For `frontend`, `backend`, `layout` and `api`, one question is architecture and patterns, whose options come from the [signal mapping](signal-mapping.md) tables.
|
|
56
|
-
4. **Skills.** A signal already covered by a skill in `.agents/skills/` or `skills-lock.json` needs no search. Map each remaining signal to a query through the [signal mapping](signal-mapping.md), present the candidates as one multi-select `question` grouped by category (name, one line, `owner/repo`, install count), install what the user confirms, and verify each one landed in both `.agents/skills/` and the lockfile.
|
|
57
|
-
5. **Write** the file from the [template](template.md).
|
|
58
|
-
6. **Merge** the new skills into `fullstack-engineer.md`.
|
|
59
|
-
7. **Report** the file created, the skills installed, the signals with no quality skill, whatever failed, and that opencode has to restart before `pc-subagent-tiers` picks the engineer up.
|
|
1
|
+
---
|
|
2
|
+
name: pc-make-engineer
|
|
3
|
+
description: Create a custom engineer agent via persona-driven interactive design. Invoked by the /make-engineer command.
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Create one file, `.opencode/agents/{persona}-engineer.md`, from the [template](template.md). The research behind it is for choosing the right skills, not for filling the file: expertise notes, architecture, conventions, file maps and workflow steps belong in skills.
|
|
8
|
+
|
|
9
|
+
## Rules
|
|
10
|
+
|
|
11
|
+
- Never write the agent file before the user has confirmed the skill set and it is installed. An engineer whose abilities do not exist cannot work.
|
|
12
|
+
- Never write `model:` or `color:`. `pc-subagent-tiers` injects both at startup, so a hand-picked colour is overwritten.
|
|
13
|
+
- Never create `*.build.md`, `*.fast.md`, `*.plan.md`, `build.md` or `plan.md`. The plugin regenerates all of them every startup and anything written there is lost.
|
|
14
|
+
- `mode: subagent`. Engineers are reached through the subagent tool, and a primary would clutter the two-entry list a human picks from.
|
|
15
|
+
- The only `##` heading is `## Abilities`, and the identity paragraph is two or three sentences carrying no project knowledge.
|
|
16
|
+
- Every `@skill` under `## Abilities` exists in `.agents/skills/` and in `skills-lock.json`. A name that is not installed is skipped rather than blocking the worker, so a typo costs the agent that ability in silence.
|
|
17
|
+
- Project-local installs only: `npx skills add -y ...`, never `-g`.
|
|
18
|
+
- At most five form questions, and only where more than one option was detected. A signal with one option is used without asking.
|
|
19
|
+
|
|
20
|
+
## Contracts
|
|
21
|
+
|
|
22
|
+
Personas: `frontend`, `layout`, `backend`, `data`, `devops`, `security`, `mobile`, `api`, `qa`. A persona passed as an argument (`/make-engineer frontend`) or typed by the user is taken as given.
|
|
23
|
+
|
|
24
|
+
Signals to detect: language, framework, data layer, testing, styling, architecture, i18n, CI/CD, cloud and IaC, monitoring, linting, dependency injection.
|
|
25
|
+
|
|
26
|
+
Discovery needs `find-skills`, and has no fallback without it:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npx skills add -y vercel-labs/skills@find-skills
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
When `.opencode/agents/{persona}-engineer.md` already exists, ask before touching it:
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"questions": [
|
|
37
|
+
{
|
|
38
|
+
"header": "Overwrite engineer",
|
|
39
|
+
"question": "An engineer named \"{persona}-engineer\" already exists. Overwrite or cancel?",
|
|
40
|
+
"options": [
|
|
41
|
+
{ "label": "Overwrite", "description": "Rewrite the file from the template." },
|
|
42
|
+
{ "label": "Cancel", "description": "Stop. Do not modify the existing file." }
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
`fullstack-engineer.md` is the body `pc-subagent-tiers` copies into `build.md` and `plan.md`, so every skill listed there reaches both primaries. Merge into it additively: add only skills it does not already list, put them in the category lines that already exist where they fit, and leave its frontmatter, identity paragraph and existing ability lines alone.
|
|
50
|
+
|
|
51
|
+
## Flow
|
|
52
|
+
|
|
53
|
+
1. **Persona.** Ask with the `question` tool unless it arrived as an argument. The answer decides what to detect, what to ask, and which skills to look for.
|
|
54
|
+
2. **Signals.** Read `.opencode/source-roots.json` (if it is missing or empty, ask which directories to scan), then `ARCHITECTURE.md`, `DESIGN.md`, and the manifests (`package.json`, `tsconfig.json`, `*.csproj`, `pyproject.toml`, `go.mod`, `Cargo.toml`). Detect what the persona needs and report the inventory.
|
|
55
|
+
3. **Form.** Present the detected options with the `question` tool, pre-selected and marked `(Recommended)`. For `frontend`, `backend`, `layout` and `api`, one question is architecture and patterns, whose options come from the [signal mapping](signal-mapping.md) tables.
|
|
56
|
+
4. **Skills.** A signal already covered by a skill in `.agents/skills/` or `skills-lock.json` needs no search. Map each remaining signal to a query through the [signal mapping](signal-mapping.md), present the candidates as one multi-select `question` grouped by category (name, one line, `owner/repo`, install count), install what the user confirms, and verify each one landed in both `.agents/skills/` and the lockfile.
|
|
57
|
+
5. **Write** the file from the [template](template.md).
|
|
58
|
+
6. **Merge** the new skills into `fullstack-engineer.md`.
|
|
59
|
+
7. **Report** the file created, the skills installed, the signals with no quality skill, whatever failed, and that opencode has to restart before `pc-subagent-tiers` picks the engineer up.
|
|
@@ -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,36 +1,36 @@
|
|
|
1
|
-
# Agent file template
|
|
2
|
-
|
|
3
|
-
The whole file, with nothing else in it:
|
|
4
|
-
|
|
5
|
-
```markdown
|
|
6
|
-
---
|
|
7
|
-
description: <one sentence naming the persona + top 3-5 detected technologies>
|
|
8
|
-
mode: subagent
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
<One paragraph: "You are a {persona} engineer specializing in {top technologies}. You own all work in {scope/files}." Keep it to 2-3 sentences max.>
|
|
12
|
-
|
|
13
|
-
## Abilities
|
|
14
|
-
- Guardrails: @pc-guardrails-generic, @pc-guardrails-project
|
|
15
|
-
- Development: <@installed-skill-1>, <@installed-skill-2>, ...
|
|
16
|
-
- Testing: <@installed-skill-for-testing>, ...
|
|
17
|
-
- Infrastructure: <@installed-skill-for-devops>, ...
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
Replace every `<...>` placeholder with real values, and drop any category line with no skills in it (Guardrails always stays). Development is language, framework, UI and DI skills; Testing is test, lint and typecheck skills; Infrastructure is DevOps, CI/CD and cloud skills.
|
|
21
|
-
|
|
22
|
-
## Description quality bar
|
|
23
|
-
|
|
24
|
-
`description:` is the matching key for `/plan-apply`: the lead compares a task's domain text against it to pick a specialist, so a vague one gets the wrong engineer spawned.
|
|
25
|
-
|
|
26
|
-
Bad: `"A frontend engineer for React"`
|
|
27
|
-
|
|
28
|
-
Good: `"Frontend engineer for Ink 7 + React 19 TUI, FSD architecture, Inversify DI, design tokens, and i18n"`
|
|
29
|
-
|
|
30
|
-
Name the persona, list the three to five technologies actually detected, one sentence, no padding.
|
|
31
|
-
|
|
32
|
-
## Identity paragraph
|
|
33
|
-
|
|
34
|
-
Two or three sentences: who the engineer is, and what files or layers it owns. A knowledge dump here is knowledge the lead cannot reuse and the engineer did not ask for.
|
|
35
|
-
|
|
36
|
-
Good: `"You are a frontend engineer specializing in terminal UI development with Ink 7 + React 19. You own all work in the FSD layers: src/app/, src/widgets/, src/features/, src/entities/, and src/shared/."`
|
|
1
|
+
# Agent file template
|
|
2
|
+
|
|
3
|
+
The whole file, with nothing else in it:
|
|
4
|
+
|
|
5
|
+
```markdown
|
|
6
|
+
---
|
|
7
|
+
description: <one sentence naming the persona + top 3-5 detected technologies>
|
|
8
|
+
mode: subagent
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
<One paragraph: "You are a {persona} engineer specializing in {top technologies}. You own all work in {scope/files}." Keep it to 2-3 sentences max.>
|
|
12
|
+
|
|
13
|
+
## Abilities
|
|
14
|
+
- Guardrails: @pc-guardrails-generic, @pc-guardrails-project
|
|
15
|
+
- Development: <@installed-skill-1>, <@installed-skill-2>, ...
|
|
16
|
+
- Testing: <@installed-skill-for-testing>, ...
|
|
17
|
+
- Infrastructure: <@installed-skill-for-devops>, ...
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Replace every `<...>` placeholder with real values, and drop any category line with no skills in it (Guardrails always stays). Development is language, framework, UI and DI skills; Testing is test, lint and typecheck skills; Infrastructure is DevOps, CI/CD and cloud skills.
|
|
21
|
+
|
|
22
|
+
## Description quality bar
|
|
23
|
+
|
|
24
|
+
`description:` is the matching key for `/plan-apply`: the lead compares a task's domain text against it to pick a specialist, so a vague one gets the wrong engineer spawned.
|
|
25
|
+
|
|
26
|
+
Bad: `"A frontend engineer for React"`
|
|
27
|
+
|
|
28
|
+
Good: `"Frontend engineer for Ink 7 + React 19 TUI, FSD architecture, Inversify DI, design tokens, and i18n"`
|
|
29
|
+
|
|
30
|
+
Name the persona, list the three to five technologies actually detected, one sentence, no padding.
|
|
31
|
+
|
|
32
|
+
## Identity paragraph
|
|
33
|
+
|
|
34
|
+
Two or three sentences: who the engineer is, and what files or layers it owns. A knowledge dump here is knowledge the lead cannot reuse and the engineer did not ask for.
|
|
35
|
+
|
|
36
|
+
Good: `"You are a frontend engineer specializing in terminal UI development with Ink 7 + React 19. You own all work in the FSD layers: src/app/, src/widgets/, src/features/, src/entities/, and src/shared/."`
|
|
@@ -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,112 +1,112 @@
|
|
|
1
|
-
# Guardrails category reference
|
|
2
|
-
|
|
3
|
-
From the documents and code graph analysis, extract the rules an agent could break without noticing. Only include a category if you found real evidence for it.
|
|
4
|
-
|
|
5
|
-
- Architecture constraints: layer boundaries, module dependencies, forbidden imports, directory ownership rules (e.g. "src/api/ must not import from src/ui/"). Verify actual import boundaries with the project-selected analysis tools.
|
|
6
|
-
- File organization: the god-files and dumping-ground constants this project has already accumulated, named. The general principle is in `pc-guardrails-generic`; what belongs here is where this codebase keeps breaking it.
|
|
7
|
-
- Naming conventions: file naming, component naming, API route conventions, branch naming
|
|
8
|
-
- Code style: formatter config, lint rules, import ordering, max line length. Derive from actual config files.
|
|
9
|
-
- Testing rules: test file locations, naming, coverage gates, what must be tested before merge
|
|
10
|
-
- Build & deployment: build commands, env requirements, deployment targets, CI gates
|
|
11
|
-
- Data & state: migration rules, schema change process, state management patterns
|
|
12
|
-
- Security: auth boundaries, input validation requirements, secrets handling
|
|
13
|
-
- Dependencies: package manager, lockfile rules, upgrade policy, forbidden packages
|
|
14
|
-
- Git workflow: branch naming, commit message format, PR process (platform-specific from `harness.json`)
|
|
15
|
-
- Domain-specific rules: anything in `openspec/config.yaml` context or `ARCHITECTURE.md` constraints/risks sections
|
|
16
|
-
|
|
17
|
-
Each rule must be:
|
|
18
|
-
|
|
19
|
-
- **Negative.** State the boundary and what breaks when it is crossed, not the behaviour you want: `Never import Microsoft.EntityFrameworkCore.* in Application; it is a layer violation and the build does not catch it`, not `Keep Application framework-free`. A prohibition removes an option; a preference competes with everything else the model knows about writing code, and loses.
|
|
20
|
-
- **Concrete**: "Use `pnpm` not `npm`" not "Use the right package manager".
|
|
21
|
-
- **Evidence-based**: derived from the files and code graph you analyzed. Never invent a rule the project does not state or demonstrate somewhere.
|
|
22
|
-
- **Not enforced elsewhere.** Skip anything the formatter, linter, type checker, test suite, CI gate or a harness plugin already fails the build on. A rule restating `biome.json` is read on every load and changes nothing: the build was going to catch it. Write the rules that nothing but a careful reader would catch.
|
|
23
|
-
- **Not already in `pc-guardrails-generic`.** That skill loads alongside this one, every request. Secrets, zero-comment default, scratch-file location, one-responsibility-per-file, minimal-test discipline, and the engineer workflow are its rules, not this file's.
|
|
24
|
-
|
|
25
|
-
**At most 40 rules, across all categories.** Rank by what a violation costs and cut from the bottom; a category with nothing consequential in it gets no rules at all. This cap is the point of the exercise, not tidiness: compliance falls away as a rule file grows, so the 41st rule does not just cost its own tokens, it dilutes the 40 that matter. If more than 40 survive every bar above, the excess is a sign the project's constraints belong in a linter rule or a CI check instead.
|
|
26
|
-
|
|
27
|
-
## Contrastive example
|
|
28
|
-
|
|
29
|
-
**Bad** (reference fact — cut):
|
|
30
|
-
> - The SQL Server database name is `myapp`, lowercase.
|
|
31
|
-
|
|
32
|
-
The agent reads the connection string in config. It costs tokens on every load and the agent cannot "break" it.
|
|
33
|
-
|
|
34
|
-
**Good** (negative constraint with consequence — keep):
|
|
35
|
-
> - Never add a cached column for a value that is derived from another entity; a later edit to the source leaves the cache stale, and nothing in the build catches it.
|
|
36
|
-
|
|
37
|
-
The agent could break this without noticing, nothing mechanically enforces it, and the consequence is stated.
|
|
38
|
-
|
|
39
|
-
## Skill template
|
|
40
|
-
|
|
41
|
-
Each section holds constraints an agent could break without noticing, not reference facts. "Naming Conventions" does not mean "list how files are named" — it means "name the conventions whose violation is silent and costly." "Build & Deployment" does not mean "list the build commands" — it means "name the build rules a developer could violate without CI catching it." If a section has only reference facts, omit it entirely.
|
|
42
|
-
|
|
43
|
-
Write (or update) `.agents/skills/pc-guardrails-project/SKILL.md`:
|
|
44
|
-
|
|
45
|
-
```markdown
|
|
46
|
-
---
|
|
47
|
-
name: pc-guardrails-project
|
|
48
|
-
description: Project-specific rules and constraints extracted from ARCHITECTURE.md. Load this skill before implementing any change to understand boundaries, conventions, and constraints for this codebase.
|
|
49
|
-
license: MIT
|
|
50
|
-
---
|
|
51
|
-
|
|
52
|
-
# Project Guardrails
|
|
53
|
-
|
|
54
|
-
> Auto-generated by `/make-guardrails`. Regenerate with the same command when architecture or conventions change.
|
|
55
|
-
|
|
56
|
-
## Architecture Constraints
|
|
57
|
-
- <rule>
|
|
58
|
-
- <rule>
|
|
59
|
-
|
|
60
|
-
## Naming Conventions
|
|
61
|
-
- <rule>
|
|
62
|
-
|
|
63
|
-
## Code Style
|
|
64
|
-
- <rule>
|
|
65
|
-
|
|
66
|
-
## Testing
|
|
67
|
-
- <rule>
|
|
68
|
-
|
|
69
|
-
## Build & Deployment
|
|
70
|
-
- <rule>
|
|
71
|
-
|
|
72
|
-
## Data & State
|
|
73
|
-
- <rule>
|
|
74
|
-
|
|
75
|
-
## Security
|
|
76
|
-
- <rule>
|
|
77
|
-
|
|
78
|
-
## Dependencies
|
|
79
|
-
- <rule>
|
|
80
|
-
|
|
81
|
-
## Git Workflow
|
|
82
|
-
- <rule>
|
|
83
|
-
|
|
84
|
-
<!-- Last updated: <current ISO timestamp> -->
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
Only include sections that have real rules. Omit empty sections.
|
|
88
|
-
|
|
89
|
-
## Self-check (before writing the file)
|
|
90
|
-
|
|
91
|
-
Re-read the output you are about to write. Then:
|
|
92
|
-
|
|
93
|
-
1. **Count the rules** (every bullet under every section). If there are more than 40, cut from the bottom — rank by what a violation costs and remove the cheapest until you are at or under 40. A rule file past 40 dilutes the ones that matter.
|
|
94
|
-
|
|
95
|
-
2. **Scan for positive phrasing and reference facts.** Cut or rewrite any rule that:
|
|
96
|
-
- States what something is named, rather than what must not be named that way and why.
|
|
97
|
-
- Lists a port number, a database name, a package version, a SDK version, or a connection string. The agent discovers these by reading config.
|
|
98
|
-
- Describes how something works (e.g. "auth uses a smart scheme that forwards to JWT or Cookies"), rather than what must not be done with it.
|
|
99
|
-
- Restates a project's tech stack as a list ("Frontend: React 19, Next.js 15, TypeScript…"). That is reference material, not a constraint.
|
|
100
|
-
|
|
101
|
-
3. **Strip anything already enforced by tooling.** Remove a rule if any of these already fails the build on its violation:
|
|
102
|
-
- Biome / ESLint / Prettier / Steiger / lint:fsd
|
|
103
|
-
- NetArchTest / architecture test projects
|
|
104
|
-
- Semgrep / Trivy / TruffleHog / SBOM checks
|
|
105
|
-
- Coverage gates (`scripts/check-coverage.mjs`)
|
|
106
|
-
- `.editorconfig`, `Directory.Build.props`, NuGet audit gates
|
|
107
|
-
- CI workflow steps (`app-ci.yml`, `ci.yml`)
|
|
108
|
-
- GitHub branch protection / required checks. If the build catches it, the rule costs tokens and adds nothing. The only exception is a rule whose enforcement is partial or non-obvious (e.g. architecture tests enforce layering but a developer could still import a namespace through reflection or a transitive dependency — that nuance is worth a rule).
|
|
109
|
-
|
|
110
|
-
4. **Strip anything already in `pc-guardrails-generic`.** That skill loads on every request alongside this one. Its rules are: secrets discipline, zero-comment default (WHY not WHAT, 10% ceiling, no auto-generated docstrings), scratch-file location, one-responsibility-per-file, minimal-test discipline (one regression test per bug, no framework/library tests, no integration/e2e/snapshot unless asked, no mock-assertion of third-party calls), and the engineer workflow. Do not restate any of them here.
|
|
111
|
-
|
|
112
|
-
5. **Re-count after cutting.** If you are still over 40, you are writing reference material, not constraints. Cut harder.
|
|
1
|
+
# Guardrails category reference
|
|
2
|
+
|
|
3
|
+
From the documents and code graph analysis, extract the rules an agent could break without noticing. Only include a category if you found real evidence for it.
|
|
4
|
+
|
|
5
|
+
- Architecture constraints: layer boundaries, module dependencies, forbidden imports, directory ownership rules (e.g. "src/api/ must not import from src/ui/"). Verify actual import boundaries with the project-selected analysis tools.
|
|
6
|
+
- File organization: the god-files and dumping-ground constants this project has already accumulated, named. The general principle is in `pc-guardrails-generic`; what belongs here is where this codebase keeps breaking it.
|
|
7
|
+
- Naming conventions: file naming, component naming, API route conventions, branch naming
|
|
8
|
+
- Code style: formatter config, lint rules, import ordering, max line length. Derive from actual config files.
|
|
9
|
+
- Testing rules: test file locations, naming, coverage gates, what must be tested before merge
|
|
10
|
+
- Build & deployment: build commands, env requirements, deployment targets, CI gates
|
|
11
|
+
- Data & state: migration rules, schema change process, state management patterns
|
|
12
|
+
- Security: auth boundaries, input validation requirements, secrets handling
|
|
13
|
+
- Dependencies: package manager, lockfile rules, upgrade policy, forbidden packages
|
|
14
|
+
- Git workflow: branch naming, commit message format, PR process (platform-specific from `harness.json`)
|
|
15
|
+
- Domain-specific rules: anything in `openspec/config.yaml` context or `ARCHITECTURE.md` constraints/risks sections
|
|
16
|
+
|
|
17
|
+
Each rule must be:
|
|
18
|
+
|
|
19
|
+
- **Negative.** State the boundary and what breaks when it is crossed, not the behaviour you want: `Never import Microsoft.EntityFrameworkCore.* in Application; it is a layer violation and the build does not catch it`, not `Keep Application framework-free`. A prohibition removes an option; a preference competes with everything else the model knows about writing code, and loses.
|
|
20
|
+
- **Concrete**: "Use `pnpm` not `npm`" not "Use the right package manager".
|
|
21
|
+
- **Evidence-based**: derived from the files and code graph you analyzed. Never invent a rule the project does not state or demonstrate somewhere.
|
|
22
|
+
- **Not enforced elsewhere.** Skip anything the formatter, linter, type checker, test suite, CI gate or a harness plugin already fails the build on. A rule restating `biome.json` is read on every load and changes nothing: the build was going to catch it. Write the rules that nothing but a careful reader would catch.
|
|
23
|
+
- **Not already in `pc-guardrails-generic`.** That skill loads alongside this one, every request. Secrets, zero-comment default, scratch-file location, one-responsibility-per-file, minimal-test discipline, and the engineer workflow are its rules, not this file's.
|
|
24
|
+
|
|
25
|
+
**At most 40 rules, across all categories.** Rank by what a violation costs and cut from the bottom; a category with nothing consequential in it gets no rules at all. This cap is the point of the exercise, not tidiness: compliance falls away as a rule file grows, so the 41st rule does not just cost its own tokens, it dilutes the 40 that matter. If more than 40 survive every bar above, the excess is a sign the project's constraints belong in a linter rule or a CI check instead.
|
|
26
|
+
|
|
27
|
+
## Contrastive example
|
|
28
|
+
|
|
29
|
+
**Bad** (reference fact — cut):
|
|
30
|
+
> - The SQL Server database name is `myapp`, lowercase.
|
|
31
|
+
|
|
32
|
+
The agent reads the connection string in config. It costs tokens on every load and the agent cannot "break" it.
|
|
33
|
+
|
|
34
|
+
**Good** (negative constraint with consequence — keep):
|
|
35
|
+
> - Never add a cached column for a value that is derived from another entity; a later edit to the source leaves the cache stale, and nothing in the build catches it.
|
|
36
|
+
|
|
37
|
+
The agent could break this without noticing, nothing mechanically enforces it, and the consequence is stated.
|
|
38
|
+
|
|
39
|
+
## Skill template
|
|
40
|
+
|
|
41
|
+
Each section holds constraints an agent could break without noticing, not reference facts. "Naming Conventions" does not mean "list how files are named" — it means "name the conventions whose violation is silent and costly." "Build & Deployment" does not mean "list the build commands" — it means "name the build rules a developer could violate without CI catching it." If a section has only reference facts, omit it entirely.
|
|
42
|
+
|
|
43
|
+
Write (or update) `.agents/skills/pc-guardrails-project/SKILL.md`:
|
|
44
|
+
|
|
45
|
+
```markdown
|
|
46
|
+
---
|
|
47
|
+
name: pc-guardrails-project
|
|
48
|
+
description: Project-specific rules and constraints extracted from ARCHITECTURE.md. Load this skill before implementing any change to understand boundaries, conventions, and constraints for this codebase.
|
|
49
|
+
license: MIT
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
# Project Guardrails
|
|
53
|
+
|
|
54
|
+
> Auto-generated by `/make-guardrails`. Regenerate with the same command when architecture or conventions change.
|
|
55
|
+
|
|
56
|
+
## Architecture Constraints
|
|
57
|
+
- <rule>
|
|
58
|
+
- <rule>
|
|
59
|
+
|
|
60
|
+
## Naming Conventions
|
|
61
|
+
- <rule>
|
|
62
|
+
|
|
63
|
+
## Code Style
|
|
64
|
+
- <rule>
|
|
65
|
+
|
|
66
|
+
## Testing
|
|
67
|
+
- <rule>
|
|
68
|
+
|
|
69
|
+
## Build & Deployment
|
|
70
|
+
- <rule>
|
|
71
|
+
|
|
72
|
+
## Data & State
|
|
73
|
+
- <rule>
|
|
74
|
+
|
|
75
|
+
## Security
|
|
76
|
+
- <rule>
|
|
77
|
+
|
|
78
|
+
## Dependencies
|
|
79
|
+
- <rule>
|
|
80
|
+
|
|
81
|
+
## Git Workflow
|
|
82
|
+
- <rule>
|
|
83
|
+
|
|
84
|
+
<!-- Last updated: <current ISO timestamp> -->
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Only include sections that have real rules. Omit empty sections.
|
|
88
|
+
|
|
89
|
+
## Self-check (before writing the file)
|
|
90
|
+
|
|
91
|
+
Re-read the output you are about to write. Then:
|
|
92
|
+
|
|
93
|
+
1. **Count the rules** (every bullet under every section). If there are more than 40, cut from the bottom — rank by what a violation costs and remove the cheapest until you are at or under 40. A rule file past 40 dilutes the ones that matter.
|
|
94
|
+
|
|
95
|
+
2. **Scan for positive phrasing and reference facts.** Cut or rewrite any rule that:
|
|
96
|
+
- States what something is named, rather than what must not be named that way and why.
|
|
97
|
+
- Lists a port number, a database name, a package version, a SDK version, or a connection string. The agent discovers these by reading config.
|
|
98
|
+
- Describes how something works (e.g. "auth uses a smart scheme that forwards to JWT or Cookies"), rather than what must not be done with it.
|
|
99
|
+
- Restates a project's tech stack as a list ("Frontend: React 19, Next.js 15, TypeScript…"). That is reference material, not a constraint.
|
|
100
|
+
|
|
101
|
+
3. **Strip anything already enforced by tooling.** Remove a rule if any of these already fails the build on its violation:
|
|
102
|
+
- Biome / ESLint / Prettier / Steiger / lint:fsd
|
|
103
|
+
- NetArchTest / architecture test projects
|
|
104
|
+
- Semgrep / Trivy / TruffleHog / SBOM checks
|
|
105
|
+
- Coverage gates (`scripts/check-coverage.mjs`)
|
|
106
|
+
- `.editorconfig`, `Directory.Build.props`, NuGet audit gates
|
|
107
|
+
- CI workflow steps (`app-ci.yml`, `ci.yml`)
|
|
108
|
+
- GitHub branch protection / required checks. If the build catches it, the rule costs tokens and adds nothing. The only exception is a rule whose enforcement is partial or non-obvious (e.g. architecture tests enforce layering but a developer could still import a namespace through reflection or a transitive dependency — that nuance is worth a rule).
|
|
109
|
+
|
|
110
|
+
4. **Strip anything already in `pc-guardrails-generic`.** That skill loads on every request alongside this one. Its rules are: secrets discipline, zero-comment default (WHY not WHAT, 10% ceiling, no auto-generated docstrings), scratch-file location, one-responsibility-per-file, minimal-test discipline (one regression test per bug, no framework/library tests, no integration/e2e/snapshot unless asked, no mock-assertion of third-party calls), and the engineer workflow. Do not restate any of them here.
|
|
111
|
+
|
|
112
|
+
5. **Re-count after cutting.** If you are still over 40, you are writing reference material, not constraints. Cut harder.
|