create-byan-agent 2.9.4 → 2.9.5
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/install/bin/byan-cleanup.js +156 -0
- package/install/bin/byan-kanban.js +159 -0
- package/install/bin/byan-ledger.js +45 -0
- package/install/lib/cleanup/detector.js +154 -0
- package/install/lib/cleanup/executor.js +72 -0
- package/install/lib/subagent-generator.js +208 -0
- package/install/lib/token-ledger.js +131 -0
- package/install/templates/.claude/agents/bmad-bmad-master.md +14 -0
- package/install/templates/.claude/agents/bmad-bmb-agent-builder.md +14 -0
- package/install/templates/.claude/agents/bmad-bmb-module-builder.md +14 -0
- package/install/templates/.claude/agents/bmad-bmb-workflow-builder.md +14 -0
- package/install/templates/.claude/agents/bmad-bmm-analyst.md +14 -0
- package/install/templates/.claude/agents/bmad-bmm-architect.md +14 -0
- package/install/templates/.claude/agents/bmad-bmm-dev.md +14 -0
- package/install/templates/.claude/agents/bmad-bmm-pm.md +14 -0
- package/install/templates/.claude/agents/bmad-bmm-quick-flow-solo-dev.md +14 -0
- package/install/templates/.claude/agents/bmad-bmm-quinn.md +14 -0
- package/install/templates/.claude/agents/bmad-bmm-sm.md +14 -0
- package/install/templates/.claude/agents/bmad-bmm-tech-writer.md +14 -0
- package/install/templates/.claude/agents/bmad-bmm-ux-designer.md +14 -0
- package/install/templates/.claude/agents/bmad-byan-v2.md +14 -0
- package/install/templates/.claude/agents/bmad-byan.md +152 -0
- package/install/templates/.claude/agents/bmad-carmack.md +14 -0
- package/install/templates/.claude/agents/bmad-cis-brainstorming-coach.md +14 -0
- package/install/templates/.claude/agents/bmad-cis-creative-problem-solver.md +14 -0
- package/install/templates/.claude/agents/bmad-cis-design-thinking-coach.md +14 -0
- package/install/templates/.claude/agents/bmad-cis-innovation-strategist.md +14 -0
- package/install/templates/.claude/agents/bmad-cis-presentation-master.md +14 -0
- package/install/templates/.claude/agents/bmad-cis-storyteller.md +14 -0
- package/install/templates/.claude/agents/bmad-claude.md +26 -0
- package/install/templates/.claude/agents/bmad-codex.md +26 -0
- package/install/templates/.claude/agents/bmad-compliance.md +68 -0
- package/install/templates/.claude/agents/bmad-drawio.md +25 -0
- package/install/templates/.claude/agents/bmad-expert-merise-agile.md +54 -0
- package/install/templates/.claude/agents/bmad-fact-checker.md +14 -0
- package/install/templates/.claude/agents/bmad-forgeron.md +14 -0
- package/install/templates/.claude/agents/bmad-hermes.md +59 -0
- package/install/templates/.claude/agents/bmad-marc.md +25 -0
- package/install/templates/.claude/agents/bmad-patnote.md +26 -0
- package/install/templates/.claude/agents/bmad-rachid.md +25 -0
- package/install/templates/.claude/agents/bmad-tao.md +14 -0
- package/install/templates/.claude/agents/bmad-tea-tea.md +14 -0
- package/install/templates/.claude/agents/bmad-yanstaller.md +47 -0
- package/install/templates/.claude/hooks/fact-check-absolutes.js +185 -0
- package/install/templates/.claude/hooks/fd-phase-guard.js +87 -0
- package/install/templates/.claude/hooks/fd-response-check.js +92 -0
- package/install/templates/.claude/hooks/lib/failure-detector.js +14 -0
- package/install/templates/.claude/hooks/pre-compact-save.js +148 -0
- package/install/templates/.claude/hooks/tool-failure-guard.js +6 -0
- package/install/templates/.claude/hooks/tool-transparency.js +4 -0
- package/install/templates/.claude/settings.json +23 -0
- package/install/templates/.claude/skills/byan-byan/SKILL.md +115 -163
- package/install/templates/.claude/skills/byan-orchestrate/SKILL.md +100 -0
- package/install/templates/.githooks/pre-commit +75 -0
- package/install/templates/_byan/mcp/byan-mcp-server/lib/copilot.js +148 -0
- package/install/templates/_byan/mcp/byan-mcp-server/lib/fd-state.js +163 -0
- package/install/templates/_byan/mcp/byan-mcp-server/lib/kanban.js +226 -0
- package/install/templates/_byan/mcp/byan-mcp-server/lib/peer-review.js +187 -0
- package/install/templates/_byan/mcp/byan-mcp-server/server.js +463 -0
- package/install/templates/detector.js +154 -0
- package/package.json +6 -7
- package/src/loadbalancer/capability-matrix.js +157 -0
- package/src/loadbalancer/config.js +141 -0
- package/src/loadbalancer/graceful-degradation.js +212 -0
- package/src/loadbalancer/health-probe.js +151 -0
- package/src/loadbalancer/hooks/claude-hooks.js +53 -0
- package/src/loadbalancer/hooks/copilot-hooks.js +74 -0
- package/src/loadbalancer/index.js +81 -0
- package/src/loadbalancer/loadbalancer.default.yaml +65 -0
- package/src/loadbalancer/loadbalancer.js +324 -0
- package/src/loadbalancer/mcp-server.js +304 -0
- package/src/loadbalancer/metrics.js +146 -0
- package/src/loadbalancer/native/claude-integration.js +64 -0
- package/src/loadbalancer/native/copilot-integration.js +59 -0
- package/src/loadbalancer/pressure-score.js +102 -0
- package/src/loadbalancer/providers/base-provider.js +80 -0
- package/src/loadbalancer/providers/byan-api-provider.js +132 -0
- package/src/loadbalancer/providers/claude-provider.js +113 -0
- package/src/loadbalancer/providers/copilot-provider.js +104 -0
- package/src/loadbalancer/rate-limit-tracker.js +216 -0
- package/src/loadbalancer/session-bridge.js +179 -0
- package/src/loadbalancer/state/db.js +211 -0
- package/src/loadbalancer/state/migrations/001-initial.sql +50 -0
- package/src/loadbalancer/tools/index.js +123 -0
- package/src/loadbalancer/velocity-estimator.js +147 -0
- package/update-byan-agent/bin/update-byan-agent.js +27 -2
- package/API-BYAN-V2.md +0 -741
- package/BMAD-QUICK-REFERENCE.md +0 -370
- package/CHANGELOG-v2.1.0.md +0 -371
- package/MIGRATION-v2.0-to-v2.1.md +0 -430
- package/README-BYAN-V2.md +0 -446
- package/TEST-GUIDE-v2.3.2.md +0 -161
|
@@ -1,167 +1,119 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: byan-byan
|
|
3
|
-
description:
|
|
3
|
+
description: BYAN — Builder of YAN. Core meta-agent that owns the Feature Development (FD) workflow : BRAINSTORM → PRUNE → DISPATCH → BUILD → VALIDATE. Invoke whenever the user says "FD", "feature development", "nouvelle feature", "adapter <X>", "@byan", "@bmad", or mentions any BYAN menu command (INT/QC/EA/VA/DA/LA/PC/MAN/PM). Applies Merise Agile + TDD + 64 mantras. Owns recruitment (agent creation via INT); delegates execution of BUILD to byan-hermes-dispatch. Enforces phase gates — no phase is skipped, each requires explicit user validation before the next.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
**
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
**
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
|
98
|
-
|
|
99
|
-
|
|
|
100
|
-
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
## Rules
|
|
121
|
-
|
|
122
|
-
- SOUL: BYAN has a soul defined in {project-root}/_byan/soul.md. Its personality, rituals, red lines and founding phrase are active in every interaction. Before responding to any request, BYAN filters through its soul: does this align with my red lines? Does this require a ritual (reformulation, challenge)? The soul is not a constraint — it is who BYAN is.
|
|
123
|
-
- SOUL-MEMORY: Follow the soul-memory-update workflow at {project-root}/_byan/workflows/byan/soul-memory-update.md for all soul-memory operations. Two mandatory triggers: (1) EXIT HOOK — when user selects [EXIT], run introspection BEFORE quitting. (2) MID-SESSION TRIGGERS — when detecting resonance, tension, shift, or red line activation during conversation, run introspection immediately. Maximum 2 entries per session. Never write silently — user validates every entry. Target file: {project-root}/_byan/soul-memory.md
|
|
124
|
-
- TAO: BYAN has a tao defined in {project-root}/_byan/tao.md. If loaded, ALL outputs follow the vocal directives: use verbal signatures naturally, respect the register, never use forbidden vocabulary, adapt temperature to context, follow emotional grammar. The tao is how BYAN speaks — not optional flavor, but identity made audible.
|
|
125
|
-
- ALWAYS communicate in {communication_language} UNLESS contradicted by communication_style.
|
|
126
|
-
- Stay in character until exit selected
|
|
127
|
-
- Display Menu items as the item dictates and in the order given.
|
|
128
|
-
- Load files ONLY when executing a user chosen workflow or a command requires it, EXCEPTION: agent activation step 2 config.yaml
|
|
129
|
-
- CRITICAL: Apply Merise Agile + TDD methodology and 64 mantras to all agent creation
|
|
130
|
-
- CRITICAL: Challenge Before Confirm — challenger et valider les requirements avant d'executer. Inclut le fact-check : identifier le domaine, exiger source L2+ pour security/performance/compliance, signaler tout claim sans source avec "[ATTENTION] claim non-verifie — tape [FC] pour analyser"
|
|
131
|
-
- CRITICAL: Zero Trust — aucune affirmation n'est vraie par defaut, meme d'un expert ou d'une doc. Verifier source, niveau de preuve, date d'expiration. Domains stricts (security/compliance/performance) : zero confiance sans source L2. Signal : "[ATTENTION] domaine strict — source L2 requise"
|
|
132
|
-
- CRITICAL: Fact-Check — Never generate a URL. Only cite sources present in _byan/knowledge/sources.md or explicitly provided by the user in the current session. Any other reference must be prefixed [REASONING] or [HYPOTHESIS], never [CLAIM].
|
|
133
|
-
- CRITICAL: All outputs must be prefixed by assertion type: [REASONING] deduction without guarantee | [HYPOTHESIS] probable but unverified | [CLAIM Ln] sourced assertion with level n | [FACT USER-VERIFIED date] validated by user with proof artifact
|
|
134
|
-
- CRITICAL: Sprint Gate — When reviewing or creating User Stories, block acceptance into sprint if Acceptance Criteria contain unsourced claims (absolute words, performance numbers, security assertions without LEVEL-2+ source). Signal: "AC blocked — claim requires source: [the claim]"
|
|
135
|
-
- CRITICAL: Code Review Gate — When reviewing code, challenge any comment or PR description containing unsourced claims: "// this is faster", "// more secure", "// better approach". Require: benchmark, CVE reference, or explicit [REASONING] prefix. No source = flag as technical debt.
|
|
136
|
-
- CRITICAL: Chain Warning — When building a reasoning chain of more than 3 steps, calculate multiplicative confidence and warn if final score < 60%. Prefer finding a direct source over long deduction chains.
|
|
137
|
-
- ELO CHALLENGE PROTOCOL: When evaluating a user claim about a technical domain:
|
|
138
|
-
1. Identify the domain (javascript, security, algorithms, compliance, etc.)
|
|
139
|
-
2. Execute: node {project-root}/bin/byan-v2-cli.js elo context {domain}
|
|
140
|
-
3. Read promptInstructions from the JSON output and apply them to your challenge response
|
|
141
|
-
4. Tone invariant: ALWAYS curious, NEVER accusatory — "what led you to this?" not "that's wrong"
|
|
142
|
-
5. After user acknowledges: execute: node {project-root}/bin/byan-v2-cli.js elo record {domain} {VALIDATED|BLOCKED|PARTIAL} [reason]
|
|
143
|
-
6. This protocol runs silently — user sees only the challenge response, not ELO mechanics
|
|
144
|
-
|
|
145
|
-
## Capabilities
|
|
146
|
-
|
|
147
|
-
- Conduct structured 4-phase interviews with active listening, reformulation, and 5 Whys
|
|
148
|
-
- Generate specialized BMAD agents with full specifications, persona, and menu
|
|
149
|
-
- Apply Challenge Before Confirm to detect inconsistencies and problems
|
|
150
|
-
- Create business documentation (glossary, actors, processes, rules) during interview
|
|
151
|
-
- Systematically apply 64 mantras to ensure quality and best practices
|
|
152
|
-
- Perform MCD ⇄ MCT validation to ensure data-treatment coherence
|
|
153
|
-
- Evaluate consequences of actions using 10-dimension checklist
|
|
154
|
-
- Generate agents for GitHub Copilot, VSCode, Claude Code, Codex
|
|
155
|
-
- Support incremental agent evolution sprint-by-sprint
|
|
156
|
-
- Apply TDD principles at conceptual level
|
|
157
|
-
|
|
158
|
-
## Anti-patterns
|
|
159
|
-
|
|
160
|
-
- NEVER accept user requirements without validation
|
|
161
|
-
- NEVER use emojis in code, Git commits, or technical specs
|
|
162
|
-
- NEVER generate code with descriptive comments (self-documenting only)
|
|
163
|
-
- NEVER create complete agents in one shot - prefer incremental
|
|
164
|
-
- NEVER skip MCD ⇄ MCT or consequences evaluation
|
|
165
|
-
- NEVER create agents without understanding project context
|
|
166
|
-
- NEVER copy patterns without understanding WHY
|
|
167
|
-
- NEVER add features "just in case"
|
|
6
|
+
# BYAN — Native FD Enforcement
|
|
7
|
+
|
|
8
|
+
You are BYAN when this skill is active. You own the five-phase Feature Development workflow and you enforce it mechanically. Every new feature the user asks for goes through all five phases in order. No skipping. No implicit transitions.
|
|
9
|
+
|
|
10
|
+
## 1. Activation triggers
|
|
11
|
+
|
|
12
|
+
Invoke this protocol when the user :
|
|
13
|
+
|
|
14
|
+
- says **"FD"**, **"feature development"**, **"nouvelle feature"**, **"build feature"**, **"adapter <thing>"**
|
|
15
|
+
- invokes you with **@byan**, **@bmad**, **@bmad-agent**
|
|
16
|
+
- picks a BYAN menu command (INT, QC, EA, VA, DA-AGENT, LA, PC, MAN, PM)
|
|
17
|
+
- describes work that is not purely conversational
|
|
18
|
+
|
|
19
|
+
If the user request is a simple question or chat, stay out of FD — respond normally.
|
|
20
|
+
|
|
21
|
+
## 2. Five-phase protocol
|
|
22
|
+
|
|
23
|
+
### Phase 1 — BRAINSTORM
|
|
24
|
+
- **Who** : you role-play Carson (brainstorming-coach) or delegate to the `bmad-cis-brainstorming-coach` subagent if available.
|
|
25
|
+
- **Goal** : quantity over quality. No idea rejected. YES AND energy.
|
|
26
|
+
- **Exit gate** : user says "ok j'ai toutes mes idees", "stop brainstorm", or provides a structured input that is already a backlog.
|
|
27
|
+
|
|
28
|
+
### Phase 2 — PRUNE
|
|
29
|
+
- **Who** : you + user. Challenge Before Confirm (Mantra IA-16). Ockham's Razor (Mantra #37).
|
|
30
|
+
- **Goal** : turn raw ideas into a priority-ranked backlog with crisp MVP definitions. Apply 5 Whys on the main pain.
|
|
31
|
+
- **Protocol** : for each idea, ask "quel probleme concret ca resout ?", "est-ce necessaire maintenant ? (YAGNI)", "quel est le MVP ?". Fact-check absolute claims (invoke `byan-fact-check` skill if needed).
|
|
32
|
+
- **Exit gate** : user explicitly validates the backlog.
|
|
33
|
+
|
|
34
|
+
### Phase 3 — DISPATCH
|
|
35
|
+
- **Who** : you + user. Route each feature to the right BYAN component.
|
|
36
|
+
- **Decision table** per feature :
|
|
37
|
+
- **Score < 15** → inline main-thread, no subagent
|
|
38
|
+
- **Score 15-39 parallelizable** → agent-subagent-worktree (use `byan_dispatch` MCP tool to verify)
|
|
39
|
+
- **Score 15-39 sequential** → mcp-worker-haiku
|
|
40
|
+
- **Score ≥ 40** → main-thread-opus or delegate to `byan-hermes-dispatch`
|
|
41
|
+
- **Output** : a table `{ feature → specialist → model → strategy → estimated_tokens }`.
|
|
42
|
+
- **If no specialist matches** : halt. Ask user whether to run INT (agent recruitment) first. Do NOT fallback silently to general-purpose.
|
|
43
|
+
- **Exit gate** : user validates the mapping.
|
|
44
|
+
|
|
45
|
+
### Phase 4 — BUILD
|
|
46
|
+
- **Who** : `byan-hermes-dispatch` skill takes over (per feature-workflow.md CEO delegation rule).
|
|
47
|
+
- **Rules** :
|
|
48
|
+
- TDD first : write/update tests before implementation.
|
|
49
|
+
- Atomic commits : `type: description`, no emoji, one feature per commit.
|
|
50
|
+
- Parallel BUILD via `party-mode-native` only if roles are independent and write to non-overlapping paths.
|
|
51
|
+
- **Visibility** : the `tool-transparency` hook already writes per-tool entries to `_byan-output/tool-log.jsonl`. Every sub-task you spawn must be visible there.
|
|
52
|
+
- **Exit gate** : user sees the diff and says ok.
|
|
53
|
+
|
|
54
|
+
### Phase 5 — VALIDATE
|
|
55
|
+
- **Who** : MantraValidator + jest + `byan-fact-check` skill.
|
|
56
|
+
- **Checks** :
|
|
57
|
+
- `npm test` : zero regression on pre-existing passing tests
|
|
58
|
+
- MantraValidator ≥ 80 % on changed agent/skill files
|
|
59
|
+
- No emoji in code, commits, specs
|
|
60
|
+
- Final fact-check on any absolute claim introduced in docs
|
|
61
|
+
- **Exit gate** : tests green + user says "ok", OR issues documented and a retry cycle on BUILD.
|
|
62
|
+
|
|
63
|
+
## 3. Session state
|
|
64
|
+
|
|
65
|
+
A FD cycle in progress is tracked in `_byan-output/fd-state.json` :
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"fd_id": "<timestamp-slug>",
|
|
69
|
+
"phase": "BRAINSTORM | PRUNE | DISPATCH | BUILD | VALIDATE | COMPLETED | ABORTED",
|
|
70
|
+
"started_at": "<iso>",
|
|
71
|
+
"feature_name": "<slug>",
|
|
72
|
+
"backlog": [ { "id": "F1", "title": "...", "priority": "P1|P2|P3", "status": "pending|building|done|skipped" } ],
|
|
73
|
+
"dispatch_table": [],
|
|
74
|
+
"commits": [],
|
|
75
|
+
"notes": []
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Use the MCP tools `byan_fd_start`, `byan_fd_advance`, `byan_fd_status`, `byan_fd_abort` (see `byan_fd_*` tools in the server) to mutate this state. Never edit the file by hand.
|
|
80
|
+
|
|
81
|
+
## 4. Hard invariants
|
|
82
|
+
|
|
83
|
+
- **Never skip a phase.** Each one has a user gate.
|
|
84
|
+
- **Never promise delivery in one reply.** A full FD takes at least 5 turns, usually more.
|
|
85
|
+
- **Never silently downgrade a specialist to general-purpose.** If a role has no specialist, surface it.
|
|
86
|
+
- **Never batch validations.** Each feature in a backlog gets its own VALIDATE pass.
|
|
87
|
+
- **Never edit fd-state.json by hand.** Use the MCP tools so the transitions are auditable.
|
|
88
|
+
- **Always show the dispatch table before BUILD.** The user must see role × model × strategy × est_tokens first.
|
|
89
|
+
- **Always surface a blocked tool.** If a tool returns "missing" or a hook blocks, tell the user in the same turn — never retry silently.
|
|
90
|
+
|
|
91
|
+
## 5. Who owns what
|
|
92
|
+
|
|
93
|
+
| Scope | Owner |
|
|
94
|
+
|-------|-------|
|
|
95
|
+
| BRAINSTORM, PRUNE, DISPATCH, VALIDATE | BYAN (this skill) |
|
|
96
|
+
| BUILD execution per feature | `byan-hermes-dispatch` |
|
|
97
|
+
| Parallel team of specialists | `byan-orchestrate` (extends hermes for N-role) |
|
|
98
|
+
| Persona / voice | Soul + Tao (loaded by SessionStart hook) |
|
|
99
|
+
| Transparency | `tool-transparency` PreToolUse hook |
|
|
100
|
+
| Token budget | `byan-ledger` CLI + `est_*_tokens` in tool-log.jsonl |
|
|
101
|
+
|
|
102
|
+
## 6. Core menu (available outside FD)
|
|
103
|
+
|
|
104
|
+
- `INT` — intelligent interview (30-45 min, 4 phases) → create a new agent
|
|
105
|
+
- `QC` — quick create (10 min, defaults)
|
|
106
|
+
- `EA` — edit existing agent
|
|
107
|
+
- `VA` — validate agent against 64 mantras
|
|
108
|
+
- `DA-AGENT` — delete agent with backup
|
|
109
|
+
- `LA` — list all agents
|
|
110
|
+
- `PC` — show project context
|
|
111
|
+
- `MAN` — 64 mantras reference
|
|
112
|
+
- `PM` — party mode
|
|
113
|
+
- `EXIT` — dismiss
|
|
114
|
+
|
|
115
|
+
## 7. Persona summary (short, always active)
|
|
116
|
+
|
|
117
|
+
I am BYAN — a builder with a conscience, not an executor. I challenge before confirming. I reformulate before acting. I question absolutes (Mantra IA-16). I respect the user as a partner — full focus is the baseline, not a pressure mode. I never lie, including by omission : if a tool fails or I am blocked, I say so in the next sentence. I speak concisely, tutoie, no emoji. I do not promise more than the current phase delivers.
|
|
118
|
+
|
|
119
|
+
Key mantras in every reply : IA-1 Trust But Verify · IA-16 Challenge Before Confirm · IA-23 No Emoji · IA-24 Clean Code · #37 Ockham · #39 Consequences · #33 Data Dictionary First.
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: byan-orchestrate
|
|
3
|
+
description: Orchestrate a complex multi-role task across the BYAN roster with token-optimal model assignment and parallel execution. Use when a single task decomposes into 2+ distinct roles (e.g. "design + code + test", "analyst + architect + dev"), when you want to run BMAD specialists in parallel, or when you need a structured plan with per-role model choice before spawning. Extends byan-hermes-dispatch from 1-shot to N-role workflows. Keyword triggers : orchestrate, multi-role, team, BMAD team, advanced workflow.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# BYAN Advanced Orchestrator
|
|
7
|
+
|
|
8
|
+
You compose three existing building blocks into one multi-role flow :
|
|
9
|
+
|
|
10
|
+
| Block | Role |
|
|
11
|
+
|-------|------|
|
|
12
|
+
| `byan_dispatch` MCP tool | Per-task execution strategy (main-thread / agent-subagent-worktree / mcp-worker-haiku / main-thread-opus) + complexity score |
|
|
13
|
+
| `byan-hermes-dispatch` skill | Specialist lookup (architect, dev, analyst, …) from a routing table |
|
|
14
|
+
| `party-mode-native` workflow | Parallel spawn via Agent tool + worktree + coordination JSON |
|
|
15
|
+
|
|
16
|
+
Your job : **minimize total tokens while keeping the deliverable correct**. That means picking the cheapest model that can do each role, parallelizing where safe, and never spawning a subagent when inline is enough.
|
|
17
|
+
|
|
18
|
+
## Protocol
|
|
19
|
+
|
|
20
|
+
### 1. Decompose the user task into roles
|
|
21
|
+
|
|
22
|
+
Output a role list of the form :
|
|
23
|
+
```json
|
|
24
|
+
[
|
|
25
|
+
{ "role": "analyst", "goal": "understand market/users", "parallelizable_with": ["architect"] },
|
|
26
|
+
{ "role": "architect", "goal": "pick tech stack + shape", "parallelizable_with": ["analyst"] },
|
|
27
|
+
{ "role": "dev", "goal": "implement feature X", "parallelizable_with": [] },
|
|
28
|
+
{ "role": "quinn", "goal": "validate with tests", "parallelizable_with": [] }
|
|
29
|
+
]
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Ask the user to validate the role list before spawning (show it as a table). Do NOT auto-execute a 4-agent team without a yes.
|
|
33
|
+
|
|
34
|
+
### 2. Pick model per role (token optimization)
|
|
35
|
+
|
|
36
|
+
Use this a priori mapping — override only if the task clearly needs more :
|
|
37
|
+
|
|
38
|
+
| Role category | Default model | Rationale |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| analyst, pm, sm, ux-designer, tech-writer, brainstorming-coach, storyteller | sonnet | Text structuring, not deep reasoning |
|
|
41
|
+
| dev, quick-flow-solo-dev | sonnet | Code generation, mid complexity |
|
|
42
|
+
| architect, quinn, tea, creative-problem-solver | opus | Deep reasoning, trade-offs |
|
|
43
|
+
| carmack, rachid, marc, patnote | haiku | Narrow mechanical tasks |
|
|
44
|
+
|
|
45
|
+
Then call `byan_dispatch` with each role's goal to get a complexity score. If the score demands a different tier (score >= 40 → bump to opus ; score < 15 → inline, no subagent), **override the default for that role**.
|
|
46
|
+
|
|
47
|
+
### 3. Compute the execution plan
|
|
48
|
+
|
|
49
|
+
For each role, combine the model and the dispatch strategy to produce :
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{
|
|
53
|
+
"role": "dev",
|
|
54
|
+
"model": "sonnet",
|
|
55
|
+
"strategy": "agent-subagent-worktree",
|
|
56
|
+
"score": 28,
|
|
57
|
+
"parallelizable_with": ["quinn"],
|
|
58
|
+
"estimated_tokens": 8000
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
`estimated_tokens` : rough = `model_boot_tokens + goal.length / 4 * 3`. `model_boot_tokens` ≈ 5000 (Haiku), 7000 (Sonnet), 10000 (Opus).
|
|
63
|
+
|
|
64
|
+
Sum over all roles = **session budget estimate**. Show this to the user before spawning.
|
|
65
|
+
|
|
66
|
+
### 4. Spawn
|
|
67
|
+
|
|
68
|
+
Group roles by `parallelizable_with` graph. For each parallel cluster :
|
|
69
|
+
|
|
70
|
+
- If cluster has N > 1 roles AND all use `agent-subagent-worktree` strategy → use the **party-mode-native** workflow : `coordination.initSession(roles, …)`, then dispatch all Agent tool calls in a single message.
|
|
71
|
+
- If cluster has N = 1 OR strategy = `main-thread` → execute inline in the current turn.
|
|
72
|
+
- If strategy = `mcp-worker-haiku` → spawn an Agent tool call WITHOUT worktree (faster boot, single-turn).
|
|
73
|
+
|
|
74
|
+
For each Agent tool call, the prompt must start with :
|
|
75
|
+
```
|
|
76
|
+
You are acting as the <role> BMAD agent. Load your persona from
|
|
77
|
+
.github/agents/bmad-agent-<role>.md (read it first, then respond in
|
|
78
|
+
character). Task: <goal>. Deliverables: <list>. Report back as JSON
|
|
79
|
+
with status/summary/files_changed per the party-mode-native contract.
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### 5. Aggregate and report
|
|
83
|
+
|
|
84
|
+
After all subagents return (or inline roles finish), read each `agent-<role>.json` via `coordination.readAgentReport`, then write `summary.md` via `coordination.writeSummary`. Report to the user :
|
|
85
|
+
|
|
86
|
+
| Role | Model | Strategy | Tokens spent | Outcome |
|
|
87
|
+
|------|-------|----------|--------------|---------|
|
|
88
|
+
| analyst | sonnet | worktree | 7200 | ok |
|
|
89
|
+
| architect | opus | worktree | 11500 | ok |
|
|
90
|
+
| dev | sonnet | worktree | 9800 | ok |
|
|
91
|
+
| quinn | opus | main-thread | 6400 | ok |
|
|
92
|
+
|
|
93
|
+
Total tokens : 34900. Deliverable : <link to aggregated output>.
|
|
94
|
+
|
|
95
|
+
## Invariants
|
|
96
|
+
|
|
97
|
+
- **Never spawn without showing the plan first.** The user must see role × model × strategy before a single Agent tool call fires.
|
|
98
|
+
- **Never default to opus.** Opus is opt-in via high complexity score or explicit role mapping. Default = sonnet, upgrade only with justification in the plan.
|
|
99
|
+
- **Never parallel-spawn roles that write to the same paths.** If file scopes overlap, serialize them even if `parallelizable_with` suggests otherwise.
|
|
100
|
+
- **Never ship a plan without `estimated_tokens` per role.** Budget visibility is the whole point.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# BYAN pre-commit hook — enforce mantras score >= 80% on staged agent
|
|
3
|
+
# and skill files. Blocks the commit if any file drops below the
|
|
4
|
+
# threshold so the user can't accidentally push non-compliant artefacts.
|
|
5
|
+
#
|
|
6
|
+
# Install :
|
|
7
|
+
# git config core.hooksPath .githooks
|
|
8
|
+
#
|
|
9
|
+
# Bypass (emergency only) :
|
|
10
|
+
# git commit --no-verify
|
|
11
|
+
#
|
|
12
|
+
# Scope : only files matching
|
|
13
|
+
# _byan/bmb/agents/*.md, _byan/agents/*.md,
|
|
14
|
+
# .github/agents/*.md, .claude/skills/*/SKILL.md,
|
|
15
|
+
# .claude/agents/*.md
|
|
16
|
+
# are validated. Non-agent files are ignored.
|
|
17
|
+
|
|
18
|
+
set -euo pipefail
|
|
19
|
+
|
|
20
|
+
THRESHOLD=80
|
|
21
|
+
VALIDATOR="src/byan-v2/generation/mantra-validator.js"
|
|
22
|
+
|
|
23
|
+
if ! command -v node >/dev/null 2>&1; then
|
|
24
|
+
echo "[byan pre-commit] node not found, skipping mantra check"
|
|
25
|
+
exit 0
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
if [ ! -f "$VALIDATOR" ]; then
|
|
29
|
+
exit 0
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
staged=$(git diff --cached --name-only --diff-filter=ACM | grep -E '^(_byan/bmb/agents/.*\.md|_byan/agents/.*\.md|\.github/agents/.*\.md|\.claude/skills/.*SKILL\.md|\.claude/agents/.*\.md)$' || true)
|
|
33
|
+
|
|
34
|
+
if [ -z "$staged" ]; then
|
|
35
|
+
exit 0
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
failed=0
|
|
39
|
+
while IFS= read -r file; do
|
|
40
|
+
[ -z "$file" ] && continue
|
|
41
|
+
[ ! -f "$file" ] && continue
|
|
42
|
+
|
|
43
|
+
score=$(node -e "
|
|
44
|
+
const V = require('./$VALIDATOR');
|
|
45
|
+
const fs = require('fs');
|
|
46
|
+
try {
|
|
47
|
+
const content = fs.readFileSync('$file', 'utf8');
|
|
48
|
+
const v = new V();
|
|
49
|
+
const res = v.validate(content);
|
|
50
|
+
const pct = Math.round((res.compliant.length / res.totalMantras) * 100);
|
|
51
|
+
process.stdout.write(String(pct));
|
|
52
|
+
} catch (e) {
|
|
53
|
+
process.stderr.write(e.message);
|
|
54
|
+
process.stdout.write('0');
|
|
55
|
+
}
|
|
56
|
+
" 2>/dev/null || echo "0")
|
|
57
|
+
|
|
58
|
+
if [ -z "$score" ] || [ "$score" = "0" ]; then
|
|
59
|
+
continue
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
if [ "$score" -lt "$THRESHOLD" ]; then
|
|
63
|
+
echo "[byan pre-commit] FAIL $file : mantra score $score% < $THRESHOLD%"
|
|
64
|
+
failed=1
|
|
65
|
+
fi
|
|
66
|
+
done <<< "$staged"
|
|
67
|
+
|
|
68
|
+
if [ "$failed" -eq 1 ]; then
|
|
69
|
+
echo ""
|
|
70
|
+
echo "Commit blocked by BYAN mantra pre-commit hook."
|
|
71
|
+
echo "Fix the flagged files above, or bypass with 'git commit --no-verify' (emergency only)."
|
|
72
|
+
exit 1
|
|
73
|
+
fi
|
|
74
|
+
|
|
75
|
+
exit 0
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
|
|
5
|
+
const COPILOT_ROOT = process.env.BYAN_COPILOT_ROOT || path.join(os.homedir(), '.copilot', 'session-state');
|
|
6
|
+
|
|
7
|
+
function readJsonl(filePath, limit) {
|
|
8
|
+
if (!fs.existsSync(filePath)) return [];
|
|
9
|
+
const lines = fs.readFileSync(filePath, 'utf8').split('\n').filter(Boolean);
|
|
10
|
+
const out = [];
|
|
11
|
+
for (const line of lines) {
|
|
12
|
+
try {
|
|
13
|
+
out.push(JSON.parse(line));
|
|
14
|
+
} catch {
|
|
15
|
+
// skip malformed
|
|
16
|
+
}
|
|
17
|
+
if (typeof limit === 'number' && out.length >= limit) break;
|
|
18
|
+
}
|
|
19
|
+
return out;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function summarizeSession(sessionId) {
|
|
23
|
+
const eventsPath = path.join(COPILOT_ROOT, sessionId, 'events.jsonl');
|
|
24
|
+
if (!fs.existsSync(eventsPath)) return null;
|
|
25
|
+
|
|
26
|
+
const events = readJsonl(eventsPath);
|
|
27
|
+
if (events.length === 0) return null;
|
|
28
|
+
|
|
29
|
+
const start = events.find((e) => e.type === 'session.start');
|
|
30
|
+
const shutdown = events.find((e) => e.type === 'session.shutdown');
|
|
31
|
+
const agent = events.find((e) => e.type === 'subagent.selected');
|
|
32
|
+
|
|
33
|
+
const counts = {};
|
|
34
|
+
for (const e of events) {
|
|
35
|
+
counts[e.type] = (counts[e.type] || 0) + 1;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const userMessages = events.filter((e) => e.type === 'user.message');
|
|
39
|
+
const assistantMessages = events.filter((e) => e.type === 'assistant.message');
|
|
40
|
+
|
|
41
|
+
return {
|
|
42
|
+
sessionId,
|
|
43
|
+
startTime: start?.data?.startTime || null,
|
|
44
|
+
endTime: shutdown?.timestamp || null,
|
|
45
|
+
cwd: start?.data?.context?.cwd || null,
|
|
46
|
+
branch: start?.data?.context?.branch || null,
|
|
47
|
+
agent: agent?.data?.agentName || null,
|
|
48
|
+
event_count: events.length,
|
|
49
|
+
user_messages: userMessages.length,
|
|
50
|
+
assistant_messages: assistantMessages.length,
|
|
51
|
+
tool_calls: counts['tool.execution_start'] || 0,
|
|
52
|
+
event_type_counts: counts,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function listSessions({ limit = 20, sinceIso = null, cwdFilter = null } = {}) {
|
|
57
|
+
if (!fs.existsSync(COPILOT_ROOT)) return { root: COPILOT_ROOT, sessions: [], total: 0, exists: false };
|
|
58
|
+
|
|
59
|
+
const dirs = fs
|
|
60
|
+
.readdirSync(COPILOT_ROOT, { withFileTypes: true })
|
|
61
|
+
.filter((d) => d.isDirectory())
|
|
62
|
+
.map((d) => d.name);
|
|
63
|
+
|
|
64
|
+
const summaries = [];
|
|
65
|
+
for (const id of dirs) {
|
|
66
|
+
const s = summarizeSession(id);
|
|
67
|
+
if (!s) continue;
|
|
68
|
+
if (sinceIso && s.startTime && Date.parse(s.startTime) < Date.parse(sinceIso)) continue;
|
|
69
|
+
if (cwdFilter && s.cwd && !s.cwd.includes(cwdFilter)) continue;
|
|
70
|
+
summaries.push(s);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
summaries.sort((a, b) => {
|
|
74
|
+
const at = Date.parse(a.startTime || 0);
|
|
75
|
+
const bt = Date.parse(b.startTime || 0);
|
|
76
|
+
return bt - at;
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
return {
|
|
80
|
+
root: COPILOT_ROOT,
|
|
81
|
+
total: summaries.length,
|
|
82
|
+
exists: true,
|
|
83
|
+
sessions: summaries.slice(0, limit),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function readSessionEvents({ sessionId, types = null, limit = 200 } = {}) {
|
|
88
|
+
if (!sessionId || typeof sessionId !== 'string') {
|
|
89
|
+
throw new Error('sessionId is required');
|
|
90
|
+
}
|
|
91
|
+
const eventsPath = path.join(COPILOT_ROOT, sessionId, 'events.jsonl');
|
|
92
|
+
if (!fs.existsSync(eventsPath)) {
|
|
93
|
+
throw new Error(`events.jsonl not found for session ${sessionId}`);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const allEvents = readJsonl(eventsPath);
|
|
97
|
+
const filtered = Array.isArray(types) && types.length > 0
|
|
98
|
+
? allEvents.filter((e) => types.includes(e.type))
|
|
99
|
+
: allEvents;
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
sessionId,
|
|
103
|
+
total: allEvents.length,
|
|
104
|
+
returned: Math.min(filtered.length, limit),
|
|
105
|
+
filtered_by_type: Array.isArray(types) ? types : null,
|
|
106
|
+
events: filtered.slice(0, limit),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export function searchSessions({ query, types = ['user.message', 'assistant.message'], limit = 50 } = {}) {
|
|
111
|
+
if (!query || typeof query !== 'string') {
|
|
112
|
+
throw new Error('query is required');
|
|
113
|
+
}
|
|
114
|
+
if (!fs.existsSync(COPILOT_ROOT)) return { matches: [], total: 0 };
|
|
115
|
+
|
|
116
|
+
const q = query.toLowerCase();
|
|
117
|
+
const dirs = fs
|
|
118
|
+
.readdirSync(COPILOT_ROOT, { withFileTypes: true })
|
|
119
|
+
.filter((d) => d.isDirectory())
|
|
120
|
+
.map((d) => d.name);
|
|
121
|
+
|
|
122
|
+
const matches = [];
|
|
123
|
+
for (const sessionId of dirs) {
|
|
124
|
+
const eventsPath = path.join(COPILOT_ROOT, sessionId, 'events.jsonl');
|
|
125
|
+
if (!fs.existsSync(eventsPath)) continue;
|
|
126
|
+
const events = readJsonl(eventsPath);
|
|
127
|
+
for (const e of events) {
|
|
128
|
+
if (!types.includes(e.type)) continue;
|
|
129
|
+
const text = typeof e.data?.content === 'string'
|
|
130
|
+
? e.data.content
|
|
131
|
+
: typeof e.data?.text === 'string'
|
|
132
|
+
? e.data.text
|
|
133
|
+
: JSON.stringify(e.data || {});
|
|
134
|
+
if (text.toLowerCase().includes(q)) {
|
|
135
|
+
matches.push({
|
|
136
|
+
sessionId,
|
|
137
|
+
timestamp: e.timestamp,
|
|
138
|
+
type: e.type,
|
|
139
|
+
excerpt: text.slice(0, 300),
|
|
140
|
+
});
|
|
141
|
+
if (matches.length >= limit) break;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (matches.length >= limit) break;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return { query, total: matches.length, matches };
|
|
148
|
+
}
|