@wrongstack/core 0.308.0 → 0.308.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/coordination/agents/index.js +4 -4
- package/dist/coordination/index.d.ts +1 -0
- package/dist/coordination/index.js +113 -15
- package/dist/coordination/task-boundary.d.ts +64 -0
- package/dist/core/index.js +1 -1
- package/dist/defaults/index.js +116 -19
- package/dist/execution/index.js +11 -8
- package/dist/index.d.ts +1 -1
- package/dist/index.js +127 -20
- package/dist/infrastructure/index.js +1 -1
- package/dist/storage/index.js +2 -1
- package/dist/tools/index.js +4 -4
- package/dist/types/config/ui.d.ts +1 -1
- package/dist/types/context-window.d.ts +18 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.js +11 -4
- package/dist/types/runtime-capability-manifest.d.ts +1 -1
- package/instructions/agents/backend.md +3 -0
- package/instructions/agents/bug-hunter.md +3 -0
- package/instructions/agents/code-reviewer.md +1 -0
- package/instructions/agents/frontend.md +2 -0
- package/instructions/agents/test.md +2 -0
- package/instructions/coordination/director-preamble.md +9 -1
- package/instructions/coordination/subagent-baseline.md +4 -0
- package/instructions/modes/code-reviewer.md +1 -1
- package/instructions/modes/debugger.md +2 -2
- package/instructions/modes/refactorer.md +2 -2
- package/instructions/modes/tester.md +2 -2
- package/instructions/system-lite.md +37 -33
- package/instructions/system-pro.md +23 -7
- package/instructions/system.md +33 -11
- package/package.json +6 -4
- package/skills/api-design/SKILL.md +26 -1
- package/skills/audit-log/SKILL.md +22 -1
- package/skills/auto-review/SKILL.md +21 -1
- package/skills/bug-hunter/SKILL.md +8 -0
- package/skills/chimera/SKILL.md +9 -0
- package/skills/data-governance/SKILL.md +25 -1
- package/skills/design-system/SKILL.md +19 -1
- package/skills/docker-deploy/SKILL.md +26 -1
- package/skills/git-flow/SKILL.md +26 -1
- package/skills/mailbox-bridge/SKILL.md +25 -1
- package/skills/mnemosyne/SKILL.md +25 -2
- package/skills/multi-agent/SKILL.md +12 -0
- package/skills/node-modern/SKILL.md +28 -1
- package/skills/observability/SKILL.md +25 -1
- package/skills/output-standards/SKILL.md +28 -1
- package/skills/plugin-author/SKILL.md +31 -1
- package/skills/prompt-engineering/SKILL.md +27 -1
- package/skills/react-modern/SKILL.md +29 -1
- package/skills/refactor-planner/SKILL.md +10 -0
- package/skills/research-web/SKILL.md +28 -1
- package/skills/sdd/SKILL.md +18 -0
- package/skills/security-scanner/SKILL.md +25 -1
- package/skills/skill-creator/SKILL.md +25 -1
- package/skills/tech-stack/SKILL.md +25 -1
- package/skills/testing/SKILL.md +25 -1
- package/skills/typescript-strict/SKILL.md +30 -1
- package/skills/wrongstack-kanban/SKILL.md +24 -0
- package/skills/wrongstack-mailbox/SKILL.md +29 -1
- package/skills/wrongstack-mailbox-mcp/SKILL.md +30 -3
|
@@ -5,7 +5,7 @@ description: |
|
|
|
5
5
|
with Docker. Triggers: user says "docker", "container", "dockerfile",
|
|
6
6
|
"image", "docker-compose", "deploy", "containerize", "registry",
|
|
7
7
|
"multi-stage", "distroless".
|
|
8
|
-
version: 1.
|
|
8
|
+
version: 1.1.0
|
|
9
9
|
required-capabilities: [filesystem.read, filesystem.write, execution.shell]
|
|
10
10
|
required-tools: []
|
|
11
11
|
---
|
|
@@ -149,6 +149,31 @@ trivy image --exit-code 1 --ignore-unfixed --severity HIGH,CRITICAL wrongstack:$
|
|
|
149
149
|
- **Session storage**: Sessions are stored at `WRONGSTACK_SESSION_ROOT` — mount a volume for persistence.
|
|
150
150
|
- **Config**: Config is at `WRONGSTACK_CONFIG_DIR` — mount for config persistence across restarts.
|
|
151
151
|
|
|
152
|
+
## Out of scope
|
|
153
|
+
|
|
154
|
+
- **Don't run as root in the container.** A non-root user is mandatory. A container compromise that lands root on the host is the failure this rule exists to prevent.
|
|
155
|
+
- **Don't use `node:latest` or unversioned base images.** Pin to `node:22-alpine` (or current). Reproducibility starts at the base.
|
|
156
|
+
- **Don't bake secrets into the image.** Pass via environment variables at runtime. A `RUN echo $API_KEY > /app/config.key` is a permanent secret in the image layer.
|
|
157
|
+
- **Don't skip the `.dockerignore`.** Without it, `node_modules`, `dist`, `.git`, and `*.test.ts` end up in the image — bigger, slower, more attack surface.
|
|
158
|
+
- **Don't tag production images `latest`.** Tag with the git SHA. `latest` is a moving target; production needs a specific commit.
|
|
159
|
+
- **Don't ship without a `HEALTHCHECK`.** Orchestrators need a probe; an image without one can't be load-balanced cleanly.
|
|
160
|
+
- **Don't skip image scanning.** `trivy image` or `docker scout` before push. Critical vulnerabilities are blocking.
|
|
161
|
+
- **Don't mix build and runtime stages.** Multi-stage is the rule: build with dev deps, runtime with production deps only. A 1GB image is a build hygiene failure.
|
|
162
|
+
- **Don't deploy without persistent volume mounts.** Sessions at `WRONGSTACK_SESSION_ROOT` and config at `WRONGSTACK_CONFIG_DIR` need volumes; container restarts lose data otherwise.
|
|
163
|
+
|
|
164
|
+
## Before returning
|
|
165
|
+
|
|
166
|
+
- [ ] Multi-stage build; runtime stage is production-deps only
|
|
167
|
+
- [ ] Base image pinned to a specific tag (`node:22-alpine`, not `latest`)
|
|
168
|
+
- [ ] Non-root user; `USER wrongstack` set before `ENTRYPOINT`
|
|
169
|
+
- [ ] Secrets via env at runtime, not baked into the image
|
|
170
|
+
- [ ] `.dockerignore` excludes `node_modules`, `dist`, `.git`, `*.test.ts`
|
|
171
|
+
- [ ] Image tagged with git SHA, not `latest`
|
|
172
|
+
- [ ] `HEALTHCHECK` directive points to the CLI's self-check command
|
|
173
|
+
- [ ] `trivy image` or `docker scout` run before push; critical vulns blocked
|
|
174
|
+
- [ ] Volumes mounted for `WRONGSTACK_SESSION_ROOT` and `WRONGSTACK_CONFIG_DIR`
|
|
175
|
+
- [ ] Build runs from repo root with `pnpm build` before `docker build` (workspace order)
|
|
176
|
+
|
|
152
177
|
## Skills in scope
|
|
153
178
|
|
|
154
179
|
- `security-scanner` — for scanning Dockerfiles and container configs for vulnerabilities
|
package/skills/git-flow/SKILL.md
CHANGED
|
@@ -4,7 +4,7 @@ description: |
|
|
|
4
4
|
Use this skill when proposing, reviewing, or troubleshooting git commits,
|
|
5
5
|
branches, pull requests, or merge strategies in a WrongStack project session.
|
|
6
6
|
Triggers: user mentions "commit", "branch", "PR", "merge", "rebase", "stash", "diff".
|
|
7
|
-
version: 1.
|
|
7
|
+
version: 1.3.0
|
|
8
8
|
required-capabilities: [version-control.manage]
|
|
9
9
|
required-tools: [test]
|
|
10
10
|
---
|
|
@@ -154,6 +154,31 @@ git rebase main && git merge --ff-only feature
|
|
|
154
154
|
Open a PR at GitHub linking to issue #123 with the commit message describing the fix.
|
|
155
155
|
```
|
|
156
156
|
|
|
157
|
+
## Out of scope
|
|
158
|
+
|
|
159
|
+
- **Don't force-push shared branches.** `--force-with-lease` on your own branch is the cap; shared branches get a PR + merge, never a force.
|
|
160
|
+
- **Don't commit lockfile changes with logic changes.** Separate commits, separate rollbacks. A lockfile muddied with a feature commit is impossible to bisect.
|
|
161
|
+
- **Don't make "Update stuff" mega-commits.** One concern per commit. 15 packages in one commit is process for process's sake.
|
|
162
|
+
- **Don't branch from branches.** Always branch from `main` or a stable release tag. Branching from a feature branch is git history debt.
|
|
163
|
+
- **Don't write a "what" commit message.** "fix: fixed bug" tells the reader nothing. Subject ≤ 72 chars, imperative mood, body explains why.
|
|
164
|
+
- **Don't `git reset --hard` with uncommitted work.** Stash first. A hard reset that loses work is the kind of incident a `git-flow` skill exists to prevent.
|
|
165
|
+
- **Don't amend a pushed commit.** It rewrites shared history. Open a follow-up commit or revert.
|
|
166
|
+
- **Don't leave WIP commits on `main`.** Use `git stash` or a feature branch, not a commit message like "WIP".
|
|
167
|
+
- **Don't skip self-review.** Self-review the diff before requesting review. Sending a diff the author hasn't read wastes the reviewer's time.
|
|
168
|
+
|
|
169
|
+
## Before returning
|
|
170
|
+
|
|
171
|
+
- [ ] Branch is from `main` or a stable release tag, not from another feature branch
|
|
172
|
+
- [ ] One concern per commit; lockfile changes isolated
|
|
173
|
+
- [ ] Subject ≤ 72 chars, imperative, no trailing period; body explains why
|
|
174
|
+
- [ ] Issue reference included (`Fix #123` or `Closes GH-456`)
|
|
175
|
+
- [ ] Self-review done before requesting review
|
|
176
|
+
- [ ] No `git push --force` to shared branches; `--force-with-lease` only on own branch
|
|
177
|
+
- [ ] Branch deleted after merge (unless shared or releasing)
|
|
178
|
+
- [ ] PR title follows commit format; body links the issue and lists changed files
|
|
179
|
+
- [ ] No `WIP` or "Update stuff" commits in the history
|
|
180
|
+
- [ ] `<nextsteps>` mirrors the recommended commit/PR actions
|
|
181
|
+
|
|
157
182
|
## Skills in scope
|
|
158
183
|
|
|
159
184
|
- `refactor-planner` — when a refactor involves multiple git-managed changes
|
|
@@ -8,7 +8,7 @@ description: |
|
|
|
8
8
|
bridge". Starts a loopback HTTP façade over the same GlobalMailbox that
|
|
9
9
|
WrongStack-internal agents already share, so any agent with curl or
|
|
10
10
|
fetch can read, send, and acknowledge messages.
|
|
11
|
-
version: 1.
|
|
11
|
+
version: 1.1.0
|
|
12
12
|
required-capabilities: [execution.shell]
|
|
13
13
|
required-tools: []
|
|
14
14
|
optional-capabilities: [web.research]
|
|
@@ -342,6 +342,30 @@ is 15 s.
|
|
|
342
342
|
audit trails of which external agent called which route are needed,
|
|
343
343
|
the agent itself should log them client-side.
|
|
344
344
|
|
|
345
|
+
## Out of scope
|
|
346
|
+
|
|
347
|
+
- **Don't expose the bridge on `0.0.0.0` without a trusted reverse proxy.** Loopback binding makes "reach" require shell access on the host. LAN exposure without re-authentication and rate-limiting at the proxy is a trust leak.
|
|
348
|
+
- **Don't log the bearer token.** The structured `mailbox_serve_started` event includes bind URL, port, project dir, and token path — never the token itself. Logging it once is a permanent compromise.
|
|
349
|
+
- **Don't treat the bearer as identity-bound.** Every caller uses the same project token. The bridge does not separately authorize `steer`/control messages or prevent impersonation; the caller can claim any `from`, `type`, or `readerId`. Add an identity-aware trusted proxy before exposing beyond mutually trusted local clients.
|
|
350
|
+
- **Don't expose the filesystem, shell, or non-mailbox tools through the bridge.** It is the mailbox surface only. If a caller needs more, they need a different bridge.
|
|
351
|
+
- **Don't start the bridge for an external agent that already speaks MCP natively.** Use `wstack mcp serve` to expose WrongStack's full tool registry including the mailbox tool. Two bridges for the same purpose is operational debt.
|
|
352
|
+
- **Don't run as a long-lived daemon for the caller.** The bridge is short-lived; spawn it for the duration of the caller's session and let it exit. `mbWithBootstrap()` is the pattern.
|
|
353
|
+
- **Don't hardcode a token into prompts or committed code.** Read it from `.mailbox.token` or accept it from the environment; re-read after a 401.
|
|
354
|
+
- **Don't send `control` messages through the bridge.** Control is a runtime-only surface; the bridge doesn't expose it, and the only legitimate override is `steer` via the `mailbox_manage` route, not through the bridge.
|
|
355
|
+
|
|
356
|
+
## Before returning
|
|
357
|
+
|
|
358
|
+
- [ ] `wstack mailbox serve` (or `mbWithBootstrap`) used; no parallel implementation
|
|
359
|
+
- [ ] Bind address is `127.0.0.1` unless behind a reverse proxy that re-authenticates
|
|
360
|
+
- [ ] Bearer token read from `.mailbox.token` or env, not hardcoded
|
|
361
|
+
- [ ] Token not present in any log line, event, or error message
|
|
362
|
+
- [ ] Body cap of 256 KB enforced; rate limit of 120/min/token enforced
|
|
363
|
+
- [ ] `/healthz` reachable; no auth or rate limit on the health probe
|
|
364
|
+
- [ ] Pair with `wrongstack-mailbox` skill for external-agent usage
|
|
365
|
+
- [ ] Graceful shutdown handles SIGINT/SIGTERM, flushes the cache, unlinks the token
|
|
366
|
+
- [ ] Mailbox health watchdog wired if running unattended
|
|
367
|
+
- [ ] No `control` messages; `steer` only via the canonical `mailbox_manage` route
|
|
368
|
+
|
|
345
369
|
## Skills in scope
|
|
346
370
|
|
|
347
371
|
- `prompt-engineering` — for the external-facing `wrongstack-mailbox`
|
|
@@ -4,7 +4,7 @@ description: |
|
|
|
4
4
|
Use when curating WrongStack SAGE memory: run deterministic hygiene and
|
|
5
5
|
anchor verification first, then review contradictions, drift, and noise;
|
|
6
6
|
file destructive outcomes as review proposals instead of deleting directly.
|
|
7
|
-
version: 1.
|
|
7
|
+
version: 1.2.0
|
|
8
8
|
required-capabilities: [memory.manage, memory.curate]
|
|
9
9
|
required-tools: [cron_cancel, cron_schedule, mail_send, mailbox, memory_candidates, memory_delete, memory_hygiene, memory_search, memory_update, memory_verify, skill]
|
|
10
10
|
---
|
|
@@ -102,7 +102,7 @@ memory_candidates({
|
|
|
102
102
|
})
|
|
103
103
|
```
|
|
104
104
|
|
|
105
|
-
Never
|
|
105
|
+
Never trigger `memory_delete`, never set `status: "deleted"`, and never set
|
|
106
106
|
`status: "archived"` as part of an autonomous Mnemosyne cycle. The user owns
|
|
107
107
|
the later `memory_candidates({ action: "resolve", ... })` decision.
|
|
108
108
|
|
|
@@ -149,6 +149,29 @@ tools are absent, run on demand instead.
|
|
|
149
149
|
- Never advertise commands, config keys, background services, or tools that
|
|
150
150
|
are not present in the live runtime.
|
|
151
151
|
|
|
152
|
+
## Out of scope
|
|
153
|
+
|
|
154
|
+
- **Don't delete or archive memories autonomously.** `memory_delete` and `status: "deleted"` / `"archived"` are not part of an autonomous Mnemosyne cycle. File `memory_candidates` proposals and let the user resolve.
|
|
155
|
+
- **Don't re-author untouched memories to bump timestamps.** A memory that passes review stays as it is. Bumping timestamps corrupts recency signals and churns the store.
|
|
156
|
+
- **Don't skip the deterministic pass.** Hygiene, anchor verification, and supersede/stale marking are run before any LLM analysis. The LLM is a bounded second pass over deterministic results, not a replacement.
|
|
157
|
+
- **Don't infer absence from a missing search result.** A search miss is not proof a memory doesn't exist. Report what was searched; let deterministic checks carry the absence claim.
|
|
158
|
+
- **Don't claim a successful broadcast or scheduled cycle that didn't run.** If the mailbox or cron tools are absent, say so. Never invent a successful delivery or a scheduled job.
|
|
159
|
+
- **Don't describe cron as a persistent daemon.** Cron jobs belong to the live runtime; they must be inspected and cancelled through the cron tools. The skill is session-scoped.
|
|
160
|
+
- **Don't bypass store protections with `force`.** Permanent and high-importance memories receive extra scrutiny. Bypassing protections is a bug, not a feature.
|
|
161
|
+
- **Don't use it as a generic memory CRUD layer.** Mnemosyne is the curation workflow. Direct memory creation/update without going through the workflow is the wrong lane.
|
|
162
|
+
|
|
163
|
+
## Before returning
|
|
164
|
+
|
|
165
|
+
- [ ] `memory_hygiene({ verify: true })` ran first; counts captured
|
|
166
|
+
- [ ] Non-zero `deleted` or `archived` counters treated as a bug and reported
|
|
167
|
+
- [ ] Bounded semantic review searched related memories, not whole store
|
|
168
|
+
- [ ] Direct updates only for non-terminal corrections (text, classification, confidence, `stale`, supersede/contradict links)
|
|
169
|
+
- [ ] Deletion or archival recommendations filed as `memory_candidates` proposals, not applied
|
|
170
|
+
- [ ] Every proposal includes a supported `reason`
|
|
171
|
+
- [ ] Report contains trigger, counts, safe corrections, proposals, errors
|
|
172
|
+
- [ ] Broadcast only when mailbox tools are registered and coordination is active
|
|
173
|
+
- [ ] No claim of scheduled cycle or broadcast that didn't actually run
|
|
174
|
+
|
|
152
175
|
## Skills in Scope
|
|
153
176
|
|
|
154
177
|
- `auto-review` — bounded background-review and reporting patterns.
|
|
@@ -351,6 +351,18 @@ session that dies halfway — and they let you synthesize as you go.
|
|
|
351
351
|
|
|
352
352
|
---
|
|
353
353
|
|
|
354
|
+
## Out of scope
|
|
355
|
+
|
|
356
|
+
- **Don't fan out a single atomic task.** One task is one agent. Subagent overhead exceeds the benefit below ~5 tool calls per subtask.
|
|
357
|
+
- **Don't fan out work that needs shared mutable state.** Subagents share nothing — no memory, no session state, no variable scope. If two subtasks would read or write the same thing, they don't fan out.
|
|
358
|
+
- **Don't fan out work with sequential dependencies.** Worker 2 needing worker 1's output means either chain it inside one agent, or use the fleet pattern with explicit hand-off. One-shot fan-out fails on dependencies.
|
|
359
|
+
- **Don't write briefs by reference.** "Audit the file we discussed" — the worker has no idea. Include exact scope, the specific question, definition of done, return format, and boundaries.
|
|
360
|
+
- **Don't dispatch workers one turn at a time.** Serialized fan-out throws away the only thing parallelism was for. Fire the whole batch in one turn.
|
|
361
|
+
- **Don't ignore `budget_exhausted`.** Partial results are still results. Re-split and retry; never silently absorb a failure into a clean-looking report.
|
|
362
|
+
- **Don't present partial coverage as complete.** A 7-of-10 fleet is a partial audit. Naming the missing three is the only way the user keeps trusting the report.
|
|
363
|
+
- **Don't pick a role that doesn't match the task.** A `bug-hunter` writing docs or a `refactor-planner` running a security audit produces confident output shaped by the wrong priorities — worse than no output.
|
|
364
|
+
- **Don't fan out "because the context is too big".** With 200K–1M windows, work that used to need splitting now fits. Fan out for wall-clock time and genuinely independent attention, not for size.
|
|
365
|
+
|
|
354
366
|
## Skills in scope
|
|
355
367
|
|
|
356
368
|
- `bug-hunter` — parallel file audits
|
|
@@ -4,7 +4,7 @@ description: |
|
|
|
4
4
|
Use this skill when writing, reviewing, or refactoring Node.js >= 22
|
|
5
5
|
TypeScript code in WrongStack. Triggers: ESM imports, fetch usage, AbortSignal,
|
|
6
6
|
node: protocol, Web Streams, or any async patterns.
|
|
7
|
-
version: 1.
|
|
7
|
+
version: 1.2.0
|
|
8
8
|
required-capabilities: [filesystem.read, filesystem.write]
|
|
9
9
|
required-tools: []
|
|
10
10
|
optional-capabilities: [verification.run]
|
|
@@ -185,6 +185,33 @@ while (true) {
|
|
|
185
185
|
}
|
|
186
186
|
```
|
|
187
187
|
|
|
188
|
+
## Out of scope
|
|
189
|
+
|
|
190
|
+
- **Don't use `require()`.** ESM only. `import { x } from './y.js'` with the `.js` extension, even in TS source.
|
|
191
|
+
- **Don't use axios, node-fetch, or got.** Native fetch is sufficient. Third-party HTTP clients are an obsolete layer.
|
|
192
|
+
- **Don't call fetch without `AbortSignal.timeout()`**. Every long-running operation needs a timeout. A request that hangs forever is a CI failure waiting to happen.
|
|
193
|
+
- **Don't use `__dirname` directly in ESM.** ESM doesn't have it. `path.dirname(fileURLToPath(import.meta.url))` is the replacement.
|
|
194
|
+
- **Don't mix callback `fs` with `await`.** Callback APIs don't return promises. Use `fs.promises.*` for `await`able access.
|
|
195
|
+
- **Don't swallow `AbortError` silently.** An `AbortError` means a timeout or abort — it is signal, not success. Log it or handle it explicitly.
|
|
196
|
+
- **Don't trust `process.cwd()` blindly.** It may not match the user's cwd. Accept `cwd` as a parameter and default sensibly.
|
|
197
|
+
- **Don't use setTimeout for cancellable delays in new code.** `setTimeout(handler, ms, { signal })` (Node 22+) is the cancellable form.
|
|
198
|
+
- **Don't write non-atomic file updates.** Use the write-temp + rename pattern. A crash mid-write leaves the file in an indeterminate state otherwise.
|
|
199
|
+
- **Don't enable axios or got for "familiarity".** Node 22+ ships everything you need.
|
|
200
|
+
|
|
201
|
+
## Before returning
|
|
202
|
+
|
|
203
|
+
- [ ] ESM only; no `require()`, no `module.exports`
|
|
204
|
+
- [ ] All relative imports use the `.js` extension
|
|
205
|
+
- [ ] Built-in modules imported via the `node:` protocol (`node:fs/promises`, `node:http`, `node:path`)
|
|
206
|
+
- [ ] fetch carries `AbortSignal.timeout()` for any operation that can wait
|
|
207
|
+
- [ ] `__dirname` replaced with `path.dirname(fileURLToPath(import.meta.url))`
|
|
208
|
+
- [ ] `fs.promises.*` for awaited file access; no callback `fs`
|
|
209
|
+
- [ ] `AbortError` caught and handled explicitly, not swallowed
|
|
210
|
+
- [ ] `cwd` accepted as parameter; `process.cwd()` is not a default
|
|
211
|
+
- [ ] File writes atomic: `writeFile(tmp)` + `rename(tmp, target)`
|
|
212
|
+
- [ ] `Promise.allSettled` for parallel tasks where partial failure is acceptable
|
|
213
|
+
- [ ] `<nextsteps>` mirrors any open follow-up (timeout wiring, ESM migration, abort handling)
|
|
214
|
+
|
|
188
215
|
## Skills in scope
|
|
189
216
|
|
|
190
217
|
- `typescript-strict` — strict TypeScript patterns
|
|
@@ -5,7 +5,7 @@ description: |
|
|
|
5
5
|
or when setting up observability for a new feature. Triggers: user says
|
|
6
6
|
"log", "trace", "metrics", "observability", "instrument", "structured logging",
|
|
7
7
|
"opentelemetry", "log level", "debug", "monitoring".
|
|
8
|
-
version: 1.
|
|
8
|
+
version: 1.1.0
|
|
9
9
|
required-capabilities: [filesystem.read, filesystem.write]
|
|
10
10
|
required-tools: []
|
|
11
11
|
optional-capabilities: [code.inspect]
|
|
@@ -129,6 +129,30 @@ Every log should include:
|
|
|
129
129
|
- **Redaction**: Use `redactKeys()` helper — never log `Authorization`, `token`, `apiKey`, `secret`.
|
|
130
130
|
- **Tool tracing**: Each tool wrapper should emit a structured log on start and end.
|
|
131
131
|
|
|
132
|
+
## Out of scope
|
|
133
|
+
|
|
134
|
+
- **Don't log secrets, tokens, or PII.** Redact at the boundary. A single `Authorization` header in a log line is a credential leak; redact `token`, `apiKey`, `secret`, `Authorization` keys before they reach the stream.
|
|
135
|
+
- **Don't use plain text logs.** JSON to stdout is the contract. `console.log('User logged in')` is unsearchable and breaks log aggregators.
|
|
136
|
+
- **Don't emit logs without a `traceId`.** Correlation across tools is the whole point. A log without a trace is an event with no story.
|
|
137
|
+
- **Don't use DEBUG level in production.** DEBUG is dev-only. Production logs are `INFO`, `WARN`, `ERROR`; DEBUG in prod is noise that hides real signals.
|
|
138
|
+
- **Don't log and ignore.** Every log entry should answer: what happened, what context, what was the outcome. A `console.log('done')` after a side effect is process for process's sake.
|
|
139
|
+
- **Don't write to file logs from app code.** CI captures stdout. File logs bypass the pipeline and become unsearchable tribal knowledge.
|
|
140
|
+
- **Don't skip trace spans on tool calls.** Every tool wrapper should open a span on start and end it on completion, with timing. Without spans, latency questions are unanswerable.
|
|
141
|
+
- **Don't conflate counters and gauges.** Counters increment (`tool.executions`); gauges track current state (`session.iterations`). Mixing them produces nonsense dashboards.
|
|
142
|
+
- **Don't include exception objects in span attributes.** `span.recordException(err)` is the OpenTelemetry path; serialization into a JSON log is its own discipline.
|
|
143
|
+
|
|
144
|
+
## Before returning
|
|
145
|
+
|
|
146
|
+
- [ ] All logs are JSON to stdout, never plain text or file logs
|
|
147
|
+
- [ ] Every entry has `level`, `traceId`, `event`, `timestamp`, `outcome`
|
|
148
|
+
- [ ] No secrets, tokens, `Authorization`, `apiKey`, or PII in any log line
|
|
149
|
+
- [ ] DEBUG level only in dev; production uses `INFO` / `WARN` / `ERROR`
|
|
150
|
+
- [ ] Tool wrappers emit structured start + end events with `duration_ms`
|
|
151
|
+
- [ ] OpenTelemetry spans opened on tool entry, closed on exit with status
|
|
152
|
+
- [ ] Counters vs. gauges respected; histograms used for latency
|
|
153
|
+
- [ ] Redaction centralized at the serialization boundary, not per call site
|
|
154
|
+
- [ ] Log volume and pattern sanity-checked against `audit-log` skill's metrics
|
|
155
|
+
|
|
132
156
|
## Skills in scope
|
|
133
157
|
|
|
134
158
|
- `audit-log` — for analyzing the logs this skill produces
|
|
@@ -4,7 +4,7 @@ description: |
|
|
|
4
4
|
Use this skill when defining or enforcing output formatting standards for agent
|
|
5
5
|
responses in WrongStack. Triggers: user says "next steps format", "output standard",
|
|
6
6
|
"response format", "final message format", "standardize next steps".
|
|
7
|
-
version: 1.
|
|
7
|
+
version: 1.1.0
|
|
8
8
|
required-capabilities: []
|
|
9
9
|
required-tools: []
|
|
10
10
|
---
|
|
@@ -156,6 +156,33 @@ When a **subagent** completes its task, it MUST:
|
|
|
156
156
|
- **Don't assign manual work to the user** — "manually check if X is correct yourself" is not a valid next prompt; when tools permit it, use an agent-directed prompt such as "Use the browser tools to verify X and fix any issue you find"
|
|
157
157
|
- **Don't include `<nextsteps>` in subagent output** — subagents report findings, leaders produce next steps
|
|
158
158
|
|
|
159
|
+
## Out of scope
|
|
160
|
+
|
|
161
|
+
- **Don't include `<nextsteps>` in subagent output.** Subagents report findings; the leader produces the unified tag. A subagent that emits `<nextsteps>` is stepping on the leader's lane.
|
|
162
|
+
- **Don't emit parseable-looking prose instead of the tag.** "Next steps:", "Suggested next:", "Let me know if you want..." all look like the tag to the parser and break the `/next` workflow.
|
|
163
|
+
- **Don't put human-only actions in `<nextsteps>`.** "Open DevTools yourself", "manually check the browser console" — those are informational, not agent prompts. They go outside the tag as plain text.
|
|
164
|
+
- **Don't put markdown inside the tag.** Plain text only, one item per line. `**bold**`, code spans, headings — all break the parser.
|
|
165
|
+
- **Don't use dashes or asterisks inside the tag.** Numbered items only: `1.`, `2.`, `3.`. Dash and asterisk bullets are wrong and silently fail the parser.
|
|
166
|
+
- **Don't put `auto="true"` on items 2+.** Only item 1 may carry the marker. The marker on later items is parsed-and-discarded.
|
|
167
|
+
- **Don't write vague prompts.** "Fix bugs" is not a prompt; "fix auth/session.ts:42 and add a regression test" is. The selected text is submitted verbatim — vague prompts are vague runs.
|
|
168
|
+
- **Don't exceed 5 items without reason.** If the list is over 5, it's probably not a single task. Split it or hand off.
|
|
169
|
+
- **Don't emit `<nextsteps>` while `ctx.todos` has open items.** The in-flight todo list isn't done; new prompt options race the todo loop. Finish the list first, re-arm the tag on the turn where the last todo flips to `completed`.
|
|
170
|
+
- **Don't address the user inside the tag.** Items are agent-directed prompt inputs. Imperative wording is valid when it tells the agent what to do.
|
|
171
|
+
|
|
172
|
+
## Before returning
|
|
173
|
+
|
|
174
|
+
- [ ] Only the leader emits `<nextsteps>`; subagents return findings only
|
|
175
|
+
- [ ] Tag is well-formed: `<nextsteps>...</nextsteps>`, no attributes on the tags
|
|
176
|
+
- [ ] Plain text only inside the tag; no markdown, dashes, or asterisks
|
|
177
|
+
- [ ] Numbered items `1.`, `2.`, `3.`; one prompt per line
|
|
178
|
+
- [ ] At most one `auto="true"`, and only on item 1
|
|
179
|
+
- [ ] Items are agent-directed prompts, not human-only actions
|
|
180
|
+
- [ ] Items are specific enough to submit verbatim (file:line + concrete action)
|
|
181
|
+
- [ ] At most 5 items unless a single task genuinely requires more
|
|
182
|
+
- [ ] Tag omitted if `ctx.todos` still has pending or in_progress items
|
|
183
|
+
- [ ] Leader output synthesized from subagent findings, deduplicated and re-prioritized
|
|
184
|
+
- [ ] Human-only actions sit outside the tag as plain text, not inside it
|
|
185
|
+
|
|
159
186
|
## Skills in scope
|
|
160
187
|
|
|
161
188
|
- `bug-hunter` — inherits output-standards for bug reports
|
|
@@ -7,7 +7,7 @@ description: |
|
|
|
7
7
|
data, and the entry-point registration steps (package.json and index.ts).
|
|
8
8
|
Triggers: user says "new plugin", "add a plugin", "plugin teardown", "plugin
|
|
9
9
|
health", "register a tool", "PluginAPI extension".
|
|
10
|
-
version: 1.
|
|
10
|
+
version: 1.1.0
|
|
11
11
|
required-capabilities: [filesystem.read, filesystem.write, execution.shell]
|
|
12
12
|
required-tools: [bash, cron_cancel, cron_list, cron_schedule, edit, fetch, git, git_autocommit, json, read, search, secret_scanner_test, semver_bump, semver_changelog, semver_current, todo, watch_list, watch_start, watch_stop, write]
|
|
13
13
|
optional-capabilities: [verification.run]
|
|
@@ -336,6 +336,36 @@ For the H1 pattern, extend `tests/plugin-teardown.test.ts` with a
|
|
|
336
336
|
8. **Run verification**: `pnpm --filter @wrongstack/plugins test` + `pnpm --filter @wrongstack/plugins typecheck` + `pnpm --filter @wrongstack/plugins build`
|
|
337
337
|
9. **Update `src/index.ts` doc comment** — bump the plugin count
|
|
338
338
|
|
|
339
|
+
## Out of scope
|
|
340
|
+
|
|
341
|
+
- **Don't put state in the `setup()` closure.** State must live at module scope; the Plugin interface does not thread state from `setup()` to `teardown()`. Closure state leaks on reload.
|
|
342
|
+
- **Don't ship a plugin without `teardown()` and `health()`.** Even stateless plugins add both. The H1 audit pattern is the floor; `/diag plugins` exposes the gap.
|
|
343
|
+
- **Don't make `setup()` non-idempotent.** Calling `setup()` twice must leave a clean slate. Hot-reload must not accumulate state.
|
|
344
|
+
- **Don't delete on-disk state in `teardown()`.** File-based plugins leave the file in place. Only in-memory counters and resource handles (timers, watchers) are cleaned.
|
|
345
|
+
- **Don't collide with built-in tool names.** `read`, `write`, `bash`, `edit`, `fetch`, `search`, `json`, `todo`, `git` are reserved. Pick unique names; `api.tools.register()` enforces uniqueness.
|
|
346
|
+
- **Don't bump `apiVersion` for additive changes.** New optional fields on `PluginAPI` don't break the contract. Bump only when the surface breaks.
|
|
347
|
+
- **Don't read config from `config.plugins`.** Config options go under `config.extensions['<plugin-name>']`. The loader's `buildPluginOptions` merges both, but the convention is `extensions`.
|
|
348
|
+
- **Don't block `setup()` with async hydration.** Use `void (async () => { ... })()` for fire-and-forget. The first call should fall through to fallback if the async hasn't completed.
|
|
349
|
+
- **Don't skip the test files.** `tests/<name>.test.ts` (unit) and `tests/<name>-exec.test.ts` (integration) are required. Plugins without tests rot fast.
|
|
350
|
+
- **Don't lower-case-skip the model and config keys.** Case-insensitive lookup is the convention; `model.toLowerCase()` everywhere.
|
|
351
|
+
|
|
352
|
+
## Before returning
|
|
353
|
+
|
|
354
|
+
- [ ] `name`, `version`, `apiVersion: '^0.1.x'` (current), description, capabilities set
|
|
355
|
+
- [ ] Module-scope state, never in `setup()` closure
|
|
356
|
+
- [ ] `setup()` idempotent: clears state before re-initializing
|
|
357
|
+
- [ ] `teardown()` releases every resource acquired in `setup()`, never deletes on-disk state
|
|
358
|
+
- [ ] `health()` returns `{ ok, message, invocationCount, lastRun? }`
|
|
359
|
+
- [ ] Tool names are unique `snake_case`; no collision with built-ins
|
|
360
|
+
- [ ] Config read from `api.config.extensions['<plugin-name>']`, validated by `configSchema`
|
|
361
|
+
- [ ] Hooks are registered via `api.registerHook(...)` with the correct event/matcher; `HookOutcome` shape honored
|
|
362
|
+
- [ ] `src/index.ts` re-exports the plugin; `package.json` adds the subpath export
|
|
363
|
+
- [ ] `packages/cli/src/wiring/plugins.ts` adds the built-in factory
|
|
364
|
+
- [ ] Tests: `<name>.test.ts` + `<name>-exec.test.ts` + `plugin-teardown.test.ts` block
|
|
365
|
+
- [ ] Verification: `pnpm --filter @wrongstack/plugins test && typecheck && build` all pass
|
|
366
|
+
- [ ] `src/index.ts` doc comment updated with the new plugin count
|
|
367
|
+
- [ ] `<nextsteps>` lists each open follow-up (config, hooks, tests, build)
|
|
368
|
+
|
|
339
369
|
## Skills in scope
|
|
340
370
|
|
|
341
371
|
- `skill-creator` — for the SKILL.md format and frontmatter rules
|
|
@@ -4,7 +4,7 @@ description: |
|
|
|
4
4
|
Use this skill when designing, critiquing, or fixing system prompts,
|
|
5
5
|
tool descriptions, skill definitions, or LLM instruction text in WrongStack.
|
|
6
6
|
Triggers: user mentions "prompt", "system instruction", "skill description", "tool hint", "usage hint", "system prompt".
|
|
7
|
-
version: 1.
|
|
7
|
+
version: 1.2.0
|
|
8
8
|
required-capabilities: [filesystem.read, filesystem.write]
|
|
9
9
|
required-tools: []
|
|
10
10
|
---
|
|
@@ -131,6 +131,32 @@ See `skill-creator` skill for the format. Key points:
|
|
|
131
131
|
- Include concrete code examples in "Do" and "Don't" sections
|
|
132
132
|
- End with "Skills in scope" so agents know to delegate
|
|
133
133
|
|
|
134
|
+
## Out of scope
|
|
135
|
+
|
|
136
|
+
- **Don't ship filler in prompts.** "Please be helpful", "Sure, I'd be happy to", "You are a helpful AI" — every filler line costs tokens and adds no signal. Strip it.
|
|
137
|
+
- **Don't write vague trigger sentences.** "This skill is about Docker" matches nothing. "Use this skill when deploying Docker containers to a production cluster" matches.
|
|
138
|
+
- **Don't describe a tool by what it does alone.** Tool descriptions need when to use, key parameters, and what it returns. "Search files" is incomplete; "Search file contents with regex. Pattern is regex. Use output_mode to select…" is the bar.
|
|
139
|
+
- **Don't put volatile content before static content.** Cache-friendly prompts put identity, tools, and instructions first; session state and recent errors last. Reversing the order costs tokens per turn.
|
|
140
|
+
- **Don't write a long preamble before the question.** The model reads the preamble, then the question. Put the question first.
|
|
141
|
+
- **Don't use ambiguous pronouns.** "Do it again" — which tool, which file? Name the specific thing.
|
|
142
|
+
- **Don't claim trigger keywords cover a domain they don't.** Trigger keywords must be specific. Generic phrases like "improve" or "help with" match too much and the loader can't disambiguate.
|
|
143
|
+
- **Don't re-invent the agent's identity.** WrongStack's system prompt already establishes who the agent is. Don't repeat it; layer domain-specific instruction on top.
|
|
144
|
+
- **Don't design prompts the way you'd write a doc.** Prompts are instruction; docs are reference. Reference material goes in skill `references/`, not in the trigger-matching body.
|
|
145
|
+
|
|
146
|
+
## Before returning
|
|
147
|
+
|
|
148
|
+
- [ ] No filler ("Please be helpful", "Sure, I'd be happy to", "You are a helpful AI")
|
|
149
|
+
- [ ] Skill description's first sentence is a concrete trigger; trigger keywords follow
|
|
150
|
+
- [ ] Tool descriptions cover when to use, key parameters, what it returns
|
|
151
|
+
- [ ] Static content first; volatile content last
|
|
152
|
+
- [ ] No long preamble before the actual question
|
|
153
|
+
- [ ] No ambiguous pronouns; specific things named
|
|
154
|
+
- [ ] Trigger keywords specific enough to disambiguate
|
|
155
|
+
- [ ] Skill body under ~500 lines; deep material in `references/`
|
|
156
|
+
- [ ] Concrete `Do` / `Don't` examples, not abstract principles
|
|
157
|
+
- [ ] `Skill in scope` lists the hand-off targets with a reason for each
|
|
158
|
+
- [ ] `<nextsteps>` mirrors open follow-up prompt-tuning tasks in priority order
|
|
159
|
+
|
|
134
160
|
## Skills in scope
|
|
135
161
|
|
|
136
162
|
- `skill-creator` — for creating new skills (primary — prompt-engineering feeds into skill creation)
|
|
@@ -4,7 +4,7 @@ description: |
|
|
|
4
4
|
Use this skill when writing or reviewing React 19+ code in WrongStack.
|
|
5
5
|
Triggers: user mentions "React", "component", "useState", "useEffect",
|
|
6
6
|
"Server Component", "Client Component", "Suspense", "useTransition", "use hook".
|
|
7
|
-
version: 1.
|
|
7
|
+
version: 1.2.0
|
|
8
8
|
required-capabilities: [filesystem.read, filesystem.write]
|
|
9
9
|
required-tools: []
|
|
10
10
|
optional-capabilities: [verification.run]
|
|
@@ -207,6 +207,34 @@ const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => { ... };
|
|
|
207
207
|
const inputRef = useRef<HTMLInputElement>(null);
|
|
208
208
|
```
|
|
209
209
|
|
|
210
|
+
## Out of scope
|
|
211
|
+
|
|
212
|
+
- **Don't default to Client Components.** Server Components are the default in React 19+. Mark `'use client'` only for interactive code; the boundary carries a serialization cost.
|
|
213
|
+
- **Don't reach for `useEffect` when fetching data.** Use Server Components or `use(promise)`. The `useEffect` + fetch + `setState` dance is the pattern React 19 replaced.
|
|
214
|
+
- **Don't reach for `forwardRef` in new code.** `ref` is a regular prop in React 19. `forwardRef` is the old way; the new way is `function Button({ ref, ...props })`.
|
|
215
|
+
- **Don't use default exports for components.** Named exports only. Default exports hinder refactoring and tree-shaking; named exports are the convention.
|
|
216
|
+
- **Don't use class components in new code.** Function components + hooks. Class components are deprecated in modern React.
|
|
217
|
+
- **`useEffect` is the wrong tool for syncing props to state.** It causes an extra render and stale data. Lift state or use a controlled component.
|
|
218
|
+
- **`useMemo` is overkill for trivial calculations.** `useMemo(() => count * 2, [count])` is more expensive than the multiplication. Measure before memoizing.
|
|
219
|
+
- **Don't reach for `useCallback` when deps change every render.** `useCallback(fn, [obj])` where `obj` is fresh each render provides no stability. Reach for it only when child deps actually benefit.
|
|
220
|
+
- **Don't mix Server/Client boundaries carelessly.** Serialization errors at the boundary are some of the hardest to debug. Keep the boundary clean.
|
|
221
|
+
- **Don't call React's `use()` outside component render.** It's a render-only hook.
|
|
222
|
+
|
|
223
|
+
## Before returning
|
|
224
|
+
|
|
225
|
+
- [ ] Server Components by default; `'use client'` only for interactive code
|
|
226
|
+
- [ ] No `useEffect` for data fetching; Server Components or `use(promise)` instead
|
|
227
|
+
- [ ] No `forwardRef` in new code; `ref` is a regular prop
|
|
228
|
+
- [ ] Named exports for components; no default exports
|
|
229
|
+
- [ ] No class components in new code; function components + hooks only
|
|
230
|
+
- [ ] Event handlers carry explicit types (`React.MouseEvent<HTMLButtonElement>`)
|
|
231
|
+
- [ ] `useState` for local state; `useReducer` for state machines
|
|
232
|
+
- [ ] `useTransition` for non-urgent updates; `useDeferredValue` for expensive search
|
|
233
|
+
- [ ] `useMemo` / `useCallback` only where profiling showed a need
|
|
234
|
+
- [ ] `useEffect` reserved for side effects (subscriptions, manual DOM, focus); not for derived state or data fetching
|
|
235
|
+
- [ ] Props interface explicit; no `any` or `Function`
|
|
236
|
+
- [ ] `<nextsteps>` mirrors any open follow-up (boundary cleanup, hook refactor, prop typing)
|
|
237
|
+
|
|
210
238
|
## Skills in scope
|
|
211
239
|
|
|
212
240
|
- `typescript-strict` — for TypeScript patterns
|
|
@@ -306,6 +306,16 @@ parallelizes.
|
|
|
306
306
|
|
|
307
307
|
---
|
|
308
308
|
|
|
309
|
+
## Out of scope
|
|
310
|
+
|
|
311
|
+
- **Don't start refactoring while planning.** A half-done refactor with no graph behind it is the failure this skill exists to prevent. Plan first, hand the plan to the executing agent phase by phase.
|
|
312
|
+
- **Don't write code or apply edits.** This skill produces a plan, not a diff. If the user wants the refactor done, the executing agent picks it up; this skill's deliverable is the phased plan.
|
|
313
|
+
- **Don't skip the dependency graph.** Ordering without a graph is guessing. Imports are the truth; build the graph from `import` statements, not from directory layout or someone's mental model.
|
|
314
|
+
- **Don't ignore cycles.** A cycle means no valid ordering. List cycles explicitly, schedule their breaking first. A plan over a cycle is fiction.
|
|
315
|
+
- **Don't refactor modules under 50% coverage blind.** Phase 1 of any such module is characterization tests, not the refactor itself. The safety argument is "behavior preserved" — without tests, there is no safety net.
|
|
316
|
+
- **Don't over-phase.** Tasks under 1h merge with related tasks. A 12-phase plan for a 3-day refactor is process for process's sake.
|
|
317
|
+
- **Don't write exit criteria that aren't checkable.** "Code is cleaner" is not an exit criterion. `pnpm test passes` is. If a phase has no checkable exit, it never formally ends.
|
|
318
|
+
|
|
309
319
|
## Skills in scope
|
|
310
320
|
|
|
311
321
|
- `bug-hunter` — for finding bugs exposed by the refactor
|
|
@@ -8,7 +8,7 @@ description: |
|
|
|
8
8
|
Triggers: user says "research", "current version", "is this still true",
|
|
9
9
|
"latest", "what's new in", "breaking changes", "find current",
|
|
10
10
|
"web research", "search the web", "look up".
|
|
11
|
-
version: 1.
|
|
11
|
+
version: 1.1.0
|
|
12
12
|
required-capabilities: [web.research]
|
|
13
13
|
required-tools: [context_manager, delegate, fetch, search]
|
|
14
14
|
optional-capabilities: [runtime.admin]
|
|
@@ -335,6 +335,33 @@ Agent: search("TypeScript null check best practices") // NO
|
|
|
335
335
|
7. CITE — In your response, cite sources for every factual claim
|
|
336
336
|
```
|
|
337
337
|
|
|
338
|
+
## Out of scope
|
|
339
|
+
|
|
340
|
+
- **Don't claim a version, deprecation, or API surface from training memory.** Verify against a live source. The cutoff is wrong; the registry is right.
|
|
341
|
+
- **Don't research-loop.** 2–3 searches + 1–2 fetches per topic. If the answer isn't there after that, surface the ambiguity, don't keep searching.
|
|
342
|
+
- **Don't re-research what you've already injected.** Once a finding is in `context_manager` notes, future turns see it. Re-searching the same topic is a context-bloat failure.
|
|
343
|
+
- **Don't fetch URLs you guessed.** Search first, fetch the result. `fetch("https://react.dev/blog/2025/03/15/...")` is a 404 waiting to happen.
|
|
344
|
+
- **Don't inject raw search results.** Inject a structured summary, not a JSON dump of `search(...)`. Future turns need to parse, not re-read.
|
|
345
|
+
- **Don't cite a single source as fact.** Two-source minimum for a claim; one-source is tentative. Tertiary sources (Reddit, SO, LLM-generated content) need corroboration.
|
|
346
|
+
- **Don't accept a Medium post as ground truth.** Source tiers matter: primary (official docs, GitHub, registries) is fact; secondary is "according to"; tertiary needs corroboration.
|
|
347
|
+
- **Don't research during tactical work.** "Fix the null deref" doesn't need web search. Research mode is for analysis and discussion phases, not bug fixes.
|
|
348
|
+
- **Don't skip the null-result note.** A "no current changes found" note prevents the next turn from re-researching the same topic. Always include it.
|
|
349
|
+
- **Don't spend $0.50 on a version check.** Cost awareness: a quick lookup is 1 search + 1 fetch ≈ 2000 tokens. Landscape surveys justify $2.00; version checks don't.
|
|
350
|
+
|
|
351
|
+
## Before returning
|
|
352
|
+
|
|
353
|
+
- [ ] Every claim cites a source URL; domain minimum, date when visible
|
|
354
|
+
- [ ] Two-source minimum for important claims; single-source labeled tentative
|
|
355
|
+
- [ ] Tertiary sources corroborated before citing
|
|
356
|
+
- [ ] Recency checked: version claims ≤ 6 months old; ecosystem trends from current year
|
|
357
|
+
- [ ] Findings injected via `context_manager` `add_note` with structured summary
|
|
358
|
+
- [ ] Null-result note included when no current changes found
|
|
359
|
+
- [ ] Search→fetch→validate→inject→cite workflow followed
|
|
360
|
+
- [ ] Stop rule honored: 2–3 searches + 1–2 fetches per topic; no loops
|
|
361
|
+
- [ ] Cost aligned with answer value; no $0.50 version checks
|
|
362
|
+
- [ ] No research done for tactical work that doesn't need it
|
|
363
|
+
- [ ] `<nextsteps>` lists any open follow-up research or pending validation
|
|
364
|
+
|
|
338
365
|
## Skills in scope
|
|
339
366
|
|
|
340
367
|
- `tech-stack` — for package version verification and ecosystem validation
|
package/skills/sdd/SKILL.md
CHANGED
|
@@ -129,6 +129,24 @@ Stage shown in real-time. Pause stops after current iteration completes.
|
|
|
129
129
|
- **Spec without acceptance criteria** — how do you know when it's done?
|
|
130
130
|
- **Skipping /sdd for urgent tasks** — the spec is what makes "urgent" possible
|
|
131
131
|
|
|
132
|
+
## Out of scope
|
|
133
|
+
|
|
134
|
+
- **Don't start coding before the spec exists.** You'll rewrite the code anyway — the spec is what makes the rewrite possible. SDD comes first or the spec is fiction.
|
|
135
|
+
- **Don't accept a spec without acceptance criteria.** "Done" must be a checkable state. Without criteria, the task has no formal end and the verifier has nothing to run.
|
|
136
|
+
- **Don't write vague requirements.** "Improve auth" is not a requirement; "Users authenticate via OAuth2 with PKCE, sessions expire after 24h" is. If a requirement can't be tested, it's not a requirement.
|
|
137
|
+
- **Don't skip `/sdd` because the task is urgent.** Urgency without a spec produces urgency-shaped rework. The spec is what makes "urgent" possible to ship correctly.
|
|
138
|
+
- **Don't start a multi-file refactor from SDD.** When the spec reveals a refactor, delegate to `refactor-planner` for the phased plan. SDD defines the goal; refactor-planner sequences the work.
|
|
139
|
+
- **Don't execute the task graph yourself unless the user asks.** SDD produces the plan and task graph; an executor (the leader, a subagent, or the user) picks it up.
|
|
140
|
+
|
|
141
|
+
## Before returning
|
|
142
|
+
|
|
143
|
+
- [ ] Spec has explicit acceptance criteria the verifier can run as commands
|
|
144
|
+
- [ ] Every requirement is specific enough to be tested, not "improve X"
|
|
145
|
+
- [ ] Tasks have dependencies; no orphan tasks at the leaves
|
|
146
|
+
- [ ] Spec template matches the work type (feature/bugfix/refactor/infra/integration/cli-command)
|
|
147
|
+
- [ ] Multi-file refactors are routed to `refactor-planner`, not absorbed into SDD tasks
|
|
148
|
+
- [ ] Critical path called out; bottlenecks named; parallel groups identified
|
|
149
|
+
|
|
132
150
|
## Skills in scope
|
|
133
151
|
|
|
134
152
|
- `refactor-planner` — when the spec reveals a multi-file refactor
|
|
@@ -4,7 +4,7 @@ description: |
|
|
|
4
4
|
Use this skill when scanning code or configuration for security vulnerabilities
|
|
5
5
|
in WrongStack. Triggers: user says "security", "vulnerability", "CVE", "secret",
|
|
6
6
|
"injection", "XSS", "SQL injection", "audit security", "supply chain".
|
|
7
|
-
version: 1.
|
|
7
|
+
version: 1.3.0
|
|
8
8
|
required-capabilities: [filesystem.read, code.inspect]
|
|
9
9
|
required-tools: []
|
|
10
10
|
optional-capabilities: [dependencies.manage]
|
|
@@ -167,6 +167,30 @@ element.textContent = userInput;
|
|
|
167
167
|
</nextsteps>
|
|
168
168
|
```
|
|
169
169
|
|
|
170
|
+
## Out of scope
|
|
171
|
+
|
|
172
|
+
- **Don't echo a full secret in the report.** Redact. A `ghp_…36 chars` is enough for the reader to find and rotate it. The unredacted value in a report is itself a leak.
|
|
173
|
+
- **Don't flag a `file:line` you haven't read.** Generic patterns cause false positives; verify the line is real before reporting. No "looks like a secret" findings.
|
|
174
|
+
- **Don't flag test fixtures as leaked secrets.** Mock credentials in `tests/` and `__fixtures__` are expected. Skip them; flag leaks in production code.
|
|
175
|
+
- **Don't scan `node_modules`.** Use `npm audit` / `pnpm audit` for supply chain. Grepping `node_modules` is a noise machine.
|
|
176
|
+
- **Don't report without remediation.** "Found X" without "do Y" is a finding the user has to research themselves. Always include the fix.
|
|
177
|
+
- **Don't claim CRITICAL without proof of exploitability.** Severity ladders are real. A pattern hit is a lead, not a warrant. State the input that triggers the bug and the consequence.
|
|
178
|
+
- **Don't bypass dependency audit.** Supply chain is an attack vector; skipping `npm audit` / lockfile review is skipping the scanner.
|
|
179
|
+
- **Don't disable TLS or relax auth configs as a "config option" without flagging CRITICAL.** TLS disabled in production is a CRITICAL, not a config note.
|
|
180
|
+
|
|
181
|
+
## Before returning
|
|
182
|
+
|
|
183
|
+
- [ ] Every `file:line` opened and confirmed; no flag from a regex guess
|
|
184
|
+
- [ ] Secrets redacted in the report (prefix + char count, never the value)
|
|
185
|
+
- [ ] Test fixtures skipped for secrets; flagged only for leak/unawaited patterns
|
|
186
|
+
- [ ] `node_modules` not scanned; supply chain via `npm audit` / lockfile review
|
|
187
|
+
- [ ] Every finding carries a remediation; "found X" without "do Y" not shipped
|
|
188
|
+
- [ ] Severity passes the ladder; CRITICAL reserved for proven exploitability
|
|
189
|
+
- [ ] Dependency audit included; CVE/version drift covered
|
|
190
|
+
- [ ] TLS / HTTP / CORS / rate-limit configuration checked and reported
|
|
191
|
+
- [ ] False-positive rate called out with a cause when it exceeds 30%
|
|
192
|
+
- [ ] Summary counts match the findings listed; `<nextsteps>` mirrors them in severity order
|
|
193
|
+
|
|
170
194
|
## Skills in scope
|
|
171
195
|
|
|
172
196
|
- `bug-hunter` — for general code quality bugs found during security scan
|
|
@@ -3,7 +3,7 @@ name: skill-creator
|
|
|
3
3
|
description: |
|
|
4
4
|
Use this skill when the user wants to create a new AI skill in WrongStack.
|
|
5
5
|
Triggers: user says "create a skill", "new skill", "add a skill", "skill definition".
|
|
6
|
-
version: 1.
|
|
6
|
+
version: 1.3.0
|
|
7
7
|
required-capabilities: [filesystem.write, runtime.admin]
|
|
8
8
|
required-tools: [bash, skill]
|
|
9
9
|
---
|
|
@@ -162,6 +162,30 @@ Before writing the file, verify:
|
|
|
162
162
|
- [ ] Content is actionable (rules, patterns, not just prose)
|
|
163
163
|
- [ ] File will be placed in `.wrongstack/skills/`
|
|
164
164
|
|
|
165
|
+
## Out of scope
|
|
166
|
+
|
|
167
|
+
- **Don't write skills without running `/skill-gen validate <name>` first.** A name that collides with an existing skill or breaks the kebab-case rule is a wall hit after the file is written. Validate first, always.
|
|
168
|
+
- **Don't ship a skill with a vague description.** "This skill is about Docker" matches nothing. First sentence = trigger; rest = `Triggers: user says "..."` listing concrete keywords.
|
|
169
|
+
- **Don't name skills in PascalCase or with underscores.** `MySkill` and `my_skill` are wrong; only `my-skill` (kebab-case) loads. The loader rejects the others.
|
|
170
|
+
- **Don't place project skills outside `.wrongstack/skills/<name>/`.** Bundled, user-profile, and foreign paths are for other owners. User-created skills always go in the project directory.
|
|
171
|
+
- **Don't write prose-only skills.** Rules, patterns, anti-patterns, code examples — the content has to be actionable. Prose without a checkable rule does not constrain the model.
|
|
172
|
+
- **Don't skip "Skills in scope".** Without the hand-off list, the model doesn't know where to delegate adjacent questions. The list is what makes the skill part of a system.
|
|
173
|
+
- **Don't forget to bump the version on structural change.** New section, scope change, rule change → major or minor bump. Patch only for wording.
|
|
174
|
+
- **Don't move work into the skill that belongs in `/skill-gen`.** The sub-commands are the deterministic layer: validation, scaffolding, from-prompt conversion. The wizard is for the parts they can't do.
|
|
175
|
+
|
|
176
|
+
## Before returning
|
|
177
|
+
|
|
178
|
+
- [ ] Name is kebab-case; `/skill-gen validate <name>` passed
|
|
179
|
+
- [ ] Name doesn't collide with bundled, project, or user-profile skills
|
|
180
|
+
- [ ] First sentence of `description` is a concrete trigger; trigger keywords follow
|
|
181
|
+
- [ ] File path is `.wrongstack/skills/<name>/SKILL.md` for project skills
|
|
182
|
+
- [ ] Content is actionable: rules, patterns, anti-patterns, code examples
|
|
183
|
+
- [ ] "Out of scope" lists what the skill is NOT for and where to hand off
|
|
184
|
+
- [ ] "Before returning" gives the model a mechanical completion check
|
|
185
|
+
- [ ] "Skills in scope" names the hand-off targets and the reason for each
|
|
186
|
+
- [ ] Version bumped appropriately; change recorded in CHANGELOG.md
|
|
187
|
+
- [ ] `/skill-gen validate <name>` re-run after writing; loads cleanly
|
|
188
|
+
|
|
165
189
|
## Skills in scope
|
|
166
190
|
|
|
167
191
|
- `prompt-engineering` — for crafting the skill description and prompt text
|