@hybridlabor-api/aos 4.14.1 → 4.16.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/.claude/hooks/aos-bus.mjs +146 -0
- package/.claude/hooks/go-gate.mjs +2 -1
- package/.opencode/plugins/bdb-aos.js +111 -5
- package/bin/aos-acp.mjs +7 -3
- package/bin/aos-doctor.mjs +21 -6
- package/docs/master-session-acp.md +15 -0
- package/docs/sessions/audit-agents.md +2 -0
- package/installer.js +341 -163
- package/package.json +3 -2
- package/scripts/validate-skills.mjs +29 -6
- package/skills/basic/godmode-shipping/SKILL.md +0 -1
- package/skills/basic/master-session/SKILL.md +1 -1
- package/skills/basic/startcycle/SKILL.md +0 -1
- package/skills/basic/startcycle-graph/SKILL.md +0 -1
- package/skills/global_config/ask-tim/SKILL.md +0 -1
- package/skills/global_config/grill-me/SKILL.md +0 -1
- package/skills/global_config/grill-with-docs/SKILL.md +0 -1
- package/skills/playbooks/pb-bug-fix/SKILL.md +48 -0
- package/skills/playbooks/pb-ci-fix/SKILL.md +0 -1
- package/skills/playbooks/pb-clip-from-moodboard/SKILL.md +55 -0
- package/skills/playbooks/pb-crew-call-sheet/SKILL.md +40 -0
- package/skills/playbooks/pb-deploy-saas/SKILL.md +44 -0
- package/skills/playbooks/pb-docs-site/SKILL.md +44 -0
- package/skills/playbooks/pb-event-tracker/SKILL.md +0 -1
- package/skills/playbooks/pb-focus-chunks/SKILL.md +40 -0
- package/skills/playbooks/pb-handover/SKILL.md +41 -0
- package/skills/playbooks/pb-harness-work/SKILL.md +64 -0
- package/skills/playbooks/pb-health-weekly/SKILL.md +43 -0
- package/skills/playbooks/pb-idea-to-launch/SKILL.md +51 -0
- package/skills/playbooks/pb-image-to-3d/SKILL.md +46 -0
- package/skills/playbooks/pb-inbox-zero/SKILL.md +39 -0
- package/skills/playbooks/pb-invoice-check/SKILL.md +41 -0
- package/skills/playbooks/pb-landing-page/SKILL.md +46 -0
- package/skills/playbooks/pb-launch-video/SKILL.md +49 -0
- package/skills/playbooks/pb-machine-setup/SKILL.md +44 -0
- package/skills/playbooks/pb-master/SKILL.md +53 -0
- package/skills/playbooks/pb-meeting-actions/SKILL.md +0 -1
- package/skills/playbooks/pb-newsletter/SKILL.md +43 -0
- package/skills/playbooks/pb-offer/SKILL.md +39 -0
- package/skills/playbooks/pb-open-source/SKILL.md +50 -0
- package/skills/playbooks/pb-pcb-to-case/SKILL.md +46 -0
- package/skills/playbooks/pb-project-new/SKILL.md +0 -1
- package/skills/playbooks/pb-redesign-app/SKILL.md +47 -0
- package/skills/playbooks/pb-release-aos/SKILL.md +50 -0
- package/skills/playbooks/pb-security-sweep/SKILL.md +48 -0
- package/skills/playbooks/pb-ship/SKILL.md +49 -0
- package/skills/playbooks/pb-show-build/SKILL.md +48 -0
- package/skills/playbooks/pb-social-pack/SKILL.md +47 -0
- package/skills/playbooks/pb-todo/SKILL.md +41 -0
- package/skills/playbooks/pb-week-plan/SKILL.md +0 -1
- package/skills/playbooks/pb-worktrees-land/SKILL.md +52 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hybridlabor-api/aos",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.16.0",
|
|
4
4
|
"description": "AOS — A Curated AI AGENT OS. Optimized agent skills and add-ons like memB, OpenWiki, Heimdall Token Saver, and Godmode architectures.",
|
|
5
5
|
"main": "installer.js",
|
|
6
6
|
"engines": {
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
"bdb-agent-skills-pro": "installer.js",
|
|
13
13
|
"bdb-agent-skills": "installer.js",
|
|
14
14
|
"aos-plan-canvas": "skills/global_config/plan-canvas/scripts/plan-canvas.js",
|
|
15
|
+
"aos-bus": ".claude/hooks/aos-bus.mjs",
|
|
15
16
|
"aos-trail": "skills/global_config/agenttrail/bin/agenttrail.mjs",
|
|
16
17
|
"aos-archify": "skills/global_config/archify/bin/archify.mjs",
|
|
17
18
|
"aos-dashboard": "bin/aos-dashboard.mjs",
|
|
@@ -28,7 +29,7 @@
|
|
|
28
29
|
"plugin:build": "node scripts/build-plugin-manifest.mjs",
|
|
29
30
|
"plugin:check": "node scripts/build-plugin-manifest.mjs --check",
|
|
30
31
|
"doctor": "node bin/aos-doctor.mjs",
|
|
31
|
-
"test": "node scripts/validate-skills.mjs --selftest && node scripts/validate-skills.mjs && node scripts/build-plugin-manifest.mjs --check && node --test tests/opencode-graph-gate.test.js && node --test tests/cross-harness-hooks.test.js && node --test tests/plan-canvas-security.test.mjs && node --test tests/plan-canvas-modes.test.mjs && node --test tests/swarm-wiring.test.js && node tests/aos-store.test.mjs && node --test tests/aos-store-ui.test.mjs && node tests/aos-store-scenario.test.mjs && node tests/aos-doctor.test.mjs && node tests/build-plugin-manifest.test.mjs && node --test tests/agent-models.test.js && node --test tests/installer-p3.test.js && node --test tests/installer-binary.test.js && node --test tests/installer-version.test.js && node --test tests/mcsc-server.test.js && node --test tests/antigravity-hooks.test.js && node --test tests/windows-hooks.test.js && node --test tests/plan-builder.test.mjs && node --test tests/plan-builder-trail.test.mjs && node --test tests/plan-builder-showcase.test.mjs && node --test tests/plan-builder-templates.test.mjs && node --test tests/plan-canvas-home.test.mjs && node --test tests/launchpad-installer.test.js && node --test tests/launchpad-plan-canvas.test.js && node --test tests/go-token.test.js && node --test tests/master-session-skill.test.js && node --test tests/aos-acp.test.js && node --test tests/opencode-go-token.test.js && node --test tests/opencode-adapter.test.js && node --test tests/pr-recap.test.mjs && node --test tests/bdb-visual-edit.test.mjs && node --test tests/opencode-trail-autostart.test.mjs && node --test tests/trail-autostart-hook.test.mjs && node --test tests/agenttrail-ensure.test.mjs"
|
|
32
|
+
"test": "node scripts/validate-skills.mjs --selftest && node scripts/validate-skills.mjs && node scripts/build-plugin-manifest.mjs --check && node --test tests/opencode-graph-gate.test.js && node --test tests/cross-harness-hooks.test.js && node --test tests/plan-canvas-security.test.mjs && node --test tests/plan-canvas-modes.test.mjs && node --test tests/swarm-wiring.test.js && node tests/aos-store.test.mjs && node --test tests/aos-store-ui.test.mjs && node tests/aos-store-scenario.test.mjs && node tests/aos-doctor.test.mjs && node tests/build-plugin-manifest.test.mjs && node --test tests/agent-models.test.js && node --test tests/installer-p3.test.js && node --test tests/installer-binary.test.js && node --test tests/installer-version.test.js && node --test tests/mcsc-server.test.js && node --test tests/antigravity-hooks.test.js && node --test tests/windows-hooks.test.js && node --test tests/plan-builder.test.mjs && node --test tests/plan-builder-trail.test.mjs && node --test tests/plan-builder-showcase.test.mjs && node --test tests/plan-builder-templates.test.mjs && node --test tests/plan-canvas-home.test.mjs && node --test tests/launchpad-installer.test.js && node --test tests/launchpad-plan-canvas.test.js && node --test tests/go-token.test.js && node --test tests/master-session-skill.test.js && node --test tests/aos-acp.test.js && node --test tests/opencode-go-token.test.js && node --test tests/opencode-adapter.test.js && node --test tests/pr-recap.test.mjs && node --test tests/bdb-visual-edit.test.mjs && node --test tests/opencode-trail-autostart.test.mjs && node --test tests/trail-autostart-hook.test.mjs && node --test tests/agenttrail-ensure.test.mjs && node --test tests/aos-bus.test.js && node --test tests/installer-quick-update.test.js"
|
|
32
33
|
},
|
|
33
34
|
"publishConfig": {
|
|
34
35
|
"access": "public"
|
|
@@ -242,7 +242,7 @@ function checkSkillRefs(text, file, known, self, findings) {
|
|
|
242
242
|
}
|
|
243
243
|
|
|
244
244
|
// Playbooks are skills with `kind: playbook`; skills without `kind` are untouched.
|
|
245
|
-
const PB_REQUIRED = ['trigger', 'inputs', 'requires', 'go_points', 'outputs', 'verify', 'difficulty', 'est_time'
|
|
245
|
+
const PB_REQUIRED = ['trigger', 'inputs', 'requires', 'go_points', 'outputs', 'verify', 'difficulty', 'est_time'];
|
|
246
246
|
const DIFFICULTY = new Set(['beginner', 'intermediate', 'advanced']);
|
|
247
247
|
const EXTERNAL = ' (external)';
|
|
248
248
|
|
|
@@ -274,12 +274,28 @@ export function checkPlaybook(byKey, known) {
|
|
|
274
274
|
add('E-PB04', `\`difficulty: ${unquote(diff.value)}\` is not one of: ${[...DIFFICULTY].join(', ')}`, 'difficulty');
|
|
275
275
|
}
|
|
276
276
|
const dmi = byKey.get('disable-model-invocation');
|
|
277
|
-
if (dmi && unquote(dmi.value)
|
|
278
|
-
add('E-PB06', 'playbooks
|
|
277
|
+
if (dmi && unquote(dmi.value) === 'true') {
|
|
278
|
+
add('E-PB06', 'playbooks must stay invocable by agents — remove `disable-model-invocation: true` (side effects are guarded by go-gate)', 'disable-model-invocation');
|
|
279
279
|
}
|
|
280
280
|
return out;
|
|
281
281
|
}
|
|
282
282
|
|
|
283
|
+
// Pipeline and role skills must stay invocable through the Skill tool: the Master and
|
|
284
|
+
// every orchestrator start them. Side effects are guarded by go-gate, not by hiding the
|
|
285
|
+
// skill from the model. Anything not listed here may still set the flag.
|
|
286
|
+
export const MODEL_INVOCABLE = new Set([
|
|
287
|
+
'startcycle', 'startcycle-graph', 'startcycle-graph-user', 'teamwork-preview',
|
|
288
|
+
'godmode-engineering', 'godmode-shipping', 'godmode-ui-ux', 'godmode-media-eventtech',
|
|
289
|
+
'master-session', 'ao-orchestrator', 'bdbrainstorm', 'bdbmediastorm',
|
|
290
|
+
'grill-me', 'grill-with-docs', 'ask-tim', 'memb-skill',
|
|
291
|
+
]);
|
|
292
|
+
|
|
293
|
+
export function checkInvocation(name, byKey) {
|
|
294
|
+
const dmi = byKey.get('disable-model-invocation');
|
|
295
|
+
if (!dmi || unquote(dmi.value) !== 'true' || !MODEL_INVOCABLE.has(name)) return [];
|
|
296
|
+
return [{ level: 'error', code: 'E-DMI01', line: dmi.line, msg: `\`${name}\` is a pipeline/role skill and must stay model-invocable — remove \`disable-model-invocation: true\` (go-gate guards its side effects)` }];
|
|
297
|
+
}
|
|
298
|
+
|
|
283
299
|
function validate() {
|
|
284
300
|
const { skills, strays } = collect();
|
|
285
301
|
const known = new Set(skills.map((f) => basename(dirname(f))));
|
|
@@ -351,6 +367,7 @@ function validate() {
|
|
|
351
367
|
}
|
|
352
368
|
|
|
353
369
|
for (const f of checkPlaybook(byKey, known)) findings.push({ ...f, file: rel });
|
|
370
|
+
for (const f of checkInvocation(basename(dir), byKey)) findings.push({ ...f, file: rel });
|
|
354
371
|
|
|
355
372
|
checkLeakedPaths(text, rel, findings);
|
|
356
373
|
checkLocalRefs(text, dir, rel, findings);
|
|
@@ -509,7 +526,7 @@ function selftest() {
|
|
|
509
526
|
trigger: '["a"]', inputs: '[repo]',
|
|
510
527
|
requires: '\n skills: [github, gh (external)]\n agents: []\n mcps: []\n store: []',
|
|
511
528
|
go_points: '[]', outputs: '["x"]', verify: '"x"', difficulty: 'beginner',
|
|
512
|
-
est_time: '5 min',
|
|
529
|
+
est_time: '5 min', ...over,
|
|
513
530
|
};
|
|
514
531
|
const lines = Object.entries(base).filter(([k]) => !drop.includes(k)).map(([k, v]) => `${k}: ${v}`);
|
|
515
532
|
const fm = scanFrontmatter(['---', ...lines, '---'].join('\n'));
|
|
@@ -530,8 +547,14 @@ function selftest() {
|
|
|
530
547
|
assert.equal(kind.length, 1);
|
|
531
548
|
assert.equal(kind[0].code, 'E-PB01');
|
|
532
549
|
assert.equal(checkPlaybook(pb({ requires: '\n skills:\n - github' }), known)[0].code, 'E-PB05');
|
|
533
|
-
assert.equal(checkPlaybook(pb({ 'disable-model-invocation': '
|
|
534
|
-
assert.deepEqual(checkPlaybook(pb({
|
|
550
|
+
assert.equal(checkPlaybook(pb({ 'disable-model-invocation': 'true' }), known)[0].code, 'E-PB06');
|
|
551
|
+
assert.deepEqual(checkPlaybook(pb({ 'disable-model-invocation': 'false' }), known), [], 'explicit false is fine');
|
|
552
|
+
const dm = (v) => new Map([['disable-model-invocation', { key: 'disable-model-invocation', value: v, line: 3 }]]);
|
|
553
|
+
assert.equal(checkInvocation('startcycle-graph', dm('true'))[0].code, 'E-DMI01');
|
|
554
|
+
assert.deepEqual(checkInvocation('startcycle-graph', dm('false')), []);
|
|
555
|
+
assert.deepEqual(checkInvocation('bdb-updater', dm('true')), [], 'unlisted skills may keep the flag');
|
|
556
|
+
assert.deepEqual(checkInvocation('startcycle', new Map()), []);
|
|
557
|
+
assert.deepEqual(checkPlaybook(pb({}, ['kind', 'trigger', 'inputs', 'requires', 'go_points', 'outputs', 'verify', 'difficulty', 'est_time']), known).length, 0, 'no kind, no playbook rules');
|
|
535
558
|
assert.deepEqual(
|
|
536
559
|
checkPlaybook(pb({ requires: '\n skills: ["gh (external)", github,]' }), known), [],
|
|
537
560
|
'quoted item and trailing comma survive',
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
name: godmode-shipping
|
|
3
3
|
description: BDB Shipping Godmode, the final gatekeeper for production releases. Use when running pre-launch checks, feature-flag rollouts, or rollback planning under Spec-Driven Development before a release ships.
|
|
4
4
|
category: engineering-method
|
|
5
|
-
disable-model-invocation: true
|
|
6
5
|
---
|
|
7
6
|
|
|
8
7
|
# 🚀 BDB Shipping Godmode
|
|
@@ -22,7 +22,7 @@ One session is the **master**: it keeps the overview, asks workers for status, a
|
|
|
22
22
|
|
|
23
23
|
### `aos-acp` in one paragraph
|
|
24
24
|
|
|
25
|
-
`bin/aos-acp.mjs` is a zero-dependency ACP client: it spawns the adapter (`npx -y @agentclientprotocol/codex-acp`, `opencode acp`, `npx -y @agentclientprotocol/claude-agent-acp`), runs `initialize` → `session/new` → `session/prompt`, streams the worker's text to stdout and logs every event to `~/.aos/acp/<name>.jsonl`. A `session/request_permission` for a guarded command (the go-gate list) is answered `allow_once` only with a valid GO token for `<name>`; with `--go-wait <sec>` the request is parked (log event `permission_pending`, show it as `GO needed`) until the token appears or the wait ends. Everything else follows `--allow-default deny|allow` (deny by default). ACP workers are not in `ListAgents`: the roster lists them from the logs.
|
|
25
|
+
`bin/aos-acp.mjs` is a zero-dependency ACP client: it spawns the adapter (`npx -y @agentclientprotocol/codex-acp`, `opencode acp`, `npx -y @agentclientprotocol/claude-agent-acp`), runs `initialize` → `session/new` → `session/prompt`, streams the worker's text to stdout and logs every event to `~/.aos/acp/<name>.jsonl`. A `session/request_permission` for a guarded command (the go-gate list) is answered `allow_once` only with a valid GO token for `<name>`; with `--go-wait <sec>` the request is parked (log event `permission_pending`, show it as `GO needed`) until the token appears or the wait ends. Everything else follows `--allow-default deny|allow` (deny by default). `--model <id>` is sent as ACP `session/set_config_option` (`configId: "model"`, id is adapter-specific, e.g. `sonnet`, `provider/model`); `fable` ids are rejected (workers run opus, sonnet or haiku), default is the adapter default and is logged. ACP workers are not in `ListAgents`: the roster lists them from the logs.
|
|
26
26
|
|
|
27
27
|
## Step 1 — Roster
|
|
28
28
|
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
name: startcycle
|
|
3
3
|
description: Linear multi-agent build pipeline with file hand-offs in production_artifacts/, run after /bdbrainstorm or /grill-me. This is the linear variant — no state.json, no repair loop, no dispatcher graph — distinct from startcycle-graph, which adds durable state and automated escalation.
|
|
4
4
|
category: bdb-core
|
|
5
|
-
disable-model-invocation: true
|
|
6
5
|
---
|
|
7
6
|
|
|
8
7
|
# `/startcycle` — Linear Build Pipeline
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
name: startcycle-graph
|
|
3
3
|
description: Use when running the autonomous multi-agent build pipeline after /bdbrainstorm or /grill-me. Routes to the startcycle-dispatch Dynamic Workflow, which reads production_artifacts/state.json and invokes Architect, TechLead, UI/UX, Engineering, Media/EventTech, Reviewer, and Shipping in turn per .agents/graph.md's edge table — the agents never invoke each other.
|
|
4
4
|
category: bdb-core
|
|
5
|
-
disable-model-invocation: true
|
|
6
5
|
---
|
|
7
6
|
|
|
8
7
|
# 🚀 BDB Autonomous Development Cycle (`/startcycle-graph`)
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
name: ask-tim
|
|
3
3
|
description: Ask which skill or flow fits your situation. A route through AOS's skills for work that travels idea to ship, plus a catalogue of the 185 available options for lookup. Use when unsure where to start, or when picking between overlapping choices.
|
|
4
4
|
category: bdb-core
|
|
5
|
-
disable-model-invocation: true
|
|
6
5
|
---
|
|
7
6
|
|
|
8
7
|
<!-- The flow map below is derived from mattpocock/skills' ask-matt (MIT, see
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
name: grill-me
|
|
3
3
|
description: A relentless interview to sharpen a plan or design. Use before committing to an approach, or on any 'grill me' trigger phrase.
|
|
4
4
|
category: engineering-method
|
|
5
|
-
disable-model-invocation: true
|
|
6
5
|
---
|
|
7
6
|
|
|
8
7
|
<!-- Source: mattpocock/skills skills/productivity/grill-me — MIT, see THIRD_PARTY_NOTICES.md -->
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
name: grill-with-docs
|
|
3
3
|
description: A relentless interview to sharpen a plan or design, which also builds the project's domain model — glossary and ADRs — as it goes. Use in a working directory whenever an idea needs sharpening.
|
|
4
4
|
category: engineering-method
|
|
5
|
-
disable-model-invocation: true
|
|
6
5
|
---
|
|
7
6
|
|
|
8
7
|
<!-- Source: mattpocock/skills skills/engineering/grill-with-docs — MIT, see THIRD_PARTY_NOTICES.md -->
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pb-bug-fix
|
|
3
|
+
description: >-
|
|
4
|
+
Turn a GitHub issue into a tested fix on a branch with an open PR: read the
|
|
5
|
+
issue as the contract, find the root cause, write the failing test first,
|
|
6
|
+
fix, prove it, review the diff against the issue, push and open the PR only
|
|
7
|
+
after GO. Merging stays with pb-ship. Use for "fix issue 42", "bug fix from
|
|
8
|
+
this issue", "turn this issue into a PR".
|
|
9
|
+
category: engineering-method
|
|
10
|
+
kind: playbook
|
|
11
|
+
trigger: ["fix issue", "bug fix from issue", "issue to PR"]
|
|
12
|
+
inputs: [repo, issue_number]
|
|
13
|
+
requires:
|
|
14
|
+
skills: [github, deja-memory, systematic-debugging, test-driven-development, verification-before-completion, git-pr-review, "gh (external)"]
|
|
15
|
+
agents: [reviewer]
|
|
16
|
+
mcps: []
|
|
17
|
+
store: []
|
|
18
|
+
go_points: ["git push + gh pr create"]
|
|
19
|
+
outputs: ["production_artifacts/pb-bug-fix-<date>.md"]
|
|
20
|
+
verify: "new test fails on the base SHA and passes on the branch SHA; gh pr view <branch> --json closingIssuesReferences contains <n>"
|
|
21
|
+
difficulty: intermediate
|
|
22
|
+
est_time: 30-90 min
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# GitHub issue to tested fix and PR
|
|
26
|
+
What you get: a branch with a failing-then-passing test and the fix, reviewed against the issue, and an open PR that closes it. Merging is a separate run (pb-ship).
|
|
27
|
+
|
|
28
|
+
## Inputs
|
|
29
|
+
- repo — the current directory, or the one the user names; `<owner/repo>` comes from `git -C <repo> remote get-url origin`
|
|
30
|
+
- issue_number — the GitHub issue to fix, asked if missing
|
|
31
|
+
|
|
32
|
+
## Steps
|
|
33
|
+
1. github — repo, issue_number → `gh auth status`, then `gh issue view <n> -R <owner/repo> --json title,body,labels,state` as the contract (acceptance points as a list) in the run log (gh missing, unauthenticated, no GitHub remote, or the issue is closed → log it, give the `gh auth login` / remote hint, stop) — contract written
|
|
34
|
+
2. deja-memory — error text or symptom from the issue → `deja fix` result in the run log — prior fix found, or "none"
|
|
35
|
+
3. systematic-debugging — contract → root cause and a local repro command in the run log — repro fails locally on the base SHA (base SHA logged), or the reason it cannot run locally
|
|
36
|
+
4. test-driven-development — root cause → failing test first (run, red, output pasted), then the minimal fix on a new branch `fix/<n>-<slug>` — the new test fails on the base SHA and passes after the fix; no unrelated edits
|
|
37
|
+
5. verification-before-completion — repro command and the repo's test, lint and typecheck scripts that exist → fresh passing output pasted in the run log — output pasted, not claimed
|
|
38
|
+
6. reviewer (agent) — `git diff <base>...HEAD`; the contract is the issue from step 1, never the run log and never the implementer's claim (input material only) → findings table in the run log — any open `blocking` finding sends the run back to step 4, at most 2 cycles, then stop and escalate
|
|
39
|
+
7. git-pr-review — `git log <base>..HEAD` → PR body draft in the run log, ending in `Fixes #<n>` — draft only, nothing posted
|
|
40
|
+
8. [GO] git push + gh pr create — `git push -u origin <branch>` then `gh pr create -R <owner/repo> --base <base> --head <branch> --title "<title>" --body-file <draft>` — the WAITING FOR GO line names branch, base, title and issue number. The run stops here until the human types GO. One GO covers the push and the PR creation, one time. (The hook guards the push only; `gh pr create` is not hook-guarded, so this GO is its only guard.)
|
|
41
|
+
9. github — `gh pr view <branch> -R <owner/repo> --json url,closingIssuesReferences` → PR URL in the run log — `closingIssuesReferences` contains `<n>`
|
|
42
|
+
|
|
43
|
+
Run log: `production_artifacts/pb-bug-fix-<date>.md` in the start directory, never committed
|
|
44
|
+
|
|
45
|
+
Rules
|
|
46
|
+
- Anything other than the literal GO (case-insensitive) is not a GO; a GO covers only that one step, one time.
|
|
47
|
+
- A failed check stops the run: write the failure into the run log and report. No silent retries beyond what a step names.
|
|
48
|
+
- Write one run-log line per step as it completes (`N. done|skipped|failed — artifact — check result`) and `WAITING FOR GO: <step>` at each gate.
|
|
@@ -19,7 +19,6 @@ outputs: [".github/workflows/*.yml", "production_artifacts/pb-ci-fix-<date>.md"]
|
|
|
19
19
|
verify: "gh run list --commit <sha> --json conclusion -q '.[0].conclusion' == success"
|
|
20
20
|
difficulty: intermediate
|
|
21
21
|
est_time: 15-45 min
|
|
22
|
-
disable-model-invocation: true
|
|
23
22
|
---
|
|
24
23
|
|
|
25
24
|
# Fix red CI or set up GitHub Actions
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pb-clip-from-moodboard
|
|
3
|
+
description: >-
|
|
4
|
+
Turn a look brief and reference images into a finished social clip:
|
|
5
|
+
concept, TouchDesigner look and palette, ComfyUI stills, a recorded take,
|
|
6
|
+
a cut in DaVinci Resolve or Remotion, 9:16 and 16:9 exports, publish only
|
|
7
|
+
after GO. Use for "moodboard to clip", "make a social clip from these
|
|
8
|
+
references", "look brief to video".
|
|
9
|
+
category: media-eventtech
|
|
10
|
+
kind: playbook
|
|
11
|
+
trigger: ["moodboard to clip", "social clip from references", "look brief to video"]
|
|
12
|
+
inputs: [brief, reference_images, project, comfy_workflow, cut_tool, formats?]
|
|
13
|
+
requires:
|
|
14
|
+
skills: [bdbmediastorm, bdb-touchdesigner-mcp, bdb-davinci-mcp, remotion, "ffprobe (external)"]
|
|
15
|
+
agents: []
|
|
16
|
+
mcps: [bdb_td_minddesigner, comfyui-mcp, bdb_davinci_mcp]
|
|
17
|
+
store: []
|
|
18
|
+
go_points: [publish]
|
|
19
|
+
outputs: ["renders/<project>/concept.md", "renders/<project>/look.tox", "renders/<project>/stills/", "renders/<project>/clip_9x16.mp4", "renders/<project>/clip_16x9.mp4", "production_artifacts/pb-clip-from-moodboard-<date>.md"]
|
|
20
|
+
verify: "ffprobe shows 1080x1920 and 1920x1080 at the asked duration; comfyui get_history status success; get_td_node_errors empty"
|
|
21
|
+
difficulty: advanced
|
|
22
|
+
est_time: 1-3 h
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# Moodboard to social clip
|
|
26
|
+
What you get: a 9:16 and a 16:9 clip built from your look brief and references, checked with ffprobe, handed off for publishing after your GO.
|
|
27
|
+
|
|
28
|
+
## Inputs
|
|
29
|
+
- brief — the look brief, asked in step 2
|
|
30
|
+
- reference_images — a folder of reference images, asked in step 2
|
|
31
|
+
- project — a slug for `renders/<project>/`, asked in step 2
|
|
32
|
+
- comfy_workflow — path to a ComfyUI API-format workflow JSON, required, never invented
|
|
33
|
+
- cut_tool — `davinci` or `remotion` (remotion needs an existing Remotion project)
|
|
34
|
+
- formats (optional) — default 9:16 and 16:9
|
|
35
|
+
|
|
36
|
+
## Steps
|
|
37
|
+
1. Preflight — ask cut_tool first; then one probe per server, before any file is written: `get_td_info` on `bdb_td_minddesigner`; `check_comfyui_health` on `comfyui-mcp`; `get_resolve_status` on `bdb_davinci_mcp` (only if cut_tool = davinci); `command -v ffprobe`. MCP tools may be deferred in the harness: try to load the tool once via the harness tool search before declaring it missing. Tool not loaded, call errors, or the payload fails its pass condition (TD `get_td_info`: `connected: true`; ComfyUI `check_comfyui_health`: `status` is `"online"`; Resolve `get_resolve_status`: no `error` key) → stop with "Missing MCP: `<server>` (`<tool>` unavailable). Start <TouchDesigner|ComfyUI|DaVinci Resolve> and check `mcpServers.<server>` in your harness config." and write nothing except the run log; davinci missing while cut_tool = remotion → continue, logged — all probes answered
|
|
38
|
+
2. Ask — brief, reference image folder, project slug, ComfyUI workflow JSON path, cut_tool, formats (default 9:16 and 16:9), length → run log and `renders/<project>/` — all answered, workflow path exists
|
|
39
|
+
3. bdbmediastorm — brief → `renders/<project>/concept.md` (look, palette intent, shot list, length) — stops for approval
|
|
40
|
+
4. bdb-touchdesigner-mcp — references → `moodboard_to_system` / `extract_palette` → network and palette; `get_td_node_errors` empty, `get_preview` shown (stops for approval), then `export_look_tox` → `renders/<project>/look.tox` — errors empty
|
|
41
|
+
5. ComfyUI — the workflow file's text (palette and prompt filled in) as the JSON string for `queue_prompt` → `get_history <prompt_id>` status success → `get_output_media_info` paths copied to `renders/<project>/stills/` and loaded into the TD network (e.g. as a `moviefilein` TOP feeding the look) before step 6, then `get_td_node_errors` empty again — at least 1 still; `local_path` is only set when `COMFYUI_DIR` is set, so if `local_path` is empty or `exists_locally` is false, stop with a clear message and copy nothing
|
|
42
|
+
6. Record — TD `record_movie` → `renders/<project>/raw.mov` — `ffprobe` duration > 0
|
|
43
|
+
7. Cut — either way the output is the two clips, and `ffprobe` shows the asked width, height and duration per file:
|
|
44
|
+
- davinci: `create_project` → `import_media` → `create_timeline` → `append_to_timeline` → `set_render_settings` per format → `add_render_job` → `start_rendering` → `get_render_job_status` complete
|
|
45
|
+
- remotion: from the Remotion project dir, copy `raw.mov` into its `public/`, then `npx remotion render <Composition> <out>` per format (network/npm on first run needs approval; the skill's Stitch steps do not apply)
|
|
46
|
+
- `ffprobe` is the gate, since nothing proves `set_render_settings` sets 1080x1920: on a width/height mismatch stop with "export <format> has WxH, expected ...", log it, do not publish, invent no conversion command, and tell the human what to change in Resolve
|
|
47
|
+
- then the clips stop for approval (taste review)
|
|
48
|
+
8. [GO] publish — the destination and the full file list shown. The run stops here until the human types GO. No publish MCP or CLI exists on this machine, so the GO releases the hand-off: the files plus the caption in `renders/<project>/publish.md`; upload is manual unless the human named a tool in step 2 — hand-off file written
|
|
49
|
+
|
|
50
|
+
Run log: `production_artifacts/pb-clip-from-moodboard-<date>.md` in the start directory, never committed
|
|
51
|
+
|
|
52
|
+
Rules
|
|
53
|
+
- Anything other than the literal GO (case-insensitive) is not a GO; a GO covers only that one step, one time.
|
|
54
|
+
- A failed check stops the run: write the failure into the run log and report. No silent retries.
|
|
55
|
+
- Write one run-log line per step as it completes (`N. done|skipped|failed — artifact — check result`) and `WAITING FOR GO: <step>` at each gate.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pb-crew-call-sheet
|
|
3
|
+
description: >-
|
|
4
|
+
Build a crew call sheet and a load-in / load-out plan for one show day from
|
|
5
|
+
your event tracker or brief and your crew list, and send it to the crew only
|
|
6
|
+
after your GO. Use for "call sheet", "crew call times", "load-in plan",
|
|
7
|
+
"load-out schedule".
|
|
8
|
+
category: media-eventtech
|
|
9
|
+
kind: playbook
|
|
10
|
+
trigger: ["call sheet", "crew call times", "load-in plan"]
|
|
11
|
+
inputs: [tracker_csv_or_event_brief, crew_list]
|
|
12
|
+
requires:
|
|
13
|
+
skills: [bdb-eventagency-skill, pb-event-tracker]
|
|
14
|
+
agents: []
|
|
15
|
+
mcps: []
|
|
16
|
+
store: []
|
|
17
|
+
go_points: [send to crew]
|
|
18
|
+
outputs: ["call-sheet.md", "load-plan.md", "run-log.md"]
|
|
19
|
+
verify: "every crew member has a call time; load-in ends before doors; load-out starts after show end"
|
|
20
|
+
difficulty: beginner
|
|
21
|
+
est_time: 10-20 min
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# Crew call sheet
|
|
25
|
+
What you get: a call sheet and a load-in / load-out plan for one show day.
|
|
26
|
+
|
|
27
|
+
## Inputs
|
|
28
|
+
- The `tracker.csv` from pb-event-tracker, or an event brief — a text or document file
|
|
29
|
+
- A crew list — a file with name, role and contact for each person
|
|
30
|
+
- A save folder — asked once; default `./pb-crew-call-sheet-<date>/`
|
|
31
|
+
|
|
32
|
+
## Steps
|
|
33
|
+
1. Ask once — save folder, tracker or brief, crew list → `run-log.md` — the files are readable; no tracker yet: run pb-event-tracker first or give the brief
|
|
34
|
+
2. Read the tracker or brief and the crew list → show date, venue, doors time, show start and end, per crew member name, role, contact — missing times are `?`, never guessed
|
|
35
|
+
3. bdb-eventagency-skill (section "5.1 Pre-production", run-of-show and day-minus milestones) — the read data → `call-sheet.md`, one row per crew member: who, role, call time, contact — every crew member has a call time
|
|
36
|
+
4. bdb-eventagency-skill (section "5.1 Pre-production") — the read data → `load-plan.md` with load-in, line check, doors, show, load-out, each with a start and end time — load-in ends before doors; load-out starts after show end
|
|
37
|
+
5. Show `call-sheet.md` and `load-plan.md` in full and apply your edits until you approve — approval logged
|
|
38
|
+
6. [GO] Send the call sheet to the crew through a connector you name, or send it yourself — show every recipient (name + address, `?` blocks sending until you fill it) and the full text of every message first. The run stops here until the human types GO. The GO covers exactly the recipients and messages shown and nothing else; a different or added recipient needs a fresh GO. Never send to anyone not listed in `call-sheet.md`. The go-gate hook does not guard sending: this [GO] is the only guard.
|
|
39
|
+
|
|
40
|
+
Run log: `run-log.md` in the save folder. One line per step as it completes (`N. done|skipped|failed — file — check result`), and `WAITING FOR GO: <step>` at the gate. Anything other than the literal GO (case-insensitive) is not a GO. If a check fails, stop, write the failure into the log and tell the user.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pb-deploy-saas
|
|
3
|
+
description: >-
|
|
4
|
+
Deploy a SaaS app to the BDB fleet: preflight of the fleet skills, a guardrail plan, green CI, the deploy after GO (Incus via
|
|
5
|
+
Forgejo CI, or direct rsync), and a health URL check. Use for "deploy this to the
|
|
6
|
+
fleet", "deploy the SaaS app", "ship to the Incus instance".
|
|
7
|
+
category: saas-ops
|
|
8
|
+
kind: playbook
|
|
9
|
+
trigger: ["deploy this to the fleet", "deploy the SaaS app", "deploy to the Incus instance"]
|
|
10
|
+
inputs: [repo, target_instance, path, version_source?]
|
|
11
|
+
requires:
|
|
12
|
+
skills: [bdb-deploy, pb-ci-fix, "bdbsaashost (external)", "deploy-incus (external)"]
|
|
13
|
+
agents: []
|
|
14
|
+
mcps: []
|
|
15
|
+
store: []
|
|
16
|
+
go_points: [deploy]
|
|
17
|
+
outputs: ["production_artifacts/pb-deploy-saas-<date>.md"]
|
|
18
|
+
verify: "curl -sI <health_url> returns 200; the version marker read in step 5 equals the deployed commit SHA, or the run log says marker absent: unverified"
|
|
19
|
+
difficulty: advanced
|
|
20
|
+
est_time: 30-90 min
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# Deploy a SaaS app to the fleet
|
|
24
|
+
What you get: the app deployed to the chosen fleet instance after your GO, with a health check logged.
|
|
25
|
+
|
|
26
|
+
## Inputs
|
|
27
|
+
- repo — the current directory, or the one the user names
|
|
28
|
+
- target_instance — the fleet instance to deploy to, asked if missing
|
|
29
|
+
- path — `incus-ci` (push to Forgejo, the runner deploys to Incus) or `direct` (rsync over SSH), asked if missing
|
|
30
|
+
- version_source (optional) — where the app exposes its commit SHA: a `/version`-style URL or a response header name of the health URL, taken from the deploy plan; none given means the app exposes none
|
|
31
|
+
|
|
32
|
+
## Steps
|
|
33
|
+
1. Preflight — `test -f ~/.claude/skills/bdbsaashost/SKILL.md`; `test -f ~/.claude/skills/deploy-incus/SKILL.md` (needed only for path = incus-ci) → run log header — a skill absent → stop with "Missing skill: <name> (installed locally only, not shipped by AOS). Install it under `~/.claude/skills/` or run this playbook on the machine that has it."; write nothing except the run log — all probes answered
|
|
34
|
+
2. bdbsaashost (external) — repo, target_instance → deploy plan with target, guardrails and the health URL in the run log — stops for approval (the human confirms target, path and health URL)
|
|
35
|
+
3. pb-ci-fix — only if `gh run list --commit <HEAD sha> --limit 1 --json conclusion` for the repo is not `success` (a repo with no GitHub CI is logged and skipped) → one pb-ci-fix run, with its own GO for the push — latest run is green, else stop
|
|
36
|
+
4. [GO] deploy — path = incus-ci: deploy-incus pushes the repo to the Forgejo remote, the push command is hook-guarded; path = direct: bdb-deploy runs `rsync` over SSH to the target, which is not hook-guarded (the same goes for `incus` commands), so this GO is the only guard there — RemoteOS approval does not cover a Forgejo push or an rsync, only actions run through its own tools (for example container manage), which this step does not use. The WAITING FOR GO line names the path, target_instance, the exact command, and the commit SHA. The run stops here until the human types GO. One GO = one deploy.
|
|
37
|
+
5. Health check — `curl -sI <health_url>` for the status line; then the marker from `version_source` (`curl -s <version_url>` for a URL, or the named header in the `curl -sI` output) → status line and marker in the run log — status 200 and the marker equals the SHA from the step 4 GO line; if `version_source` is empty or returns no marker, log "marker absent: unverified" and accept the 200 alone; a marker that differs from the SHA, or any other status, stops the run and reports, no automatic rollback
|
|
38
|
+
|
|
39
|
+
Run log: `production_artifacts/pb-deploy-saas-<date>.md` in the start directory, never committed
|
|
40
|
+
|
|
41
|
+
Rules
|
|
42
|
+
- Anything other than the literal GO (case-insensitive) is not a GO; a GO covers only that one step, one time.
|
|
43
|
+
- A failed check stops the run: write the failure into the run log and report. No silent retries.
|
|
44
|
+
- Write one run-log line per step as it completes (`N. done|skipped|failed — artifact — check result`) and `WAITING FOR GO: <step>` at each gate.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pb-docs-site
|
|
3
|
+
description: >-
|
|
4
|
+
Publish a project's docs as a static HTML manual on GitHub Pages: check
|
|
5
|
+
that Pages is enabled, bring the wiki up to date, list the doc gaps, build
|
|
6
|
+
the site, preview it locally and push it after GO. Use for "publish the
|
|
7
|
+
docs", "docs site", "put the manual on GitHub Pages".
|
|
8
|
+
category: design-ui-ux
|
|
9
|
+
kind: playbook
|
|
10
|
+
trigger: ["publish the docs", "docs site", "manual on GitHub Pages"]
|
|
11
|
+
inputs: [repo, source]
|
|
12
|
+
requires:
|
|
13
|
+
skills: [openwiki-skill, readme, documentation, bdbhtmlmanueldocs, github, "gh (external)"]
|
|
14
|
+
agents: []
|
|
15
|
+
mcps: []
|
|
16
|
+
store: []
|
|
17
|
+
go_points: ["git push"]
|
|
18
|
+
outputs: ["docs/", "production_artifacts/pb-docs-site-<date>.md"]
|
|
19
|
+
verify: "gh api repos/<owner>/<repo>/pages -q .status == built; curl -sI <pages_url> returns 200"
|
|
20
|
+
difficulty: intermediate
|
|
21
|
+
est_time: 30-90 min
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# Publish a docs site
|
|
25
|
+
What you get: the project's docs as a static HTML manual on GitHub Pages, pushed only after your GO.
|
|
26
|
+
|
|
27
|
+
## Inputs
|
|
28
|
+
- repo — the local checkout, default the current directory; `<owner/repo>` comes from `git -C <repo> remote get-url origin`
|
|
29
|
+
- source — where the content lives: OpenWiki pages, the README, or `docs/`
|
|
30
|
+
|
|
31
|
+
## Steps
|
|
32
|
+
1. Preflight — `gh auth status`, then `gh api repos/<owner>/<repo>/pages` → run log header — gh missing, unauthenticated or no GitHub remote → log it, give the `gh auth login` / remote hint, stop; 404 → stop with "Pages not enabled: enable it in repo settings", this playbook does not enable Pages; a private repo whose Pages call is refused for plan reasons → stop with "Pages on a private repo needs a paid plan", and never change the repo's visibility. Then openwiki-skill — wiki refreshed or confirmed current → log line — Pages answered and the wiki is current
|
|
33
|
+
2. readme and documentation — `source` against the code → list of doc gaps in the run log — stops for approval
|
|
34
|
+
3. bdbhtmlmanueldocs — approved content → site files in `docs/` (or the Pages source path the step 1 response names) — files written, nothing committed; the skill's Pages build-type switch (`gh api -X PUT .../pages`) and its Pages deploy workflow are NOT run here, only the site files are written
|
|
35
|
+
4. Preview — a local preview link or the path to the built `index.html` in the run log — link or path given
|
|
36
|
+
5. [GO] git push — the site files committed to the branch and path the step 1 response names as the Pages source; the WAITING FOR GO line names the branch and the file list. The WAITING FOR GO line also says: a Pages site of a private repo is public. The run stops here until the human types GO. The hook guards `git push`; it does not guard `gh api` settings writes, so no Pages setting or workflow is changed in this playbook.
|
|
37
|
+
6. github — `gh api repos/<owner>/<repo>/pages -q .status` equals `built` (poll, at most 5 minutes), then `curl -sI <pages_url>` → status line in the run log — returns 200
|
|
38
|
+
|
|
39
|
+
Run log: `production_artifacts/pb-docs-site-<date>.md` in the start directory, never committed
|
|
40
|
+
|
|
41
|
+
Rules
|
|
42
|
+
- Anything other than the literal GO (case-insensitive) is not a GO; a GO covers only that one step, one time.
|
|
43
|
+
- A failed check stops the run: write the failure into the run log and report. No silent retries.
|
|
44
|
+
- Write one run-log line per step as it completes (`N. done|skipped|failed — artifact — check result`) and `WAITING FOR GO: <step>` at each gate.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pb-focus-chunks
|
|
3
|
+
description: >-
|
|
4
|
+
Split one big task into chunks of at most 25 minutes, each with a
|
|
5
|
+
done-check, and place the demanding ones in your high-energy hours. Use for
|
|
6
|
+
"split this task", "break it into chunks", "I can't start this", "focus
|
|
7
|
+
plan". Nothing leaves your computer.
|
|
8
|
+
category: bdb-core
|
|
9
|
+
kind: playbook
|
|
10
|
+
trigger: ["split this task", "break it into chunks", "focus plan"]
|
|
11
|
+
inputs: [task, energy_pattern]
|
|
12
|
+
requires:
|
|
13
|
+
skills: [concise-planning]
|
|
14
|
+
agents: []
|
|
15
|
+
mcps: []
|
|
16
|
+
store: []
|
|
17
|
+
go_points: []
|
|
18
|
+
outputs: ["chunks.md", "run-log.md"]
|
|
19
|
+
verify: "every chunk is <= 25 min and has a done-check; sum of chunks equals the estimate"
|
|
20
|
+
difficulty: beginner
|
|
21
|
+
est_time: 5-10 min
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# Focus chunks
|
|
25
|
+
What you get: one big task split into 25-minute chunks, ordered by your energy level, each with a done-check.
|
|
26
|
+
|
|
27
|
+
## Inputs
|
|
28
|
+
- One task, in your own words, with your total time estimate
|
|
29
|
+
- Your energy pattern — asked once, e.g. morning high / afternoon low
|
|
30
|
+
- A save folder — asked once; default `./pb-focus-chunks-<date>/`
|
|
31
|
+
|
|
32
|
+
## Steps
|
|
33
|
+
1. Ask once — save folder, task, total estimate, energy pattern → `run-log.md` — all answered
|
|
34
|
+
2. concise-planning — task and estimate → `chunks.md`: numbered chunks of at most 25 minutes, each with minutes, a done-check and an energy tag (high / low) — every chunk is <= 25 min and has a done-check; the minutes add up to your estimate
|
|
35
|
+
3. Order `chunks.md` so high-energy chunks fall into your high-energy slots and low-energy chunks into the rest → slot named per chunk — no high-energy chunk sits in a low slot
|
|
36
|
+
4. Show `chunks.md` in full and apply your edits until you approve — approval logged
|
|
37
|
+
|
|
38
|
+
Nothing in this plan is sent anywhere, so there is no GO step. It only writes into the save folder.
|
|
39
|
+
|
|
40
|
+
Run log: `run-log.md` in the save folder. One line per step as it completes (`N. done|skipped|failed — file — check result`). If a check fails, stop, write the failure into the log and tell the user.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pb-handover
|
|
3
|
+
description: >-
|
|
4
|
+
Write a handover note for a colleague from the state of a project folder:
|
|
5
|
+
what is done, what is open, what is risky, the next 3 steps and where
|
|
6
|
+
things live. Sent only after your GO. Use for "handover note", "hand this
|
|
7
|
+
project over", "I'm going on leave, brief my colleague".
|
|
8
|
+
category: bdb-core
|
|
9
|
+
kind: playbook
|
|
10
|
+
trigger: ["handover note", "hand this project over", "brief my colleague"]
|
|
11
|
+
inputs: [project_folder, colleague_name]
|
|
12
|
+
requires:
|
|
13
|
+
skills: [quick-recap, memb-skill, github, "gh (external)"]
|
|
14
|
+
agents: []
|
|
15
|
+
mcps: []
|
|
16
|
+
store: []
|
|
17
|
+
go_points: [send handover]
|
|
18
|
+
outputs: ["handover.md", "run-log.md"]
|
|
19
|
+
verify: "every open item cites a file, commit or PR"
|
|
20
|
+
difficulty: beginner
|
|
21
|
+
est_time: 10-20 min
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# Handover note
|
|
25
|
+
What you get: a handover note for a colleague from the state of a project folder.
|
|
26
|
+
|
|
27
|
+
## Inputs
|
|
28
|
+
- A project folder
|
|
29
|
+
- The colleague's name
|
|
30
|
+
- A save folder — asked once; default `./pb-handover-<date>/`
|
|
31
|
+
|
|
32
|
+
## Steps
|
|
33
|
+
1. Ask once — save folder, project folder, colleague name → `run-log.md` — the folder exists
|
|
34
|
+
2. Read the folder and its git log (read-only); github — only if `gh (external)` is installed: your open pull requests for this repo → list of files, recent commits and open PRs in `run-log.md` — if gh is missing, skipped and logged
|
|
35
|
+
3. quick-recap — folder state and recent commits → what is done, what is in progress — each point cites a file or commit
|
|
36
|
+
4. memb-skill — search open commitments for this project → added tagged `[memB]` — skipped and logged if memB is not installed
|
|
37
|
+
5. Write `handover.md`: done, open, risks, next 3 steps, where things live — every open item cites a file, commit or PR; nothing invented, unknown is `?`
|
|
38
|
+
6. Show `handover.md` in full and apply your edits until you approve — approval logged
|
|
39
|
+
7. [GO] Send the handover through a connector you name, or send it yourself — show the recipient (name + address, `?` blocks sending until you fill it) and the full text first. The run stops here until the human types GO. The GO covers exactly the recipient and message shown and nothing else; a different or added recipient needs a fresh GO. The go-gate hook does not guard sending: this [GO] is the only guard.
|
|
40
|
+
|
|
41
|
+
Run log: `run-log.md` in the save folder. One line per step as it completes (`N. done|skipped|failed — file — check result`), and `WAITING FOR GO: <step>` at the gate. Anything other than the literal GO (case-insensitive) is not a GO. If a check fails, stop, write the failure into the log and tell the user.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pb-harness-work
|
|
3
|
+
description: >-
|
|
4
|
+
Change the agent harness itself (AOS, AO or CBS hooks, gates, memory,
|
|
5
|
+
permissions, delegation, plugins, bootstrap) the safe way: look up the
|
|
6
|
+
matching harness pattern, design against its gotchas, build with
|
|
7
|
+
/startcycle and a live trail, check every harness, open a PR after GO.
|
|
8
|
+
Use for "change a hook", "fix the go-gate", "harness work", "plugin change".
|
|
9
|
+
category: bdb-core
|
|
10
|
+
kind: playbook
|
|
11
|
+
trigger: ["harness work", "change a hook", "fix the go-gate", "plugin change"]
|
|
12
|
+
inputs: [goal, repo, area]
|
|
13
|
+
requires:
|
|
14
|
+
skills: [agentic-harness-patterns, startcycle, agenttrail, verification-before-completion, git-pr-review, github, "gh (external)"]
|
|
15
|
+
agents: [architect, techlead, reviewer]
|
|
16
|
+
mcps: []
|
|
17
|
+
store: []
|
|
18
|
+
go_points: [git push + gh pr create]
|
|
19
|
+
outputs: ["production_artifacts/00_execution_plan.md", "production_artifacts/pb-harness-work-<date>.md"]
|
|
20
|
+
verify: "npm test exit 0 on the pushed SHA; gh pr view <branch> --json state -q .state == OPEN"
|
|
21
|
+
difficulty: advanced
|
|
22
|
+
est_time: 1-3 h
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# Change the harness safely
|
|
26
|
+
What you get: a harness change that was designed against the known gotchas, built and reviewed, tested on every harness, and opened as a PR after your GO.
|
|
27
|
+
|
|
28
|
+
## Inputs
|
|
29
|
+
- goal — what should change, asked in step 1
|
|
30
|
+
- repo — the local checkout, asked in step 1
|
|
31
|
+
- area — memory, permissions, hooks, delegation, context, skills/plugins, tools or bootstrap, asked in step 1
|
|
32
|
+
|
|
33
|
+
## Steps
|
|
34
|
+
1. Ask + preflight (run everything from `<repo>`) — goal, repo, area → run log; default branch: `default=$(git -C <repo> symbolic-ref --short refs/remotes/origin/HEAD); default=${default#origin/}` (the command prints `origin/main`); if `git -C <repo> branch --show-current` equals it, `git -C <repo> switch -c feat/<slug>` — on a feature branch (gh missing or unauthenticated → log it, give the `gh auth login` hint, stop)
|
|
35
|
+
2. agentic-harness-patterns — area → section and reference file, named in the run log; files live in `skills/global_config/agentic-harness-patterns/references/` (installed copy: the matching directory):
|
|
36
|
+
- memory → `memory-persistence-pattern.md`
|
|
37
|
+
- permissions → `permission-gate-pattern.md`
|
|
38
|
+
- hooks → `hook-lifecycle-pattern.md`
|
|
39
|
+
- delegation → `agent-orchestration-pattern.md` and `task-decomposition-pattern.md`
|
|
40
|
+
- context → `context-engineering-pattern.md`
|
|
41
|
+
- skills/plugins → `skill-runtime-pattern.md`
|
|
42
|
+
- tools → `tool-registry-pattern.md`
|
|
43
|
+
- bootstrap → `bootstrap-sequence-pattern.md`
|
|
44
|
+
- check: the gotcha titles that apply are listed as a checklist (titles only, no copied content)
|
|
45
|
+
3. startcycle (Architect) — goal and gotcha checklist → `production_artifacts/00_execution_plan.md` with agenttrail components, each with a `files:` line — every listed gotcha is marked addressed or n/a with a reason; a component without `files:` → back to Architect
|
|
46
|
+
4. agenttrail — `aos-trail . --plan production_artifacts/00_execution_plan.md --no-open` → URL in the run log, before the build nodes start — URL printed; a no-op if startcycle already started the trail (it is safe to run twice)
|
|
47
|
+
5. startcycle (TechLead → build → Reviewer) — the dispatcher is the main session; the agents never call each other → code and review file — no open `blocking` finding
|
|
48
|
+
6. Cross-harness check → table in the run log, one row per harness (affected yes/no, file, evidence):
|
|
49
|
+
- Claude: `.claude/hooks/*.mjs`, settings hooks
|
|
50
|
+
- agy: `hooks.json` via installer `mergeAntigravityHooks`
|
|
51
|
+
- OpenCode: `.opencode/plugins/bdb-aos.js`
|
|
52
|
+
- Codex: `.codex/agents/*.toml`, `~/.codex/hooks` and `[features] hooks` in `~/.codex/config.toml` (both written by `installer.js`)
|
|
53
|
+
- check: every "yes" row has a test in `npm test` or a named manual check
|
|
54
|
+
7. verification-before-completion — `npm test` (and `node scripts/validate-skills.mjs` if skills changed) → fresh output pasted in the run log — exit 0
|
|
55
|
+
8. git commit — compare `git -C <repo> status --porcelain` with the plan's `files:` lines; unlisted changes outside `production_artifacts/` → stop and ask; stage only the listed files (never the run log or `production_artifacts/`) → SHA in the run log — the commit hook passes
|
|
56
|
+
9. git-pr-review — commits → PR body in `production_artifacts/pb-harness-work-<date>-pr.md` — body written, nothing posted
|
|
57
|
+
10. [GO] github — `git -C <repo> push -u origin <branch>`, then `gh pr create -R <owner/repo> --base <default> --head <branch> --title "<title>" --body-file <body>` (`<owner/repo>` from `git -C <repo> remote get-url origin`) — the WAITING FOR GO line names branch, base and title. The run stops here until the human types GO. The hook guards the push only; the PR create is GO by contract.
|
|
58
|
+
|
|
59
|
+
Run log: `production_artifacts/pb-harness-work-<date>.md` in the repo's start directory, never committed
|
|
60
|
+
|
|
61
|
+
Rules
|
|
62
|
+
- Anything other than the literal GO (case-insensitive) is not a GO; a GO covers only that one step, one time.
|
|
63
|
+
- A failed check stops the run: write the failure into the run log and report. No silent retries.
|
|
64
|
+
- Write one run-log line per step as it completes (`N. done|skipped|failed — artifact — check result`) and `WAITING FOR GO: <step>` at each gate.
|