@piecemaker-legal/piecemaker 2.0.9 → 2.0.11

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 (177) hide show
  1. package/dist/assets/FindReplaceDialog-KU5TEIBJ-BucOHLdm.js +1 -0
  2. package/dist/assets/FootnotePropertiesDialog-W3YHM4BV-D5UqbelV.js +1 -0
  3. package/dist/assets/HyperlinkDialog-ZYH7ZHRF-8yEhLigd.js +144 -0
  4. package/dist/assets/HyperlinkDialog-ZYH7ZHRF-qIPBOssF.css +1 -0
  5. package/dist/assets/ImagePositionDialog-HEWYR6Q3-wGIBYxCm.js +1 -0
  6. package/dist/assets/ImagePropertiesDialog-RAB47C6M-D86PckZ2.js +1 -0
  7. package/dist/assets/PageSetupDialog-AIGIXO3E-DLETP-7v.js +1 -0
  8. package/dist/assets/SplitCellDialog-IFBKYCD6-CwdQBXeb.js +1 -0
  9. package/dist/assets/TablePropertiesDialog-TMLKGOOW-j2nA7KJs.js +1 -0
  10. package/dist/assets/WatermarkDialog-KRL7WMIS-XFJ9gTkC.js +1 -0
  11. package/dist/assets/{abnfDiagram-VCTEODGH-WrsSAHOe.js → abnfDiagram-VCTEODGH-DiCrND_Y.js} +1 -1
  12. package/dist/assets/arc-DOjgbMYz.js +1 -0
  13. package/dist/assets/architectureDiagram-5GKGNRK7-brzIFVhl.js +36 -0
  14. package/dist/assets/{blockDiagram-I7D4REHJ-zGMnF7Ox.js → blockDiagram-I7D4REHJ-C8JhTjQQ.js} +1 -1
  15. package/dist/assets/{c4Diagram-7LVT6UL2-ClWw3bqt.js → c4Diagram-7LVT6UL2-jfYxccyk.js} +1 -1
  16. package/dist/assets/channel-Dajzu2W1.js +1 -0
  17. package/dist/assets/{chunk-2Q5K7J3B-C-9ICPHv.js → chunk-2Q5K7J3B-CrlEShp9.js} +1 -1
  18. package/dist/assets/{chunk-5VM5RSS4-Bawy3teT.js → chunk-5VM5RSS4-DzPlUHGq.js} +1 -1
  19. package/dist/assets/{chunk-F27PBJKO-DQ375RQO.js → chunk-F27PBJKO-Cp9cpeWU.js} +1 -1
  20. package/dist/assets/{chunk-IMKFNOWR-CflNF2f6.js → chunk-IMKFNOWR-BifUldEN.js} +1 -1
  21. package/dist/assets/{chunk-JWPE2WC7-CIXQv0gc.js → chunk-JWPE2WC7-ggPEIkWu.js} +1 -1
  22. package/dist/assets/{chunk-POPQ4Y6H-Cza5j6Qw.js → chunk-POPQ4Y6H-3h_nayRX.js} +1 -1
  23. package/dist/assets/{chunk-SVP7TREG-GQ_VvWZR.js → chunk-SVP7TREG-CH29aG6J.js} +1 -1
  24. package/dist/assets/{chunk-TICWLB2K-BEmU16W5.js → chunk-TICWLB2K-PluJUM5k.js} +1 -1
  25. package/dist/assets/{chunk-XXDRQBXY-C1KpkLYH.js → chunk-XXDRQBXY-DXU39Vwg.js} +1 -1
  26. package/dist/assets/classDiagram-ZZMXUADV-dDEP_giv.js +1 -0
  27. package/dist/assets/classDiagram-v2-VYDZK3BY-dDEP_giv.js +1 -0
  28. package/dist/assets/{cose-bilkent-JH36ORCC-CZE48TRG.js → cose-bilkent-JH36ORCC-Dz6roYrN.js} +1 -1
  29. package/dist/assets/{cynefin-OW5HDTMX-L-tx1eC-.js → cynefin-OW5HDTMX-BLzrpSit.js} +1 -1
  30. package/dist/assets/{cynefinDiagram-5FMLGOSQ-Coa8oJwR.js → cynefinDiagram-5FMLGOSQ-kfxnERDZ.js} +1 -1
  31. package/dist/assets/{dagre-GXQ25YYZ-Bu_3Y75K.js → dagre-GXQ25YYZ-DP57bp-N.js} +1 -1
  32. package/dist/assets/{diagram-S7CK7UJ4-CFiiV4es.js → diagram-S7CK7UJ4-DAlsrQVW.js} +1 -1
  33. package/dist/assets/{diagram-UQ7AKVKN-CCXheGAA.js → diagram-UQ7AKVKN-By5yrMer.js} +1 -1
  34. package/dist/assets/{diagram-VSXAHHWV-B70m4lr_.js → diagram-VSXAHHWV-Dx89kryN.js} +1 -1
  35. package/dist/assets/{diagram-VX7I27RA-CHkiMOVA.js → diagram-VX7I27RA-B9fARitZ.js} +1 -1
  36. package/dist/assets/{diagram-Z3DM3KII-_awpc4Bs.js → diagram-Z3DM3KII-DC15CEH1.js} +1 -1
  37. package/dist/assets/{ebnfDiagram-PWID7BFC-CZzjH86H.js → ebnfDiagram-PWID7BFC-BKQzghGF.js} +1 -1
  38. package/dist/assets/{erDiagram-RLTQ6QDP-9DgiHZg9.js → erDiagram-RLTQ6QDP-CPY6RM7G.js} +1 -1
  39. package/dist/assets/{flowDiagram-HODETNUW-DHY_503b.js → flowDiagram-HODETNUW-4dL4GJcf.js} +1 -1
  40. package/dist/assets/{ganttDiagram-EL5Y4UJY-DPiiYZ_l.js → ganttDiagram-EL5Y4UJY-D4-cVcfb.js} +1 -1
  41. package/dist/assets/{gitGraphDiagram-WWUBYQGX-Ddd_evm7.js → gitGraphDiagram-WWUBYQGX-BMeVIEiX.js} +1 -1
  42. package/dist/assets/{index-tibHq7Qp.js → index-DNtFDOni.js} +140 -140
  43. package/dist/assets/index-Dc9wNuS4.css +1 -0
  44. package/dist/assets/{infoDiagram-27XIBGKW-BPRNhfwb.js → infoDiagram-27XIBGKW-D5qMSUEU.js} +1 -1
  45. package/dist/assets/{ishikawaDiagram-5VMMS53U-BXx6aqkq.js → ishikawaDiagram-5VMMS53U-BDnyKRHm.js} +1 -1
  46. package/dist/assets/{journeyDiagram-3NMN7TZE-BK8TZM29.js → journeyDiagram-3NMN7TZE-dGz5ZGzq.js} +1 -1
  47. package/dist/assets/{kanban-definition-UXKFOSKX-CHioRmxz.js → kanban-definition-UXKFOSKX-D7UAz7o_.js} +6 -6
  48. package/dist/assets/layout-DKrmEGrz.js +1 -0
  49. package/dist/assets/{linear-CTEhUcKG.js → linear-CrTdMY-p.js} +1 -1
  50. package/dist/assets/{mermaid.core-DYUb_UUB.js → mermaid.core-CXQOT5G6.js} +7 -7
  51. package/dist/assets/{mindmap-definition-YA3MSWOX-D7ODZ4oS.js → mindmap-definition-YA3MSWOX-VgEiYfay.js} +1 -1
  52. package/dist/assets/{pegDiagram-XKGWAZYB-8J-_2_kw.js → pegDiagram-XKGWAZYB-9IqT8gGx.js} +1 -1
  53. package/dist/assets/{pieDiagram-E7YTZNPT-ebg0yfMi.js → pieDiagram-E7YTZNPT-D98pRE-t.js} +1 -1
  54. package/dist/assets/processTemplate-GPFDLQMX-B1sVV2O0.js +22 -0
  55. package/dist/assets/{quadrantDiagram-AXDQQJYC-BoWkDiFb.js → quadrantDiagram-AXDQQJYC-b9PwkYzL.js} +1 -1
  56. package/dist/assets/{railroadDiagram-O6MQD6OU-BRJ77ldz.js → railroadDiagram-O6MQD6OU-Dz87hsPE.js} +1 -1
  57. package/dist/assets/{requirementDiagram-BXWQKSXE-Z0JJgktA.js → requirementDiagram-BXWQKSXE-CkcV73dK.js} +1 -1
  58. package/dist/assets/sankeyDiagram-P5KCCOFB-UBN31Yrs.js +40 -0
  59. package/dist/assets/{sequenceDiagram-WJ2MYXX4-BPAjtXwp.js → sequenceDiagram-WJ2MYXX4-CpQxd5Za.js} +1 -1
  60. package/dist/assets/{server.browser-BzI1jrZw.js → server.browser-BY3bL-IX.js} +1 -1
  61. package/dist/assets/{sizeCapture-INFHLROL-BGZPCzM4.js → sizeCapture-INFHLROL-mCsFmyzw.js} +1 -1
  62. package/dist/assets/stateDiagram-D77RDMKH-B0MTBN-3.js +1 -0
  63. package/dist/assets/stateDiagram-v2-MP3YSRHH-DzBPN39W.js +1 -0
  64. package/dist/assets/{swimlanes-42K2YHIH-DvuB15qF.js → swimlanes-42K2YHIH-Dzydjm0e.js} +1 -1
  65. package/dist/assets/swimlanesDiagram-VR7AAH4N-BXQpbUMD.js +8 -0
  66. package/dist/assets/{timeline-definition-24CTP7MA-ZIziYCIF.js → timeline-definition-24CTP7MA-Dz0toOLu.js} +3 -3
  67. package/dist/assets/{vendor-codemirror-CjW0lHR5.js → vendor-codemirror-CN-sJePf.js} +2 -2
  68. package/dist/assets/{vendor-react-D809iwXR.js → vendor-react-B22wqN3J.js} +5 -5
  69. package/dist/assets/{vennDiagram-4TSXK5OY-C5_B9gWa.js → vennDiagram-4TSXK5OY-DOWp7dkf.js} +4 -4
  70. package/dist/assets/{wardleyDiagram-VM6X3IG4-DMlH9Afw.js → wardleyDiagram-VM6X3IG4-CUxsztUB.js} +1 -1
  71. package/dist/assets/{xychartDiagram-S5SC5T6Z-BldhJt7i.js → xychartDiagram-S5SC5T6Z-DS96vNED.js} +1 -1
  72. package/dist/index.html +4 -4
  73. package/dist/sw.js +1 -1
  74. package/dist-server/server/modules/providers/list/mistral/mistral-models.provider.js +4 -53
  75. package/dist-server/server/modules/providers/list/mistral/mistral-models.provider.js.map +1 -1
  76. package/dist-server/server/modules/providers/list/mistral/mistral-runtime.provider.js +2 -3
  77. package/dist-server/server/modules/providers/list/mistral/mistral-runtime.provider.js.map +1 -1
  78. package/dist-server/server/modules/providers/list/mistral/mistral-vibe-models.js +30 -0
  79. package/dist-server/server/modules/providers/list/mistral/mistral-vibe-models.js.map +1 -0
  80. package/dist-server/server/modules/providers/tests/mistral-vibe-models.test.js +24 -0
  81. package/dist-server/server/modules/providers/tests/mistral-vibe-models.test.js.map +1 -0
  82. package/dist-server/server/piecemaker/agent-instructions.js +148 -0
  83. package/dist-server/server/piecemaker/agent-instructions.js.map +1 -0
  84. package/dist-server/server/piecemaker/anonymizer/lifecycle.js +2 -3
  85. package/dist-server/server/piecemaker/anonymizer/lifecycle.js.map +1 -1
  86. package/dist-server/server/piecemaker/docx-document.js +50 -0
  87. package/dist-server/server/piecemaker/docx-document.js.map +1 -0
  88. package/dist-server/server/piecemaker/index.js +13 -2
  89. package/dist-server/server/piecemaker/index.js.map +1 -1
  90. package/dist-server/server/piecemaker/model-discovery/codex-catalog.js +46 -0
  91. package/dist-server/server/piecemaker/model-discovery/codex-catalog.js.map +1 -0
  92. package/dist-server/server/piecemaker/model-discovery/index.js +42 -0
  93. package/dist-server/server/piecemaker/model-discovery/index.js.map +1 -0
  94. package/dist-server/server/piecemaker/model-discovery/mistral-catalog.js +19 -0
  95. package/dist-server/server/piecemaker/model-discovery/mistral-catalog.js.map +1 -0
  96. package/dist-server/server/piecemaker/model-discovery/stdio-rpc.js +61 -0
  97. package/dist-server/server/piecemaker/model-discovery/stdio-rpc.js.map +1 -0
  98. package/dist-server/server/piecemaker/project-registry.js +29 -0
  99. package/dist-server/server/piecemaker/project-registry.js.map +1 -0
  100. package/package.json +12 -1
  101. package/scripts/piecemaker/cli/disable-anonymizer.mjs +19 -0
  102. package/scripts/piecemaker/cli/lib/config.mjs +0 -1
  103. package/scripts/piecemaker/cli/lib/plugins.mjs +1 -0
  104. package/scripts/piecemaker/cli/lib/services.mjs +1 -10
  105. package/scripts/piecemaker/cli/piecemaker.mjs +0 -3
  106. package/server/modules/providers/list/mistral/mistral-models.provider.ts +4 -53
  107. package/server/modules/providers/list/mistral/mistral-runtime.provider.ts +2 -3
  108. package/server/modules/providers/list/mistral/mistral-vibe-models.ts +43 -0
  109. package/server/modules/providers/tests/mistral-vibe-models.test.ts +27 -0
  110. package/server/piecemaker/agent-instructions.ts +148 -0
  111. package/server/piecemaker/anonymizer/client-config.cjs +92 -92
  112. package/server/piecemaker/anonymizer/dictionary.cjs +34 -3
  113. package/server/piecemaker/anonymizer/hudsucker-fixture.cjs +9 -16
  114. package/server/piecemaker/anonymizer/hudsucker-proxy/Cargo.toml +1 -1
  115. package/server/piecemaker/anonymizer/hudsucker-proxy/src/main.rs +251 -268
  116. package/server/piecemaker/anonymizer/hudsucker-smoke.cjs +343 -0
  117. package/server/piecemaker/anonymizer/lifecycle.ts +2 -3
  118. package/server/piecemaker/anonymizer/rewriter-bridge.cjs +13 -4
  119. package/server/piecemaker/anonymizer/rewriter-worker.cjs +85 -0
  120. package/server/piecemaker/anonymizer/service.cjs +109 -179
  121. package/server/piecemaker/anonymizer/sqlite-dictionary.cjs +12 -1
  122. package/server/piecemaker/docx-document.ts +54 -0
  123. package/server/piecemaker/harness/decisions.cjs +1 -1
  124. package/server/piecemaker/harness/index.cjs +2 -3
  125. package/server/piecemaker/harness/verification.cjs +1 -1
  126. package/server/piecemaker/index.ts +15 -3
  127. package/server/piecemaker/model-discovery/codex-catalog.ts +67 -0
  128. package/server/piecemaker/model-discovery/index.ts +69 -0
  129. package/server/piecemaker/model-discovery/mistral-catalog.ts +36 -0
  130. package/server/piecemaker/model-discovery/stdio-rpc.ts +79 -0
  131. package/server/piecemaker/project-registry.ts +34 -0
  132. package/server/piecemaker/router.cjs +6 -8
  133. package/server/piecemaker/vendor/installer/bin/piecemaker.mjs +31 -77
  134. package/server/piecemaker/vendor/installer/lib/codex-skills.mjs +2 -84
  135. package/server/piecemaker/vendor/installer/lib/service.mjs +4 -24
  136. package/server/piecemaker/vendor/installer/steps/02-dependances-node.mjs +5 -5
  137. package/server/piecemaker/vendor/installer/steps/06-hooks.mjs +10 -21
  138. package/server/piecemaker/vendor/installer/steps/09-claude-assets.mjs +0 -11
  139. package/server/piecemaker/vendor/installer/steps/09-codex-plugin.mjs +6 -36
  140. package/server/piecemaker/vendor/installer/steps/13-garde-secrets.mjs +30 -12
  141. package/server/piecemaker/vendor/piecemaker-plugin/README.md +2 -9
  142. package/server/piecemaker/vendor/piecemaker-plugin/scripts/billing-track.mjs +5 -5
  143. package/server/piecemaker/vendor/piecemaker-plugin/scripts/classify-ai-documents.mjs +8 -8
  144. package/server/piecemaker/vendor/piecemaker-plugin/scripts/commit-track.mjs +2 -2
  145. package/server/piecemaker/vendor/piecemaker-plugin/scripts/compile-recherche.mjs +4 -6
  146. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folder-structure.cjs +2 -90
  147. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folders.cjs +71 -38
  148. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/mapping.cjs +8 -38
  149. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/protection.cjs +82 -61
  150. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/substitution.cjs +189 -41
  151. package/server/piecemaker/vendor/piecemaker-plugin/scripts/protect-originals.mjs +4 -55
  152. package/server/piecemaker/vendor/piecemaker-plugin/scripts/statusline.mjs +24 -117
  153. package/server/piecemaker/vendor/piecemaker-plugin/skills/ajout-de-fonctionnalites/SKILL.md +4 -18
  154. package/server/piecemaker/vendor/piecemaker-plugin/skills/tamponnage/SKILL.md +2 -2
  155. package/server/piecemaker/vendor/websocket-server/admin-routes.cjs +14 -148
  156. package/server/piecemaker/vendor/websocket-server/case-registry.cjs +16 -42
  157. package/server/piecemaker/vendor/websocket-server/claude-hooks.cjs +0 -73
  158. package/server/piecemaker/vendor/websocket-server/originals-pipeline.cjs +0 -7
  159. package/server/piecemaker/vendor/websocket-server/stamping-routes.cjs +3 -12
  160. package/server/piecemaker/vendor/websocket-server/workspace-paths.cjs +6 -6
  161. package/dist/assets/arc-DAA6wH-C.js +0 -1
  162. package/dist/assets/architectureDiagram-5GKGNRK7-BGNHr7ef.js +0 -36
  163. package/dist/assets/channel-BAQyfMll.js +0 -1
  164. package/dist/assets/classDiagram-ZZMXUADV-BNGCuvrR.js +0 -1
  165. package/dist/assets/classDiagram-v2-VYDZK3BY-BNGCuvrR.js +0 -1
  166. package/dist/assets/index-WwknP0l4.css +0 -1
  167. package/dist/assets/layout-DEnkyfTY.js +0 -1
  168. package/dist/assets/sankeyDiagram-P5KCCOFB-4PW5HTOP.js +0 -40
  169. package/dist/assets/stateDiagram-D77RDMKH-o-vEcKwz.js +0 -1
  170. package/dist/assets/stateDiagram-v2-MP3YSRHH-BsuDaKkN.js +0 -1
  171. package/dist/assets/swimlanesDiagram-VR7AAH4N-DcCAyKlT.js +0 -8
  172. package/scripts/piecemaker/cli/lib/piecemaker-anonymizer.mjs +0 -78
  173. package/scripts/piecemaker/hooks/proxy-guard.mjs +0 -251
  174. package/server/piecemaker/anonymizer/providers.cjs +0 -120
  175. package/server/piecemaker/vendor/installer/steps/08-telegram.mjs +0 -482
  176. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/central-mapping.cjs +0 -0
  177. package/server/piecemaker/vendor/websocket-server/telegram-admin.cjs +0 -602
@@ -1,10 +1,10 @@
1
1
  /**
2
- * Maintenance du dépôt installé : mise à jour Git/npm et redémarrage du démon
3
- * Telegram. Aucun serveur local n'est piloté ici — l'application et son proxy
4
- * PII sont démarrés par la commande `piecemaker`.
2
+ * Maintenance du dépôt installé : mise à jour Git/npm. Aucun serveur local
3
+ * n'est piloté ici — l'application et son proxy PII sont démarrés par la
4
+ * commande `piecemaker`.
5
5
  */
6
6
 
7
- import { IS_MAC, REPO_ROOT, npmBin, npmEnv, runCapture } from './platform.mjs';
7
+ import { REPO_ROOT, npmBin, npmEnv, runCapture } from './platform.mjs';
8
8
 
9
9
  function runOrThrow(command, args, label) {
10
10
  const result = runCapture(command, args, { cwd: REPO_ROOT });
@@ -14,26 +14,6 @@ function runOrThrow(command, args, label) {
14
14
  return result;
15
15
  }
16
16
 
17
- /** launchd label of the Telegram monitor installed by step 08. */
18
- const TELEGRAM_DAEMON_LABEL = 'com.piecemaker.telegram-monitor';
19
-
20
- /**
21
- * The Telegram monitor runs `orchestrator/piecemaker-daemon.mjs` straight out
22
- * of the repository, so an update leaves it executing the previous revision
23
- * until launchd restarts it. Only touched when the service is already loaded.
24
- */
25
- export function restartTelegramDaemon() {
26
- if (!IS_MAC || typeof process.getuid !== 'function') return { restarted: false, reason: 'unsupported' };
27
- const domain = `gui/${process.getuid()}`;
28
- if (runCapture('launchctl', ['print', `${domain}/${TELEGRAM_DAEMON_LABEL}`]).code !== 0) {
29
- return { restarted: false, reason: 'absent' };
30
- }
31
- const kick = runCapture('launchctl', ['kickstart', '-k', `${domain}/${TELEGRAM_DAEMON_LABEL}`]);
32
- return kick.code === 0
33
- ? { restarted: true }
34
- : { restarted: false, reason: kick.stderr || `code ${kick.code}` };
35
- }
36
-
37
17
  function gitOut(args, label) {
38
18
  return runOrThrow('git', args, label).stdout;
39
19
  }
@@ -9,7 +9,7 @@
9
9
  import fs from 'node:fs';
10
10
  import path from 'node:path';
11
11
  import { log, spinner, columns } from '../lib/ui.mjs';
12
- import { run, npmBin, npmEnv, REPO_ROOT } from '../lib/platform.mjs';
12
+ import { run, npmBin, npmEnv, GIT_REPO_ROOT } from '../lib/platform.mjs';
13
13
 
14
14
  export const meta = {
15
15
  id: '02-dependances-node',
@@ -36,7 +36,7 @@ function readPackageJson(dir) {
36
36
  // Certaines distributions npm conservent spawn-helper de node-pty en 0644.
37
37
  // Le module se charge alors normalement mais tout pty.spawn échoue avec
38
38
  // « posix_spawnp failed ». Réparer le bit exécutable est idempotent.
39
- export function repairNodePtySpawnHelpers(repoRoot = REPO_ROOT, { repair = true } = {}) {
39
+ export function repairNodePtySpawnHelpers(repoRoot = GIT_REPO_ROOT, { repair = true } = {}) {
40
40
  if (process.platform === 'win32') return { found: 0, repaired: 0, ready: true };
41
41
  const prebuilds = path.join(repoRoot, 'node_modules', 'node-pty', 'prebuilds');
42
42
  if (!fs.existsSync(prebuilds)) return { found: 0, repaired: 0, ready: false };
@@ -88,7 +88,7 @@ async function npmInstall(dir, label, ctx) {
88
88
  export async function install(ctx) {
89
89
  const results = [];
90
90
 
91
- results.push(['racine du projet', await npmInstall(REPO_ROOT, 'Racine', ctx)]);
91
+ results.push(['racine du projet', await npmInstall(GIT_REPO_ROOT, 'Racine', ctx)]);
92
92
 
93
93
  if (ctx.dryRun) {
94
94
  return { status: 'skipped', note: 'Mode simulation — aucune installation effectuée.' };
@@ -116,8 +116,8 @@ export async function install(ctx) {
116
116
  }
117
117
 
118
118
  export async function check(ctx) {
119
- const rootInstalled = fs.existsSync(path.join(REPO_ROOT, 'node_modules'));
120
- const ptyReady = repairNodePtySpawnHelpers(REPO_ROOT, { repair: false }).ready;
119
+ const rootInstalled = fs.existsSync(path.join(GIT_REPO_ROOT, 'node_modules'));
120
+ const ptyReady = repairNodePtySpawnHelpers(GIT_REPO_ROOT, { repair: false }).ready;
121
121
 
122
122
  if (rootInstalled && ptyReady) return { status: 'done', note: '' };
123
123
  if (rootInstalled) {
@@ -17,16 +17,14 @@ import os from 'node:os';
17
17
  import path from 'node:path';
18
18
  import { createRequire } from 'node:module';
19
19
  import { log, spinner } from '../lib/ui.mjs';
20
- import { REPO_ROOT, GIT_REPO_ROOT, HOME_DIR, runCapture, ensureDir } from '../lib/platform.mjs';
20
+ import { REPO_ROOT, HOME_DIR, runCapture, ensureDir } from '../lib/platform.mjs';
21
21
  import { updateConfig } from '../lib/state.mjs';
22
22
 
23
23
  const require = createRequire(import.meta.url);
24
24
  const {
25
25
  claudeHooksStatus,
26
- claudeSessionHookStatus,
27
26
  claudeStatusLineStatus,
28
27
  installClaudeHooks,
29
- installClaudeSessionHook,
30
28
  installClaudeStatusLine,
31
29
  } = require('../../websocket-server/claude-hooks.cjs');
32
30
 
@@ -47,7 +45,6 @@ const HOOK_SCRIPTS = {
47
45
  commit: path.join(SCRIPTS_DIR, 'commit-track.mjs'),
48
46
  classify: path.join(SCRIPTS_DIR, 'classify-ai-documents.mjs'),
49
47
  billing: path.join(SCRIPTS_DIR, 'billing-track.mjs'),
50
- proxyGuard: path.join(GIT_REPO_ROOT, 'scripts', 'piecemaker', 'hooks', 'proxy-guard.mjs'),
51
48
  statusline: path.join(SCRIPTS_DIR, 'statusline.mjs'),
52
49
  };
53
50
 
@@ -106,16 +103,16 @@ export async function install(ctx) {
106
103
  const testResults = [];
107
104
  let testDir = null;
108
105
  let selftestRegistered = false;
109
- const caseFoldersBefore = Array.isArray(ctx.config?.caseFolders) ? ctx.config.caseFolders : [];
106
+ const { publishProjectSource } = require('../../piecemaker-plugin/scripts/lib/case-folders.cjs');
110
107
 
111
108
  try {
112
109
  // Un vrai dossier juridique factice, sans point de tête : les hooks
113
110
  // ignorent les répertoires cachés, un bac de test caché ne prouverait donc
114
- // rien du garde-fou. Comme un dossier n'est protégé qu'une fois enregistré,
115
- // on l'ajoute à `caseFolders` le temps du test, puis on rétablit la config.
111
+ // rien du garde-fou. Comme seul un projet publié est un dossier juridique,
112
+ // on le publie le temps du test sous une source dédiée, retirée ensuite.
116
113
  testDir = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'piecemaker-hook-selftest-')));
117
114
  fs.writeFileSync(path.join(testDir, 'piece-selftest.pdf'), 'PIECE DE TEST', 'utf8');
118
- updateConfig({ caseFolders: [...new Set([...caseFoldersBefore, testDir])] });
115
+ publishProjectSource('installer-selftest', [testDir]);
119
116
  selftestRegistered = true;
120
117
 
121
118
  // 1. protect-originals.mjs — une pièce du bac de test : protégée par
@@ -165,8 +162,8 @@ export async function install(ctx) {
165
162
  // de test enregistré doit ressortir classé « espace de travail » dans
166
163
  // `.piecemaker/protection.json`, sans quoi l'IA ne pourrait pas se
167
164
  // relire. On vérifie l'effet de bord, pas seulement le code de sortie.
168
- const createdDoc = path.join(testDir, 'note-selftest.docx');
169
- fs.writeFileSync(createdDoc, 'NOTE DE TEST', 'utf8');
165
+ const createdDoc = path.join(testDir, 'note-selftest.pdf');
166
+ fs.writeFileSync(createdDoc, '%PDF-1.4 NOTE DE TEST', 'utf8');
170
167
  const classifyResult = runHookSelfTest('classify-ai-documents.mjs', HOOK_SCRIPTS.classify, {
171
168
  hook_event_name: 'PostToolUse',
172
169
  session_id: 'installer-selftest',
@@ -180,7 +177,7 @@ export async function install(ctx) {
180
177
  });
181
178
  if (classifyResult.ok) {
182
179
  const { readProtection } = require('../../piecemaker-plugin/scripts/lib/protection.cjs');
183
- if (!readProtection(testDir).unprotected.has('note-selftest.docx')) {
180
+ if (!readProtection(testDir).unprotected.has('note-selftest.pdf')) {
184
181
  classifyResult.ok = false;
185
182
  classifyResult.note = 'le document créé n\'a pas été classé « espace de travail »';
186
183
  } else {
@@ -191,7 +188,7 @@ export async function install(ctx) {
191
188
  } finally {
192
189
  // Rétablir la liste des dossiers enregistrés : le bac de test ne doit pas
193
190
  // rester surveillé après l'installation.
194
- if (selftestRegistered) updateConfig({ caseFolders: caseFoldersBefore });
191
+ if (selftestRegistered) publishProjectSource('installer-selftest', null);
195
192
  if (testDir) fs.rmSync(testDir, { recursive: true, force: true });
196
193
  }
197
194
 
@@ -223,13 +220,6 @@ export async function install(ctx) {
223
220
  }
224
221
  log.ok(`${registration.registered} hook(s) PieceMaker ${registration.changed ? 'enregistré(s)' : 'déjà enregistré(s)'} directement dans ~/.claude/settings.json.`);
225
222
 
226
- const sessionHook = installClaudeSessionHook(os.homedir());
227
- if (!sessionHook.ok) {
228
- log.warn(`Sentinelle proxy PII (SessionStart) non enregistrée : ${sessionHook.reason}.`);
229
- } else {
230
- log.ok(`Sentinelle proxy PII (SessionStart) ${sessionHook.changed ? 'enregistrée' : 'déjà à jour'} dans ~/.claude/settings.json.`);
231
- }
232
-
233
223
  const statusLine = installClaudeStatusLine(REPO_ROOT, os.homedir());
234
224
  if (statusLine.conflict) {
235
225
  log.warn(`statusLine Claude Code personnelle détectée — laissée telle quelle (${statusLine.reason}). Bandeau d'état PieceMaker non installé.`);
@@ -249,14 +239,13 @@ export async function check(ctx) {
249
239
  const cfg = ctx.config || {};
250
240
  const configOk = Boolean(cfg.commits && cfg.billing);
251
241
  const hooksRegistered = claudeHooksStatus(REPO_ROOT, os.homedir()).ok;
252
- const sessionHookRegistered = claudeSessionHookStatus(os.homedir()).ok;
253
242
  const statusLine = claudeStatusLineStatus(REPO_ROOT, os.homedir());
254
243
  const statusLineOk = statusLine.ok || statusLine.conflict; // une statusLine personnelle n'est pas une anomalie
255
244
 
256
245
  if (!scriptsExist || !hooksJsonExists) {
257
246
  return { status: 'failed', note: 'Fichiers du plugin manquants (scripts ou hooks.json) — réinstallez piecemaker-plugin/.' };
258
247
  }
259
- if (!dirsExist || !configOk || !hooksRegistered || !sessionHookRegistered) {
248
+ if (!dirsExist || !configOk || !hooksRegistered) {
260
249
  return { status: 'partial', note: 'Scripts présents mais configuration, enregistrement Claude ou répertoires de facturation incomplets — relancez cette étape.' };
261
250
  }
262
251
  if (!statusLineOk) {
@@ -13,12 +13,10 @@ import { createRequire } from 'node:module';
13
13
 
14
14
  import { log } from '../lib/ui.mjs';
15
15
  import { REPO_ROOT, commandExists } from '../lib/platform.mjs';
16
- import { loadConfig } from '../lib/state.mjs';
17
16
 
18
17
  const require = createRequire(import.meta.url);
19
18
  const { claudeAssetStatus, repositoryAssets, syncClaudeAssets } = require('../../websocket-server/claude-assets.cjs');
20
19
  const { claudeHooksStatus, installClaudeHooks } = require('../../websocket-server/claude-hooks.cjs');
21
- const { refreshRegisteredCaseRules } = require('../../websocket-server/case-instructions.cjs');
22
20
 
23
21
  export const meta = {
24
22
  id: '09-claude-assets',
@@ -39,8 +37,6 @@ function dependencies(overrides = {}) {
39
37
  syncClaudeAssets,
40
38
  claudeHooksStatus,
41
39
  installClaudeHooks,
42
- loadConfig,
43
- refreshRegisteredCaseRules,
44
40
  ...overrides,
45
41
  };
46
42
  }
@@ -64,7 +60,6 @@ export async function install(ctx, overrides = {}) {
64
60
  if (ctx.dryRun) {
65
61
  ops.log.info(`[simulation] enregistrement de ${assets.length} skill(s)/agent(s) PieceMaker dans ~/.claude`);
66
62
  ops.log.info('[simulation] fusion des hooks PieceMaker dans ~/.claude/settings.json');
67
- ops.log.info('[simulation] actualisation des instructions des dossiers juridiques enregistrés');
68
63
  return { status: 'skipped', note: 'Mode simulation — aucune modification effectuée.' };
69
64
  }
70
65
 
@@ -79,12 +74,6 @@ export async function install(ctx, overrides = {}) {
79
74
  }
80
75
  ops.log.detail(`${hooks.registered} hook(s) PieceMaker enregistré(s) directement dans ~/.claude/settings.json.`);
81
76
 
82
- const instructions = ops.refreshRegisteredCaseRules(REPO_ROOT, ops.loadConfig());
83
- ops.log.detail(`${instructions.refreshed} dossier(s) juridique(s) muni(s) des instructions PieceMaker.`);
84
- for (const failure of instructions.failed) {
85
- ops.log.warn(`Instructions non actualisées pour ${failure.folder} : ${failure.error}`);
86
- }
87
-
88
77
  if (result.conflicts.length) {
89
78
  return {
90
79
  status: 'partial',
@@ -2,35 +2,28 @@
2
2
  * Étape 09 — composants PieceMaker pour la CLI Codex.
3
3
  *
4
4
  * Aucune entrée de marketplace ni aucun plugin d'application n'est créé :
5
- * les skills sont enregistrés dans `~/.codex/skills/` et la sentinelle du
6
- * proxy dans `~/.codex/hooks.json`, deux emplacements locaux découverts par
5
+ * les skills sont enregistrés dans `~/.codex/skills/` et la protection des
6
+ * pièces dans `~/.codex/hooks.json`, deux emplacements locaux découverts par
7
7
  * la CLI Codex. Claude Code et son marketplace restent entièrement inchangés.
8
8
  */
9
9
 
10
10
  import fs from 'node:fs';
11
11
  import os from 'node:os';
12
12
  import path from 'node:path';
13
- import { createRequire } from 'node:module';
14
13
  import { log } from '../lib/ui.mjs';
15
14
  import { REPO_ROOT, commandExists } from '../lib/platform.mjs';
16
15
  import {
17
16
  codexProtectionHookStatus,
18
- codexSessionHookStatus,
19
17
  codexSkillStatus,
20
18
  installCodexProtectionHook,
21
- installCodexSessionHook,
22
19
  repositoryCodexSkills,
23
20
  syncCodexSkills,
24
21
  } from '../lib/codex-skills.mjs';
25
- import { loadConfig } from '../lib/state.mjs';
26
-
27
- const require = createRequire(import.meta.url);
28
- const { refreshRegisteredCaseRules } = require('../../websocket-server/case-instructions.cjs');
29
22
 
30
23
  export const meta = {
31
24
  id: '09-codex-plugin',
32
25
  label: 'Composants Codex PieceMaker',
33
- description: 'Enregistre les skills et le badge d’anonymisation lorsque la CLI Codex est présente',
26
+ description: 'Enregistre les skills et la protection des pièces lorsque la CLI Codex est présente',
34
27
  required: false,
35
28
  };
36
29
 
@@ -43,14 +36,10 @@ function dependencies(overrides = {}) {
43
36
  userHome: os.homedir(),
44
37
  log,
45
38
  codexSkillStatus,
46
- codexSessionHookStatus,
47
39
  codexProtectionHookStatus,
48
- installCodexSessionHook,
49
40
  installCodexProtectionHook,
50
41
  repositoryCodexSkills,
51
42
  syncCodexSkills,
52
- loadConfig,
53
- refreshRegisteredCaseRules,
54
43
  ...overrides,
55
44
  };
56
45
  }
@@ -70,8 +59,6 @@ export async function install(ctx, overrides = {}) {
70
59
  }
71
60
  if (ctx.dryRun) {
72
61
  ops.log.info(`[simulation] enregistrement de ${skills.length} skill(s) PieceMaker dans ~/.codex/skills`);
73
- ops.log.info('[simulation] enregistrement du badge d’anonymisation au démarrage des sessions Codex');
74
- ops.log.info('[simulation] actualisation des instructions AGENTS.md des dossiers enregistrés');
75
62
  return { status: 'skipped', note: 'Mode simulation — aucune modification effectuée.' };
76
63
  }
77
64
 
@@ -80,34 +67,21 @@ export async function install(ctx, overrides = {}) {
80
67
  for (const conflict of result.conflicts) {
81
68
  ops.log.warn(`Le skill Codex personnel « ${conflict.slug} » existe déjà et n'a pas été remplacé.`);
82
69
  }
83
- const sessionHook = ops.installCodexSessionHook(REPO_ROOT, ops.userHome);
84
- if (!sessionHook.ok) {
85
- ops.log.warn(`Badge d’anonymisation Codex non enregistré : ${sessionHook.reason}.`);
86
- } else {
87
- ops.log.detail(`Badge d’anonymisation Codex ${sessionHook.changed ? 'enregistré' : 'déjà à jour'} dans ~/.codex/hooks.json.`);
88
- }
89
70
  const protectionHook = ops.installCodexProtectionHook(REPO_ROOT, ops.userHome);
90
71
  if (!protectionHook.ok) {
91
72
  ops.log.warn(`Protection des pièces Codex non enregistrée : ${protectionHook.reason}.`);
92
73
  } else {
93
74
  ops.log.detail(`Protection des pièces Codex ${protectionHook.changed ? 'enregistrée' : 'déjà à jour'} dans ~/.codex/hooks.json.`);
94
75
  }
95
- const instructions = ops.refreshRegisteredCaseRules(REPO_ROOT, ops.loadConfig());
96
- ops.log.detail(`${instructions.refreshed} dossier(s) juridique(s) muni(s) des instructions Codex/Claude.`);
97
- for (const failure of instructions.failed) {
98
- ops.log.warn(`Instructions non actualisées pour ${failure.folder} : ${failure.error}`);
99
- }
100
- if (result.conflicts.length || !sessionHook.ok || !protectionHook.ok) {
76
+ if (result.conflicts.length || !protectionHook.ok) {
101
77
  return {
102
78
  status: 'partial',
103
- note: !sessionHook.ok
104
- ? `Badge d’anonymisation Codex non enregistré (${sessionHook.reason}).`
105
- : !protectionHook.ok
79
+ note: !protectionHook.ok
106
80
  ? `Protection des pièces Codex non enregistrée (${protectionHook.reason}).`
107
81
  : `${result.conflicts.length} skill(s) Codex personnel(s) homonyme(s) conservé(s).`,
108
82
  };
109
83
  }
110
- return { status: 'done', note: 'Skills et badge PieceMaker disponibles à la prochaine session Codex CLI.' };
84
+ return { status: 'done', note: 'Skills PieceMaker disponibles à la prochaine session Codex CLI.' };
111
85
  }
112
86
 
113
87
  export async function check(_ctx, overrides = {}) {
@@ -130,10 +104,6 @@ export async function check(_ctx, overrides = {}) {
130
104
  note: `${missing.length} skill(s) PieceMaker non enregistré(s) dans ~/.codex/skills.`,
131
105
  };
132
106
  }
133
- const sessionHook = ops.codexSessionHookStatus(REPO_ROOT, ops.userHome);
134
- if (!sessionHook.ok) {
135
- return { status: 'partial', note: `Badge d’anonymisation Codex absent ou périmé (${sessionHook.reason}).` };
136
- }
137
107
  const protectionHook = ops.codexProtectionHookStatus(REPO_ROOT, ops.userHome);
138
108
  if (!protectionHook.ok) {
139
109
  return { status: 'partial', note: `Protection des pièces Codex absente ou périmée (${protectionHook.reason}).` };
@@ -4,9 +4,10 @@
4
4
  * Reproduces, via the installer, a guard that previously only existed by
5
5
  * hand under ~/.claude/ and would vanish on a fresh machine or a wiped
6
6
  * ~/.claude: a `PreToolUse` hook that denies the *agent* any read of the
7
- * server's `.env` et le mapping central du proxy (Read/Grep/Glob/Edit/Write/NotebookEdit and Bash
8
- * workarounds — cat/grep/head/`python -c "open(...)"`…), because that file
9
- * holds Légifrance credentials. See `installer/lib/secrets-guard.mjs` for
7
+ * server's `.env` et la base `auth.db` (Read/Grep/Glob/Edit/Write/NotebookEdit and Bash
8
+ * workarounds — cat/grep/head/`python -c "open(...)"`…), because the first
9
+ * holds Légifrance credentials and the second the real names behind every
10
+ * pseudonymisation code (`piecemaker_mappings`). See `installer/lib/secrets-guard.mjs` for
10
11
  * the merge logic and `installer/assets/claude-hooks/
11
12
  * piecemaker-guard-secrets.mjs` for the hook itself (a byte-for-byte copy of
12
13
  * the one that was running standalone in ~/.claude/hooks).
@@ -31,7 +32,8 @@ import fs from 'node:fs';
31
32
  import os from 'node:os';
32
33
  import path from 'node:path';
33
34
  import { log } from '../lib/ui.mjs';
34
- import { REPO_ROOT, HOME_DIR } from '../lib/platform.mjs';
35
+ import { pathToFileURL } from 'node:url';
36
+ import { REPO_ROOT, GIT_REPO_ROOT } from '../lib/platform.mjs';
35
37
  import { ENV_FILE } from '../lib/state.mjs';
36
38
  import {
37
39
  HOOK_SCRIPT_BASENAME,
@@ -48,18 +50,33 @@ import {
48
50
  export const meta = {
49
51
  id: '13-garde-secrets',
50
52
  label: 'Garde-fou secrets (Claude Code)',
51
- description: "Empêche Claude Code de lire le .env et le mapping central du proxy",
53
+ description: "Empêche Claude Code de lire le .env et la base auth.db (noms réels)",
52
54
  };
53
55
 
54
- const CENTRAL_MAPPING_FILE = path.join(HOME_DIR, 'central-mapping.json');
56
+ async function databaseFiles() {
57
+ const upstreamRoot = path.join(os.homedir(), '.cloudcli');
58
+ let dataRoot = upstreamRoot;
59
+ try {
60
+ const { productDataRoot } = await import(pathToFileURL(path.join(GIT_REPO_ROOT, 'shared', 'product-config.mjs')).href);
61
+ dataRoot = productDataRoot(upstreamRoot);
62
+ } catch {
63
+ dataRoot = process.env.CLOUDCLI_HOME || upstreamRoot;
64
+ }
65
+ const database = process.env.DATABASE_PATH || path.join(dataRoot, 'auth.db');
66
+ return ['', '-wal', '-shm'].map((suffix) => `${database}${suffix}`);
67
+ }
68
+
69
+ async function protectedPaths() {
70
+ return [ENV_FILE, ...await databaseFiles()];
71
+ }
55
72
 
56
73
  export async function install(ctx) {
57
74
  const userHome = os.homedir();
58
- const protectedPaths = [ENV_FILE, CENTRAL_MAPPING_FILE];
75
+ const guarded = await protectedPaths();
59
76
 
60
77
  if (ctx.dryRun) {
61
78
  log.info(`[simulation] hook installé/rafraîchi : ${hookTargetPath(userHome)} <- ${hookAssetPath(REPO_ROOT)}`);
62
- log.info(`[simulation] liste noire créée/complétée : ${blocklistTargetPath(userHome)} (+${protectedPaths.join(', ')})`);
79
+ log.info(`[simulation] liste noire créée/complétée : ${blocklistTargetPath(userHome)} (+${guarded.join(', ')})`);
63
80
  log.info(`[simulation] ${settingsPath(userHome)} : hook PreToolUse + permissions.deny fusionnés`);
64
81
  return { status: 'skipped', note: 'Mode simulation — aucune modification effectuée.' };
65
82
  }
@@ -72,12 +89,12 @@ export async function install(ctx) {
72
89
  if (hook.changed) log.ok(`Hook ${hook.created ? 'installé' : 'mis à jour'} : ${hook.path}`);
73
90
  else log.ok(`Hook déjà à jour : ${hook.path}`);
74
91
 
75
- const blocklist = seedBlocklist({ repoRoot: REPO_ROOT, userHome, envPaths: protectedPaths });
92
+ const blocklist = seedBlocklist({ repoRoot: REPO_ROOT, userHome, envPaths: guarded });
76
93
  if (blocklist.created) log.ok(`Liste noire créée : ${blocklist.path} (${blocklist.entries.length} chemin(s))`);
77
94
  else if (blocklist.added.length) log.ok(`Liste noire complétée (+${blocklist.added.length}) : ${blocklist.path}`);
78
95
  else log.ok(`Liste noire déjà à jour : ${blocklist.path}`);
79
96
 
80
- const settings = mergeSettings({ userHome, envPaths: protectedPaths });
97
+ const settings = mergeSettings({ userHome, envPaths: guarded });
81
98
  if (settings.hookAdded) log.ok(`Hook PreToolUse enregistré dans ${settings.path}`);
82
99
  else log.ok('Hook PreToolUse déjà enregistré.');
83
100
  if (settings.denyAdded.length) log.ok(`Règle(s) permissions.deny ajoutée(s) : ${settings.denyAdded.join(', ')}`);
@@ -90,6 +107,7 @@ export async function install(ctx) {
90
107
 
91
108
  export async function check(ctx) {
92
109
  const userHome = os.homedir();
110
+ const guarded = await protectedPaths();
93
111
 
94
112
  const hookOk = fs.existsSync(hookTargetPath(userHome));
95
113
 
@@ -99,7 +117,7 @@ export async function check(ctx) {
99
117
  const normalized = new Set(Array.isArray(list)
100
118
  ? list.filter((entry) => typeof entry === 'string').map((entry) => path.resolve(entry))
101
119
  : []);
102
- blocklistOk = [ENV_FILE, CENTRAL_MAPPING_FILE].every((entry) => normalized.has(path.resolve(entry)));
120
+ blocklistOk = guarded.every((entry) => normalized.has(path.resolve(entry)));
103
121
  } catch {
104
122
  // absent or malformed -> not ok
105
123
  }
@@ -118,7 +136,7 @@ export async function check(ctx) {
118
136
  );
119
137
  const deny = settings?.permissions?.deny;
120
138
  denyOk = Array.isArray(deny)
121
- && [ENV_FILE, CENTRAL_MAPPING_FILE].every((entry) => deny.includes(denyRuleFor(entry)));
139
+ && guarded.every((entry) => deny.includes(denyRuleFor(entry)));
122
140
  } catch {
123
141
  // absent or malformed -> not ok
124
142
  }
@@ -33,7 +33,7 @@ Légifrance est maintenu séparément dans
33
33
 
34
34
  L'installateur enregistre ces composants dans les emplacements utilisateur
35
35
  découverts par les CLI. Il fusionne tous les hooks dans les réglages Claude
36
- Code et la sentinelle `SessionStart` dans les réglages Codex.
36
+ Code et la protection des pièces (`PreToolUse`) dans les réglages Codex.
37
37
 
38
38
  Chaque sous-dossier immédiat de `config.workspacePath` est traité comme un dossier
39
39
  juridique indépendant. Son historique Git est conservé hors des données client,
@@ -56,8 +56,7 @@ L'étape `09-claude-assets` enregistre, si Claude Code est présent :
56
56
  L'étape `09-codex-plugin` enregistre, si Codex CLI est présent :
57
57
 
58
58
  - `~/.codex/skills/<slug>/SKILL.md`
59
- - `~/.codex/hooks.json` — sentinelle `SessionStart` qui affiche l’état réel du
60
- proxy : `🔒 Anonymisation PieceMaker active ✓` ou un avertissement explicite.
59
+ - `~/.codex/hooks.json` — refus `PreToolUse` de lecture des pièces protégées.
61
60
 
62
61
  Ce sont des **liens symboliques** vers `piecemaker-plugin/` : toute
63
62
  modification du Markdown (administration ou éditeur) est prise en compte à la
@@ -80,12 +79,6 @@ Les hooks décrits par `hooks/hooks.json` sont fusionnés directement dans
80
79
  dépendent donc d'aucun cache de plugin. `piecemaker update`, le démarrage du
81
80
  serveur et l'étape 06 réconcilient cet enregistrement.
82
81
 
83
- Codex ne permet pas encore d’exécuter une commande arbitraire dans sa
84
- `tui.status_line`. PieceMaker utilise donc son hook natif `SessionStart` : le
85
- message figure au début de chaque session et reflète le routage Codex ainsi que
86
- la disponibilité du proxy au moment du lancement. Codex peut demander une fois
87
- de confirmer la confiance accordée à ce hook local.
88
-
89
82
  ## Serveur MCP Légifrance
90
83
 
91
84
  L'étape `07-legifrance` installe le plugin autonome depuis
@@ -37,7 +37,7 @@ import {
37
37
  } from './lib/hook-io.mjs';
38
38
 
39
39
  const require = createRequire(import.meta.url);
40
- const { locateConfiguredCase } = require('./lib/case-folders.cjs');
40
+ const { locateProjectCase } = require('./lib/case-folders.cjs');
41
41
 
42
42
  const DEFAULT_TIMEOUT_MS = 8000;
43
43
  const MAX_TRANSCRIPT_BYTES = 10 * 1024 * 1024; // skip duration/tool-count derivation beyond this
@@ -106,10 +106,10 @@ function derivedDurationMs(analysis) {
106
106
  return Number.isFinite(ms) && ms >= 0 ? ms : null;
107
107
  }
108
108
 
109
- /** Name of the explicitly registered or legacy legal case containing cwd. */
110
- function detectDossier(cwd, config) {
109
+ /** Name of the project folder containing cwd. */
110
+ function detectDossier(cwd) {
111
111
  if (!cwd) return null;
112
- return locateConfiguredCase(config, cwd)?.caseName || null;
112
+ return locateProjectCase(cwd)?.caseName || null;
113
113
  }
114
114
 
115
115
  function synthesisFilePath(sessionId, isoTimestamp) {
@@ -133,7 +133,7 @@ async function main() {
133
133
 
134
134
  const nowIso = new Date().toISOString();
135
135
  const monthFile = path.join(BILLING_DIR, `${nowIso.slice(0, 7)}.jsonl`); // YYYY-MM.jsonl
136
- const dossier = detectDossier(payload.cwd, config);
136
+ const dossier = detectDossier(payload.cwd);
137
137
  const analysis = await analyzeTranscript(payload.transcript_path);
138
138
 
139
139
  if (eventName === 'TaskCompleted') {
@@ -3,12 +3,12 @@
3
3
  * PostToolUse hook (Write|Bash) — classe en « espace de travail » tout document
4
4
  * que l'IA vient de créer dans un dossier juridique enregistré.
5
5
  *
6
- * La protection est une propriété du fichier et le coffre-fort est le défaut :
7
- * `.piecemaker/protection.json` n'enregistre que les exceptions. Sans ce hook,
8
- * un document produit par l'IA elle-même — `.docx` de `docx-cli`, export
9
- * pandoc/LibreOffice, fichier écrit par `Write` — naît protégé, et le
10
- * `PreToolUse` `protect-originals.mjs` lui en refuse ensuite la relecture. Il
11
- * n'y a pourtant rien à protéger de l'IA dans un fichier qu'elle a écrit.
6
+ * Seuls les PDF et les images sont protégés, et `.piecemaker/protection.json`
7
+ * n'enregistre que les exceptions. Sans ce hook, un PDF ou une image produits
8
+ * par l'IA elle-même — export pandoc/LibreOffice, rendu d'une note de
9
+ * recherche — naît protégé, et le `PreToolUse` `protect-originals.mjs` lui en
10
+ * refuse ensuite la relecture. Il n'y a pourtant rien à protéger de l'IA dans
11
+ * un fichier qu'elle a écrit.
12
12
  *
13
13
  * Le classement reste une *exception ajoutée* : rien de ce que l'IA n'a pas
14
14
  * nommé n'est déclassé, et une pièce marquée « ressource » n'est jamais
@@ -30,7 +30,7 @@ import {
30
30
 
31
31
  const require = createRequire(import.meta.url);
32
32
  const { classifyAsWorkspace } = require('./lib/protection.cjs');
33
- const { locateConfiguredCase } = require('./lib/case-folders.cjs');
33
+ const { locateProjectCase } = require('./lib/case-folders.cjs');
34
34
 
35
35
  /**
36
36
  * Une commande Bash ne dit pas quel fichier elle a créé. On ne retient donc
@@ -110,7 +110,7 @@ async function main() {
110
110
  for (const absolute of candidatePaths(payload, cwd)) {
111
111
  let located;
112
112
  try {
113
- located = locateConfiguredCase(config, absolute);
113
+ located = locateProjectCase(absolute);
114
114
  } catch {
115
115
  continue;
116
116
  }
@@ -28,7 +28,7 @@ import {
28
28
 
29
29
  const require = createRequire(import.meta.url);
30
30
  const { locateCaseFile } = require('./lib/commits.cjs');
31
- const { locateConfiguredCase } = require('./lib/case-folders.cjs');
31
+ const { locateProjectCase } = require('./lib/case-folders.cjs');
32
32
 
33
33
  const PENDING_DIR = path.join(HOME_DIR, 'pending');
34
34
 
@@ -50,7 +50,7 @@ async function main() {
50
50
  const absolute = path.isAbsolute(filePath) ? filePath : path.resolve(cwd, filePath);
51
51
  let located;
52
52
  try {
53
- const configured = locateConfiguredCase(config, absolute);
53
+ const configured = locateProjectCase(absolute);
54
54
  if (!configured) return null;
55
55
  located = locateCaseFile(configured.casesRoot, absolute);
56
56
  } catch {
@@ -21,15 +21,14 @@ import fs from 'node:fs';
21
21
  import path from 'node:path';
22
22
  import {
23
23
  HOME_DIR,
24
- loadPieceMakerConfig,
25
24
  noop,
26
25
  readHookPayload,
27
26
  runHook,
28
27
  } from './lib/hook-io.mjs';
29
28
 
30
29
  const require = createRequire(import.meta.url);
31
- const { locateConfiguredCase } = require('./lib/case-folders.cjs');
32
- const { resolveConfiguredCaseMapping, revertMapping } = require('./lib/mapping.cjs');
30
+ const { locateProjectCase } = require('./lib/case-folders.cjs');
31
+ const { resolveProjectCaseMapping, revertMapping } = require('./lib/mapping.cjs');
33
32
  const { renderMarkdown, reportSlug } = require('./lib/recherche-report.cjs');
34
33
 
35
34
  const HERE = path.dirname(fileURLToPath(import.meta.url));
@@ -62,10 +61,9 @@ async function main() {
62
61
 
63
62
  // Le cas cible est porté par le payload (l'agent sait dans quel dossier il
64
63
  // travaille) : un chemin absolu situé dans le dossier enregistré.
65
- const config = loadPieceMakerConfig();
66
64
  const caseHint = data.caseRoot || data.case || data.dossier;
67
65
  if (!caseHint || !path.isAbsolute(caseHint)) return null;
68
- const located = locateConfiguredCase(config, caseHint);
66
+ const located = locateProjectCase(caseHint);
69
67
  if (!located) return null;
70
68
 
71
69
  const rechercheDir = path.join(located.caseRoot, 'recherche');
@@ -77,7 +75,7 @@ async function main() {
77
75
  // lisible → on ré-identifie le Markdown final avant écriture disque (même
78
76
  // logique que commit-track sur les libellés). Idempotent.
79
77
  let markdown = renderMarkdown(data, { caseName: located.caseName });
80
- const legalCase = resolveConfiguredCaseMapping(config, located.caseRoot);
78
+ const legalCase = resolveProjectCaseMapping(located.caseRoot);
81
79
  if (legalCase?.reverse_mapping) markdown = revertMapping(markdown, legalCase.reverse_mapping);
82
80
 
83
81
  fs.mkdirSync(rechercheDir, { recursive: true });