create-byan-agent 2.41.0 → 2.44.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.
Files changed (77) hide show
  1. package/CHANGELOG.md +144 -0
  2. package/install/bin/byan-handoff.js +139 -0
  3. package/install/bin/byan-kanban.js +1 -1
  4. package/install/bin/create-byan-agent-v2.js +133 -112
  5. package/install/lib/byan-leantime-integration.js +2 -2
  6. package/install/lib/byan-web-integration.js +5 -5
  7. package/install/lib/claude-native-setup.js +11 -11
  8. package/install/lib/codex-native-setup.js +96 -4
  9. package/install/lib/exchange/agent-packager.js +1 -1
  10. package/install/lib/mcp-extensions/gdrive.js +5 -5
  11. package/install/lib/mcp-extensions/index.js +5 -5
  12. package/install/lib/phase2-chat.js +21 -21
  13. package/install/lib/platforms/claude-code.js +2 -2
  14. package/install/lib/project-agents-generator.js +4 -4
  15. package/install/lib/project-handoff.js +300 -0
  16. package/install/lib/rtk-integration.js +81 -14
  17. package/install/lib/staging-consent.js +1 -1
  18. package/install/lib/subagent-generator.js +2 -3
  19. package/install/lib/utils/logger.js +4 -4
  20. package/install/lib/utils/node-detector.js +1 -1
  21. package/install/lib/yanstaller/agent-launcher.js +1 -1
  22. package/install/lib/yanstaller/index.js +11 -116
  23. package/install/lib/yanstaller/platform-selector.js +11 -11
  24. package/install/src/byan-v2/dispatcher/task-router.js +1 -1
  25. package/install/src/index.js +1 -1
  26. package/install/src/webui/api.js +0 -13
  27. package/install/src/webui/chat/bridge.js +1 -1
  28. package/install/src/webui/chat/cli-detector.js +1 -1
  29. package/install/templates/.claude/CLAUDE.md +16 -0
  30. package/install/templates/.claude/rules/native-workflows.md +22 -14
  31. package/install/templates/.claude/settings.json +24 -24
  32. package/install/templates/.claude/skills/byan-byan/SKILL.md +14 -0
  33. package/install/templates/.claude/skills/byan-codex/SKILL.md +7 -0
  34. package/install/templates/.codex/skills/byan/SKILL.md +77 -0
  35. package/install/templates/_byan/COMPLETION-REPORT.md +0 -1
  36. package/install/templates/_byan/INDEX.md +6 -2
  37. package/install/templates/_byan/_config/workflow-manifest.csv +1 -1
  38. package/install/templates/_byan/core/activation/soul-activation.md +3 -3
  39. package/install/templates/_byan/mcp/byan-mcp-server/bin/byan-lint-workflows.js +6 -3
  40. package/install/templates/_byan/mcp/byan-mcp-server/lib/native-tiers.js +35 -17
  41. package/install/templates/_byan/mcp/byan-mcp-server/lib/workflows-lint.js +38 -0
  42. package/install/templates/_byan/mcp/byan-mcp-server/skill-bundles-manifest.json +2 -2
  43. package/install/templates/_byan/worker/workers.md +1 -1
  44. package/install/templates/_byan/workflow/simple/byan/project-handoff-workflow.md +90 -0
  45. package/install/templates/dist/skill-bundles/byan-byan.zip +0 -0
  46. package/install/templates/dist/skill-bundles/byan-codex.zip +0 -0
  47. package/install/templates/docs/codex-auto-delegation.md +140 -0
  48. package/package.json +2 -1
  49. package/src/byan-v2/dispatcher/task-router.js +1 -1
  50. package/src/byan-v2/lib/layout-resolver.js +3 -6
  51. package/install/lib/yanstaller/installer.js +0 -138
  52. package/install/lib/yanstaller/interviewer.js +0 -88
  53. package/install/lib/yanstaller/recommender.js +0 -102
  54. package/install/lib/yanstaller/troubleshooter.js +0 -89
  55. package/install/lib/yanstaller/validator.js +0 -198
  56. package/install/lib/yanstaller/wizard.js +0 -109
  57. package/install/src/byan-v2/dispatcher/task-tool-interface-mock.js +0 -134
  58. package/install/src/byan-v2/dispatcher/task-tool-interface.js +0 -123
  59. package/install/templates/_bmad/bmb/agents/agent-builder.md +0 -59
  60. package/install/templates/_bmad/bmb/agents/byan-test.md +0 -116
  61. package/install/templates/_bmad/bmb/agents/byan.md +0 -215
  62. package/install/templates/_bmad/bmb/agents/marc.md +0 -303
  63. package/install/templates/_bmad/bmb/agents/module-builder.md +0 -60
  64. package/install/templates/_bmad/bmb/agents/patnote.md +0 -495
  65. package/install/templates/_bmad/bmb/agents/rachid.md +0 -184
  66. package/install/templates/_bmad/bmb/agents/workflow-builder.md +0 -61
  67. package/install/templates/_bmad/bmb/workflows/byan/data/mantras.yaml +0 -272
  68. package/install/templates/_bmad/bmb/workflows/byan/data/templates.yaml +0 -59
  69. package/install/templates/_bmad/bmb/workflows/byan/delete-agent-workflow.md +0 -657
  70. package/install/templates/_bmad/bmb/workflows/byan/edit-agent-workflow.md +0 -688
  71. package/install/templates/_bmad/bmb/workflows/byan/interview-workflow.md +0 -753
  72. package/install/templates/_bmad/bmb/workflows/byan/quick-create-workflow.md +0 -450
  73. package/install/templates/_bmad/bmb/workflows/byan/templates/base-agent-template.md +0 -79
  74. package/install/templates/_bmad/bmb/workflows/byan/validate-agent-workflow.md +0 -676
  75. package/install/templates/_bmad/core/agents/carmack.md +0 -238
  76. package/src/byan-v2/dispatcher/task-tool-interface-mock.js +0 -134
  77. package/src/byan-v2/dispatcher/task-tool-interface.js +0 -123
package/CHANGELOG.md CHANGED
@@ -9,6 +9,150 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9
9
 
10
10
  ## [Unreleased]
11
11
 
12
+ ## [2.44.0] - 2026-07-15
13
+
14
+ ### Changed - Revived the Sonnet middle tier for native-workflow model routing
15
+
16
+ - Native-workflow ANALYSIS leaves (score/rank/assess/design/nfr/coverage/
17
+ recommend/synthesize) now auto-route to the balanced tier (`model: 'sonnet'`)
18
+ instead of `deep` (inherit the session model). Before this, the Sonnet rung was
19
+ reachable only through the explicit `mech-` opt-in, so on an Opus (or high-effort)
20
+ session every analysis/verification/implementation leaf ran on Opus — the Sonnet
21
+ tier was effectively dead (ledger: recent workflows logged all-`inherit`).
22
+ - This deliberately overrides the session model for analysis leaves; a genuinely
23
+ frontier analysis opts back to the session model with the `deep-` label prefix
24
+ (`deep-assess-architecture`), the mirror of the `mech-` opt-in. VERIFICATION and
25
+ IMPLEMENTATION are untouched — a wrong check or a code-write still inherits the
26
+ session model (no silent downgrade of the dangerous classes).
27
+ - Propagated through the enforcement stack: `modelRoutingViolations` accepts sonnet
28
+ on an analysis leaf (its tier) and still blocks haiku (`analysis-below-tier`) and
29
+ any downgrade on a protected leaf; added a non-blocking `untiered-analysis`
30
+ advisory (surfaces an analysis leaf running deep, suggests `model: 'sonnet'`).
31
+ Files: `native-tiers.js` (tierFor + `DEEP_PREFIX` + `synthes` keyword),
32
+ `workflows-lint.js`, `bin/byan-lint-workflows.js`, native-workflows.md.
33
+ - The 21 committed workflows still pass the contract; MCP 792 + jest 2606 green.
34
+
35
+ ## [2.43.0] - 2026-07-10
36
+
37
+ ### Removed - Purged the Gen1 `_bmad/` legacy layer
38
+
39
+ - Removed the Gen1 `_bmad/` fallback from the layout resolver
40
+ (`src/byan-v2/lib/layout-resolver.js`): `resolveAgent` / `agentDirs` now resolve
41
+ Gen3 (`_byan/agent/<name>/`) and Gen2 (`_byan/agents/`, `_byan/<module>/agents/`)
42
+ only. A pre-Gen3 project on the raw `_bmad/` layout is migrated with
43
+ `scripts/migrate-bmad-to-byan.js` (agents land under `_byan/`, resolved by the
44
+ Gen2 branches). Added a regression test locking Gen1 resolution to null.
45
+ - Deleted the frozen Gen1 content: `_bmad/` (677 files) and the dead shipped
46
+ template `install/templates/_bmad/` (17 files) that the installer does not copy
47
+ (it scaffolds `templates/_byan/`). Neither carried a live code path.
48
+ - Removed the dead `marc` agent residues (a GitHub Copilot CLI specialist for the
49
+ already-removed Copilot platform, present only under `_bmad/`): the
50
+ `subagent-generator` model-map key, an `agent-launcher` jsdoc example, and the
51
+ `marc.md` entry in the migrator's agent list.
52
+ - Migrated `_bmad` doc references to `_byan` (CLAUDE.md, QUICK-START,
53
+ GUIDE-UTILISATION, soul-activation, workers) and cleaned stale Gen1
54
+ comments / dead branches (agent-packager, bridge, cli-detector, index example).
55
+ - Kept the migration back-compat intact: the webui legacy-install detection, the
56
+ `migrate-bmad-to-byan` script, `stub-sync`, and the `_bmad-output` user-data scan.
57
+
58
+ ### Note - Known follow-up
59
+
60
+ - `install/install.sh` (a dormant legacy shell installer) still scaffolds a Gen1
61
+ `_bmad/` tree and promotes GitHub Copilot CLI. It ships but is not run by the
62
+ npx flow. It needs a dedicated rework to align with the Gen3-only, Copilot-free
63
+ product; deliberately left out of this purge to avoid touching an untested
64
+ installer path.
65
+
66
+ ## [2.42.1] - 2026-07-06
67
+
68
+ ### Changed - Excised the dead stub half of the yanstaller module
69
+
70
+ - Removed six pure-stub files under `install/lib/yanstaller/` that had no caller
71
+ (`installer.js`, `validator.js`, `recommender.js`, `interviewer.js`,
72
+ `troubleshooter.js`, `wizard.js`). `installer.js` faked a successful install
73
+ without touching the disk; `validator.js` returned `passed: true` for its ten
74
+ checks without inspecting anything. The real installer is
75
+ `install/bin/create-byan-agent-v2.js`.
76
+ - Dropped the half-implemented `install()`/`uninstall()` orchestrator from
77
+ `install/lib/yanstaller/index.js`. The live surface consumed by the CLI
78
+ (`update` / `rollback` / `backups` / `check`) and the web UI is untouched:
79
+ `update`, `rollback`, `listBackups`, plus the `detector` / `platformSelector`
80
+ / `updater` / `backuper` modules.
81
+ - Removed the dead `yanstaller.install()` call from the web UI install path
82
+ (`install/src/webui/api.js`); it already had its own directory/config
83
+ fallback and had logged that call as a stub.
84
+ - Added `install/__tests__/yanstaller/no-stub-guard.test.js`, a regression guard
85
+ that keeps the excised stubs from creeping back and locks the surviving public
86
+ surface. Net: -853 / +11 lines shipped to npm consumers.
87
+
88
+ ### Changed - Purged emoji from the installer CLI output (Mantra IA-23)
89
+
90
+ - Removed every emoji from the 16 live installer files under `install/lib/` and
91
+ `install/bin/` (201 occurrences). Status glyphs became bracket tags matching
92
+ the existing `[DEBUG]` idiom: `[OK]` / `[INFO]` / `[WARN]` / `[ERROR]` / `[x]`;
93
+ decorative glyphs were dropped and the arrow `->` de-symbolized. Message text,
94
+ colors, and control flow are unchanged (a `git diff -w` is emoji-only).
95
+ - Updated the two coupled tests in lockstep: `install/__tests__/utils/logger.test.js`
96
+ and `install/__tests__/integration/platform-integration.test.js`.
97
+
98
+ ### Removed - Dead Copilot-era task-tool-interface stub
99
+
100
+ - Deleted `task-tool-interface.js` + `-mock.js` from both `src/byan-v2/dispatcher/`
101
+ and `install/src/byan-v2/dispatcher/`, plus their test. The module had no caller
102
+ outside its own test. Scrubbed the five stale `TaskToolInterface` doc references
103
+ it left behind (`task-router` JSDoc + `COMPLETION-REPORT.md`).
104
+
105
+ ## [2.42.0] - 2026-07-06
106
+
107
+ ### Fixed - Shipped Claude Code hooks no longer spam MODULE_NOT_FOUND
108
+ - **Every hook command in the shipped `.claude/settings.json` is now
109
+ self-guarded.** The hooks run on every tool (empty matcher); a bare
110
+ `node "$CLAUDE_PROJECT_DIR"/.claude/hooks/X.js` threw `MODULE_NOT_FOUND` on
111
+ every tool call whenever the script was not resolvable — a non-BYAN project, an
112
+ empty `$CLAUDE_PROJECT_DIR`, a partial install, or version drift. Each command
113
+ is now `p="$CLAUDE_PROJECT_DIR/.claude/hooks/X.js"; [ -f "$p" ] || exit 0; exec
114
+ node "$p"`: a missing script no-ops with exit 0 (the tool proceeds), a present
115
+ script runs via `exec` so its exit code is preserved (a blocking PreToolUse /
116
+ Stop guard still blocks). Covered by
117
+ `install/__tests__/hook-invocation-guard.test.js` (guarded-shape on all 24
118
+ commands + runtime sh simulation: absent/empty -> 0, blocker -> 2, stdin
119
+ passthrough).
120
+
121
+ ### Changed - Handoff auto-import instructions
122
+ - **Claude and Codex activation surfaces now know how to handle
123
+ `importe depuis claude` / `importe depuis codex` automatically.** `CLAUDE.md`
124
+ and BYAN skills instruct the assistant to run
125
+ `byan-handoff latest --from <source> --prompt` and resume from the generated
126
+ context without relying on native assistant memory.
127
+
128
+ ### Added - Portable Claude/Codex Markdown handoff
129
+ - **BYAN can now export/import project state as a portable Markdown handoff for
130
+ switching between Claude Code and Codex.** The new `byan-handoff` CLI writes
131
+ handoffs under `_byan-output/handoffs/`, embeds a parseable
132
+ `json byan-handoff` block, and can print a compact resume prompt via
133
+ `byan-handoff latest --from <source> --prompt` or
134
+ `byan-handoff import <file> --prompt`.
135
+ A new `project-handoff` BYAN workflow documents the limit-switch protocol.
136
+ Covered by `install/__tests__/project-handoff.test.js`.
137
+
138
+ ### Changed - RTK offered on Codex-selected installs
139
+ - **Yanstaller now offers RTK when the selected target includes Codex, not only
140
+ Claude Code.** Claude Code keeps the transparent `rtk init -g --auto-patch`
141
+ hook path. Codex installs get the verified native `rtk` binary and an explicit
142
+ no-transparent-hook status, matching BYAN's current Codex adapter model.
143
+ Covered by `install/__tests__/rtk-integration.test.js`.
144
+
145
+ ### Added - Codex native skills in yanstaller
146
+ - **Codex installs now get real native skills, not just project prompt stubs.**
147
+ When the yanstaller target includes Codex (Codex-only or Claude+Codex), it
148
+ writes the BYAN MCP entry to `~/.codex/config.toml` and copies BYAN skill
149
+ folders into `~/.codex/skills`, creating `~/.codex` when Codex was explicitly
150
+ selected. The project template also ships `.codex/skills/byan/SKILL.md`, so a
151
+ fresh Codex install has a native skill named `byan` in addition to the
152
+ Claude-derived BYAN specialty skills. This closes the gap where a fresh
153
+ machine had `.codex/prompts/` and MCP wiring but no native `$byan` / BYAN skill
154
+ surface for delegation. Covered by `install/__tests__/codex-native-setup.test.js`.
155
+
12
156
  ### Added - Codex auto-delegation (opt-in, native)
13
157
  - **BYAN now proposes handing delegable work to Codex on your ChatGPT
14
158
  subscription (no API credit) when Claude nears its 5h limit.** A
@@ -0,0 +1,139 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const fs = require('fs');
5
+ const path = require('path');
6
+ const {
7
+ buildHandoff,
8
+ latestHandoff,
9
+ parseMarkdown,
10
+ renderMarkdown,
11
+ renderResumePrompt,
12
+ writeHandoff,
13
+ } = require('../lib/project-handoff');
14
+
15
+ function usage() {
16
+ return [
17
+ 'byan-handoff export [--from claude|codex] [--to codex|claude] [--task <text>] [--summary <text>] [--next <text>] [--out <file>] [--root <dir>] [--stdout]',
18
+ 'byan-handoff import <file> [--prompt] [--json] [--root <dir>]',
19
+ 'byan-handoff latest [--from claude|codex] [--prompt] [--json] [--root <dir>]',
20
+ ].join('\n');
21
+ }
22
+
23
+ function parseArgs(argv) {
24
+ const args = {
25
+ cmd: argv[2] || 'export',
26
+ root: process.cwd(),
27
+ from: null,
28
+ to: null,
29
+ task: null,
30
+ summary: null,
31
+ out: null,
32
+ stdout: false,
33
+ prompt: false,
34
+ json: false,
35
+ next: [],
36
+ decisions: [],
37
+ blockers: [],
38
+ commands: [],
39
+ notes: [],
40
+ file: null,
41
+ };
42
+
43
+ for (let i = 3; i < argv.length; i++) {
44
+ const a = argv[i];
45
+ if (a === '--root') args.root = argv[++i];
46
+ else if (a === '--from') args.from = argv[++i];
47
+ else if (a === '--to') args.to = argv[++i];
48
+ else if (a === '--task') args.task = argv[++i];
49
+ else if (a === '--summary') args.summary = argv[++i];
50
+ else if (a === '--out') args.out = argv[++i];
51
+ else if (a === '--stdout') args.stdout = true;
52
+ else if (a === '--prompt') args.prompt = true;
53
+ else if (a === '--json') args.json = true;
54
+ else if (a === '--next') args.next.push(argv[++i]);
55
+ else if (a === '--decision') args.decisions.push(argv[++i]);
56
+ else if (a === '--blocker') args.blockers.push(argv[++i]);
57
+ else if (a === '--command') args.commands.push(argv[++i]);
58
+ else if (a === '--note') args.notes.push(argv[++i]);
59
+ else if (a === '-h' || a === '--help') args.help = true;
60
+ else if (!args.file) args.file = a;
61
+ else throw new Error(`Unexpected argument: ${a}`);
62
+ }
63
+ return args;
64
+ }
65
+
66
+ function readHandoffFile(file) {
67
+ return parseMarkdown(fs.readFileSync(file, 'utf8'));
68
+ }
69
+
70
+ function printImported(handoff, args) {
71
+ if (args.json) {
72
+ process.stdout.write(JSON.stringify(handoff, null, 2) + '\n');
73
+ } else if (args.prompt) {
74
+ process.stdout.write(renderResumePrompt(handoff) + '\n');
75
+ } else {
76
+ process.stdout.write(renderMarkdown(handoff) + '\n');
77
+ }
78
+ }
79
+
80
+ function main() {
81
+ try {
82
+ const args = parseArgs(process.argv);
83
+ if (args.help) {
84
+ console.log(usage());
85
+ return;
86
+ }
87
+
88
+ const root = path.resolve(args.root);
89
+ if (args.cmd === 'export') {
90
+ const handoff = buildHandoff({
91
+ root,
92
+ from: args.from,
93
+ to: args.to,
94
+ task: args.task,
95
+ summary: args.summary,
96
+ nextActions: args.next,
97
+ decisions: args.decisions,
98
+ blockers: args.blockers,
99
+ commands: args.commands,
100
+ notes: args.notes,
101
+ });
102
+ if (args.stdout) {
103
+ process.stdout.write(renderMarkdown(handoff) + '\n');
104
+ return;
105
+ }
106
+ const result = writeHandoff(root, handoff, { outPath: args.out });
107
+ process.stdout.write(`${result.path}\n`);
108
+ return;
109
+ }
110
+
111
+ if (args.cmd === 'import') {
112
+ if (!args.file) throw new Error('Missing handoff file');
113
+ printImported(readHandoffFile(path.resolve(root, args.file)), args);
114
+ return;
115
+ }
116
+
117
+ if (args.cmd === 'latest') {
118
+ const file = latestHandoff(root, { from: args.from });
119
+ if (!file) {
120
+ const suffix = args.from ? ` from ${args.from}` : '';
121
+ throw new Error(`No handoff${suffix} found under _byan-output/handoffs`);
122
+ }
123
+ if (!args.prompt && !args.json) {
124
+ process.stdout.write(`${file}\n`);
125
+ return;
126
+ }
127
+ printImported(readHandoffFile(file), args);
128
+ return;
129
+ }
130
+
131
+ throw new Error(`Unknown command: ${args.cmd}`);
132
+ } catch (err) {
133
+ process.stderr.write(`byan-handoff: ${err.message}\n`);
134
+ process.stderr.write(usage() + '\n');
135
+ process.exit(1);
136
+ }
137
+ }
138
+
139
+ main();
@@ -86,7 +86,7 @@ function renderStandups(entries) {
86
86
  const blockers = e.blockers && e.blockers.length > 0
87
87
  ? FG(COLORS.blocked, ` blockers=${e.blockers.join('|')}`)
88
88
  : '';
89
- return `${e.timestamp} ${e.agent}: ${e.did || '-'}${blockers} ${e.next || '-'}`;
89
+ return `${e.timestamp} ${e.agent}: ${e.did || '-'}${blockers} -> ${e.next || '-'}`;
90
90
  })
91
91
  .join('\n');
92
92
  }