create-byan-agent 2.60.0 → 2.60.2

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 (69) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +10 -0
  3. package/install/bin/byan-communication.cjs +11 -0
  4. package/install/lib/communication-manifest.json +243 -0
  5. package/install/lib/communication-migration.cjs +91 -0
  6. package/install/lib/communication-previous.json +181 -0
  7. package/install/lib/gitignore.js +135 -0
  8. package/install/lib/install-engine.js +17 -1
  9. package/install/lib/ownership.js +24 -5
  10. package/install/package.json +1 -1
  11. package/install/templates/.claude/agents/bmad-byan.md +13 -26
  12. package/install/templates/.claude/agents/bmad-tao.md +47 -0
  13. package/install/templates/.claude/hooks/auto-dispatch-gate.js +81 -0
  14. package/install/templates/.claude/hooks/inject-tao.js +15 -71
  15. package/install/templates/.claude/hooks/inject-voice-anchor.js +21 -154
  16. package/install/templates/.claude/hooks/lib/dispatch-approval.cjs +135 -0
  17. package/install/templates/.claude/hooks/lib/dispatch-plan-format.js +293 -0
  18. package/install/templates/.claude/hooks/lib/plain-language.js +7 -14
  19. package/install/templates/.claude/hooks/lib/rtk-coverage.js +31 -0
  20. package/install/templates/.claude/hooks/lib/tool-log.js +143 -0
  21. package/install/templates/.claude/hooks/lib/voice-conformance.js +9 -32
  22. package/install/templates/.claude/hooks/lib/webfetch-output.js +37 -0
  23. package/install/templates/.claude/hooks/rtk-coverage.js +18 -0
  24. package/install/templates/.claude/hooks/tool-failure-guard.js +16 -9
  25. package/install/templates/.claude/hooks/webfetch-output.js +17 -0
  26. package/install/templates/.claude/rules/native-workflows.md +24 -5
  27. package/install/templates/.claude/rules/plain-language.md +7 -86
  28. package/install/templates/.claude/settings.json +56 -0
  29. package/install/templates/.claude/skills/byan-byan/SKILL.md +42 -83
  30. package/install/templates/.claude/skills/byan-hermes-dispatch/SKILL.md +22 -7
  31. package/install/templates/.claude/workflows/byan-auto-dispatch.js +86 -38
  32. package/install/templates/.codex/skills/byan/SKILL.md +7 -0
  33. package/install/templates/AGENTS.md +106 -0
  34. package/install/templates/_byan/_config/communication-policy.json +50 -0
  35. package/install/templates/_byan/_config/workflow-manifest.csv +2 -0
  36. package/install/templates/_byan/agent/byan/byan-soul.md +14 -2
  37. package/install/templates/_byan/agent/byan/byan-tao.md +35 -274
  38. package/install/templates/_byan/agent/byan/byan.md +6 -2
  39. package/install/templates/_byan/agent/byan/soul.md +419 -0
  40. package/install/templates/_byan/agent/byan/tao.md +60 -0
  41. package/install/templates/_byan/agent/tao/tao.md +26 -27
  42. package/install/templates/_byan/connaissance/mantras-sources.md +295 -0
  43. package/install/templates/_byan/core/activation/soul-activation.md +6 -5
  44. package/install/templates/_byan/core/communication.cjs +76 -0
  45. package/install/templates/_byan/mcp/byan-mcp-server/lib/agent-matcher.js +38 -1
  46. package/install/templates/_byan/mcp/byan-mcp-server/lib/communication.cjs +77 -0
  47. package/install/templates/_byan/mcp/byan-mcp-server/lib/dispatch-router.js +12 -3
  48. package/install/templates/_byan/mcp/byan-mcp-server/lib/dispatch.js +51 -20
  49. package/install/templates/_byan/mcp/byan-mcp-server/lib/fd-ack.js +75 -0
  50. package/install/templates/_byan/mcp/byan-mcp-server/lib/leantime-fd-core.js +12 -1
  51. package/install/templates/_byan/mcp/byan-mcp-server/lib/native-tiers.js +114 -2
  52. package/install/templates/_byan/mcp/byan-mcp-server/lib/routing-ledger.js +356 -0
  53. package/install/templates/_byan/mcp/byan-mcp-server/lib/soul.js +9 -0
  54. package/install/templates/_byan/mcp/byan-mcp-server/server.js +24 -6
  55. package/install/templates/_byan/mcp/byan-mcp-server/skill-bundles-manifest.json +2 -2
  56. package/install/templates/_byan/workflow/simple/byan/data/mantras.yaml +2 -5
  57. package/install/templates/_byan/workflow/simple/byan/templates/tao-template.md +56 -0
  58. package/install/templates/docs/auto-dispatch.md +76 -0
  59. package/install/templates/docs/communication.md +69 -0
  60. package/install/templates/docs/native-workflows-contract.md +33 -11
  61. package/install/templates/docs/tool-output-cost.md +88 -0
  62. package/install/templates/scripts/communication-eval.cjs +192 -0
  63. package/install/templates/scripts/rtk-coverage-report.js +30 -0
  64. package/install/templates/src/byan-v2/data/mantras.json +1058 -0
  65. package/install/templates/tests/communication/README.md +106 -0
  66. package/install/templates/tests/communication/incises.test.cjs +26 -0
  67. package/install/templates/tests/communication/scenarios.json +391 -0
  68. package/package.json +1 -1
  69. package/src/byan-v2/data/mantras.json +26 -6
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # Changelog - BYAN (create-byan-agent)
2
2
 
3
+ ## 2.60.2 : communication fr-1 (13 septembre 2026)
4
+
5
+ - Correction après lecture de S05 : incises avec virgules ou parenthèses, titres informatifs, événements détectés non inventés ; règles propagées aux contrats et au mode dégradé, migration depuis la première révision fr-1.
6
+
7
+ - Français précis et profils par livrable dans Soul, Tao, agent et mantra IA-26.
8
+ - Suppression des signatures et du tutoiement imposés aux documents ; tirets de ponctuation réservés aux marqueurs de listes avec préservation des éléments exacts.
9
+ - Chargement, contrats de délégation et projections cohérents ; migration ciblée prévisualisable et réversible.
10
+ - Corpus de 30 scénarios et recette humaine avant activation pilote. Voir [le guide](docs/communication.md).
11
+
12
+ ## 2026-09-11 — Routage natif et validation du plan
13
+
14
+ - Routage modele/effort par tache, protections de verification et tests de parite.
15
+ - Preparation separee de l execution, validation du plan courant au terminal et dans le desktop.
16
+ - Journal des decisions raccorde, accuses FD compacts, extrait WebFetch avec archive integrale, mesure RTK attribuable.
17
+ - Documentation : [parcours et limites](docs/auto-dispatch.md), [mesures des retours](docs/tool-output-cost.md).
18
+
19
+
3
20
  All notable changes to this project will be documented in this file.
4
21
 
5
22
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
package/README.md CHANGED
@@ -501,3 +501,13 @@ MIT © [Yan-Acadenice](https://github.com/Yan-Acadenice)
501
501
  ---
502
502
 
503
503
  *Fait avec de la frustration, de la curiosité, et l'envie que l'IA soit vraiment utile — pas juste impressionnante.*
504
+
505
+ ### Plan de dispatch avant execution
506
+
507
+ Le rail automatique prepare un plan modele/effort par tache, puis attend sa
508
+ validation explicite au terminal ou dans l application. Voir le
509
+ [parcours complet et les limites de plateforme](docs/auto-dispatch.md).
510
+
511
+ ## Politique de communication
512
+
513
+ BYAN adapte le registre au destinataire de chaque livrable, conserve les faits et réserve les tirets de ponctuation aux marqueurs de listes. Configuration, migration et recette : [guide de communication](docs/communication.md).
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+ const path=require('path');
4
+ const migration=require('../lib/communication-migration.cjs');
5
+ try {
6
+ const [command='preview',target='.',backup]=process.argv.slice(2);
7
+ const options={target:path.resolve(target),source:path.resolve(__dirname,'../templates'),manifest:require('../lib/communication-manifest.json')};
8
+ if(!['preview','apply','rollback'].includes(command))throw Error('Usage: node install/bin/byan-communication.cjs preview|apply|rollback PROJECT [BACKUP]');
9
+ const result=command==='rollback'?migration.rollback({target:options.target,backup}):migration[command](options);
10
+ process.stdout.write(JSON.stringify(result,null,2)+'\n');
11
+ }catch(e){console.error(e.message);process.exitCode=1;}
@@ -0,0 +1,243 @@
1
+ {
2
+ "version": "fr-1",
3
+ "files": [
4
+ {
5
+ "path": "docs/communication.md",
6
+ "sha256": "1bbcf3a0ffd89429d2e24fbce876cd644404c4cd91a5ce76495874a60873df86",
7
+ "previous": [
8
+ "9c6d864da2f3dff7708b9caecbfe095fe334fd1b13c2a95d9cd978a7b2a9d095"
9
+ ]
10
+ },
11
+ {
12
+ "path": "scripts/communication-eval.cjs",
13
+ "sha256": "9d5adcc8160edbcb068f1d98ecd02bdc84359d250e729ce067b75df7b66a124f",
14
+ "previous": [
15
+ "9d5adcc8160edbcb068f1d98ecd02bdc84359d250e729ce067b75df7b66a124f"
16
+ ]
17
+ },
18
+ {
19
+ "path": "tests/communication/scenarios.json",
20
+ "sha256": "f9244498d6cc57f263ddefcae5bbc60fd809e1234f6a45ea19d7f0353072f0df",
21
+ "previous": [
22
+ "2d530387c1f5e9864315f582399d8e6cf2b9b2fc4aaeee07de1933e86ae3d974"
23
+ ]
24
+ },
25
+ {
26
+ "path": "tests/communication/README.md",
27
+ "sha256": "4577b4dfb151548545e91e0feaf377f7e8583bb2827e3fbf1d2e114367d16b68",
28
+ "previous": [
29
+ "97b4d1d9c3ee91fd6c1fcbfeec1fd8a792558cc382fd3329a7ce6f27dfbfecb9"
30
+ ]
31
+ },
32
+ {
33
+ "path": "tests/communication/incises.test.cjs",
34
+ "sha256": "ab58c6656686318c7330346d0dbc47ffeb582c3a992e2e9f5d24a94c698371cb",
35
+ "previous": []
36
+ },
37
+ {
38
+ "path": "_byan/_config/communication-policy.json",
39
+ "sha256": "daee745439677aadf0914f0aad7b7077896e08e4537b74f0dc9dd9ecc7829532",
40
+ "previous": [
41
+ "a77896dc67ce4607d49cc0db8a811246a835e827c3e8a29ad4bc2cddd01ba330"
42
+ ]
43
+ },
44
+ {
45
+ "path": "_byan/core/communication.cjs",
46
+ "sha256": "2aea00097194aafab69cb62a78fa24bfa24fceda10797233bc82aac54d3419d0",
47
+ "previous": [
48
+ "7e57f6927fea300bfc7e36efe60fbcb594e65d23ac9552682989adacfd71e001"
49
+ ]
50
+ },
51
+ {
52
+ "path": "_byan/agent/byan/soul.md",
53
+ "sha256": "71dd5477ed0f19e190fb4e139ee6ed52f81e27dc6c79036aaa831e00cb2f7a17",
54
+ "previous": [
55
+ "b82e4dea777ebaa61b0e8f0504bf744a625a5c45d314d1bd59157de1a5fe7035",
56
+ "71dd5477ed0f19e190fb4e139ee6ed52f81e27dc6c79036aaa831e00cb2f7a17"
57
+ ]
58
+ },
59
+ {
60
+ "path": "_byan/agent/byan/tao.md",
61
+ "sha256": "6c18a3bac36dfa961dad9fdca3ad9b9f4233200be279ea0218d62d089625dc34",
62
+ "previous": [
63
+ "f08dedfb375a1306d0eddb166e958a08f379fe09cd6a65a1d7ab95dc8149f65c",
64
+ "c25aa9861b2ed79e4fb988261c4c4ea0cd161950dd552db51f748fdc984bdd02"
65
+ ]
66
+ },
67
+ {
68
+ "path": "_byan/agent/byan/byan.md",
69
+ "sha256": "0b5c54f6b274c322bccb78fa905af501f5b7a2fcb918e6fc5ca25954fbf7a416",
70
+ "previous": [
71
+ "4b828da47f2f4c47dbea4786821b7a4bdfbd021554111682eae6a59555dc12e2",
72
+ "0b5c54f6b274c322bccb78fa905af501f5b7a2fcb918e6fc5ca25954fbf7a416"
73
+ ]
74
+ },
75
+ {
76
+ "path": "_byan/agent/byan/byan-soul.md",
77
+ "sha256": "71dd5477ed0f19e190fb4e139ee6ed52f81e27dc6c79036aaa831e00cb2f7a17",
78
+ "previous": [
79
+ "b82e4dea777ebaa61b0e8f0504bf744a625a5c45d314d1bd59157de1a5fe7035",
80
+ "71dd5477ed0f19e190fb4e139ee6ed52f81e27dc6c79036aaa831e00cb2f7a17"
81
+ ]
82
+ },
83
+ {
84
+ "path": "_byan/agent/byan/byan-tao.md",
85
+ "sha256": "6c18a3bac36dfa961dad9fdca3ad9b9f4233200be279ea0218d62d089625dc34",
86
+ "previous": [
87
+ "f08dedfb375a1306d0eddb166e958a08f379fe09cd6a65a1d7ab95dc8149f65c",
88
+ "c25aa9861b2ed79e4fb988261c4c4ea0cd161950dd552db51f748fdc984bdd02"
89
+ ]
90
+ },
91
+ {
92
+ "path": "_byan/agent/tao/tao.md",
93
+ "sha256": "a3bfb4cb2ff6ec2deed6ca2339d7d293e7cbdd45e2a32ecef0d6a63ab56e61a5",
94
+ "previous": [
95
+ "b9a60707c5b0fb873a73837cf2f155b0d8e7a9fa34030fbba7c345a8882ec463",
96
+ "a3bfb4cb2ff6ec2deed6ca2339d7d293e7cbdd45e2a32ecef0d6a63ab56e61a5"
97
+ ]
98
+ },
99
+ {
100
+ "path": "_byan/core/activation/soul-activation.md",
101
+ "sha256": "0e9353bd6d15af1558ad345651a9a82852e2500b9c318ba0b8c67d5aed51371d",
102
+ "previous": [
103
+ "252609719d2bd33d5355308358dc3fd8c0fab2f7e7d1fe793f3f7ffa05bbe5a3",
104
+ "0e9353bd6d15af1558ad345651a9a82852e2500b9c318ba0b8c67d5aed51371d"
105
+ ]
106
+ },
107
+ {
108
+ "path": "_byan/workflow/simple/byan/templates/tao-template.md",
109
+ "sha256": "30b6c8beced6fa0cdd13b4e1e368e64c81c96e028014e28c1e4f1d36f6e779f7",
110
+ "previous": [
111
+ "1bb74ef134b33c65a5310e01743a50df3d1f21163b56cfd38458362eb7a571d8",
112
+ "33170d7f76573f7ff8a2a4c9007bf9fc6d374ec12c31c10c67fbcd55591b3fb3"
113
+ ]
114
+ },
115
+ {
116
+ "path": "_byan/workflow/simple/byan/data/mantras.yaml",
117
+ "sha256": "3b0234651fb52662cb194568e2e405f3591ba506e1e9a06580a98b9c6ee66e6f",
118
+ "previous": [
119
+ "5219d7f708ca79a89927d7840cdb1b8736af4e50d61355f29da91bde06688b37",
120
+ "355d5562c01bd3f44dea12059b289fe4da69ad5b36b0856b4d94c7d441b563ee"
121
+ ]
122
+ },
123
+ {
124
+ "path": "_byan/connaissance/mantras-sources.md",
125
+ "sha256": "bf9c76dccbeb37837dd1903b752f35023a7c994090ba89f2a47c01e2252c5a07",
126
+ "previous": [
127
+ "aaa2bd4d4d5d83796c09a884c38d151aad992da908d31bebd6959bb1b09882b7",
128
+ "349cfd2cf9cab190a644dd36bce9112cf326feb5b1e6710ec864a9322915d6d8"
129
+ ]
130
+ },
131
+ {
132
+ "path": "src/byan-v2/data/mantras.json",
133
+ "sha256": "bcf23ede5ed4d6bc01493d98f9fd29dec48c6f4aae43c3f596672d57d6582e18",
134
+ "previous": [
135
+ "1b956c57ad61e594b3f3f3fe1afdc5ef878f66bdc25f2987e6018c4dae774ea1",
136
+ "d6f4a08811a71312039a2ea0624896ffaeb62059db673f2a522bee6d6dfaba57"
137
+ ]
138
+ },
139
+ {
140
+ "path": ".claude/hooks/inject-tao.js",
141
+ "sha256": "88e5ea0d7a6a97604c783806053045d4be9fac9c4bd919ecfeabdc57c25839b5",
142
+ "previous": [
143
+ "2c20ab72978f16290ddcd23944db2780f1eae6ed87b3ba001949e579cf168579",
144
+ "88e5ea0d7a6a97604c783806053045d4be9fac9c4bd919ecfeabdc57c25839b5"
145
+ ]
146
+ },
147
+ {
148
+ "path": ".claude/hooks/inject-voice-anchor.js",
149
+ "sha256": "dc54bb0cc75083d7c6528259963e6cd068a385a86437debdc3a769d38243ce95",
150
+ "previous": [
151
+ "d35c7d239b7582e7a46c87aa102ace4c7b2f07202be705a12e43e96f1df4caeb",
152
+ "dc54bb0cc75083d7c6528259963e6cd068a385a86437debdc3a769d38243ce95"
153
+ ]
154
+ },
155
+ {
156
+ "path": ".claude/hooks/lib/plain-language.js",
157
+ "sha256": "934f77d487b950db0edf4fc8db50bbe24c49d2b5e008b71aa01270e50fac16db",
158
+ "previous": [
159
+ "90c2357b755da9e0862855363e1b7c5f53bf09df0e687df568734573a108c48d",
160
+ "934f77d487b950db0edf4fc8db50bbe24c49d2b5e008b71aa01270e50fac16db"
161
+ ]
162
+ },
163
+ {
164
+ "path": ".claude/hooks/lib/voice-conformance.js",
165
+ "sha256": "8ced1f7c932acb0bcd9150b0c317af1d87a9a377972b100a01270ddb27777201",
166
+ "previous": [
167
+ "b4277c59acacda4a49cdd10cef69569334c6c05f6e89f14cbb28289e7836dd7b",
168
+ "8ced1f7c932acb0bcd9150b0c317af1d87a9a377972b100a01270ddb27777201"
169
+ ]
170
+ },
171
+ {
172
+ "path": ".claude/rules/plain-language.md",
173
+ "sha256": "cabe670358e8dd76a1e0610ff25e36290eee4943fecb00fd8e9f1a64dc932d21",
174
+ "previous": [
175
+ "c4f804919bec260ed87d87d9109399dda52ab93652f3bea18bf99935878e86c4",
176
+ "cabe670358e8dd76a1e0610ff25e36290eee4943fecb00fd8e9f1a64dc932d21"
177
+ ]
178
+ },
179
+ {
180
+ "path": ".claude/skills/byan-byan/SKILL.md",
181
+ "sha256": "049cd334b54031e43cc287580c46e57aa99fdd166769d686f17cd97042b527ed",
182
+ "previous": [
183
+ "04ec7039907df44105f546b276d3354262ee1b87c6b060bdbb4011c98d7c2c3f",
184
+ "049cd334b54031e43cc287580c46e57aa99fdd166769d686f17cd97042b527ed"
185
+ ]
186
+ },
187
+ {
188
+ "path": ".claude/skills/byan-hermes-dispatch/SKILL.md",
189
+ "sha256": "f9f61c1a8816eafb6480be1fcc442339388af3790cf5ce9889a3369351c2353a",
190
+ "previous": [
191
+ "2b975bca060a6da329d384a2ed8065fa4dc2eb4817960040d3865dfce7a87eb6",
192
+ "f9f61c1a8816eafb6480be1fcc442339388af3790cf5ce9889a3369351c2353a"
193
+ ]
194
+ },
195
+ {
196
+ "path": ".codex/skills/byan/SKILL.md",
197
+ "sha256": "b17b7f5f8f9f3de84b9fa076540161ce4edc8daeb8122068855c220c5f351337",
198
+ "previous": [
199
+ "4cf06b7aa0478748d2327cf34d5917384e1c5215c36d5c4469013d9832b4f0f7",
200
+ "b17b7f5f8f9f3de84b9fa076540161ce4edc8daeb8122068855c220c5f351337"
201
+ ]
202
+ },
203
+ {
204
+ "path": ".claude/agents/bmad-byan.md",
205
+ "sha256": "ac46c69aa7636883141222ccaa21cf8c9b6a482a06f4558a32998d4af9491cfd",
206
+ "previous": [
207
+ "f7c0f579393194ac9bd4058b53f199fecae3a4d57eae687ae952feb9afce8e42",
208
+ "ac46c69aa7636883141222ccaa21cf8c9b6a482a06f4558a32998d4af9491cfd"
209
+ ]
210
+ },
211
+ {
212
+ "path": ".claude/agents/bmad-tao.md",
213
+ "sha256": "0b6d1d2db6cf958a3ac0eb51a56e7c6d991f72eb77da060a64cae943a6ee5603",
214
+ "previous": [
215
+ "4d9957ecdfa7cc4a029a19d638423f3dbe168f253471aa67dd1045a284ec4bda",
216
+ "0b6d1d2db6cf958a3ac0eb51a56e7c6d991f72eb77da060a64cae943a6ee5603"
217
+ ]
218
+ },
219
+ {
220
+ "path": "AGENTS.md",
221
+ "sha256": "15b16a62c0cacd11584559c3def19ba279244b1df4f1fb776b47fdee2b58d523",
222
+ "previous": [
223
+ "2e7b2834a111363a25450269350ac4b8a80423163f5e9d4c511033d7c0105a3e",
224
+ "15b16a62c0cacd11584559c3def19ba279244b1df4f1fb776b47fdee2b58d523"
225
+ ]
226
+ },
227
+ {
228
+ "path": "_byan/mcp/byan-mcp-server/lib/soul.js",
229
+ "sha256": "8e497c3411bb35e28e19d28e96d1db2b675a9c574361866a202f0bb9e7ca27a8",
230
+ "previous": [
231
+ "8aa7049069805e5221a898afc96458dcdae47d176b276c54b2a2312a2f80f839",
232
+ "8e497c3411bb35e28e19d28e96d1db2b675a9c574361866a202f0bb9e7ca27a8"
233
+ ]
234
+ },
235
+ {
236
+ "path": "_byan/mcp/byan-mcp-server/lib/communication.cjs",
237
+ "sha256": "d85c467de9a9be0a5f3def07c9479f09f9b14544abeadd22c1d165d661078292",
238
+ "previous": [
239
+ "d123e8ac9e30c788547503d80ad5ee8c14ec66c1646a9b0abd2df92a696659cb"
240
+ ]
241
+ }
242
+ ]
243
+ }
@@ -0,0 +1,91 @@
1
+ 'use strict';
2
+ const fs = require('fs');
3
+ const path = require('path');
4
+ const crypto = require('crypto');
5
+ const hash = value => crypto.createHash('sha256').update(value).digest('hex');
6
+ function safe(root, rel) {
7
+ if (typeof rel !== 'string' || !rel || path.isAbsolute(rel) || rel.split(/[\\/]/).some(p => p === '..' || p === '.' || !p)) throw Error('invalid path');
8
+ let current = path.resolve(root);
9
+ if (fs.existsSync(current) && fs.lstatSync(current).isSymbolicLink()) throw Error('symlink path');
10
+ for (const part of rel.split('/')) {
11
+ current = path.join(current, part);
12
+ if (fs.existsSync(current) && fs.lstatSync(current).isSymbolicLink()) throw Error('symlink path');
13
+ }
14
+ return current;
15
+ }
16
+ function read(file) { try { return fs.readFileSync(file); } catch(e) { if(e.code==='ENOENT') return null; throw e; } }
17
+ function atomic(file, data) {
18
+ fs.mkdirSync(path.dirname(file), {recursive:true});
19
+ const tmp=file+'.communication-'+crypto.randomBytes(6).toString('hex');
20
+ try { fs.writeFileSync(tmp,data,{mode:0o600});fs.renameSync(tmp,file); }
21
+ finally { if(fs.existsSync(tmp)) fs.unlinkSync(tmp); }
22
+ }
23
+ function preview({source,target,manifest}) {
24
+ if(manifest.version!=='fr-1'||!Array.isArray(manifest.files)) throw Error('invalid manifest');
25
+ const seen=new Set();
26
+ const files=manifest.files.map(entry=>{
27
+ if(seen.has(entry.path)) throw Error('duplicate path');seen.add(entry.path);
28
+ const desired=read(safe(source,entry.path));
29
+ if(!desired||hash(desired)!==entry.sha256) throw Error('source mismatch');
30
+ const current=read(safe(target,entry.path)), before=current===null?null:hash(current);
31
+ const action=before===entry.sha256?'unchanged':before===null?'create':(entry.previous||[]).includes(before)?'update':'conflict';
32
+ return {path:entry.path,before,after:entry.sha256,action};
33
+ });
34
+ return {version:manifest.version,files,conflicts:files.filter(f=>f.action==='conflict').map(f=>f.path)};
35
+ }
36
+ function apply(options) {
37
+ const plan=preview(options);
38
+ if(plan.conflicts.length) throw Error('migration conflict: '+plan.conflicts.join(', '));
39
+ const changes=plan.files.filter(f=>f.action!=='unchanged');
40
+ if(!changes.length) return {changed:0,backup:null};
41
+ const backupRel='_byan-output/communication-backups/'+Date.now()+'-'+crypto.randomBytes(6).toString('hex');
42
+ const backup=safe(options.target,backupRel);
43
+ fs.mkdirSync(backup,{recursive:true,mode:0o700});
44
+ const records=changes.map(entry=>{
45
+ const file=safe(options.target,entry.path),before=read(file);
46
+ if((before===null?null:hash(before))!==entry.before) throw Error('migration conflict after preview');
47
+ if(before!==null) atomic(safe(backup,entry.path),before);
48
+ return {...entry,mode:before===null?null:fs.statSync(file).mode & 0o777};
49
+ });
50
+ atomic(path.join(backup,'manifest.json'),JSON.stringify({version:'fr-1',files:records},null,2));
51
+ const applied=[];
52
+ try {
53
+ for(const entry of records) {
54
+ const file=safe(options.target,entry.path),content=read(safe(options.source,entry.path));
55
+ if(!content||hash(content)!==entry.after) throw Error('source mismatch after preview');
56
+ const before=read(file);if((before===null?null:hash(before))!==entry.before) throw Error('migration conflict after backup');
57
+ atomic(file,content);applied.push(entry);if(entry.mode!==null) fs.chmodSync(file,entry.mode);
58
+ }
59
+ } catch(error) {
60
+ for(const entry of applied.reverse()) {
61
+ const file=safe(options.target,entry.path);
62
+ if(hash(fs.readFileSync(file))!==entry.after) continue;
63
+ if(entry.before===null) fs.unlinkSync(file);
64
+ else {atomic(file,fs.readFileSync(safe(backup,entry.path)));fs.chmodSync(file,entry.mode);}
65
+ }
66
+ throw error;
67
+ }
68
+ return {changed:records.length,backup:backupRel};
69
+ }
70
+ function rollback({target,backup}) {
71
+ const dir=safe(target,backup),manifest=JSON.parse(fs.readFileSync(path.join(dir,'manifest.json'),'utf8'));
72
+ if(manifest.version!=='fr-1'||!Array.isArray(manifest.files)) throw Error('invalid backup');
73
+ for(const entry of manifest.files) {
74
+ const current=read(safe(target,entry.path));
75
+ const currentHash=current===null?null:hash(current);
76
+ if(currentHash!==entry.after && currentHash!==entry.before) throw Error('rollback conflict: '+entry.path);
77
+ if(entry.before!==null && hash(fs.readFileSync(safe(dir,entry.path)))!==entry.before) throw Error('backup mismatch');
78
+ }
79
+ for(const entry of manifest.files) {
80
+ const file=safe(target,entry.path);
81
+ const current=read(file);
82
+ if((current===null?null:hash(current))===entry.before) {
83
+ if(entry.before!==null && entry.mode!==null) fs.chmodSync(file,entry.mode);
84
+ continue;
85
+ }
86
+ if(entry.before===null) fs.unlinkSync(file);
87
+ else {atomic(file,fs.readFileSync(safe(dir,entry.path)));if(entry.mode!==null) fs.chmodSync(file,entry.mode);}
88
+ }
89
+ return {restored:manifest.files.length};
90
+ }
91
+ module.exports={preview,apply,rollback};
@@ -0,0 +1,181 @@
1
+ {
2
+ "AGENTS.md": [
3
+ "2e7b2834a111363a25450269350ac4b8a80423163f5e9d4c511033d7c0105a3e",
4
+ "15b16a62c0cacd11584559c3def19ba279244b1df4f1fb776b47fdee2b58d523"
5
+ ],
6
+ "CLAUDE.md": [
7
+ "6d91f1a3064be1f6205f9ee43f6f83482076795745c94cc095686123926ab4e2"
8
+ ],
9
+ ".codex/skills/byan/SKILL.md": [
10
+ "4cf06b7aa0478748d2327cf34d5917384e1c5215c36d5c4469013d9832b4f0f7",
11
+ "b17b7f5f8f9f3de84b9fa076540161ce4edc8daeb8122068855c220c5f351337"
12
+ ],
13
+ ".claude/skills/byan-byan/SKILL.md": [
14
+ "04ec7039907df44105f546b276d3354262ee1b87c6b060bdbb4011c98d7c2c3f",
15
+ "049cd334b54031e43cc287580c46e57aa99fdd166769d686f17cd97042b527ed"
16
+ ],
17
+ ".claude/skills/byan-hermes-dispatch/SKILL.md": [
18
+ "2b975bca060a6da329d384a2ed8065fa4dc2eb4817960040d3865dfce7a87eb6",
19
+ "f9f61c1a8816eafb6480be1fcc442339388af3790cf5ce9889a3369351c2353a"
20
+ ],
21
+ ".claude/rules/plain-language.md": [
22
+ "c4f804919bec260ed87d87d9109399dda52ab93652f3bea18bf99935878e86c4",
23
+ "cabe670358e8dd76a1e0610ff25e36290eee4943fecb00fd8e9f1a64dc932d21"
24
+ ],
25
+ "_byan/agent/byan/soul.md": [
26
+ "b82e4dea777ebaa61b0e8f0504bf744a625a5c45d314d1bd59157de1a5fe7035",
27
+ "71dd5477ed0f19e190fb4e139ee6ed52f81e27dc6c79036aaa831e00cb2f7a17"
28
+ ],
29
+ "_byan/agent/byan/tao.md": [
30
+ "f08dedfb375a1306d0eddb166e958a08f379fe09cd6a65a1d7ab95dc8149f65c",
31
+ "c25aa9861b2ed79e4fb988261c4c4ea0cd161950dd552db51f748fdc984bdd02"
32
+ ],
33
+ "_byan/agent/byan/byan.md": [
34
+ "4b828da47f2f4c47dbea4786821b7a4bdfbd021554111682eae6a59555dc12e2",
35
+ "0b5c54f6b274c322bccb78fa905af501f5b7a2fcb918e6fc5ca25954fbf7a416"
36
+ ],
37
+ "_byan/agent/byan/byan-soul.md": [
38
+ "b82e4dea777ebaa61b0e8f0504bf744a625a5c45d314d1bd59157de1a5fe7035",
39
+ "71dd5477ed0f19e190fb4e139ee6ed52f81e27dc6c79036aaa831e00cb2f7a17"
40
+ ],
41
+ "_byan/agent/byan/byan-tao.md": [
42
+ "f08dedfb375a1306d0eddb166e958a08f379fe09cd6a65a1d7ab95dc8149f65c",
43
+ "c25aa9861b2ed79e4fb988261c4c4ea0cd161950dd552db51f748fdc984bdd02"
44
+ ],
45
+ "_byan/agent/tao/tao.md": [
46
+ "b9a60707c5b0fb873a73837cf2f155b0d8e7a9fa34030fbba7c345a8882ec463",
47
+ "a3bfb4cb2ff6ec2deed6ca2339d7d293e7cbdd45e2a32ecef0d6a63ab56e61a5"
48
+ ],
49
+ "_byan/core/activation/soul-activation.md": [
50
+ "252609719d2bd33d5355308358dc3fd8c0fab2f7e7d1fe793f3f7ffa05bbe5a3",
51
+ "0e9353bd6d15af1558ad345651a9a82852e2500b9c318ba0b8c67d5aed51371d"
52
+ ],
53
+ "_byan/workflow/simple/byan/templates/tao-template.md": [
54
+ "1bb74ef134b33c65a5310e01743a50df3d1f21163b56cfd38458362eb7a571d8",
55
+ "33170d7f76573f7ff8a2a4c9007bf9fc6d374ec12c31c10c67fbcd55591b3fb3"
56
+ ],
57
+ "_byan/workflow/simple/byan/data/mantras.yaml": [
58
+ "5219d7f708ca79a89927d7840cdb1b8736af4e50d61355f29da91bde06688b37",
59
+ "355d5562c01bd3f44dea12059b289fe4da69ad5b36b0856b4d94c7d441b563ee"
60
+ ],
61
+ "_byan/connaissance/mantras-sources.md": [
62
+ "aaa2bd4d4d5d83796c09a884c38d151aad992da908d31bebd6959bb1b09882b7",
63
+ "349cfd2cf9cab190a644dd36bce9112cf326feb5b1e6710ec864a9322915d6d8"
64
+ ],
65
+ "src/byan-v2/data/mantras.json": [
66
+ "1b956c57ad61e594b3f3f3fe1afdc5ef878f66bdc25f2987e6018c4dae774ea1",
67
+ "d6f4a08811a71312039a2ea0624896ffaeb62059db673f2a522bee6d6dfaba57"
68
+ ],
69
+ "src/byan-v2/generation/mantra-validator.js": [
70
+ "2826d74f868c7130eea8f9468de830d5890121e041fcb662dbe08a63a1f5ab41"
71
+ ],
72
+ "src/byan-v2/generation/mantra-audit.js": [
73
+ "43f8040905e150bf5b657b9edb093508e2241f6eb821b7f14ca2b2ad12fa8c0b"
74
+ ],
75
+ ".claude/hooks/inject-soul.js": [
76
+ "34417463d2d3cce1521356778e53f15f0cef7fe7f04514f54cdda243ebb3a087"
77
+ ],
78
+ ".claude/hooks/inject-tao.js": [
79
+ "2c20ab72978f16290ddcd23944db2780f1eae6ed87b3ba001949e579cf168579",
80
+ "88e5ea0d7a6a97604c783806053045d4be9fac9c4bd919ecfeabdc57c25839b5"
81
+ ],
82
+ ".claude/hooks/inject-voice-anchor.js": [
83
+ "d35c7d239b7582e7a46c87aa102ace4c7b2f07202be705a12e43e96f1df4caeb",
84
+ "dc54bb0cc75083d7c6528259963e6cd068a385a86437debdc3a769d38243ce95"
85
+ ],
86
+ ".claude/hooks/lib/plain-language.js": [
87
+ "90c2357b755da9e0862855363e1b7c5f53bf09df0e687df568734573a108c48d",
88
+ "934f77d487b950db0edf4fc8db50bbe24c49d2b5e008b71aa01270e50fac16db"
89
+ ],
90
+ ".claude/hooks/lib/voice-conformance.js": [
91
+ "b4277c59acacda4a49cdd10cef69569334c6c05f6e89f14cbb28289e7836dd7b",
92
+ "8ced1f7c932acb0bcd9150b0c317af1d87a9a377972b100a01270ddb27777201"
93
+ ],
94
+ ".claude/hooks/plain-language-check.js": [
95
+ "a1b50e769fa8f6e01d158c2e3a56c50c09d0d0d8f4535a3c145ed3ffe28adb4e"
96
+ ],
97
+ ".claude/hooks/voice-conformance-check.js": [
98
+ "64cd87840edc7a8e6f2630ff2d8c842ad7d8a3f7c38c8b39c56d8075d79111b2"
99
+ ],
100
+ "_byan/mcp/byan-mcp-server/lib/soul.js": [
101
+ "8aa7049069805e5221a898afc96458dcdae47d176b276c54b2a2312a2f80f839",
102
+ "8e497c3411bb35e28e19d28e96d1db2b675a9c574361866a202f0bb9e7ca27a8"
103
+ ],
104
+ "_byan/mcp/byan-mcp-server/lib/sync-soul.js": [
105
+ "8524407d6a67c97bb8d9cbe3fabbab605cd103b9ec5a477a850759a38ddf8294"
106
+ ],
107
+ "install/lib/codex-native-setup.js": [
108
+ "b2b0752858da137f55cba0ced91fa07bc1838bd7df8df0325df4821f0fe4172e"
109
+ ],
110
+ "install/lib/claude-native-setup.js": [
111
+ "54f9120100113471b0b35a994de7dc177a2f589447c4f4b1f55240d4acd2347d"
112
+ ],
113
+ "install/lib/global-skills-sync.js": [
114
+ "c45c6ffbef4f6672879b1056bc002860c05d9aaeba61f7d4a4206e1d4ae8bff7"
115
+ ],
116
+ "install/lib/subagent-generator.js": [
117
+ "54ff2318532ee770539c85c53598ee777722cf912459439341b6e88a98696381"
118
+ ],
119
+ "install/lib/agent-generator.js": [
120
+ "d139f505e898f5543c90faa5a225810e2e939da3aed81e6b2d919ee1c30502fa"
121
+ ],
122
+ "install/packages/install-core/lib/plan.js": [
123
+ "1b05bfbda1814f3108fe7ac0bce4a29194e0b6b037434b7a82aaa6c85a8d1e77"
124
+ ],
125
+ "install/packages/install-core/lib/apply.js": [
126
+ "2eba7c2b2f85792c00f9553278778cc3a893074c09bdcf7d17213110a645215e"
127
+ ],
128
+ "services/byan-mcp/src/mcp/create-server.ts": [
129
+ "73b9bd7ca2e12bab156b38673b2592ecbfffb4aba83cadb56625dd045a2ea272"
130
+ ],
131
+ "services/byan-mcp/src/domain/wcaw.ts": [
132
+ "4e71521509ef607e2f704e195abc4c68ff2ed6e35f467612d1f77c12bdceabb5"
133
+ ],
134
+ "services/byan-mcp/src/execution/model-executor.ts": [
135
+ "9b1fd05407ec75f68648baeb099573186104431293f2bc3de7ee01d6ce705e7c"
136
+ ],
137
+ "services/byan-mcp/src/execution/local-cli-executor.ts": [
138
+ "12aa6666fcac4d70488642b2ee8a6759582f011b432db8a2a1672480d7cf535e"
139
+ ],
140
+ "services/byan-mcp/src/execution/openai-responses-executor.ts": [
141
+ "a5de0e67d106d11ff0d45eea8144050c33c86113e53423203d049200e125a45b"
142
+ ],
143
+ "app/main/engines/codex-engine.ts": [
144
+ "dc62f5de4504f68d8e59a2310162a066fc2af8b8ac03d9e2c854837b7c4600eb"
145
+ ],
146
+ "app/main/engines/claude-engine.ts": [
147
+ "43b01941b4a7bfe9afe3cfe48a0e2e7307752eefe0309282496855658d60700e"
148
+ ],
149
+ "app/shared/agent-definition.ts": [
150
+ "27005280da157b9e1d31aa0c9d100322bb73ab98f74c570584e8e28b38e5167a"
151
+ ],
152
+ ".claude/agents/bmad-byan.md": [
153
+ "f7c0f579393194ac9bd4058b53f199fecae3a4d57eae687ae952feb9afce8e42",
154
+ "ac46c69aa7636883141222ccaa21cf8c9b6a482a06f4558a32998d4af9491cfd"
155
+ ],
156
+ ".claude/agents/bmad-tao.md": [
157
+ "4d9957ecdfa7cc4a029a19d638423f3dbe168f253471aa67dd1045a284ec4bda",
158
+ "0b6d1d2db6cf958a3ac0eb51a56e7c6d991f72eb77da060a64cae943a6ee5603"
159
+ ],
160
+ "docs/communication.md": [
161
+ "9c6d864da2f3dff7708b9caecbfe095fe334fd1b13c2a95d9cd978a7b2a9d095"
162
+ ],
163
+ "scripts/communication-eval.cjs": [
164
+ "9d5adcc8160edbcb068f1d98ecd02bdc84359d250e729ce067b75df7b66a124f"
165
+ ],
166
+ "tests/communication/scenarios.json": [
167
+ "2d530387c1f5e9864315f582399d8e6cf2b9b2fc4aaeee07de1933e86ae3d974"
168
+ ],
169
+ "tests/communication/README.md": [
170
+ "97b4d1d9c3ee91fd6c1fcbfeec1fd8a792558cc382fd3329a7ce6f27dfbfecb9"
171
+ ],
172
+ "_byan/_config/communication-policy.json": [
173
+ "a77896dc67ce4607d49cc0db8a811246a835e827c3e8a29ad4bc2cddd01ba330"
174
+ ],
175
+ "_byan/core/communication.cjs": [
176
+ "7e57f6927fea300bfc7e36efe60fbcb594e65d23ac9552682989adacfd71e001"
177
+ ],
178
+ "_byan/mcp/byan-mcp-server/lib/communication.cjs": [
179
+ "d123e8ac9e30c788547503d80ad5ee8c14ec66c1646a9b0abd2df92a696659cb"
180
+ ]
181
+ }