@jabworks/condux 0.10.1 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +16 -0
- package/package.json +1 -1
- package/skills/condux-doctor/doctor.mjs +11 -1
- package/skills/draft-plan/evals/trigger_eval.json +1 -1
- package/skills/preflight/evals/trigger_eval.json +2 -2
- package/skills/root-cause-analysis/SKILL.md +1 -1
- package/skills/subagent-deployment/evals/trigger_eval.json +1 -1
- package/skills/subagent-execution/SKILL.md +1 -1
- package/skills/subagent-execution/evals/trigger_eval.json +2 -2
- package/skills/technical-spec/evals/trigger_eval.json +2 -2
- package/skills/test-first-development/SKILL.md +1 -1
package/index.js
CHANGED
|
@@ -13,6 +13,14 @@
|
|
|
13
13
|
// separate `npx skills add` step for condux. This works because the config hook
|
|
14
14
|
// mutates the cached config before OpenCode lazily discovers skills.
|
|
15
15
|
//
|
|
16
|
+
// It also pushes workflow's routing.md onto config.instructions, giving
|
|
17
|
+
// OpenCode the same `/workflow`-as-entry-point enforcement Claude Code and
|
|
18
|
+
// Codex get from their SessionStart hook — OpenCode has no hook system for
|
|
19
|
+
// that, so `instructions` (ambient every turn, verified via `opencode debug
|
|
20
|
+
// config` against a config-hook mutation) is the closest equivalent. Costs
|
|
21
|
+
// ~390 tokens/turn, permanently; that trade was made deliberately, not by
|
|
22
|
+
// default (docket #38).
|
|
23
|
+
//
|
|
16
24
|
// Optional plan-review listener (CONDUX_PLAN_REVIEW=1): when the primary
|
|
17
25
|
// `plan` agent finishes a turn (session.idle), spawns the plan-review annotate
|
|
18
26
|
// server from an installed condux skill tree. Best-effort only — OpenCode does
|
|
@@ -28,6 +36,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
28
36
|
const PKG_DIR = path.dirname(fileURLToPath(import.meta.url));
|
|
29
37
|
const AGENTS_DIR = path.join(PKG_DIR, 'agents');
|
|
30
38
|
const SKILLS_DIR = path.join(PKG_DIR, 'skills');
|
|
39
|
+
const ROUTING_MD = path.join(SKILLS_DIR, 'workflow', 'hooks', 'routing.md');
|
|
31
40
|
|
|
32
41
|
// Bundled agent files use exactly the frontmatter the toolkit generator emits:
|
|
33
42
|
// a JSON-quoted `description`, a plain `mode`, an optional `permission` deny map
|
|
@@ -107,6 +116,13 @@ export const ConduxPlugin = async ({ worktree }) => {
|
|
|
107
116
|
cfg.skills.paths ??= [];
|
|
108
117
|
if (!cfg.skills.paths.includes(SKILLS_DIR)) cfg.skills.paths.push(SKILLS_DIR);
|
|
109
118
|
}
|
|
119
|
+
|
|
120
|
+
// Route through /workflow the same way Claude Code and Codex do —
|
|
121
|
+
// see the file-header comment for why `instructions` is the mechanism.
|
|
122
|
+
if (existsSync(ROUTING_MD)) {
|
|
123
|
+
cfg.instructions ??= [];
|
|
124
|
+
if (!cfg.instructions.includes(ROUTING_MD)) cfg.instructions.push(ROUTING_MD);
|
|
125
|
+
}
|
|
110
126
|
},
|
|
111
127
|
|
|
112
128
|
'chat.params': async (input) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jabworks/condux",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.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": {
|
|
@@ -333,7 +333,17 @@ function probeOpencode(hosts) {
|
|
|
333
333
|
return { host: 'opencode', status: 'broken', detail: 'the installed package entry point does not parse', fix: `reinstall ${PACKAGE}` };
|
|
334
334
|
}
|
|
335
335
|
|
|
336
|
-
|
|
336
|
+
const routing = path.join(pkg, 'skills', 'workflow', 'hooks', 'routing.md');
|
|
337
|
+
if (!fs.existsSync(routing)) {
|
|
338
|
+
return {
|
|
339
|
+
host: 'opencode',
|
|
340
|
+
status: 'broken',
|
|
341
|
+
detail: 'the installed package ships no workflow/hooks/routing.md — /workflow routing enforcement is missing',
|
|
342
|
+
fix: `reinstall ${PACKAGE}`,
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
return { host: 'opencode', status: 'done', detail: 'registered, and the installed package ships its agents, skills, and /workflow routing enforcement' };
|
|
337
347
|
}
|
|
338
348
|
|
|
339
349
|
// The four specialist agents are plugin-level and reached by their own sync
|
|
@@ -17,6 +17,6 @@
|
|
|
17
17
|
{ "query": "execute the plan with agents", "should_trigger": true, "expected_skill": "subagent-execution" },
|
|
18
18
|
{ "query": "design isnt agreed yet, help me align first", "should_trigger": true, "expected_skill": "discovery" },
|
|
19
19
|
{ "query": "add a task to my todo list", "should_trigger": false, "expected_skill": null, "accept": ["record"] },
|
|
20
|
-
{ "query": "plan my sprint for next week", "should_trigger": false, "expected_skill": null },
|
|
20
|
+
{ "query": "plan my sprint for next week", "should_trigger": false, "expected_skill": null, "accept": ["groom"], "note": "Where a docket exists, sprint planning is what-to-work-on-next — groom's contract claims that verbatim. null stays the primary: nothing forces a backlog reading." },
|
|
21
21
|
{ "query": "make a project timeline gantt chart", "should_trigger": false, "expected_skill": null }
|
|
22
22
|
]
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
{ "query": "did we cover the edge cases", "should_trigger": true, "expected_skill": "preflight" },
|
|
10
10
|
{ "query": "ready to finalize?", "should_trigger": true, "expected_skill": "preflight" },
|
|
11
11
|
{ "query": "are all the plan steps done", "should_trigger": true, "expected_skill": "preflight" },
|
|
12
|
-
{ "query": "I tested it manually, ship it", "should_trigger": true, "expected_skill": "preflight", "accept": ["finalize"] },
|
|
13
|
-
{ "query": "only changed one line, can we skip the checks", "should_trigger": true, "expected_skill": "preflight" },
|
|
12
|
+
{ "query": "I tested it manually, ship it", "should_trigger": true, "expected_skill": "preflight", "accept": ["finalize","release"], "note": "release added 2026-08-17: the user literally asked to ship, and release is the shipping skill — it would surface the unverified state at its own dry-run gate. preflight stays primary." },
|
|
13
|
+
{ "query": "only changed one line, can we skip the checks", "should_trigger": true, "expected_skill": "preflight", "accept": ["finalize"], "note": "finalize owns the checks being skipped; a router sending the skip-question to the gate itself serves the user." },
|
|
14
14
|
{ "query": "done-ness check b4 finalize", "should_trigger": true, "expected_skill": "preflight" },
|
|
15
15
|
{ "query": "double check my work on this feature", "should_trigger": true, "expected_skill": "preflight", "accept": ["code-review"] },
|
|
16
16
|
{ "query": "run typecheck and the tests now", "should_trigger": true, "expected_skill": "finalize" },
|
|
@@ -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. 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."
|
|
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…\", and declarative bug reports with no question mark — \"checkout crashes on empty cart\", \"there's a bug where X happens\" — a stated symptom is a bug report too. 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
|
---
|
|
@@ -18,5 +18,5 @@
|
|
|
18
18
|
{ "query": "deploy the app to production", "should_trigger": false, "expected_skill": null },
|
|
19
19
|
{ "query": "set up the deployment pipeline for staging", "should_trigger": false, "expected_skill": null },
|
|
20
20
|
{ "query": "parallelize the test suite in ci", "should_trigger": true, "expected_skill": "workflow", "note": "parallelising a test suite is an implementation request, not a fan-out instruction" },
|
|
21
|
-
{ "query": "map reduce over these records", "should_trigger": false, "expected_skill": null }
|
|
21
|
+
{ "query": "map reduce over these records", "should_trigger": false, "expected_skill": null, "accept": ["workflow"], "note": "Reads as a data-processing implementation request, which workflow claims outright. The case still guards subagent-deployment against the parallelism-sounding bait." }
|
|
22
22
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: subagent-execution
|
|
3
|
-
description: "Execute a plan using named specialist agents. Default is to implement yourself — only spawn when there is a concrete justification. Trigger when implementing a LARGE plan with tasks that benefit from agent specialization or parallel exploration — including task briefs, review packages, spawn rules, and resuming an interrupted plan from the `.condux/progress/` ledger (not session-handoff). Not for ad-hoc independent tasks outside a plan (that's subagent-deployment)."
|
|
3
|
+
description: "Execute a plan using named specialist agents. Default is to implement yourself — only spawn when there is a concrete justification. Trigger when implementing a LARGE plan with tasks that benefit from agent specialization or parallel exploration — including task briefs, review packages, spawn rules, which model a dispatched agent should get, and resuming an interrupted plan from the `.condux/progress/` ledger (not session-handoff). Not for ad-hoc independent tasks outside a plan (that's subagent-deployment)."
|
|
4
4
|
argument-hint: "<plan file path>"
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -11,12 +11,12 @@
|
|
|
11
11
|
{ "query": "continue the wave, tasks 5 and 6 are unblocked", "should_trigger": true, "expected_skill": "subagent-execution" },
|
|
12
12
|
{ "query": "we compacted mid-plan, where were we with the agents", "should_trigger": true, "expected_skill": "subagent-execution" },
|
|
13
13
|
{ "query": "dont re-dispatch tasks that are already done", "should_trigger": true, "expected_skill": "subagent-execution" },
|
|
14
|
-
{ "query": "
|
|
14
|
+
{ "query": "spawn the agents for this plan", "should_trigger": true, "expected_skill": "subagent-execution" },
|
|
15
15
|
{ "query": "dispatch these three unrelated fixes in parallel", "should_trigger": true, "expected_skill": "subagent-deployment" },
|
|
16
16
|
{ "query": "fan out independent lookups across agents", "should_trigger": true, "expected_skill": "subagent-deployment" },
|
|
17
17
|
{ "query": "three independent bugs, fix them concurrently", "should_trigger": true, "expected_skill": "subagent-deployment" },
|
|
18
18
|
{ "query": "ill implement the plan myself top to bottom", "should_trigger": true, "expected_skill": "workflow" },
|
|
19
|
-
{ "query": "the plan is fully implemented, verify it", "should_trigger": true, "expected_skill": "preflight" },
|
|
19
|
+
{ "query": "the plan is fully implemented, verify it", "should_trigger": true, "expected_skill": "preflight", "accept": ["live-verification"], "note": "live-verification's contract claims post-implementation \"verify it\" phrasing directly; preflight-vs-live-verification is a legitimate two-skill stimulus." },
|
|
20
20
|
{ "query": "orchestrate the ci pipeline stages", "should_trigger": false, "expected_skill": null },
|
|
21
21
|
{ "query": "kubernetes pod scheduling question", "should_trigger": false, "expected_skill": null }
|
|
22
22
|
]
|
|
@@ -13,11 +13,11 @@
|
|
|
13
13
|
{ "query": "sepc this out pls", "should_trigger": true, "expected_skill": "technical-spec" },
|
|
14
14
|
{ "query": "write up what we decided about the milestone", "should_trigger": true, "expected_skill": "technical-spec" },
|
|
15
15
|
{ "query": "update the spec with what we built", "should_trigger": true, "expected_skill": "technical-spec" },
|
|
16
|
-
{ "query": "load the spec for checkout before we start the task", "should_trigger": true, "expected_skill": "workflow" },
|
|
16
|
+
{ "query": "load the spec for checkout before we start the task", "should_trigger": true, "expected_skill": "workflow", "accept": ["spec-browser"], "note": "spec-browser owns \"where is the spec for X\" navigation; loading a spec before a task is servable by either the router's step-2 lookup or the spec site." },
|
|
17
17
|
{ "query": "browse the specs tree", "should_trigger": true, "expected_skill": "spec-browser" },
|
|
18
18
|
{ "query": "where is the spec for the auth feature", "should_trigger": true, "expected_skill": "spec-browser" },
|
|
19
19
|
{ "query": "design the feature first before documenting", "should_trigger": true, "expected_skill": "discovery" },
|
|
20
20
|
{ "query": "generate openapi yaml from the routes", "should_trigger": false, "expected_skill": null },
|
|
21
|
-
{ "query": "write jsdoc comments for this module", "should_trigger": false, "expected_skill": null },
|
|
21
|
+
{ "query": "write jsdoc comments for this module", "should_trigger": false, "expected_skill": null, "accept": ["workflow"], "note": "Writing comments is a code change — an implementation request workflow claims. null stays primary: it is also fine to just do it." },
|
|
22
22
|
{ "query": "host our swagger docs somewhere", "should_trigger": false, "expected_skill": null }
|
|
23
23
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: test-first-development
|
|
3
|
-
description: "Tests-first development — write tests before implementation. Opt-in only: one upfront consent (write tests first + auto-run), then run the cycle without re-asking. Trigger when the user explicitly asks for tests-first, picks it at a workflow checkpoint, or when implementing logic with clear input/output behavior. Also
|
|
3
|
+
description: "Tests-first development — write tests before implementation. Opt-in only: one upfront consent (write tests first + auto-run), then run the cycle without re-asking. Trigger when the user explicitly asks for tests-first, picks it at a workflow checkpoint, or when implementing logic with clear input/output behavior. Also owns any request to change an existing test so it passes — just fix the test, update the failing test to match the new behavior — that decision runs through this skill, never silently. Answers questions about the practice itself too — should I tdd this, is test-first worth it for UI components."
|
|
4
4
|
argument-hint: "<what to test>"
|
|
5
5
|
---
|
|
6
6
|
|