@fro.bot/systematic 2.6.1 → 2.7.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.
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: api-contract-reviewer
3
3
  description: Conditional code-review persona, selected when the diff touches API routes, request/response types, serialization, versioning, or exported type signatures. Reviews code for breaking contract changes.
4
+ model: inherit
4
5
  tools: Read, Grep, Glob, Bash
5
6
  color: blue
6
7
  mode: subagent
@@ -46,4 +47,3 @@ Return your findings as JSON matching the findings schema. No prose outside the
46
47
  "testing_gaps": []
47
48
  }
48
49
  ```
49
-
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: correctness-reviewer
3
3
  description: Always-on code-review persona. Reviews code for logic errors, edge cases, state management bugs, error propagation failures, and intent-vs-implementation mismatches.
4
+ model: inherit
4
5
  tools: Read, Grep, Glob, Bash
5
6
  color: blue
6
7
  mode: subagent
@@ -46,4 +47,3 @@ Return your findings as JSON matching the findings schema. No prose outside the
46
47
  "testing_gaps": []
47
48
  }
48
49
  ```
49
-
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: data-migrations-reviewer
3
3
  description: Conditional code-review persona, selected when the diff touches migration files, schema changes, data transformations, or backfill scripts. Reviews code for data integrity and migration safety.
4
+ model: inherit
4
5
  tools: Read, Grep, Glob, Bash
5
6
  color: blue
6
7
  mode: subagent
@@ -50,4 +51,3 @@ Return your findings as JSON matching the findings schema. No prose outside the
50
51
  "testing_gaps": []
51
52
  }
52
53
  ```
53
-
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: dhh-rails-reviewer
3
3
  description: Conditional code-review persona, selected when Rails diffs introduce architectural choices, abstractions, or frontend patterns that may fight the framework. Reviews code from an opinionated DHH perspective.
4
+ model: inherit
4
5
  tools: Read, Grep, Glob, Bash
5
6
  color: blue
6
7
  mode: subagent
@@ -44,4 +45,3 @@ Return your findings as JSON matching the findings schema. No prose outside the
44
45
  "testing_gaps": []
45
46
  }
46
47
  ```
47
-
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: julik-frontend-races-reviewer
3
3
  description: Conditional code-review persona, selected when the diff touches async UI code, Stimulus/Turbo lifecycles, or DOM-timing-sensitive frontend behavior. Reviews code for race conditions and janky UI failure modes.
4
+ model: inherit
4
5
  tools: Read, Grep, Glob, Bash
5
6
  color: blue
6
7
  mode: subagent
@@ -47,4 +48,3 @@ Return your findings as JSON matching the findings schema. No prose outside the
47
48
  ```
48
49
 
49
50
  Discourage the user from pulling in too many dependencies, explaining that the job is to first understand the race conditions, and then pick a tool for removing them. That tool is usually just a dozen lines, if not less - no need to pull in half of NPM for that.
50
-
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: kieran-python-reviewer
3
3
  description: Conditional code-review persona, selected when the diff touches Python code. Reviews changes with Kieran's strict bar for Pythonic clarity, type hints, and maintainability.
4
+ model: inherit
4
5
  tools: Read, Grep, Glob, Bash
5
6
  color: blue
6
7
  mode: subagent
@@ -45,4 +46,3 @@ Return your findings as JSON matching the findings schema. No prose outside the
45
46
  "testing_gaps": []
46
47
  }
47
48
  ```
48
-
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: kieran-rails-reviewer
3
3
  description: Conditional code-review persona, selected when the diff touches Rails application code. Reviews Rails changes with Kieran's strict bar for clarity, conventions, and maintainability.
4
+ model: inherit
4
5
  tools: Read, Grep, Glob, Bash
5
6
  color: blue
6
7
  mode: subagent
@@ -45,4 +46,3 @@ Return your findings as JSON matching the findings schema. No prose outside the
45
46
  "testing_gaps": []
46
47
  }
47
48
  ```
48
-
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: kieran-typescript-reviewer
3
3
  description: Conditional code-review persona, selected when the diff touches TypeScript code. Reviews changes with Kieran's strict bar for type safety, clarity, and maintainability.
4
+ model: inherit
4
5
  tools: Read, Grep, Glob, Bash
5
6
  color: blue
6
7
  mode: subagent
@@ -45,4 +46,3 @@ Return your findings as JSON matching the findings schema. No prose outside the
45
46
  "testing_gaps": []
46
47
  }
47
48
  ```
48
-
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: maintainability-reviewer
3
3
  description: Always-on code-review persona. Reviews code for premature abstraction, unnecessary indirection, dead code, coupling between unrelated modules, and naming that obscures intent.
4
+ model: inherit
4
5
  tools: Read, Grep, Glob, Bash
5
6
  color: blue
6
7
  mode: subagent
@@ -46,4 +47,3 @@ Return your findings as JSON matching the findings schema. No prose outside the
46
47
  "testing_gaps": []
47
48
  }
48
49
  ```
49
-
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: performance-reviewer
3
3
  description: Conditional code-review persona, selected when the diff touches database queries, loop-heavy data transforms, caching layers, or I/O-intensive paths. Reviews code for runtime performance and scalability issues.
4
+ model: inherit
4
5
  tools: Read, Grep, Glob, Bash
5
6
  color: blue
6
7
  mode: subagent
@@ -48,4 +49,3 @@ Return your findings as JSON matching the findings schema. No prose outside the
48
49
  "testing_gaps": []
49
50
  }
50
51
  ```
51
-
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: reliability-reviewer
3
3
  description: Conditional code-review persona, selected when the diff touches error handling, retries, circuit breakers, timeouts, health checks, background jobs, or async handlers. Reviews code for production reliability and failure modes.
4
+ model: inherit
4
5
  tools: Read, Grep, Glob, Bash
5
6
  color: blue
6
7
  mode: subagent
@@ -46,4 +47,3 @@ Return your findings as JSON matching the findings schema. No prose outside the
46
47
  "testing_gaps": []
47
48
  }
48
49
  ```
49
-
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: security-reviewer
3
3
  description: Conditional code-review persona, selected when the diff touches auth middleware, public endpoints, user input handling, or permission checks. Reviews code for exploitable vulnerabilities.
4
+ model: inherit
4
5
  tools: Read, Grep, Glob, Bash
5
6
  color: blue
6
7
  mode: subagent
@@ -48,4 +49,3 @@ Return your findings as JSON matching the findings schema. No prose outside the
48
49
  "testing_gaps": []
49
50
  }
50
51
  ```
51
-
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: bug-reproduction-validator
3
3
  description: Systematically reproduces and validates bug reports to confirm whether reported behavior is an actual bug. Use when you receive a bug report or issue that needs verification.
4
+ model: inherit
4
5
  mode: subagent
5
6
  temperature: 0.1
6
7
  ---
@@ -81,4 +82,3 @@ Key Principles:
81
82
  - If you cannot reproduce after reasonable attempts, clearly state what you tried
82
83
 
83
84
  When you cannot access certain resources or need additional information, explicitly state what would help validate the bug further. Your goal is to provide definitive validation of whether the reported issue is a genuine bug requiring a fix.
84
-
package/dist/cli.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  findCommandsInDir,
7
7
  findSkillsInDir,
8
8
  getConfigPaths
9
- } from "./index-3h7kpmfa.js";
9
+ } from "./index-k9tdxh0p.js";
10
10
 
11
11
  // src/cli.ts
12
12
  import fs from "fs";
@@ -1436,7 +1436,7 @@ function extractFrontmatter(filePath) {
1436
1436
  metadata,
1437
1437
  disableModelInvocation: extractBoolean(data, "disable-model-invocation"),
1438
1438
  userInvocable: extractBoolean(data, "user-invocable"),
1439
- subtask: data.context === "fork" ? true : undefined,
1439
+ subtask: data.context === "fork" ? true : extractBoolean(data, "subtask") ?? undefined,
1440
1440
  agent: extractNonEmptyString(data, "agent"),
1441
1441
  model: extractNonEmptyString(data, "model"),
1442
1442
  argumentHint: argumentHint !== "" ? argumentHint : undefined,
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  import type { Plugin } from '@opencode-ai/plugin';
2
- export declare const SystematicPlugin: Plugin;
2
+ declare const SystematicPlugin: Plugin;
3
3
  export default SystematicPlugin;
package/dist/index.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  findSkillsInDir,
9
9
  loadConfig,
10
10
  parseFrontmatter
11
- } from "./index-3h7kpmfa.js";
11
+ } from "./index-k9tdxh0p.js";
12
12
 
13
13
  // src/index.ts
14
14
  import fs3 from "fs";
@@ -553,6 +553,5 @@ var SystematicPlugin = async ({ client, directory }) => {
553
553
  };
554
554
  var src_default = SystematicPlugin;
555
555
  export {
556
- src_default as default,
557
- SystematicPlugin
556
+ src_default as default
558
557
  };
@@ -28,5 +28,6 @@ export interface SkillInfo {
28
28
  argumentHint?: string;
29
29
  allowedTools?: string;
30
30
  }
31
+ export declare const SKILL_FRONTMATTER_FIELDS: readonly ["name", "description", "argument-hint", "disable-model-invocation", "allowed-tools", "license", "compatibility", "metadata", "user-invocable", "agent", "model", "context", "subtask"];
31
32
  export declare function extractFrontmatter(filePath: string): SkillFrontmatter;
32
33
  export declare function findSkillsInDir(dir: string, maxDepth?: number): SkillInfo[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fro.bot/systematic",
3
- "version": "2.6.1",
3
+ "version": "2.7.0",
4
4
  "description": "Structured engineering workflows for OpenCode",
5
5
  "type": "module",
6
6
  "homepage": "https://fro.bot/systematic",
@@ -7,9 +7,6 @@ allowed-tools:
7
7
  - Write
8
8
  - Bash
9
9
  - Grep
10
- preconditions:
11
- - Problem has been solved (not in-progress)
12
- - Solution has been verified working
13
10
  ---
14
11
 
15
12
  # compound-docs Skill
@@ -22,6 +19,8 @@ This skill captures problem solutions immediately after confirmation, creating s
22
19
 
23
20
  **Organization:** Single-file architecture - each problem documented as one markdown file in its symptom category directory (e.g., `docs/solutions/performance-issues/n-plus-one-briefs.md`). Files use YAML frontmatter for metadata and searchability.
24
21
 
22
+ **Prerequisites:** The problem has been solved and the solution has been verified working. Do not document in-progress investigations as finalized solutions.
23
+
25
24
  ---
26
25
 
27
26
  <critical_sequence name="documentation-capture" enforce_order="strict">
@@ -0,0 +1,115 @@
1
+ ---
2
+ name: writing-systematic-skills
3
+ description: Use when creating, editing, auditing, or fixing bundled Systematic skills, especially when authoring SKILL.md files, adding skill reference files, resolving content-integrity frontmatter failures, or deciding which Systematic conventions apply beyond the general writing-skills guidance.
4
+ ---
5
+
6
+ # Writing Systematic Skills
7
+
8
+ Systematic skills are OpenCode-native workflow assets. Use this skill after loading the general `writing-skills` foundation; this file only covers the Systematic-specific delta.
9
+
10
+ ## When To Use
11
+
12
+ Use this skill when you are:
13
+
14
+ - Creating a new bundled skill under `skills/`
15
+ - Editing an existing bundled skill's frontmatter or file layout
16
+ - Fixing content-integrity frontmatter or sub-file failures
17
+ - Deciding whether a skill needs references, scripts, assets, or templates
18
+ - Auditing bundled skills for provider-portable defaults
19
+
20
+ Do not use this as a replacement for `~/.agents/skills/writing-skills/SKILL.md`. Load that foundation first when authoring or substantially editing skill content.
21
+
22
+ ## Foundation
23
+
24
+ `writing-skills` supplies the authoring discipline: pressure scenarios, clear trigger-oriented descriptions, concise bodies, and reference files only when depth earns its keep.
25
+
26
+ Systematic adds repository-specific constraints:
27
+
28
+ - Runtime-recognized frontmatter fields are fixed by the skill loader.
29
+ - Skill sub-files live in a small set of conventional directories.
30
+ - Bundled agents must use provider-portable model defaults.
31
+ - Content-integrity enforces the mechanical parts in CI.
32
+
33
+ For worked examples and judgment calls, read `references/foundation-conventions.md`.
34
+
35
+ ## Frontmatter Rules
36
+
37
+ Every bundled skill must have YAML frontmatter with:
38
+
39
+ - `name` - unprefixed skill identifier. The loader adds the `systematic:` command prefix automatically unless the skill intentionally belongs to another namespace such as `ce:`.
40
+ - `description` - third-person trigger conditions. Prefer `Use when...`; describe when to load the skill, not its internal workflow.
41
+
42
+ Optional fields are allowed only when the runtime loader recognizes them:
43
+
44
+ | Field | Use |
45
+ |---|---|
46
+ | `argument-hint` | Shows expected invocation arguments. |
47
+ | `disable-model-invocation` | Prevents direct model invocation for dispatcher-style skills. |
48
+ | `allowed-tools` | Declares tool constraints for skill execution. |
49
+ | `license` | Carries skill licensing metadata. |
50
+ | `compatibility` | Notes platform or version compatibility. |
51
+ | `metadata` | String-only metadata map. |
52
+ | `user-invocable` | Marks whether users should invoke the skill directly. |
53
+ | `agent` | Selects a companion agent when the loader supports it. |
54
+ | `model` | Selects a model for skill execution when justified. |
55
+ | `context` | Use `fork` when the skill should run in forked subtask context. |
56
+ | `subtask` | Explicit forked-subtask marker recognized by the runtime. |
57
+
58
+ `preconditions` is banned. It has no runtime consumer. Put prerequisite guidance in the skill body instead.
59
+
60
+ ## File Layout
61
+
62
+ The required entry point is:
63
+
64
+ ```text
65
+ skills/<skill-name>/SKILL.md
66
+ ```
67
+
68
+ Optional sub-files must live under one of these directories:
69
+
70
+ - `references/` - deeper guidance, decision tables, long examples, or API notes
71
+ - `scripts/` - executable helpers an agent can run
72
+ - `assets/` - static files used by the skill
73
+ - `templates/` - reusable stubs or document templates
74
+
75
+ Keep the main `SKILL.md` small enough to decide whether and how to proceed. Move heavy detail to `references/`, and cite it with a repo-local path such as `references/foundation-conventions.md` so the sub-file integrity gate can verify it exists.
76
+
77
+ ## Identity Defaults
78
+
79
+ Bundled agents must declare:
80
+
81
+ ```yaml
82
+ model: inherit
83
+ ```
84
+
85
+ Hardcoded provider model IDs break users who do not use that provider. Use `model: inherit` unless a future design explicitly proves a provider-specific dependency and documents the tradeoff.
86
+
87
+ For agent or API attribution, `ai:systematic` is the machine ID used by Systematic-owned operations, such as Proof's `by` field and `X-Agent-Id` header. It is not a skill cross-reference convention.
88
+
89
+ ## Validator
90
+
91
+ Run the content-integrity gate before shipping skill changes:
92
+
93
+ ```bash
94
+ bun 'scripts/content-integrity.ts'
95
+ ```
96
+
97
+ The gate checks:
98
+
99
+ - Skill frontmatter is present and uses only runtime-recognized fields.
100
+ - Required `name` and `description` fields are non-empty.
101
+ - Banned frontmatter such as `preconditions` is absent.
102
+ - Bundled agents use `model: inherit`.
103
+ - Skill references to `references/`, `scripts/`, `assets/`, and `templates/` resolve on disk.
104
+
105
+ If the gate fails, fix the content rather than broadening the validator unless the runtime loader contract has actually changed.
106
+
107
+ ## Common Mistakes
108
+
109
+ | Mistake | Fix |
110
+ |---|---|
111
+ | Adding a new frontmatter field because it reads well | Add body prose instead, unless the runtime loader consumes the field. |
112
+ | Summarizing the whole workflow in `description` | Describe trigger conditions only. |
113
+ | Adding provider-specific agent models | Use `model: inherit`. |
114
+ | Linking to a non-existent reference file | Create the file or remove the link. |
115
+ | Duplicating the general writing-skills guidance | Link to the foundation and document only the Systematic delta. |
@@ -0,0 +1,143 @@
1
+ # Foundation Conventions
2
+
3
+ This reference expands the Systematic-specific rules from `SKILL.md`. The mechanical rules are enforced by `bun scripts/content-integrity.ts`; this file explains the judgment calls behind them.
4
+
5
+ ## Frontmatter
6
+
7
+ Systematic skill frontmatter mirrors what the runtime loader actually reads. Do not invent fields for documentation structure. If the loader does not consume the field, put the information in the body.
8
+
9
+ | Field | Required | When To Use | Example |
10
+ |---|---:|---|---|
11
+ | `name` | Yes | Every skill. Use the unprefixed skill identifier unless another namespace is intentional. | `name: writing-systematic-skills` |
12
+ | `description` | Yes | Trigger-oriented discovery text. Third person. Prefer `Use when...`. | `description: Use when fixing bundled skill frontmatter failures...` |
13
+ | `argument-hint` | No | The skill accepts meaningful invocation arguments. | `argument-hint: "[path/to/document.md]"` |
14
+ | `disable-model-invocation` | No | Dispatcher or routing skills that should not be directly model-invoked. | `disable-model-invocation: true` |
15
+ | `allowed-tools` | No | The skill needs an explicit tool allowlist. | `allowed-tools: Bash, Read` |
16
+ | `license` | No | Licensing metadata matters for distribution. | `license: MIT` |
17
+ | `compatibility` | No | A platform or version caveat is real and useful. | `compatibility: OpenCode` |
18
+ | `metadata` | No | String-only metadata map. Keep it boring. | `metadata: { owner: systematic }` |
19
+ | `user-invocable` | No | Direct user invocation should be explicitly advertised or suppressed. | `user-invocable: false` |
20
+ | `agent` | No | A loader-supported companion agent is required. | `agent: general` |
21
+ | `model` | No | A skill-level model choice is justified. Prefer inheritance elsewhere. | `model: inherit` |
22
+ | `context` | No | Forked execution is required. `fork` derives subtask behavior at runtime. | `context: fork` |
23
+ | `subtask` | No | Explicit forked-subtask dispatch marker. | `subtask: true` |
24
+
25
+ ### Required Fields
26
+
27
+ `name` and `description` must be present. Empty strings are not valid values. Bare YAML keys such as `name:` parse as null and count as missing.
28
+
29
+ ### Banned Field
30
+
31
+ `preconditions` is banned because it has no runtime consumer. Use a body section instead:
32
+
33
+ ```markdown
34
+ ## Prerequisites
35
+
36
+ Only run this skill after the bug is reproduced and the fix has been verified.
37
+ ```
38
+
39
+ ### Runtime-Recognized Forking Fields
40
+
41
+ `context: fork` and `subtask: true` are allowed. They are runtime-recognized and must not be treated as idiosyncratic frontmatter.
42
+
43
+ Use them only when the skill genuinely needs forked subtask behavior. Do not cargo-cult them onto normal skills.
44
+
45
+ ### Description Style
46
+
47
+ Good descriptions answer: should the agent load this skill now?
48
+
49
+ Good:
50
+
51
+ ```yaml
52
+ description: Use when creating, editing, auditing, or fixing bundled Systematic skills, especially when authoring SKILL.md files or resolving content-integrity frontmatter failures.
53
+ ```
54
+
55
+ Bad:
56
+
57
+ ```yaml
58
+ description: This skill explains frontmatter, file layout, validation, and identity defaults for Systematic skills.
59
+ ```
60
+
61
+ The bad version describes content. The good version describes trigger conditions.
62
+
63
+ ## File Layout
64
+
65
+ Every skill has exactly one entry point:
66
+
67
+ ```text
68
+ skills/<skill-name>/SKILL.md
69
+ ```
70
+
71
+ Use sub-files only when the content is too bulky or operationally distinct for the main skill.
72
+
73
+ ```text
74
+ skills/<skill-name>/
75
+ ├── SKILL.md
76
+ ├── references/
77
+ │ └── detailed-guidance.md
78
+ ├── scripts/
79
+ │ └── helper.mjs
80
+ ├── assets/
81
+ │ └── diagram.svg
82
+ └── templates/
83
+ └── output-template.md
84
+ ```
85
+
86
+ ### Directory Choices
87
+
88
+ | Directory | Use For | Do Not Use For |
89
+ |---|---|---|
90
+ | `references/` | Long explanations, decision tables, extended examples | Required setup that must be read before deciding to use the skill |
91
+ | `scripts/` | Executable helpers the agent can run | Pseudocode or prose examples |
92
+ | `assets/` | Static images, fixtures, or other bundled files | Markdown guidance that belongs in `references/` |
93
+ | `templates/` | Fillable documents, prompts, or output stubs | Examples that should not be copied verbatim |
94
+
95
+ ### Sub-File Links
96
+
97
+ When `SKILL.md` mentions a sub-file path, the content-integrity gate verifies it exists. Prefer direct repo-local paths:
98
+
99
+ ```markdown
100
+ Read `references/foundation-conventions.md` for examples.
101
+ ```
102
+
103
+ Avoid ambiguous references such as "the conventions doc". They are harder for agents to follow and impossible for the gate to verify.
104
+
105
+ ## Identity Defaults
106
+
107
+ ### Bundled Agent Model
108
+
109
+ Bundled agents must use:
110
+
111
+ ```yaml
112
+ model: inherit
113
+ ```
114
+
115
+ This keeps Systematic provider-portable. Hardcoded provider IDs make an agent unusable for users on other providers and are almost never worth the lock-in.
116
+
117
+ If a future agent truly depends on a specific provider, document the constraint in the plan and get explicit review before adding the hardcoded model.
118
+
119
+ ### Machine ID
120
+
121
+ `ai:systematic` is a machine identity string for Systematic-owned operations. Proof uses it as the `by` field on operations and the `X-Agent-Id` header. Keep it lowercase and stable.
122
+
123
+ Do not use `ai:systematic` as a skill-reference pattern. Skill and agent references use their own namespaces, such as `systematic:writing-systematic-skills` or `systematic:research:best-practices-researcher`.
124
+
125
+ ### Public-Facing Voice
126
+
127
+ Skill text should be reusable guidance, not a session transcript. Avoid first-person process narration, internal note IDs, and references to how a particular implementation session unfolded.
128
+
129
+ ## Validator Workflow
130
+
131
+ Run:
132
+
133
+ ```bash
134
+ bun scripts/content-integrity.ts --verbose
135
+ ```
136
+
137
+ Use the output as the source of truth for cleanup. If a violation surprises you, check the runtime loader before changing the validator:
138
+
139
+ - Skill frontmatter rules mirror `src/lib/skills.ts`.
140
+ - YAML parsing behavior comes from `src/lib/frontmatter.ts`.
141
+ - Sub-file directories come from `SUBFILE_DIRECTORY_NAMES` in `scripts/content-integrity.ts`.
142
+
143
+ When the runtime contract changes, update the loader and validator together. A validator allow-list that drifts from the loader creates false failures or misses real runtime-invisible fields.