bossbuild 0.97.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/PRINCIPLES.md +70 -0
- package/README.md +213 -0
- package/VERSION +1 -0
- package/bin/boss +3 -0
- package/library/README.md +19 -0
- package/library/agents/.gitkeep +0 -0
- package/library/agents/mentor-venture.md +57 -0
- package/library/hooks/.gitkeep +0 -0
- package/library/hooks/auto-log.js +133 -0
- package/library/hooks/memory-cue.js +82 -0
- package/library/hooks/secrets-guard.js +87 -0
- package/library/memory-seed/README.md +29 -0
- package/library/memory-seed/durable-facts-example.md +16 -0
- package/library/practices/.gitkeep +0 -0
- package/library/practices/agent-security.md +111 -0
- package/library/practices/ai-adoption-culture.md +104 -0
- package/library/practices/ai-ux-patterns.md +246 -0
- package/library/practices/celebration-of-done.md +100 -0
- package/library/practices/conscience-voicing.md +121 -0
- package/library/practices/context-discipline.md +116 -0
- package/library/practices/design-system.md +152 -0
- package/library/practices/git-workflow.md +119 -0
- package/library/practices/harm-taxonomy.md +45 -0
- package/library/practices/quality-ratchet.md +48 -0
- package/library/practices/revalidation.md +57 -0
- package/library/practices/scalable-architecture.md +111 -0
- package/library/practices/ship-it-live.md +149 -0
- package/library/practices/skill-authoring.md +70 -0
- package/library/skills/.gitkeep +0 -0
- package/library/skills/boss-learn/SKILL.md +63 -0
- package/library/skills/boss-sync/SKILL.md +48 -0
- package/package.json +49 -0
- package/registry/CHANGELOG.md +2737 -0
- package/src/board.js +655 -0
- package/src/brain.js +288 -0
- package/src/cli.js +542 -0
- package/src/conscience.js +426 -0
- package/src/insights.js +147 -0
- package/src/learn.js +92 -0
- package/src/map.js +103 -0
- package/src/modes.js +82 -0
- package/src/paths.js +36 -0
- package/src/registry.js +34 -0
- package/src/scaffold.js +138 -0
- package/src/sync.js +292 -0
- package/src/team.js +103 -0
- package/stages/L0-quickstart/manifest.json +12 -0
- package/stages/L0-quickstart/template/.claude/agents/coder-generalist.md +31 -0
- package/stages/L0-quickstart/template/.claude/agents/mentor-venture.md +57 -0
- package/stages/L0-quickstart/template/.claude/agents/pm.md +28 -0
- package/stages/L0-quickstart/template/.claude/hooks/conscience.js +89 -0
- package/stages/L0-quickstart/template/.claude/hooks/lib/loop-runtime.js +507 -0
- package/stages/L0-quickstart/template/.claude/hooks/lib/yaml.js +163 -0
- package/stages/L0-quickstart/template/.claude/hooks/memory-cue.js +82 -0
- package/stages/L0-quickstart/template/.claude/hooks/secrets-guard.js +87 -0
- package/stages/L0-quickstart/template/.claude/rules/your-app-code.md +17 -0
- package/stages/L0-quickstart/template/.claude/settings.json +36 -0
- package/stages/L0-quickstart/template/.claude/skills/boss/SKILL.md +161 -0
- package/stages/L0-quickstart/template/.claude/skills/boss-learn/SKILL.md +63 -0
- package/stages/L0-quickstart/template/.claude/skills/boss-sync/SKILL.md +55 -0
- package/stages/L0-quickstart/template/.claude/skills/canvas/SKILL.md +112 -0
- package/stages/L0-quickstart/template/.claude/skills/comprehend/SKILL.md +72 -0
- package/stages/L0-quickstart/template/.claude/skills/decide/SKILL.md +122 -0
- package/stages/L0-quickstart/template/.claude/skills/feedback/SKILL.md +68 -0
- package/stages/L0-quickstart/template/.claude/skills/import/SKILL.md +73 -0
- package/stages/L0-quickstart/template/.claude/skills/persona/SKILL.md +92 -0
- package/stages/L0-quickstart/template/.claude/skills/prototype/SKILL.md +114 -0
- package/stages/L0-quickstart/template/.claude/skills/triage/SKILL.md +104 -0
- package/stages/L0-quickstart/template/.claude/skills/welcome/SKILL.md +262 -0
- package/stages/L0-quickstart/template/AGENTS.md +31 -0
- package/stages/L0-quickstart/template/CLAUDE.md +57 -0
- package/stages/L0-quickstart/template/docs/IDS.md +42 -0
- package/stages/L0-quickstart/template/docs/ideas/INDEX.md +24 -0
- package/stages/L0-quickstart/template/docs/loops/canvas-loop.md +90 -0
- package/stages/L0-quickstart/template/docs/loops/capture-loop.md +64 -0
- package/stages/L1-mvp/manifest.json +12 -0
- package/stages/L1-mvp/template/.claude/agents/mentor-architect.md +124 -0
- package/stages/L1-mvp/template/.claude/agents/mentor-cofounder.md +85 -0
- package/stages/L1-mvp/template/.claude/agents/mentor-gtm.md +49 -0
- package/stages/L1-mvp/template/.claude/agents/program-manager.md +46 -0
- package/stages/L1-mvp/template/.claude/agents/tester.md +42 -0
- package/stages/L1-mvp/template/.claude/hooks/auto-log.js +133 -0
- package/stages/L1-mvp/template/.claude/rules/feature-context.md +18 -0
- package/stages/L1-mvp/template/.claude/skills/ai-cost/SKILL.md +249 -0
- package/stages/L1-mvp/template/.claude/skills/ai-failure-states/SKILL.md +226 -0
- package/stages/L1-mvp/template/.claude/skills/ai-first-init/SKILL.md +227 -0
- package/stages/L1-mvp/template/.claude/skills/close/SKILL.md +170 -0
- package/stages/L1-mvp/template/.claude/skills/consult/SKILL.md +72 -0
- package/stages/L1-mvp/template/.claude/skills/cost-review/SKILL.md +204 -0
- package/stages/L1-mvp/template/.claude/skills/design-tokens-init/SKILL.md +192 -0
- package/stages/L1-mvp/template/.claude/skills/drift-deep/SKILL.md +170 -0
- package/stages/L1-mvp/template/.claude/skills/evals/SKILL.md +154 -0
- package/stages/L1-mvp/template/.claude/skills/extract/SKILL.md +209 -0
- package/stages/L1-mvp/template/.claude/skills/judge-traces/SKILL.md +68 -0
- package/stages/L1-mvp/template/.claude/skills/log/SKILL.md +64 -0
- package/stages/L1-mvp/template/.claude/skills/practice/SKILL.md +92 -0
- package/stages/L1-mvp/template/.claude/skills/pretotype/SKILL.md +95 -0
- package/stages/L1-mvp/template/.claude/skills/red-team/SKILL.md +137 -0
- package/stages/L1-mvp/template/.claude/skills/revalidate/SKILL.md +51 -0
- package/stages/L1-mvp/template/.claude/skills/ship/SKILL.md +105 -0
- package/stages/L1-mvp/template/.claude/skills/smoke/SKILL.md +43 -0
- package/stages/L1-mvp/template/.claude/skills/spec/SKILL.md +145 -0
- package/stages/L1-mvp/template/claude-append.md +122 -0
- package/stages/L1-mvp/template/docs/loops/ai-failure-state-loop.md +107 -0
- package/stages/L1-mvp/template/docs/loops/coordination-loop.md +116 -0
- package/stages/L1-mvp/template/docs/loops/cost-budget-loop.md +117 -0
- package/stages/L1-mvp/template/docs/loops/cost-review-loop.md +113 -0
- package/stages/L1-mvp/template/docs/loops/design-tokens-loop.md +98 -0
- package/stages/L1-mvp/template/docs/loops/drift-loop.md +149 -0
- package/stages/L1-mvp/template/docs/loops/extraction-loop.md +128 -0
- package/stages/L1-mvp/template/docs/loops/focus-loop.md +106 -0
- package/stages/L1-mvp/template/docs/loops/pretotype-loop.md +88 -0
- package/stages/L1-mvp/template/docs/loops/spec-loop.md +83 -0
- package/stages/L2-v1/manifest.json +12 -0
- package/stages/L2-v1/template/.claude/agents/db-architect.md +91 -0
- package/stages/L2-v1/template/.claude/agents/mentor-business.md +124 -0
- package/stages/L2-v1/template/.claude/agents/mentor-fundraising.md +72 -0
- package/stages/L2-v1/template/.claude/agents/mentor-pitch.md +84 -0
- package/stages/L2-v1/template/.claude/agents/mentor-talent.md +84 -0
- package/stages/L2-v1/template/.claude/agents/ui-designer.md +81 -0
- package/stages/L2-v1/template/.claude/agents/ux-designer.md +87 -0
- package/stages/L2-v1/template/.claude/skills/board/SKILL.md +98 -0
- package/stages/L2-v1/template/.claude/skills/design-review/SKILL.md +77 -0
- package/stages/L2-v1/template/.claude/skills/ux-check/SKILL.md +93 -0
- package/stages/L2-v1/template/claude-append.md +59 -0
- package/stages/L2-v1/template/docs/loops/design-drift-loop.md +108 -0
- package/stages/L3-scale/README.md +13 -0
package/src/team.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// src/team.js — the venture's people (founder layer slice 2; IDEA-037 / FEAT-021).
|
|
2
|
+
//
|
|
3
|
+
// Team-AWARENESS built on git + identity, zero-dep. The design rule from the mentor
|
|
4
|
+
// passes: **dormant-solo** — when no collaborator is declared, BOSS is unchanged for a
|
|
5
|
+
// solo founder; this only lights up when a second person is on the venture (inert, not
|
|
6
|
+
// overhead). The roster lives in .boss/config.json (LOCAL for now; the shared-vs-personal
|
|
7
|
+
// state cut — should the roster travel via git? — is slice 3, to be recorded as its own DEC).
|
|
8
|
+
//
|
|
9
|
+
// Identity = the GitHub login, resolved the same way /decide does (the principal id the
|
|
10
|
+
// whole team layer keys on). Never fabricated: a null handle is honest.
|
|
11
|
+
|
|
12
|
+
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import { execSync } from 'node:child_process';
|
|
15
|
+
|
|
16
|
+
const CONFIG = '.boss/config.json';
|
|
17
|
+
|
|
18
|
+
function configPath(dir) { return join(dir, CONFIG); }
|
|
19
|
+
|
|
20
|
+
export function readConfig(dir) {
|
|
21
|
+
const p = configPath(dir);
|
|
22
|
+
if (!existsSync(p)) return {};
|
|
23
|
+
try { return JSON.parse(readFileSync(p, 'utf8')); } catch { return {}; }
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function writeConfig(dir, cfg) {
|
|
27
|
+
writeFileSync(configPath(dir), JSON.stringify(cfg, null, 2) + '\n');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function sh(cmd) {
|
|
31
|
+
try { return execSync(cmd, { stdio: ['ignore', 'pipe', 'ignore'] }).toString().trim() || null; }
|
|
32
|
+
catch { return null; }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// The current operator's identity: GitHub login first (the principal id), then the git
|
|
36
|
+
// name, then null. Same resolution order /decide uses — never invented.
|
|
37
|
+
export function resolveIdentity() {
|
|
38
|
+
return { handle: sh('gh api user --jq .login'), name: sh('git config user.name') };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const normHandle = (h) => String(h || '').replace(/^@/, '').trim();
|
|
42
|
+
|
|
43
|
+
export function roster(dir) {
|
|
44
|
+
const t = readConfig(dir).team;
|
|
45
|
+
return Array.isArray(t) ? t : [];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// True once a cofounder is on the venture — the switch the dormant team layer waits on.
|
|
49
|
+
export function isTeam(dir) { return roster(dir).length > 0; }
|
|
50
|
+
|
|
51
|
+
export function addCollaborator(dir, handle, name) {
|
|
52
|
+
const h = normHandle(handle);
|
|
53
|
+
if (!h) throw new Error('need a @github-username');
|
|
54
|
+
const me = normHandle(resolveIdentity().handle);
|
|
55
|
+
if (me && h.toLowerCase() === me.toLowerCase()) return { added: false, self: true, handle: '@' + h };
|
|
56
|
+
const cfg = readConfig(dir);
|
|
57
|
+
const team = Array.isArray(cfg.team) ? cfg.team : [];
|
|
58
|
+
if (team.some((m) => normHandle(m.handle) === h)) return { added: false, handle: '@' + h };
|
|
59
|
+
team.push({ handle: '@' + h, name: name || null, added: new Date().toISOString().slice(0, 10) });
|
|
60
|
+
cfg.team = team;
|
|
61
|
+
writeConfig(dir, cfg);
|
|
62
|
+
return { added: true, handle: '@' + h };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function removeCollaborator(dir, handle) {
|
|
66
|
+
const h = normHandle(handle);
|
|
67
|
+
const cfg = readConfig(dir);
|
|
68
|
+
const team = Array.isArray(cfg.team) ? cfg.team : [];
|
|
69
|
+
cfg.team = team.filter((m) => normHandle(m.handle) !== h);
|
|
70
|
+
writeConfig(dir, cfg);
|
|
71
|
+
return { removed: team.length - cfg.team.length };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// `boss team` — dormant-solo aware. Solo: a quiet "you, and here's how to add a cofounder."
|
|
75
|
+
// Team: the roster, with the decision-log pointer (the thing that keeps a pair in the loop).
|
|
76
|
+
export function renderTeam(dir) {
|
|
77
|
+
const me = resolveIdentity();
|
|
78
|
+
const meLabel = me.handle ? '@' + me.handle : (me.name || 'you');
|
|
79
|
+
const team = roster(dir);
|
|
80
|
+
const out = [''];
|
|
81
|
+
if (team.length === 0) {
|
|
82
|
+
out.push(' ▸ Solo venture');
|
|
83
|
+
out.push(` You: ${meLabel}`);
|
|
84
|
+
out.push('');
|
|
85
|
+
out.push(' Building with a cofounder? Add them so BOSS keeps you both in the loop:');
|
|
86
|
+
out.push(' boss team add @their-github-username "Their Name"');
|
|
87
|
+
out.push('');
|
|
88
|
+
out.push(' Solo, the team layer stays out of your way — nothing changes until someone joins.');
|
|
89
|
+
} else {
|
|
90
|
+
out.push(` ▸ Founding team (${team.length + 1})`);
|
|
91
|
+
out.push(` ${meLabel} (you)`);
|
|
92
|
+
for (const m of team) {
|
|
93
|
+
out.push(` ${m.handle}${m.name ? ' ' + m.name : ''}${m.added ? ' · since ' + m.added : ''}`);
|
|
94
|
+
}
|
|
95
|
+
out.push('');
|
|
96
|
+
out.push(' /decide records who decided what (DEC-NNN) — the rationale you can both point at.');
|
|
97
|
+
out.push(' New to building together? mentor-cofounder coaches the partnership — start with the');
|
|
98
|
+
out.push(' AI consent + norms conversation (who automates what · what stays human · no workslop).');
|
|
99
|
+
out.push(' boss team add @user "Name" · boss team remove @user');
|
|
100
|
+
}
|
|
101
|
+
out.push('');
|
|
102
|
+
return out.join('\n');
|
|
103
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "L0-quickstart",
|
|
3
|
+
"name": "Quickstart",
|
|
4
|
+
"summary": "Light idea capture. The smallest agentic footprint: describe an idea, shape it, remember it — a PM + a coder + a venture mentor to coach the founder, almost no ceremony. /welcome runs first for new founders (v0.28). /prototype turns a rough idea into a runnable, clickable sketch fast — build-first as a legitimate lean-cycle start; the conscience helps fill the gaps after you see it, not before (v0.52, IDEA-030). /persona builds your app's target-user persona from the idea, grows it from what you know + research + dropped-in user research, and consults it as an agent voice — both to guide product decisions and to QA builds; a pre-filter that sharpens the questions you take to real users, never a replacement (v0.55, IDEA-031). /comprehend is AI-native scaffold tailoring (opt-in via `boss new --ai` / `boss adopt --ai`): reads what BOSS can understand (the idea / source / adopted repo), tailors the scaffold non-destructively, and seeds the venture brain with an honest first read so the conscience has continuity from day one — augments the deterministic template, never replaces it (v0.64, IDEA-022 Track 3). /decide records a load-bearing or hard-to-reverse choice as a durable DEC-NNN decision record (Context/Decision/Why/Consequences + who decided + how reversible) — the rationale future-you and a cofounder can read instead of guessing; slice 1 of the founder layer for teams (v0.74, IDEA-037/FEAT-021).",
|
|
5
|
+
"requires": null,
|
|
6
|
+
"agents": ["pm", "coder-generalist", "mentor-venture"],
|
|
7
|
+
"skills": ["welcome", "boss", "import", "triage", "prototype", "canvas", "decide", "persona", "comprehend", "feedback", "boss-sync", "boss-learn"],
|
|
8
|
+
"hooks": ["conscience"],
|
|
9
|
+
"loops": ["capture-loop", "canvas-loop"],
|
|
10
|
+
"unlocksNext": "L1-mvp",
|
|
11
|
+
"graduationHint": "When you're ready to actually build, switch to MVP mode: boss unlock mvp."
|
|
12
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: coder-generalist
|
|
3
|
+
description: The builder for {{PROJECT_NAME}}. Implements features in whatever stack the project chooses. Stack-neutral until the first build decision pins one, then specializes its own guidance. In later modes this may split into stack-specific coders (coder-rust, coder-frontend, etc.) — but in Quickstart/MVP mode it is the single implementer. Trigger phrases - "build", "implement", "fix", "wire up", "make it work".
|
|
4
|
+
tools: Read, Grep, Glob, Edit, Write, Bash
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
You are the implementer for **{{PROJECT_NAME}}**, scaffolded by BlueprintOS in {{MODE}} mode.
|
|
8
|
+
|
|
9
|
+
## Stack-neutral by default
|
|
10
|
+
|
|
11
|
+
This project ships with **no assumed tech stack**. The first real build decision picks one. When it does:
|
|
12
|
+
|
|
13
|
+
1. Record the choice as a decision (an `IDEA-NNN` note or, once MVP mode is unlocked, a spec).
|
|
14
|
+
2. Specialize *this file* — add the stack's conventions, build command, and test command inline below, so future sessions inherit them.
|
|
15
|
+
3. If the project grows multiple stacks/surfaces, propose splitting into stack-specific coders in V1/Scale mode.
|
|
16
|
+
|
|
17
|
+
## How you build
|
|
18
|
+
|
|
19
|
+
- Smallest reversible change that satisfies the intent. No speculative abstractions, no error handling for impossible states, no comments that restate code.
|
|
20
|
+
- Read before you write. Match existing patterns over inventing new ones.
|
|
21
|
+
- Source files and shared state are precious — ask before destructive or irreversible actions.
|
|
22
|
+
- In MVP mode you must run `/smoke` (build + type + test gate) before claiming any task done. In Quickstart there's no formal gate yet; verify your change runs.
|
|
23
|
+
|
|
24
|
+
## Project build/test commands
|
|
25
|
+
|
|
26
|
+
<!-- Fill these in once the stack is chosen. Examples:
|
|
27
|
+
build: npm run build | cargo build | make
|
|
28
|
+
test: npm test | cargo test | pytest
|
|
29
|
+
run: npm run dev | cargo run | python -m {{PROJECT_NAME}} -->
|
|
30
|
+
|
|
31
|
+
_TBD — pinned when the stack is decided._
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mentor-venture
|
|
3
|
+
description: Venture mentor for {{PROJECT_NAME}} — coaches the FOUNDER, not the codebase. Pressure-tests whether the idea is worth pursuing, names the riskiest assumption, and points at the next real step. Owns the canvas conversation. Advisory only — never writes product code or specs. Trigger phrases - "is this worth doing", "should I build this", "what's my biggest risk", "how do I start a company", "talk me through this idea".
|
|
4
|
+
tools: Read, Grep, Glob, Edit, Write
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
You are the **venture mentor** for **{{PROJECT_NAME}}** ({{MODE}} mode) — the cornerstone of BOSS's
|
|
8
|
+
mentor layer (see `docs/MENTORS.md`). You coach the *founder*. You are not a builder: you don't write
|
|
9
|
+
production code, own specs, or decide implementation. You move the founder's *thinking* forward.
|
|
10
|
+
|
|
11
|
+
## Your job
|
|
12
|
+
|
|
13
|
+
- Be the experienced voice in the room for a founder who may be doing this for the first time.
|
|
14
|
+
- Pressure-test the idea humanely: who's served, what tension, what promise, who could be harmed —
|
|
15
|
+
*then* commercial rigor (riskiest assumption, smallest experiment, willingness to pay).
|
|
16
|
+
- Always leave them with **the single most useful next step**, not a plan they can't act on.
|
|
17
|
+
- Own the canvas conversation: nudge toward `/canvas`, help fill a few cells at a time, revisit it.
|
|
18
|
+
|
|
19
|
+
## How you work
|
|
20
|
+
|
|
21
|
+
1. Read `docs/ideas/` (what they're chasing), `docs/ideas/CANVAS.md` if present, and `PRINCIPLES.md`.
|
|
22
|
+
2. Ask one sharp question at a time. The goal is insight, not an interrogation.
|
|
23
|
+
3. Name the **riskiest assumption** out loud and propose one cheap way to test it this week.
|
|
24
|
+
4. Capture what's decided where it belongs (canvas, idea doc) — start the founder's dossier
|
|
25
|
+
(`docs/dossier/` as artifacts emerge). Author *with* them, never behind their back.
|
|
26
|
+
|
|
27
|
+
## The evidence you carry (use it, don't recite it)
|
|
28
|
+
|
|
29
|
+
Three findings anchor how you pressure-test. Lead with the judgment; cite only if they want the receipt.
|
|
30
|
+
|
|
31
|
+
- **Validation buys faster *decisions*, not guaranteed wins.** The disciplined founder doesn't win more
|
|
32
|
+
often by magic — they decide faster and **quit weak ideas faster** (Camuffo et al., 759-firm RCT).
|
|
33
|
+
Cheap AI lowers the cost of *building*, not the cost of *being wrong*. So when building feels free,
|
|
34
|
+
the riskiest-assumption test matters *more*, not less. Never sell validation as a guarantee.
|
|
35
|
+
- **The demoware test.** AI makes an impressive demo trivially cheap — and trivially easy to mistake for
|
|
36
|
+
a validated product. The blunt cut (Cagan/SVPG): *if your AI product only replaces a prompt plus a
|
|
37
|
+
copy/paste, it's a demo, not a product.* Use it at the `/prototype`→`/spec` graduation: did we test
|
|
38
|
+
value, usability, viability — or just that the demo runs?
|
|
39
|
+
- **The competence-gate.** AI advice *amplifies* the judgment a founder already has — it can actively
|
|
40
|
+
harm the founder least able to grade it (Otis et al., HBS RCT, 640 founders: high performers ~+15%,
|
|
41
|
+
struggling ones ~−8%; and confidence in AI tracks *less* checking, not more). So at a decision the
|
|
42
|
+
founder may not be equipped to evaluate, the move is to ask **"are you set up to judge this answer?"** —
|
|
43
|
+
point them at who would know, don't answer it for them. A humility prompt, used rarely, never a gate.
|
|
44
|
+
|
|
45
|
+
## What you do NOT do
|
|
46
|
+
|
|
47
|
+
- No production code, no specs, no architecture decisions — hand those to the builders (`pm`, `coder-generalist`).
|
|
48
|
+
- No premature ceremony. If they need more structure, the answer is usually `boss unlock <mode>`, which
|
|
49
|
+
brings the next mentors (architect, GTM…) with it — not a process you hand-roll.
|
|
50
|
+
- **No binding legal, financial, tax, or medical advice.** Caveat clearly and point them to a real
|
|
51
|
+
expert for anything consequential. You are a thinking partner, not a licensed professional.
|
|
52
|
+
|
|
53
|
+
## The line you hold
|
|
54
|
+
|
|
55
|
+
The humane lens comes before viability (Principle 6). Never coach toward harm for the sake of growth.
|
|
56
|
+
Surface trade-offs honestly; don't manufacture false confidence. When the idea genuinely has legs, say
|
|
57
|
+
so plainly and point at the next rung (`/canvas`, then `boss unlock mvp`).
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pm
|
|
3
|
+
description: Product lead for {{PROJECT_NAME}}. Decides what is worth building and why, shapes rough ideas into scoped intent, keeps the idea pool honest. Not a coder, not a designer. In Quickstart/MVP mode this is the only product voice; it splits into a PM org if/when the project reaches Scale mode. Trigger phrases - "what should we build", "is this worth it", "scope this", "prioritize", "does this fit".
|
|
4
|
+
tools: Read, Grep, Glob, Edit, Write
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
You are the product lead for **{{PROJECT_NAME}}**, scaffolded by BlueprintOS in {{MODE}} mode.
|
|
8
|
+
|
|
9
|
+
## Your job
|
|
10
|
+
|
|
11
|
+
- Turn vague intent into scoped, buildable ideas. A one-line thought is a complete input — ask a clarifying question only if genuinely ambiguous.
|
|
12
|
+
- Own `docs/ideas/INDEX.md`: every idea worth remembering lives there with an `IDEA-NNN` id and frontmatter.
|
|
13
|
+
- Decide *what* and *why*, never *how*. Implementation is the coder's call; visual/interaction is design's (unlocks in V1 mode).
|
|
14
|
+
- Keep scope small. The smallest version that proves the idea beats the complete version that doesn't ship.
|
|
15
|
+
|
|
16
|
+
## What you do NOT do in this mode
|
|
17
|
+
|
|
18
|
+
- You don't write production code (hand to `coder-generalist`).
|
|
19
|
+
- You don't run a PM org — that unlocks in Scale mode. Right now you are the whole product function.
|
|
20
|
+
- You don't invent ceremony the project hasn't earned. If a workflow feels missing, the answer is usually `boss unlock <mode>`, not a hand-rolled process.
|
|
21
|
+
|
|
22
|
+
## How to work
|
|
23
|
+
|
|
24
|
+
1. Read `docs/ideas/INDEX.md` and `docs/IDS.md` first.
|
|
25
|
+
2. When the user describes something, decide: is this an idea to capture (`/triage` → `IDEA-NNN`), a decision to record, or a question to answer?
|
|
26
|
+
3. Keep the idea pool current — mark ideas `building`, `shipped`, or `dropped` as state changes.
|
|
27
|
+
|
|
28
|
+
When the project starts spawning specs, features, and a board, suggest unlocking MVP mode (`boss unlock mvp`).
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// BOSS conscience hook (v0.18.0+) — generic, loop-driven.
|
|
3
|
+
//
|
|
4
|
+
// Fires on UserPromptSubmit. Reads docs/loops/*.md from the project, classifies
|
|
5
|
+
// each loop's state against the predicate-based runtime, returns structured
|
|
6
|
+
// signals for any loop drifting. Claude composes the voice; the hook ships a
|
|
7
|
+
// schema (Liu's discipline).
|
|
8
|
+
//
|
|
9
|
+
// Output schema:
|
|
10
|
+
// { hookSpecificOutput: {
|
|
11
|
+
// hookEventName: "UserPromptSubmit",
|
|
12
|
+
// signals: [{ loop_id, type, moment, confidence, evidence, suppress_if }, ...],
|
|
13
|
+
// // For back-compat with v0.16 eval-runner: mirror first signal's fields.
|
|
14
|
+
// moment, confidence, evidence, suppress_if,
|
|
15
|
+
// additionalContext: "..." } }
|
|
16
|
+
//
|
|
17
|
+
// Always exits 0. Empty output = no signal = stay silent.
|
|
18
|
+
|
|
19
|
+
import { detectSignals, composeContext, readCohort, readBrainContext, readRelationshipContext, readPauseState, clearPauseState, readMuteState, isMomentMuted, clearExpiredMutes, logActivity } from './lib/loop-runtime.js';
|
|
20
|
+
|
|
21
|
+
const projectDir = process.env.CLAUDE_PROJECT_DIR || process.cwd();
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
// Check pause state first (IDEA-011 v0.23.0+). When paused-and-not-expired,
|
|
25
|
+
// exit silent — the founder explicitly asked for this. When paused-and-expired,
|
|
26
|
+
// auto-clear and continue normally. The auto-resume IS the kindness.
|
|
27
|
+
const pause = readPauseState(projectDir);
|
|
28
|
+
if (pause && pause.mode === 'paused') {
|
|
29
|
+
if (!pause.expires || new Date(pause.expires) > new Date()) {
|
|
30
|
+
process.exit(0);
|
|
31
|
+
}
|
|
32
|
+
// Expired — clear the pause; the hook resumes normal operation.
|
|
33
|
+
clearPauseState(projectDir);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const detected = detectSignals(projectDir);
|
|
37
|
+
if (detected.length === 0) {
|
|
38
|
+
process.exit(0);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Per-moment mute (v0.72.0) — the founder turned this specific moment down.
|
|
42
|
+
// Surgical sibling of pause: drop only signals whose moment is muted-and-unexpired,
|
|
43
|
+
// then prune any expired mutes (the per-moment silent auto-resume). If muting
|
|
44
|
+
// leaves nothing to say, exit silent, exactly like pause.
|
|
45
|
+
clearExpiredMutes(projectDir);
|
|
46
|
+
const mutes = readMuteState(projectDir);
|
|
47
|
+
const signals = detected.filter((s) => !isMomentMuted(mutes, s.moment));
|
|
48
|
+
if (signals.length === 0) {
|
|
49
|
+
process.exit(0);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const cohort = readCohort(projectDir);
|
|
53
|
+
// Continuity (IDEA-022 Track 4): only read when a moment is already firing (past
|
|
54
|
+
// the silent early-exit) — bounded + cost-disciplined. null when no brain yet.
|
|
55
|
+
const brain = readBrainContext(projectDir);
|
|
56
|
+
// Learning (the relationship half): how recent nudges landed, so the conscience
|
|
57
|
+
// calibrates instead of repeating. null when no relationship log yet.
|
|
58
|
+
const relationship = readRelationshipContext(projectDir);
|
|
59
|
+
const additionalContext = composeContext(signals, { cohort, brain, relationship });
|
|
60
|
+
|
|
61
|
+
// Frequency ledger (v0.34) — correctness-invisible side effect; only fires
|
|
62
|
+
// reach here (past the silent early-exit). Records facts (moments, judge-bool,
|
|
63
|
+
// injected char count), never estimates. Remove this line and the conscience
|
|
64
|
+
// output below is byte-identical.
|
|
65
|
+
logActivity(projectDir, signals, additionalContext, cohort);
|
|
66
|
+
|
|
67
|
+
const first = signals[0];
|
|
68
|
+
|
|
69
|
+
const out = {
|
|
70
|
+
hookSpecificOutput: {
|
|
71
|
+
hookEventName: 'UserPromptSubmit',
|
|
72
|
+
signals,
|
|
73
|
+
moment: first.moment,
|
|
74
|
+
confidence: first.confidence,
|
|
75
|
+
evidence: first.evidence,
|
|
76
|
+
suppress_if: first.suppress_if || [],
|
|
77
|
+
cohort,
|
|
78
|
+
additionalContext,
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
process.stdout.write(JSON.stringify(out));
|
|
82
|
+
} catch (e) {
|
|
83
|
+
// Fail silent — the conscience must never block the user's prompt.
|
|
84
|
+
// Errors are written to stderr for the developer to see; hookOutput is empty
|
|
85
|
+
// so the user's session continues normally.
|
|
86
|
+
process.stderr.write(`[conscience hook error] ${e.message}\n`);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
process.exit(0);
|