@jabworks/condux 0.3.0 → 0.4.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 -0
- package/package.json +1 -1
- package/skills/discovery/SKILL.md +19 -0
- package/skills/finalize/SKILL.md +14 -1
- package/skills/live-verification/SKILL.md +173 -0
- package/skills/plan-review/SKILL.md +1 -1
- package/skills/preflight/SKILL.md +1 -1
- package/skills/root-cause-analysis/SKILL.md +1 -1
- package/skills/workflow/SKILL.md +2 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Hieu Vi
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jabworks/condux",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "OpenCode plugin for the condux workflow toolkit — bundles the condux skills and injects the specialist agents (coder, explorer, planner, researcher) plus an opt-in plan-review listener.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"publishConfig": {
|
|
@@ -84,6 +84,24 @@ as any other soft gate in this skill.
|
|
|
84
84
|
└──────────────────────────────────────────────────────────────────┘
|
|
85
85
|
```
|
|
86
86
|
|
|
87
|
+
## Scope Lock (part of Step 1)
|
|
88
|
+
|
|
89
|
+
The scope check runs in both directions. Decomposition catches a request that
|
|
90
|
+
is secretly several features; the scope lock catches the opposite failure —
|
|
91
|
+
quietly discovering against a wider surface than the one asked about, e.g.
|
|
92
|
+
auditing a whole repo when one plugin was named.
|
|
93
|
+
|
|
94
|
+
Before Step 2, state the target surface back in one line:
|
|
95
|
+
|
|
96
|
+
> "Reading this as scoped to `<the named package / plugin / directory>` — the
|
|
97
|
+
> rest of the repo is out of scope unless you say otherwise."
|
|
98
|
+
|
|
99
|
+
Then hold it. If the design starts to need something outside that surface,
|
|
100
|
+
name the crossing and get agreement before widening — do not widen silently
|
|
101
|
+
because the adjacent thing looked related. Narrowing works the same way: if
|
|
102
|
+
the user names a narrower target mid-discovery, that is the new surface, and
|
|
103
|
+
work already done against the wider one is dropped, not folded in.
|
|
104
|
+
|
|
87
105
|
## Clarifying Questions — Good vs Bad
|
|
88
106
|
|
|
89
107
|
```
|
|
@@ -124,6 +142,7 @@ Accept either answer. Never block. Never lecture.
|
|
|
124
142
|
✗ Asking questions one at a time in a long back-and-forth
|
|
125
143
|
✗ Proceeding to planning without explicit sign-off
|
|
126
144
|
✗ Treating a well-defined ticket as needing full discovery
|
|
145
|
+
✗ Widening past the named target surface without saying so
|
|
127
146
|
```
|
|
128
147
|
|
|
129
148
|
## Output
|
package/skills/finalize/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: finalize
|
|
3
|
-
description: "End-of-task quality gate — typecheck → lint → format → tests. Runs in order, once. Stops on first failure and fixes before continuing. Run after all implementation is complete. Called automatically by /workflow, or standalone. Check AGENTS.md for the project's actual commands. Not for auditing whether requirements and plan steps are complete;
|
|
3
|
+
description: "End-of-task quality gate — typecheck → lint → format → tests. Runs in order, once. Stops on first failure and fixes before continuing. Run after all implementation is complete. Called automatically by /workflow, or standalone. Check AGENTS.md for the project's actual commands. Not for auditing whether requirements and plan steps are complete (preflight, first); not for running the change and watching it work (live-verification, after)."
|
|
4
4
|
argument-hint: "[package or path to scope — optional]"
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -86,6 +86,7 @@ Typecheck ✓ clean
|
|
|
86
86
|
Lint ✓ clean (2 warnings — not blocking)
|
|
87
87
|
Format ✓ 2 files auto-fixed (Button.tsx, invoice.router.ts)
|
|
88
88
|
Tests ✓ 18 passed, 0 failed
|
|
89
|
+
Env ✓ 1 new var → .env.example updated (STRIPE_WEBHOOK_SECRET)
|
|
89
90
|
Plan (none found for this task — treating as standalone scope)
|
|
90
91
|
|
|
91
92
|
Ready to commit.
|
|
@@ -107,6 +108,18 @@ Format ✓ clean
|
|
|
107
108
|
Tests ✓ 18 passed
|
|
108
109
|
```
|
|
109
110
|
|
|
111
|
+
## Companion Files
|
|
112
|
+
|
|
113
|
+
One cheap scan of the diff, reported alongside the gate. It never blocks —
|
|
114
|
+
it exists because "remember to update the env example for newly added env vars"
|
|
115
|
+
should not have to be said again.
|
|
116
|
+
|
|
117
|
+
- A new env var anywhere in the diff (`process.env.X`, `import.meta.env.X`, a
|
|
118
|
+
new key in an env schema, a new `docker-compose`/CI variable) ⇒ the project's
|
|
119
|
+
example file (`.env.example`, `.env.sample`, or whatever it uses) gains the
|
|
120
|
+
same key in the same change — placeholder value only, never a real secret.
|
|
121
|
+
- Report `Env ✓ n/a` when the diff adds none, so the check is visibly running.
|
|
122
|
+
|
|
110
123
|
## What Does NOT Happen
|
|
111
124
|
|
|
112
125
|
```
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: live-verification
|
|
3
|
+
description: "Verify a change by actually running it — drive the real UI or endpoint, check each claim against observed behaviour, and capture evidence before pushing. Detects what's runnable, verifies dark mode first, and reports claim → evidence → verdict with unverifiable claims named rather than hidden. After /finalize, before committing or pushing a change that has a runnable surface — UI, page, component, endpoint, CLI. Triggers include \"verify it live\", \"did this actually work\", \"check it in the browser\", \"live verify before pushing\", \"does it render right\". Not for typecheck/lint/test (that's finalize), not for auditing plan completeness (preflight), not for reading code to judge it (code-review)."
|
|
4
|
+
argument-hint: "[what to verify — optional; defaults to the current diff]"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /live-verification
|
|
8
|
+
|
|
9
|
+
Green tests are not evidence that the thing works. This skill closes the gap
|
|
10
|
+
between "the pipeline passed" and "I watched it do the thing".
|
|
11
|
+
|
|
12
|
+
## Usage
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
/live-verification # verify the current diff
|
|
16
|
+
/live-verification the upload dialog # verify a named surface
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## When It Applies
|
|
20
|
+
|
|
21
|
+
| Change touches | Run this? |
|
|
22
|
+
|---|---|
|
|
23
|
+
| A rendered surface — page, component, story, dialog | **Yes** |
|
|
24
|
+
| An endpoint, procedure, or CLI a human will call | **Yes** |
|
|
25
|
+
| Behaviour behind a flag or a state the tests don't reach | **Yes** |
|
|
26
|
+
| Types, docs, comments, config with no runtime effect | No — say so and skip |
|
|
27
|
+
| Code fully covered by a test that genuinely exercises it | Judgment: skip, and name the test you're leaning on |
|
|
28
|
+
|
|
29
|
+
Skipping is a legitimate outcome. Skipping *silently* is not.
|
|
30
|
+
|
|
31
|
+
## How It Works
|
|
32
|
+
|
|
33
|
+
### Step 1 — Resolve the run target
|
|
34
|
+
|
|
35
|
+
Do not assume a dev server. In order:
|
|
36
|
+
|
|
37
|
+
1. Something already running? Check the project's usual port before starting
|
|
38
|
+
anything (`ss -tlnp` / `lsof -i` / the URL in `README` or `AGENTS.md`).
|
|
39
|
+
2. `AGENTS.md` — if it names the command to run the app, that command wins.
|
|
40
|
+
3. `package.json` scripts — `dev`, `storybook`, `start`, `preview`.
|
|
41
|
+
4. Nothing runnable → stop here and report that. Do not scaffold a harness.
|
|
42
|
+
|
|
43
|
+
Start it in the background, wait for it to actually serve (poll the URL — do
|
|
44
|
+
not `sleep` and hope), and note the URL in the report.
|
|
45
|
+
|
|
46
|
+
### Step 2 — Enumerate the claims
|
|
47
|
+
|
|
48
|
+
Before touching the UI, write down what the change claims to do — one line
|
|
49
|
+
each, from the diff and the task description. These are the only things you
|
|
50
|
+
verify. A change that claims four things needs four verdicts.
|
|
51
|
+
|
|
52
|
+
Bad: "the dialog works." Good: "Save is disabled while the mutation is in
|
|
53
|
+
flight", "a failed save shows the server's message inline", "Escape closes
|
|
54
|
+
the dialog and returns focus to the trigger".
|
|
55
|
+
|
|
56
|
+
### Step 3 — Drive it
|
|
57
|
+
|
|
58
|
+
Use whatever driving tool this environment actually has — a browser MCP, a
|
|
59
|
+
headless script the repo already ships, `curl` for an endpoint, or the CLI
|
|
60
|
+
itself. **Nothing is assumed installed.** If no driving tool exists, degrade
|
|
61
|
+
honestly: report what could not be driven rather than inventing a result.
|
|
62
|
+
|
|
63
|
+
Order of checks, because this is where the defects were:
|
|
64
|
+
|
|
65
|
+
1. **Dark mode first.** Then light. A themed change is not verified until it
|
|
66
|
+
has been seen in both.
|
|
67
|
+
2. **The interactive states**, not just the resting one — hover, focus,
|
|
68
|
+
disabled, selected, and the in-flight state of every mutation.
|
|
69
|
+
3. **The failure path.** Make the thing fail on purpose if you can (offline,
|
|
70
|
+
bad input, forced error) and confirm the error is surfaced where the user
|
|
71
|
+
acted.
|
|
72
|
+
4. **Keyboard.** Tab to it, Escape out of it, confirm focus lands somewhere
|
|
73
|
+
sensible.
|
|
74
|
+
|
|
75
|
+
### Step 4 — Capture evidence
|
|
76
|
+
|
|
77
|
+
One artifact per claim that has a visual or observable outcome — screenshot,
|
|
78
|
+
response body, console excerpt. Store under
|
|
79
|
+
`<git-root>/.condux/verification/<YYYY-MM-DD>-<slug>/` and reference the file
|
|
80
|
+
in the report. Console errors and failed network requests seen along the way
|
|
81
|
+
get reported even when they belong to another feature.
|
|
82
|
+
|
|
83
|
+
### Step 5 — Report and stop
|
|
84
|
+
|
|
85
|
+
One pass. Fix what you found, re-verify only the claims that failed, then
|
|
86
|
+
stop. This skill does not loop.
|
|
87
|
+
|
|
88
|
+
## Failure Handling
|
|
89
|
+
|
|
90
|
+
The recurring failures here are environmental, not logical — treat them as
|
|
91
|
+
results, not as things to retry into the ground:
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
Server won't start / port already in use
|
|
95
|
+
→ Report it. Do not kill a process you did not start.
|
|
96
|
+
|
|
97
|
+
Out of memory, model won't load, dependency missing
|
|
98
|
+
→ Not your bug. Report "could not verify — <reason>" and stop.
|
|
99
|
+
"Let's do live verify later" is a valid user answer.
|
|
100
|
+
|
|
101
|
+
Selector not found / element no longer exists
|
|
102
|
+
→ Re-read the current DOM once and retry with what's actually there.
|
|
103
|
+
Second miss: report the claim as unverified, don't keep guessing.
|
|
104
|
+
|
|
105
|
+
Wait timed out
|
|
106
|
+
→ Poll for the condition, never a fixed sleep. On a real timeout, report
|
|
107
|
+
it as a finding — a surface that takes longer than the timeout to
|
|
108
|
+
appear is itself a defect worth naming.
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Two failed attempts on the same claim is the ceiling. Report and move on.
|
|
112
|
+
|
|
113
|
+
## Output Format
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
## Live verification: <change>
|
|
117
|
+
|
|
118
|
+
Target http://localhost:3000 (pnpm dev — started by this run)
|
|
119
|
+
Themes dark ✓ light ✓
|
|
120
|
+
|
|
121
|
+
Claim Evidence Verdict
|
|
122
|
+
Save disabled while mutation in flight save-pending.png ✓
|
|
123
|
+
Failed save shows server message inline save-error.png ✓
|
|
124
|
+
Escape closes dialog, focus returns to trigger — ✗ focus lands on body
|
|
125
|
+
Empty list renders the empty state empty-state.png ✓
|
|
126
|
+
|
|
127
|
+
Also seen: 2 console errors on mount (pre-existing, unrelated to this change)
|
|
128
|
+
|
|
129
|
+
1 claim failed. Fixed focus return in dialog.tsx:44 — re-verified ✓
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
When nothing could be driven:
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
## Live verification: <change>
|
|
136
|
+
|
|
137
|
+
Target none — no dev/start/storybook script and nothing on the usual ports
|
|
138
|
+
Verdict NOT VERIFIED — 3 claims unchecked, listed below
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## What Does NOT Happen
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
✗ Reporting a claim as verified because the code looks right
|
|
145
|
+
✗ Inventing a screenshot, a response, or a result that wasn't observed
|
|
146
|
+
✗ Installing a browser driver or scaffolding a test harness to get a result
|
|
147
|
+
✗ sleep-then-check instead of polling for the condition
|
|
148
|
+
✗ Retrying the same selector more than twice
|
|
149
|
+
✗ Killing processes the run didn't start
|
|
150
|
+
✗ Re-running typecheck/lint/tests — that was finalize's job
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Artifacts
|
|
154
|
+
|
|
155
|
+
Evidence is **working state**: `<git-root>/.condux/verification/`, gitignored,
|
|
156
|
+
alongside condux's `designs/` and `plans/`. Never the repo root, never the
|
|
157
|
+
project's `docs/`.
|
|
158
|
+
|
|
159
|
+
**Bootstrap.** `.condux/` is created on demand at the git root by the first
|
|
160
|
+
skill that writes there. Before the first write, check it's ignored:
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
git check-ignore -q .condux/ || echo "not ignored"
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
If it isn't, offer once: "condux keeps its working files in `.condux/` — add
|
|
167
|
+
it to `.gitignore` so they stay out of your commits?" On yes, append
|
|
168
|
+
`.condux/` to the repo's `.gitignore`. If the user would rather not touch a
|
|
169
|
+
tracked file, write it to `.git/info/exclude` instead. Never edit either file
|
|
170
|
+
without asking. Not a git repo → fall back to CWD and say so once.
|
|
171
|
+
|
|
172
|
+
**Override.** A project can relocate this in `AGENTS.md`; an explicit
|
|
173
|
+
override always wins.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: plan-review
|
|
3
|
-
description: "Render a plan in a local browser for inline annotation, then return an approve / request-revisions / deny decision to the agent. Auto-captures the plan via a Claude Code ExitPlanMode hook or a Codex Stop hook, or runs manually on any markdown file or spec directory. Self-contained — no network egress, no third-party runtime deps. When the agent finishes planning (Claude Code ExitPlanMode, or a Codex planning turn) and you want to review/annotate before it implements, or when you invoke /plan-review on a markdown plan or spec directory. Also owns its own machinery — steer-mode review loops, the live spec preview, and installing or troubleshooting the ExitPlanMode / Codex Stop hooks. Not for cataloging a whole specs tree; use spec-browser."
|
|
3
|
+
description: "Render a plan in a local browser for inline annotation, then return an approve / request-revisions / deny decision to the agent. Auto-captures the plan via a Claude Code ExitPlanMode hook or a Codex Stop hook, or runs manually on any markdown file or spec directory. Self-contained — no network egress, no third-party runtime deps. When the agent finishes planning (Claude Code ExitPlanMode, or a Codex planning turn) and you want to review/annotate before it implements, or when you invoke /plan-review on a markdown plan or spec directory. Also owns its own machinery — steer-mode review loops, the live spec preview, and installing or troubleshooting the ExitPlanMode / Codex Stop hooks. Phrases include \"let's review the plan\", \"walk me through the plan before we build\", \"annotate the plan\" — use these when the ExitPlanMode or Codex Stop hook doesn't fire. Not for cataloging a whole specs tree; use spec-browser."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# /plan-review
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: preflight
|
|
3
|
-
description: "Lightweight \"am I actually done?\" checklist before calling /finalize. Prevents premature completion — catches skipped steps, missing behavior, and silent regressions. Runs before /finalize at the end of every /workflow tier (automatic on SMALL; the recommended CP-2 choice on MEDIUM/LARGE). Also trigger standalone on \"verify this\", \"am I done?\", or \"preflight\". Not for executing typecheck, lint, format, and tests; use finalize."
|
|
3
|
+
description: "Lightweight \"am I actually done?\" checklist before calling /finalize. Prevents premature completion — catches skipped steps, missing behavior, and silent regressions. Runs before /finalize at the end of every /workflow tier (automatic on SMALL; the recommended CP-2 choice on MEDIUM/LARGE). Also trigger standalone on \"verify this\", \"am I done?\", or \"preflight\". Not for executing typecheck, lint, format, and tests; use finalize. Not for actually running the change and observing it work in a browser or CLI; that's live-verification, after finalize."
|
|
4
4
|
argument-hint: "[task or feature name]"
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: root-cause-analysis
|
|
3
|
-
description: "Enforces root-cause-first bug investigation — read the error, reproduce it, trace the data flow backward. Never propose a solution before the investigation phase completes. Trigger the moment debugging starts — never proactively — and always before any fix is proposed or any change is made."
|
|
3
|
+
description: "Enforces root-cause-first bug investigation — read the error, reproduce it, trace the data flow backward. Never propose a solution before the investigation phase completes. Trigger the moment debugging starts — never proactively — and always before any fix is proposed or any change is made. Phrases include \"why is this failing\", \"this bug\", \"unexpected behavior\", \"error when I…\". Not for a jabworks/agentic-toolkit skill or plugin misbehaving (won't trigger, won't show up, dist drift); that's toolkit-debugging-playbook."
|
|
4
4
|
argument-hint: "<error message or bug description>"
|
|
5
5
|
effort: high
|
|
6
6
|
---
|
package/skills/workflow/SKILL.md
CHANGED
|
@@ -130,6 +130,7 @@ happened (or was declined) in draft-plan's own save step — don't re-offer it.*
|
|
|
130
130
|
|
|
131
131
|
| Option | What it does |
|
|
132
132
|
|---|---|
|
|
133
|
+
| **Verify it live** *(recommended when the change has a runnable surface)* | Load `live-verification` — drive the real UI or endpoint and check each claim against observed behaviour |
|
|
133
134
|
| **Code review** *(recommended)* | `/code-review` the diff before merging |
|
|
134
135
|
| **Commit** | Load the `git-commit` skill if installed (conventional message from the diff, safe staging); otherwise follow the repo's commit conventions |
|
|
135
136
|
| **Cut a release** | Load the `release` skill if installed — machinery detection, dry-run plan, then tag → push → GitHub release; otherwise follow the repo's release conventions |
|
|
@@ -148,6 +149,7 @@ Load each only when its step is reached.
|
|
|
148
149
|
| `subagent-deployment` | 2+ independent tasks, no shared files/deps | ad-hoc work, not ordered plans |
|
|
149
150
|
| `preflight` | end of every tier, before finalize | automatic on SMALL; recommended CP-2 choice |
|
|
150
151
|
| `finalize` | after all implementation | runs in order, once, stops on first failure; check AGENTS.md for the real commands |
|
|
152
|
+
| `live-verification` | after finalize, when the change has a runnable surface | offer at CP-3; one pass, no loop; skipping is fine, silent skipping is not |
|
|
151
153
|
| `code-review` | on request only | never auto-triggers, never fixes; after finalize you may ask ONCE |
|
|
152
154
|
| `root-cause-analysis` | any bug investigation | load when debugging starts, not proactively; investigation before fixes |
|
|
153
155
|
| `plan-review` | plan/spec annotation in the browser | via ExitPlanMode/Stop hook, draft-plan's save step, or manually |
|