@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.
- package/dist/assets/FindReplaceDialog-KU5TEIBJ-BucOHLdm.js +1 -0
- package/dist/assets/FootnotePropertiesDialog-W3YHM4BV-D5UqbelV.js +1 -0
- package/dist/assets/HyperlinkDialog-ZYH7ZHRF-8yEhLigd.js +144 -0
- package/dist/assets/HyperlinkDialog-ZYH7ZHRF-qIPBOssF.css +1 -0
- package/dist/assets/ImagePositionDialog-HEWYR6Q3-wGIBYxCm.js +1 -0
- package/dist/assets/ImagePropertiesDialog-RAB47C6M-D86PckZ2.js +1 -0
- package/dist/assets/PageSetupDialog-AIGIXO3E-DLETP-7v.js +1 -0
- package/dist/assets/SplitCellDialog-IFBKYCD6-CwdQBXeb.js +1 -0
- package/dist/assets/TablePropertiesDialog-TMLKGOOW-j2nA7KJs.js +1 -0
- package/dist/assets/WatermarkDialog-KRL7WMIS-XFJ9gTkC.js +1 -0
- package/dist/assets/{abnfDiagram-VCTEODGH-WrsSAHOe.js → abnfDiagram-VCTEODGH-DiCrND_Y.js} +1 -1
- package/dist/assets/arc-DOjgbMYz.js +1 -0
- package/dist/assets/architectureDiagram-5GKGNRK7-brzIFVhl.js +36 -0
- package/dist/assets/{blockDiagram-I7D4REHJ-zGMnF7Ox.js → blockDiagram-I7D4REHJ-C8JhTjQQ.js} +1 -1
- package/dist/assets/{c4Diagram-7LVT6UL2-ClWw3bqt.js → c4Diagram-7LVT6UL2-jfYxccyk.js} +1 -1
- package/dist/assets/channel-Dajzu2W1.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-C-9ICPHv.js → chunk-2Q5K7J3B-CrlEShp9.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-Bawy3teT.js → chunk-5VM5RSS4-DzPlUHGq.js} +1 -1
- package/dist/assets/{chunk-F27PBJKO-DQ375RQO.js → chunk-F27PBJKO-Cp9cpeWU.js} +1 -1
- package/dist/assets/{chunk-IMKFNOWR-CflNF2f6.js → chunk-IMKFNOWR-BifUldEN.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-CIXQv0gc.js → chunk-JWPE2WC7-ggPEIkWu.js} +1 -1
- package/dist/assets/{chunk-POPQ4Y6H-Cza5j6Qw.js → chunk-POPQ4Y6H-3h_nayRX.js} +1 -1
- package/dist/assets/{chunk-SVP7TREG-GQ_VvWZR.js → chunk-SVP7TREG-CH29aG6J.js} +1 -1
- package/dist/assets/{chunk-TICWLB2K-BEmU16W5.js → chunk-TICWLB2K-PluJUM5k.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-C1KpkLYH.js → chunk-XXDRQBXY-DXU39Vwg.js} +1 -1
- package/dist/assets/classDiagram-ZZMXUADV-dDEP_giv.js +1 -0
- package/dist/assets/classDiagram-v2-VYDZK3BY-dDEP_giv.js +1 -0
- package/dist/assets/{cose-bilkent-JH36ORCC-CZE48TRG.js → cose-bilkent-JH36ORCC-Dz6roYrN.js} +1 -1
- package/dist/assets/{cynefin-OW5HDTMX-L-tx1eC-.js → cynefin-OW5HDTMX-BLzrpSit.js} +1 -1
- package/dist/assets/{cynefinDiagram-5FMLGOSQ-Coa8oJwR.js → cynefinDiagram-5FMLGOSQ-kfxnERDZ.js} +1 -1
- package/dist/assets/{dagre-GXQ25YYZ-Bu_3Y75K.js → dagre-GXQ25YYZ-DP57bp-N.js} +1 -1
- package/dist/assets/{diagram-S7CK7UJ4-CFiiV4es.js → diagram-S7CK7UJ4-DAlsrQVW.js} +1 -1
- package/dist/assets/{diagram-UQ7AKVKN-CCXheGAA.js → diagram-UQ7AKVKN-By5yrMer.js} +1 -1
- package/dist/assets/{diagram-VSXAHHWV-B70m4lr_.js → diagram-VSXAHHWV-Dx89kryN.js} +1 -1
- package/dist/assets/{diagram-VX7I27RA-CHkiMOVA.js → diagram-VX7I27RA-B9fARitZ.js} +1 -1
- package/dist/assets/{diagram-Z3DM3KII-_awpc4Bs.js → diagram-Z3DM3KII-DC15CEH1.js} +1 -1
- package/dist/assets/{ebnfDiagram-PWID7BFC-CZzjH86H.js → ebnfDiagram-PWID7BFC-BKQzghGF.js} +1 -1
- package/dist/assets/{erDiagram-RLTQ6QDP-9DgiHZg9.js → erDiagram-RLTQ6QDP-CPY6RM7G.js} +1 -1
- package/dist/assets/{flowDiagram-HODETNUW-DHY_503b.js → flowDiagram-HODETNUW-4dL4GJcf.js} +1 -1
- package/dist/assets/{ganttDiagram-EL5Y4UJY-DPiiYZ_l.js → ganttDiagram-EL5Y4UJY-D4-cVcfb.js} +1 -1
- package/dist/assets/{gitGraphDiagram-WWUBYQGX-Ddd_evm7.js → gitGraphDiagram-WWUBYQGX-BMeVIEiX.js} +1 -1
- package/dist/assets/{index-tibHq7Qp.js → index-DNtFDOni.js} +140 -140
- package/dist/assets/index-Dc9wNuS4.css +1 -0
- package/dist/assets/{infoDiagram-27XIBGKW-BPRNhfwb.js → infoDiagram-27XIBGKW-D5qMSUEU.js} +1 -1
- package/dist/assets/{ishikawaDiagram-5VMMS53U-BXx6aqkq.js → ishikawaDiagram-5VMMS53U-BDnyKRHm.js} +1 -1
- package/dist/assets/{journeyDiagram-3NMN7TZE-BK8TZM29.js → journeyDiagram-3NMN7TZE-dGz5ZGzq.js} +1 -1
- package/dist/assets/{kanban-definition-UXKFOSKX-CHioRmxz.js → kanban-definition-UXKFOSKX-D7UAz7o_.js} +6 -6
- package/dist/assets/layout-DKrmEGrz.js +1 -0
- package/dist/assets/{linear-CTEhUcKG.js → linear-CrTdMY-p.js} +1 -1
- package/dist/assets/{mermaid.core-DYUb_UUB.js → mermaid.core-CXQOT5G6.js} +7 -7
- package/dist/assets/{mindmap-definition-YA3MSWOX-D7ODZ4oS.js → mindmap-definition-YA3MSWOX-VgEiYfay.js} +1 -1
- package/dist/assets/{pegDiagram-XKGWAZYB-8J-_2_kw.js → pegDiagram-XKGWAZYB-9IqT8gGx.js} +1 -1
- package/dist/assets/{pieDiagram-E7YTZNPT-ebg0yfMi.js → pieDiagram-E7YTZNPT-D98pRE-t.js} +1 -1
- package/dist/assets/processTemplate-GPFDLQMX-B1sVV2O0.js +22 -0
- package/dist/assets/{quadrantDiagram-AXDQQJYC-BoWkDiFb.js → quadrantDiagram-AXDQQJYC-b9PwkYzL.js} +1 -1
- package/dist/assets/{railroadDiagram-O6MQD6OU-BRJ77ldz.js → railroadDiagram-O6MQD6OU-Dz87hsPE.js} +1 -1
- package/dist/assets/{requirementDiagram-BXWQKSXE-Z0JJgktA.js → requirementDiagram-BXWQKSXE-CkcV73dK.js} +1 -1
- package/dist/assets/sankeyDiagram-P5KCCOFB-UBN31Yrs.js +40 -0
- package/dist/assets/{sequenceDiagram-WJ2MYXX4-BPAjtXwp.js → sequenceDiagram-WJ2MYXX4-CpQxd5Za.js} +1 -1
- package/dist/assets/{server.browser-BzI1jrZw.js → server.browser-BY3bL-IX.js} +1 -1
- package/dist/assets/{sizeCapture-INFHLROL-BGZPCzM4.js → sizeCapture-INFHLROL-mCsFmyzw.js} +1 -1
- package/dist/assets/stateDiagram-D77RDMKH-B0MTBN-3.js +1 -0
- package/dist/assets/stateDiagram-v2-MP3YSRHH-DzBPN39W.js +1 -0
- package/dist/assets/{swimlanes-42K2YHIH-DvuB15qF.js → swimlanes-42K2YHIH-Dzydjm0e.js} +1 -1
- package/dist/assets/swimlanesDiagram-VR7AAH4N-BXQpbUMD.js +8 -0
- package/dist/assets/{timeline-definition-24CTP7MA-ZIziYCIF.js → timeline-definition-24CTP7MA-Dz0toOLu.js} +3 -3
- package/dist/assets/{vendor-codemirror-CjW0lHR5.js → vendor-codemirror-CN-sJePf.js} +2 -2
- package/dist/assets/{vendor-react-D809iwXR.js → vendor-react-B22wqN3J.js} +5 -5
- package/dist/assets/{vennDiagram-4TSXK5OY-C5_B9gWa.js → vennDiagram-4TSXK5OY-DOWp7dkf.js} +4 -4
- package/dist/assets/{wardleyDiagram-VM6X3IG4-DMlH9Afw.js → wardleyDiagram-VM6X3IG4-CUxsztUB.js} +1 -1
- package/dist/assets/{xychartDiagram-S5SC5T6Z-BldhJt7i.js → xychartDiagram-S5SC5T6Z-DS96vNED.js} +1 -1
- package/dist/index.html +4 -4
- package/dist/sw.js +1 -1
- package/dist-server/server/modules/providers/list/mistral/mistral-models.provider.js +4 -53
- package/dist-server/server/modules/providers/list/mistral/mistral-models.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/mistral/mistral-runtime.provider.js +2 -3
- package/dist-server/server/modules/providers/list/mistral/mistral-runtime.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/mistral/mistral-vibe-models.js +30 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-vibe-models.js.map +1 -0
- package/dist-server/server/modules/providers/tests/mistral-vibe-models.test.js +24 -0
- package/dist-server/server/modules/providers/tests/mistral-vibe-models.test.js.map +1 -0
- package/dist-server/server/piecemaker/agent-instructions.js +148 -0
- package/dist-server/server/piecemaker/agent-instructions.js.map +1 -0
- package/dist-server/server/piecemaker/anonymizer/lifecycle.js +2 -3
- package/dist-server/server/piecemaker/anonymizer/lifecycle.js.map +1 -1
- package/dist-server/server/piecemaker/docx-document.js +50 -0
- package/dist-server/server/piecemaker/docx-document.js.map +1 -0
- package/dist-server/server/piecemaker/index.js +13 -2
- package/dist-server/server/piecemaker/index.js.map +1 -1
- package/dist-server/server/piecemaker/model-discovery/codex-catalog.js +46 -0
- package/dist-server/server/piecemaker/model-discovery/codex-catalog.js.map +1 -0
- package/dist-server/server/piecemaker/model-discovery/index.js +42 -0
- package/dist-server/server/piecemaker/model-discovery/index.js.map +1 -0
- package/dist-server/server/piecemaker/model-discovery/mistral-catalog.js +19 -0
- package/dist-server/server/piecemaker/model-discovery/mistral-catalog.js.map +1 -0
- package/dist-server/server/piecemaker/model-discovery/stdio-rpc.js +61 -0
- package/dist-server/server/piecemaker/model-discovery/stdio-rpc.js.map +1 -0
- package/dist-server/server/piecemaker/project-registry.js +29 -0
- package/dist-server/server/piecemaker/project-registry.js.map +1 -0
- package/package.json +12 -1
- package/scripts/piecemaker/cli/disable-anonymizer.mjs +19 -0
- package/scripts/piecemaker/cli/lib/config.mjs +0 -1
- package/scripts/piecemaker/cli/lib/plugins.mjs +1 -0
- package/scripts/piecemaker/cli/lib/services.mjs +1 -10
- package/scripts/piecemaker/cli/piecemaker.mjs +0 -3
- package/server/modules/providers/list/mistral/mistral-models.provider.ts +4 -53
- package/server/modules/providers/list/mistral/mistral-runtime.provider.ts +2 -3
- package/server/modules/providers/list/mistral/mistral-vibe-models.ts +43 -0
- package/server/modules/providers/tests/mistral-vibe-models.test.ts +27 -0
- package/server/piecemaker/agent-instructions.ts +148 -0
- package/server/piecemaker/anonymizer/client-config.cjs +92 -92
- package/server/piecemaker/anonymizer/dictionary.cjs +34 -3
- package/server/piecemaker/anonymizer/hudsucker-fixture.cjs +9 -16
- package/server/piecemaker/anonymizer/hudsucker-proxy/Cargo.toml +1 -1
- package/server/piecemaker/anonymizer/hudsucker-proxy/src/main.rs +251 -268
- package/server/piecemaker/anonymizer/hudsucker-smoke.cjs +343 -0
- package/server/piecemaker/anonymizer/lifecycle.ts +2 -3
- package/server/piecemaker/anonymizer/rewriter-bridge.cjs +13 -4
- package/server/piecemaker/anonymizer/rewriter-worker.cjs +85 -0
- package/server/piecemaker/anonymizer/service.cjs +109 -179
- package/server/piecemaker/anonymizer/sqlite-dictionary.cjs +12 -1
- package/server/piecemaker/docx-document.ts +54 -0
- package/server/piecemaker/harness/decisions.cjs +1 -1
- package/server/piecemaker/harness/index.cjs +2 -3
- package/server/piecemaker/harness/verification.cjs +1 -1
- package/server/piecemaker/index.ts +15 -3
- package/server/piecemaker/model-discovery/codex-catalog.ts +67 -0
- package/server/piecemaker/model-discovery/index.ts +69 -0
- package/server/piecemaker/model-discovery/mistral-catalog.ts +36 -0
- package/server/piecemaker/model-discovery/stdio-rpc.ts +79 -0
- package/server/piecemaker/project-registry.ts +34 -0
- package/server/piecemaker/router.cjs +6 -8
- package/server/piecemaker/vendor/installer/bin/piecemaker.mjs +31 -77
- package/server/piecemaker/vendor/installer/lib/codex-skills.mjs +2 -84
- package/server/piecemaker/vendor/installer/lib/service.mjs +4 -24
- package/server/piecemaker/vendor/installer/steps/02-dependances-node.mjs +5 -5
- package/server/piecemaker/vendor/installer/steps/06-hooks.mjs +10 -21
- package/server/piecemaker/vendor/installer/steps/09-claude-assets.mjs +0 -11
- package/server/piecemaker/vendor/installer/steps/09-codex-plugin.mjs +6 -36
- package/server/piecemaker/vendor/installer/steps/13-garde-secrets.mjs +30 -12
- package/server/piecemaker/vendor/piecemaker-plugin/README.md +2 -9
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/billing-track.mjs +5 -5
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/classify-ai-documents.mjs +8 -8
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/commit-track.mjs +2 -2
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/compile-recherche.mjs +4 -6
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folder-structure.cjs +2 -90
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folders.cjs +71 -38
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/mapping.cjs +8 -38
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/protection.cjs +82 -61
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/substitution.cjs +189 -41
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/protect-originals.mjs +4 -55
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/statusline.mjs +24 -117
- package/server/piecemaker/vendor/piecemaker-plugin/skills/ajout-de-fonctionnalites/SKILL.md +4 -18
- package/server/piecemaker/vendor/piecemaker-plugin/skills/tamponnage/SKILL.md +2 -2
- package/server/piecemaker/vendor/websocket-server/admin-routes.cjs +14 -148
- package/server/piecemaker/vendor/websocket-server/case-registry.cjs +16 -42
- package/server/piecemaker/vendor/websocket-server/claude-hooks.cjs +0 -73
- package/server/piecemaker/vendor/websocket-server/originals-pipeline.cjs +0 -7
- package/server/piecemaker/vendor/websocket-server/stamping-routes.cjs +3 -12
- package/server/piecemaker/vendor/websocket-server/workspace-paths.cjs +6 -6
- package/dist/assets/arc-DAA6wH-C.js +0 -1
- package/dist/assets/architectureDiagram-5GKGNRK7-BGNHr7ef.js +0 -36
- package/dist/assets/channel-BAQyfMll.js +0 -1
- package/dist/assets/classDiagram-ZZMXUADV-BNGCuvrR.js +0 -1
- package/dist/assets/classDiagram-v2-VYDZK3BY-BNGCuvrR.js +0 -1
- package/dist/assets/index-WwknP0l4.css +0 -1
- package/dist/assets/layout-DEnkyfTY.js +0 -1
- package/dist/assets/sankeyDiagram-P5KCCOFB-4PW5HTOP.js +0 -40
- package/dist/assets/stateDiagram-D77RDMKH-o-vEcKwz.js +0 -1
- package/dist/assets/stateDiagram-v2-MP3YSRHH-BsuDaKkN.js +0 -1
- package/dist/assets/swimlanesDiagram-VR7AAH4N-DcCAyKlT.js +0 -8
- package/scripts/piecemaker/cli/lib/piecemaker-anonymizer.mjs +0 -78
- package/scripts/piecemaker/hooks/proxy-guard.mjs +0 -251
- package/server/piecemaker/anonymizer/providers.cjs +0 -120
- package/server/piecemaker/vendor/installer/steps/08-telegram.mjs +0 -482
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/central-mapping.cjs +0 -0
- package/server/piecemaker/vendor/websocket-server/telegram-admin.cjs +0 -602
|
@@ -5,9 +5,8 @@ const crypto = require('node:crypto');
|
|
|
5
5
|
const { spawn, spawnSync } = require('child_process');
|
|
6
6
|
const { performance } = require('node:perf_hooks');
|
|
7
7
|
const {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
registerCaseFolder,
|
|
8
|
+
listProjectCases,
|
|
9
|
+
projectCaseEntry,
|
|
11
10
|
resolveCaseReference,
|
|
12
11
|
validateSelectedCaseFolder,
|
|
13
12
|
} = require('./case-registry.cjs');
|
|
@@ -67,19 +66,6 @@ const {
|
|
|
67
66
|
unregisterClaudeAsset,
|
|
68
67
|
} = require('./claude-assets.cjs');
|
|
69
68
|
const { claudeHooksStatus } = require('./claude-hooks.cjs');
|
|
70
|
-
const {
|
|
71
|
-
controlDossierBot,
|
|
72
|
-
controlTelegram,
|
|
73
|
-
getTelegramState,
|
|
74
|
-
saveDossierBot,
|
|
75
|
-
saveTelegramConfig,
|
|
76
|
-
} = require('./telegram-admin.cjs');
|
|
77
|
-
const {
|
|
78
|
-
DEFAULT_CASE_FOLDER_STRUCTURE,
|
|
79
|
-
configuredCaseFolderStructure,
|
|
80
|
-
ensureCaseFolderStructure,
|
|
81
|
-
normalizeCaseFolderStructure,
|
|
82
|
-
} = require('./case-folder-structure.cjs');
|
|
83
69
|
|
|
84
70
|
const MAX_MARKDOWN_BYTES = 1024 * 1024;
|
|
85
71
|
const SECRET_KEYS = new Set([
|
|
@@ -104,14 +90,13 @@ function validateNewCaseName(value) {
|
|
|
104
90
|
return name;
|
|
105
91
|
}
|
|
106
92
|
|
|
107
|
-
async function createLegalCase({ casesRoot, homeDir, name
|
|
93
|
+
async function createLegalCase({ casesRoot, homeDir, name }) {
|
|
108
94
|
const root = resolveCasesRoot(casesRoot);
|
|
109
95
|
const safeName = validateNewCaseName(name);
|
|
110
96
|
const directory = path.join(root, safeName);
|
|
111
97
|
if (fs.existsSync(directory)) throw new Error(`Le dossier juridique « ${safeName} » existe déjà.`);
|
|
112
98
|
fs.mkdirSync(directory);
|
|
113
99
|
try {
|
|
114
|
-
const structure = ensureCaseFolderStructure(directory, config);
|
|
115
100
|
writeProtection(directory, { unprotected: [] });
|
|
116
101
|
const mapping = writeCaseMapping(directory, { mapping: {}, reverse_mapping: {} });
|
|
117
102
|
await createCommit({
|
|
@@ -127,7 +112,6 @@ async function createLegalCase({ casesRoot, homeDir, name, config = {} }) {
|
|
|
127
112
|
});
|
|
128
113
|
const folder = await caseOverview(root, homeDir, safeName);
|
|
129
114
|
folder.branches = await historyBranches(root, homeDir, safeName);
|
|
130
|
-
folder.structure = structure;
|
|
131
115
|
return folder;
|
|
132
116
|
} catch (error) {
|
|
133
117
|
fs.rmSync(directory, { recursive: true, force: true });
|
|
@@ -204,12 +188,11 @@ async function selectLocalFolder(platform = process.platform, initialFolder = os
|
|
|
204
188
|
|
|
205
189
|
async function registerLegalCase({
|
|
206
190
|
folder,
|
|
207
|
-
configFile,
|
|
208
191
|
homeDir,
|
|
209
192
|
} = {}) {
|
|
210
193
|
const root = validateSelectedCaseFolder(folder);
|
|
211
|
-
const
|
|
212
|
-
|
|
194
|
+
const entry = projectCaseEntry(root);
|
|
195
|
+
if (!entry) throw new Error('Ce dossier n’est pas un projet enregistré.');
|
|
213
196
|
const protection = readProtection(root);
|
|
214
197
|
if (!protection.exists) writeProtection(root, { unprotected: [] });
|
|
215
198
|
const currentMapping = readCaseMapping(root);
|
|
@@ -217,11 +200,8 @@ async function registerLegalCase({
|
|
|
217
200
|
? currentMapping
|
|
218
201
|
: writeCaseMapping(root, { mapping: {}, reverse_mapping: {} });
|
|
219
202
|
|
|
220
|
-
const registered = registerCaseFolder(previous, root);
|
|
221
|
-
atomicWrite(configFile, `${JSON.stringify(registered.config, null, 2)}\n`);
|
|
222
|
-
|
|
223
203
|
const folderOverview = await caseOverview(path.dirname(root), homeDir, path.basename(root));
|
|
224
|
-
folderOverview.path =
|
|
204
|
+
folderOverview.path = entry.id;
|
|
225
205
|
folderOverview.location = root;
|
|
226
206
|
folderOverview.registered = true;
|
|
227
207
|
folderOverview.branches = await historyBranches(path.dirname(root), homeDir, path.basename(root));
|
|
@@ -230,27 +210,17 @@ async function registerLegalCase({
|
|
|
230
210
|
installed: {
|
|
231
211
|
mapping: path.relative(root, mapping.file).split(path.sep).join('/'),
|
|
232
212
|
protection: path.relative(root, protection.file).split(path.sep).join('/'),
|
|
233
|
-
structure: structure.directories,
|
|
234
213
|
},
|
|
235
214
|
};
|
|
236
215
|
}
|
|
237
216
|
|
|
238
217
|
function defaultConfig(repoRoot, homeDir = path.join(os.homedir(), '.piecemaker')) {
|
|
239
218
|
return {
|
|
240
|
-
port: 43098,
|
|
241
219
|
pythonPath: null,
|
|
242
220
|
venvPath: path.join(homeDir, 'venv'),
|
|
243
|
-
adminTheme: 'light',
|
|
244
|
-
caseFolderStructure: { ...DEFAULT_CASE_FOLDER_STRUCTURE },
|
|
245
221
|
};
|
|
246
222
|
}
|
|
247
223
|
|
|
248
|
-
function validateAdminTheme(value) {
|
|
249
|
-
const theme = String(value || '');
|
|
250
|
-
if (theme !== 'light' && theme !== 'dark') throw new Error('Le thème doit être « light » ou « dark ».');
|
|
251
|
-
return theme;
|
|
252
|
-
}
|
|
253
|
-
|
|
254
224
|
function readJson(file, fallback) {
|
|
255
225
|
try {
|
|
256
226
|
return fs.existsSync(file) ? JSON.parse(fs.readFileSync(file, 'utf8')) : fallback;
|
|
@@ -741,7 +711,6 @@ async function configurationOverview({ repoRoot, homeDir, userHome, getRuntimeSt
|
|
|
741
711
|
},
|
|
742
712
|
];
|
|
743
713
|
const models = await ollamaState(fetchImpl);
|
|
744
|
-
const telegram = getTelegramState({ repoRoot, homeDir, userHome });
|
|
745
714
|
|
|
746
715
|
// Moteurs Python locaux du venv — détection par présence de paquet, sans import
|
|
747
716
|
// (importer gliner2/mineru chargerait des centaines de Mo à chaque appel).
|
|
@@ -777,22 +746,11 @@ async function configurationOverview({ repoRoot, homeDir, userHome, getRuntimeSt
|
|
|
777
746
|
&& glinerModelReady;
|
|
778
747
|
const mineruReady = hasPackage('mineru') || hasPackage('magic_pdf')
|
|
779
748
|
|| fs.existsSync(path.join(venvDir, 'bin', 'mineru'));
|
|
780
|
-
const folders =
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
id: entry.id,
|
|
786
|
-
name: entry.name,
|
|
787
|
-
path: entry.root,
|
|
788
|
-
bot: bot ? {
|
|
789
|
-
id: bot.id,
|
|
790
|
-
name: bot.name,
|
|
791
|
-
configured: Boolean(bot.linked),
|
|
792
|
-
running: Boolean(bot.running),
|
|
793
|
-
} : null,
|
|
794
|
-
};
|
|
795
|
-
});
|
|
749
|
+
const folders = listProjectCases().map((entry) => ({
|
|
750
|
+
id: entry.id,
|
|
751
|
+
name: entry.name,
|
|
752
|
+
path: entry.root,
|
|
753
|
+
}));
|
|
796
754
|
|
|
797
755
|
return {
|
|
798
756
|
components: {
|
|
@@ -845,22 +803,6 @@ async function configurationOverview({ repoRoot, homeDir, userHome, getRuntimeSt
|
|
|
845
803
|
? 'OCR local · PDF scannés et images'
|
|
846
804
|
: 'Optionnel · non installé',
|
|
847
805
|
},
|
|
848
|
-
telegram: {
|
|
849
|
-
name: 'Telegram',
|
|
850
|
-
installed: true,
|
|
851
|
-
optional: true,
|
|
852
|
-
configured: Boolean(telegram.assistant.token.configured || telegram.monitor.token.configured),
|
|
853
|
-
summary: (() => {
|
|
854
|
-
const running = [telegram.assistant.running && 'Assistant', telegram.monitor.running && 'Surveillance'].filter(Boolean);
|
|
855
|
-
if (running.length) return `${running.join(' + ')} en ligne`;
|
|
856
|
-
if (telegram.assistant.token.configured || telegram.monitor.token.configured) return 'Configuré · arrêté';
|
|
857
|
-
return 'Aucun bot configuré';
|
|
858
|
-
})(),
|
|
859
|
-
bots: [
|
|
860
|
-
{ name: telegram.assistant.name, role: 'Assistant', configured: Boolean(telegram.assistant.token.configured), running: Boolean(telegram.assistant.running) },
|
|
861
|
-
{ name: telegram.monitor.name, role: 'Surveillance', configured: Boolean(telegram.monitor.token.configured), running: Boolean(telegram.monitor.running) },
|
|
862
|
-
],
|
|
863
|
-
},
|
|
864
806
|
},
|
|
865
807
|
models: {
|
|
866
808
|
provider: 'Ollama',
|
|
@@ -1584,9 +1526,8 @@ function finishAdminTiming(res, metric, startedAt, details = {}) {
|
|
|
1584
1526
|
// dans l'arborescence. Chaque dossier expose ses pièces originales — tout fichier
|
|
1585
1527
|
// qui n'est ni `.md` ni `.json` —, identifiées par leur chemin relatif au dossier.
|
|
1586
1528
|
async function listDossiers(repoRoot, homeDir) {
|
|
1587
|
-
const config = readRegistryConfig(path.join(homeDir, 'config.json'));
|
|
1588
1529
|
const dossiers = [];
|
|
1589
|
-
for (const entry of
|
|
1530
|
+
for (const entry of listProjectCases()) {
|
|
1590
1531
|
let originals;
|
|
1591
1532
|
try {
|
|
1592
1533
|
originals = await listOriginals(entry.root);
|
|
@@ -2043,14 +1984,8 @@ function createAdminRouter({
|
|
|
2043
1984
|
const router = express.Router();
|
|
2044
1985
|
const configFile = path.join(homeDir, 'config.json');
|
|
2045
1986
|
const envFile = path.join(repoRoot, '.env');
|
|
2046
|
-
const registryConfig = () => readRegistryConfig(configFile);
|
|
2047
1987
|
const selectedCase = (reference) => {
|
|
2048
|
-
|
|
2049
|
-
const legalCase = resolveCaseReference(config, reference);
|
|
2050
|
-
// Migration idempotente des dossiers enregistrés avant l'introduction de
|
|
2051
|
-
// l'arborescence métier. Le manifeste fige les noms utilisés par ce dossier.
|
|
2052
|
-
ensureCaseFolderStructure(legalCase.root, config);
|
|
2053
|
-
return legalCase;
|
|
1988
|
+
return resolveCaseReference(reference);
|
|
2054
1989
|
};
|
|
2055
1990
|
|
|
2056
1991
|
// Migration : l'identité de commit ne vivait que dans le `.env` du clone
|
|
@@ -2148,7 +2083,6 @@ function createAdminRouter({
|
|
|
2148
2083
|
|
|
2149
2084
|
router.get('/settings', (req, res) => {
|
|
2150
2085
|
const config = { ...defaultConfig(repoRoot, homeDir), ...readJson(configFile, {}) };
|
|
2151
|
-
config.caseFolderStructure = configuredCaseFolderStructure(config);
|
|
2152
2086
|
const env = readEnvFile(envFile);
|
|
2153
2087
|
const publicEnv = {};
|
|
2154
2088
|
const secrets = {};
|
|
@@ -2162,25 +2096,10 @@ function createAdminRouter({
|
|
|
2162
2096
|
router.put('/settings', (req, res) => {
|
|
2163
2097
|
try {
|
|
2164
2098
|
const current = { ...defaultConfig(repoRoot, homeDir), ...readJson(configFile, {}) };
|
|
2165
|
-
current.caseFolderStructure = configuredCaseFolderStructure(current);
|
|
2166
2099
|
const patch = req.body?.config || {};
|
|
2167
2100
|
const next = { ...current };
|
|
2168
2101
|
|
|
2169
|
-
if (patch.port !== undefined) {
|
|
2170
|
-
const port = Number(patch.port);
|
|
2171
|
-
if (!Number.isInteger(port) || port < 1024 || port > 65535) throw new Error('Le port doit être compris entre 1024 et 65535.');
|
|
2172
|
-
next.port = port;
|
|
2173
|
-
}
|
|
2174
2102
|
if (patch.pythonPath !== undefined) next.pythonPath = String(patch.pythonPath || '').trim() || null;
|
|
2175
|
-
if (patch.adminTheme !== undefined) next.adminTheme = validateAdminTheme(patch.adminTheme);
|
|
2176
|
-
if (patch.caseFolderStructure !== undefined) {
|
|
2177
|
-
next.caseFolderStructure = normalizeCaseFolderStructure({
|
|
2178
|
-
...current.caseFolderStructure,
|
|
2179
|
-
...(patch.caseFolderStructure && typeof patch.caseFolderStructure === 'object'
|
|
2180
|
-
? patch.caseFolderStructure
|
|
2181
|
-
: {}),
|
|
2182
|
-
});
|
|
2183
|
-
}
|
|
2184
2103
|
|
|
2185
2104
|
// L'identité de commit est aussi mémorisée dans config.json : le hook
|
|
2186
2105
|
// d'édition (lancé depuis le cache du plugin) ne peut pas lire le `.env`
|
|
@@ -2421,8 +2340,7 @@ function createAdminRouter({
|
|
|
2421
2340
|
router.get('/repository', async (req, res) => {
|
|
2422
2341
|
const startedAt = performance.now();
|
|
2423
2342
|
try {
|
|
2424
|
-
const
|
|
2425
|
-
const entries = listConfiguredCases(config);
|
|
2343
|
+
const entries = listProjectCases();
|
|
2426
2344
|
const overview = {
|
|
2427
2345
|
name: 'PieceMaker',
|
|
2428
2346
|
root: '',
|
|
@@ -2444,21 +2362,6 @@ function createAdminRouter({
|
|
|
2444
2362
|
}
|
|
2445
2363
|
});
|
|
2446
2364
|
|
|
2447
|
-
router.post('/repository/cases', async (req, res) => {
|
|
2448
|
-
try {
|
|
2449
|
-
const selected = await pickFolder(process.platform, userHome);
|
|
2450
|
-
if (!selected) return res.json({ ok: true, cancelled: true });
|
|
2451
|
-
const result = await registerLegalCase({
|
|
2452
|
-
folder: selected,
|
|
2453
|
-
configFile,
|
|
2454
|
-
homeDir,
|
|
2455
|
-
});
|
|
2456
|
-
res.status(201).json({ ok: true, ...result });
|
|
2457
|
-
} catch (error) {
|
|
2458
|
-
res.status(400).json({ error: error.message });
|
|
2459
|
-
}
|
|
2460
|
-
});
|
|
2461
|
-
|
|
2462
2365
|
router.get('/repository/case', async (req, res) => {
|
|
2463
2366
|
const startedAt = performance.now();
|
|
2464
2367
|
try {
|
|
@@ -2980,42 +2883,6 @@ function createAdminRouter({
|
|
|
2980
2883
|
}
|
|
2981
2884
|
});
|
|
2982
2885
|
|
|
2983
|
-
router.get('/telegram', (req, res) => {
|
|
2984
|
-
res.json(getTelegramState({ repoRoot, homeDir, userHome }));
|
|
2985
|
-
});
|
|
2986
|
-
|
|
2987
|
-
router.put('/telegram', (req, res) => {
|
|
2988
|
-
try {
|
|
2989
|
-
res.json({ ok: true, ...saveTelegramConfig({ repoRoot, homeDir, userHome }, req.body) });
|
|
2990
|
-
} catch (error) {
|
|
2991
|
-
res.status(400).json({ error: error.message });
|
|
2992
|
-
}
|
|
2993
|
-
});
|
|
2994
|
-
|
|
2995
|
-
router.post('/telegram/:role/:action', (req, res) => {
|
|
2996
|
-
try {
|
|
2997
|
-
res.json(controlTelegram({ repoRoot, homeDir, userHome }, req.params.role, req.params.action));
|
|
2998
|
-
} catch (error) {
|
|
2999
|
-
res.status(400).json({ error: error.message });
|
|
3000
|
-
}
|
|
3001
|
-
});
|
|
3002
|
-
|
|
3003
|
-
router.put('/telegram/dossiers/:id', (req, res) => {
|
|
3004
|
-
try {
|
|
3005
|
-
res.json({ ok: true, dossier: saveDossierBot({ repoRoot, homeDir, userHome }, req.params.id, req.body) });
|
|
3006
|
-
} catch (error) {
|
|
3007
|
-
res.status(400).json({ error: error.message });
|
|
3008
|
-
}
|
|
3009
|
-
});
|
|
3010
|
-
|
|
3011
|
-
router.post('/telegram/dossiers/:id/:action', (req, res) => {
|
|
3012
|
-
try {
|
|
3013
|
-
res.json(controlDossierBot({ repoRoot, homeDir, userHome }, req.params.id, req.params.action));
|
|
3014
|
-
} catch (error) {
|
|
3015
|
-
res.status(400).json({ error: error.message });
|
|
3016
|
-
}
|
|
3017
|
-
});
|
|
3018
|
-
|
|
3019
2886
|
return router;
|
|
3020
2887
|
}
|
|
3021
2888
|
|
|
@@ -3057,5 +2924,4 @@ module.exports = {
|
|
|
3057
2924
|
saveManagedFile,
|
|
3058
2925
|
selectLocalFolder,
|
|
3059
2926
|
updateEnvFile,
|
|
3060
|
-
validateAdminTheme,
|
|
3061
2927
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/** Legal-case registry: every CloudCLI project published by the server is a case. */
|
|
2
2
|
const crypto = require('node:crypto');
|
|
3
3
|
const fs = require('node:fs');
|
|
4
4
|
const path = require('node:path');
|
|
@@ -6,27 +6,15 @@ const path = require('node:path');
|
|
|
6
6
|
const {
|
|
7
7
|
isTechnicalCaseDirectoryName,
|
|
8
8
|
} = require('../piecemaker-plugin/scripts/lib/commits.cjs');
|
|
9
|
-
const {
|
|
10
|
-
configuredWatchPaths,
|
|
11
|
-
registeredCaseFolders,
|
|
12
|
-
} = require('../piecemaker-plugin/scripts/lib/case-folders.cjs');
|
|
13
|
-
|
|
14
|
-
function readRegistryConfig(configFile) {
|
|
15
|
-
try {
|
|
16
|
-
const parsed = JSON.parse(fs.readFileSync(configFile, 'utf8'));
|
|
17
|
-
return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {};
|
|
18
|
-
} catch {
|
|
19
|
-
return {};
|
|
20
|
-
}
|
|
21
|
-
}
|
|
9
|
+
const { registeredProjectFolders } = require('../piecemaker-plugin/scripts/lib/case-folders.cjs');
|
|
22
10
|
|
|
23
11
|
function caseFolderId(folder) {
|
|
24
12
|
const digest = crypto.createHash('sha256').update(path.resolve(folder)).digest('hex').slice(0, 20);
|
|
25
13
|
return `folder-${digest}`;
|
|
26
14
|
}
|
|
27
15
|
|
|
28
|
-
function
|
|
29
|
-
return
|
|
16
|
+
function projectEntries() {
|
|
17
|
+
return registeredProjectFolders().map((root) => ({
|
|
30
18
|
id: caseFolderId(root),
|
|
31
19
|
name: path.basename(root),
|
|
32
20
|
root,
|
|
@@ -36,22 +24,21 @@ function explicitEntries(config) {
|
|
|
36
24
|
}));
|
|
37
25
|
}
|
|
38
26
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
* longer a workspace root whose immediate children are listed automatically —
|
|
42
|
-
* a matter appears once it has been registered from the admin panel.
|
|
43
|
-
*/
|
|
44
|
-
function listConfiguredCases(config) {
|
|
45
|
-
return explicitEntries(config).sort((a, b) =>
|
|
27
|
+
function listProjectCases() {
|
|
28
|
+
return projectEntries().sort((a, b) =>
|
|
46
29
|
a.name.localeCompare(b.name, 'fr') || a.root.localeCompare(b.root, 'fr'));
|
|
47
30
|
}
|
|
48
31
|
|
|
49
|
-
function resolveCaseReference(
|
|
32
|
+
function resolveCaseReference(reference) {
|
|
50
33
|
const token = String(reference || '').trim();
|
|
51
34
|
if (!token) throw new Error('Dossier juridique invalide.');
|
|
52
|
-
const
|
|
53
|
-
if (!
|
|
54
|
-
return
|
|
35
|
+
const entry = projectEntries().find((candidate) => candidate.id === token);
|
|
36
|
+
if (!entry) throw new Error('Ce dossier juridique n’est pas un projet enregistré.');
|
|
37
|
+
return entry;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function projectCaseEntry(root) {
|
|
41
|
+
return projectEntries().find((entry) => entry.root === root) || null;
|
|
55
42
|
}
|
|
56
43
|
|
|
57
44
|
function validateSelectedCaseFolder(folder) {
|
|
@@ -71,23 +58,10 @@ function validateSelectedCaseFolder(folder) {
|
|
|
71
58
|
return root;
|
|
72
59
|
}
|
|
73
60
|
|
|
74
|
-
function registerCaseFolder(config, folder) {
|
|
75
|
-
const root = validateSelectedCaseFolder(folder);
|
|
76
|
-
const existing = registeredCaseFolders(config);
|
|
77
|
-
const caseFolders = [...new Set([...existing, root])];
|
|
78
|
-
const next = { ...config, caseFolders };
|
|
79
|
-
next.anonymization = {
|
|
80
|
-
...(config?.anonymization || {}),
|
|
81
|
-
watchPaths: configuredWatchPaths(next),
|
|
82
|
-
};
|
|
83
|
-
return { config: next, entry: explicitEntries(next).find((item) => item.root === root) };
|
|
84
|
-
}
|
|
85
|
-
|
|
86
61
|
module.exports = {
|
|
87
62
|
caseFolderId,
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
registerCaseFolder,
|
|
63
|
+
listProjectCases,
|
|
64
|
+
projectCaseEntry,
|
|
91
65
|
resolveCaseReference,
|
|
92
66
|
validateSelectedCaseFolder,
|
|
93
67
|
};
|
|
@@ -10,9 +10,6 @@
|
|
|
10
10
|
const fs = require('fs');
|
|
11
11
|
const path = require('path');
|
|
12
12
|
|
|
13
|
-
/** Racine du dépôt git, quatre niveaux au-dessus de ce fichier vendorisé. */
|
|
14
|
-
const GIT_REPO_ROOT = path.resolve(__dirname, '..', '..', '..', '..');
|
|
15
|
-
|
|
16
13
|
const DEPRECATED_HOOKS = new Set([
|
|
17
14
|
'anonymize-read.mjs',
|
|
18
15
|
'deanonymize-write.mjs',
|
|
@@ -231,74 +228,6 @@ function installClaudeHooks(repoRoot, userHome) {
|
|
|
231
228
|
return { ok: true, changed: changed || cleanup.changed, registered, settings: target, cleanup };
|
|
232
229
|
}
|
|
233
230
|
|
|
234
|
-
/**
|
|
235
|
-
* Sentinelle SessionStart (proxy PII) — script unique, partagé avec Codex,
|
|
236
|
-
* hors de piecemaker-plugin/ (voir scripts/piecemaker/hooks/proxy-guard.mjs).
|
|
237
|
-
* Non sourcée depuis hooks.json : son placeholder ${CLAUDE_PLUGIN_ROOT} ne
|
|
238
|
-
* peut pas désigner un script qui n'est délibérément pas vendorisé.
|
|
239
|
-
*/
|
|
240
|
-
function sessionHookScriptPath() {
|
|
241
|
-
return path.join(GIT_REPO_ROOT, 'scripts', 'piecemaker', 'hooks', 'proxy-guard.mjs');
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
function sessionHookCommand() {
|
|
245
|
-
return `node "${sessionHookScriptPath().replaceAll('"', '\\"')}"`;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
function isOwnSessionHook(hook) {
|
|
249
|
-
const command = typeof hook?.command === 'string' ? hook.command : '';
|
|
250
|
-
return command.includes('proxy-guard.mjs');
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
function claudeSessionHookStatus(userHome) {
|
|
254
|
-
const target = settingsPath(userHome);
|
|
255
|
-
const command = sessionHookCommand();
|
|
256
|
-
if (!fs.existsSync(target)) return { ok: false, reason: 'settings-absent', command };
|
|
257
|
-
const settings = readJson(target);
|
|
258
|
-
if (!settings) return { ok: false, reason: 'settings-invalide', command };
|
|
259
|
-
const groups = Array.isArray(settings.hooks?.SessionStart) ? settings.hooks.SessionStart : [];
|
|
260
|
-
const managed = groups.flatMap((group) => Array.isArray(group?.hooks) ? group.hooks : []).filter(isOwnSessionHook);
|
|
261
|
-
const exact = groups.some((group) => group?.matcher === 'startup|resume|clear'
|
|
262
|
-
&& Array.isArray(group.hooks)
|
|
263
|
-
&& group.hooks.some((hook) => hook?.type === 'command' && hook.command === command));
|
|
264
|
-
return { ok: exact && managed.length === 1, reason: exact && managed.length === 1 ? '' : 'hook-absent-ou-perime', command };
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
/** Fusionne uniquement la sentinelle SessionStart ; tous les hooks personnels sont conservés. */
|
|
268
|
-
function installClaudeSessionHook(userHome) {
|
|
269
|
-
const target = settingsPath(userHome);
|
|
270
|
-
const command = sessionHookCommand();
|
|
271
|
-
|
|
272
|
-
let settings = {};
|
|
273
|
-
if (fs.existsSync(target)) {
|
|
274
|
-
settings = readJson(target);
|
|
275
|
-
if (!settings) return { ok: false, changed: false, reason: 'settings-invalide', command, settings: target };
|
|
276
|
-
}
|
|
277
|
-
if (!settings.hooks || typeof settings.hooks !== 'object' || Array.isArray(settings.hooks)) settings.hooks = {};
|
|
278
|
-
|
|
279
|
-
const groups = Array.isArray(settings.hooks.SessionStart) ? settings.hooks.SessionStart : [];
|
|
280
|
-
const preserved = [];
|
|
281
|
-
for (const group of groups) {
|
|
282
|
-
if (!group || typeof group !== 'object' || Array.isArray(group)) {
|
|
283
|
-
preserved.push(group);
|
|
284
|
-
continue;
|
|
285
|
-
}
|
|
286
|
-
const hooks = Array.isArray(group.hooks) ? group.hooks.filter((hook) => !isOwnSessionHook(hook)) : [];
|
|
287
|
-
if (hooks.length || !Array.isArray(group.hooks)) preserved.push({ ...group, hooks });
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
const status = claudeSessionHookStatus(userHome);
|
|
291
|
-
if (status.ok) return { ok: true, changed: false, command, settings: target };
|
|
292
|
-
|
|
293
|
-
settings.hooks.SessionStart = [...preserved, {
|
|
294
|
-
matcher: 'startup|resume|clear',
|
|
295
|
-
hooks: [{ type: 'command', command, timeout: 45 }],
|
|
296
|
-
}];
|
|
297
|
-
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
298
|
-
fs.writeFileSync(target, `${JSON.stringify(settings, null, 2)}\n`, 'utf8');
|
|
299
|
-
return { ok: true, changed: true, command, settings: target };
|
|
300
|
-
}
|
|
301
|
-
|
|
302
231
|
/**
|
|
303
232
|
* statusLine Claude Code — même logique de matérialisation que les hooks,
|
|
304
233
|
* mais pour une clé unique de settings.json (`statusLine`) plutôt qu'un
|
|
@@ -371,11 +300,9 @@ function installClaudeStatusLine(repoRoot, userHome) {
|
|
|
371
300
|
|
|
372
301
|
module.exports = {
|
|
373
302
|
claudeHooksStatus,
|
|
374
|
-
claudeSessionHookStatus,
|
|
375
303
|
claudeStatusLineStatus,
|
|
376
304
|
directHookGroups,
|
|
377
305
|
installClaudeHooks,
|
|
378
|
-
installClaudeSessionHook,
|
|
379
306
|
installClaudeStatusLine,
|
|
380
307
|
removeDeprecatedHooks,
|
|
381
308
|
settingsPath,
|
|
@@ -45,11 +45,6 @@ const {
|
|
|
45
45
|
// Vocabulaire des sigles de sociétés (SA_1, SARL_1, PERS_MORALE_1…), miroir de
|
|
46
46
|
// `_LEGAL_FORMS` (scan_utils.py) — sert à classer un code déjà attribué.
|
|
47
47
|
const { isSocieteCode, societeCounterKey, detectCompanySigle, LEGAL_FORM_TOKENS } = require('./legal-forms.cjs');
|
|
48
|
-
// À chaque enregistrement d'un mapping de dossier, le mapping central global est
|
|
49
|
-
// reconstruit et dé-conflicté : c'est lui que le hook central applique à toute
|
|
50
|
-
// lecture, dossier ou non. `syncCentralMapping` ne jette jamais — un central qui
|
|
51
|
-
// échoue ne doit pas faire échouer la sauvegarde du dossier.
|
|
52
|
-
const { syncCentralMapping } = require('../piecemaker-plugin/scripts/lib/central-mapping.cjs');
|
|
53
48
|
|
|
54
49
|
const SCRIPTS_DIR = path.join(__dirname, 'scripts');
|
|
55
50
|
const PIECEMAKER_HOME = path.join(os.homedir(), '.piecemaker');
|
|
@@ -154,8 +149,6 @@ function writeCaseMapping(caseRoot, document) {
|
|
|
154
149
|
fs.unlinkSync(full);
|
|
155
150
|
}
|
|
156
151
|
}
|
|
157
|
-
// Le mapping central reflète désormais ce dossier. Best-effort et jamais bloquant.
|
|
158
|
-
try { syncCentralMapping(); } catch { /* le central ne doit pas bloquer une sauvegarde */ }
|
|
159
152
|
return { file, exists: true, ignored: payload.ignored || [], ...payload };
|
|
160
153
|
}
|
|
161
154
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Routes tampon et tamponnage, extraites de `websocket-server/server.cjs` de
|
|
2
2
|
// PieceMaker-Installer (endpoints /api/tampon/* et /api/stamping) pour être
|
|
3
3
|
// montées sur le serveur CloudCLI. La logique est reprise telle quelle ; seules
|
|
4
|
-
// les dépendances au module `server.cjs` (PIECEMAKER_HOME,
|
|
4
|
+
// les dépendances au module `server.cjs` (PIECEMAKER_HOME,
|
|
5
5
|
// readFileStripBOM) sont devenues des paramètres ou des fonctions locales.
|
|
6
6
|
const fs = require('fs');
|
|
7
7
|
const os = require('os');
|
|
@@ -13,7 +13,7 @@ const {
|
|
|
13
13
|
stampDataUrl,
|
|
14
14
|
stampedPiecesDirectory,
|
|
15
15
|
} = require('./lib/stamping.cjs');
|
|
16
|
-
const { isInside,
|
|
16
|
+
const { isInside, resolveProjectCaseFolder } = require('./workspace-paths.cjs');
|
|
17
17
|
|
|
18
18
|
const ORIGINALS_SUBFOLDER = 'pièces originales';
|
|
19
19
|
const DOSSIER_FOLDERS_FILE = 'dossier_folders.json';
|
|
@@ -63,17 +63,8 @@ function createStampingRouter({ homeDir = path.join(os.homedir(), '.piecemaker')
|
|
|
63
63
|
const express = require('express');
|
|
64
64
|
const router = express.Router();
|
|
65
65
|
|
|
66
|
-
const configPath = path.join(homeDir, 'config.json');
|
|
67
66
|
const getSystemDataPath = (...segments) => path.join(homeDir, ...segments);
|
|
68
67
|
|
|
69
|
-
const readUserConfig = () => {
|
|
70
|
-
try {
|
|
71
|
-
return fs.existsSync(configPath) ? JSON.parse(fs.readFileSync(configPath, 'utf8')) : {};
|
|
72
|
-
} catch {
|
|
73
|
-
return {};
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
|
|
77
68
|
const readDossierFolders = () => {
|
|
78
69
|
try {
|
|
79
70
|
const file = getSystemDataPath(DOSSIER_FOLDERS_FILE);
|
|
@@ -85,7 +76,7 @@ function createStampingRouter({ homeDir = path.join(os.homedir(), '.piecemaker')
|
|
|
85
76
|
|
|
86
77
|
const rememberDossierFolder = (documentId, folder) => {
|
|
87
78
|
if (!documentId || !folder) throw new Error('documentId et dossier de travail requis.');
|
|
88
|
-
const legalCase =
|
|
79
|
+
const legalCase = resolveProjectCaseFolder(folder);
|
|
89
80
|
const registry = readDossierFolders();
|
|
90
81
|
if (registry[documentId] === legalCase) return legalCase;
|
|
91
82
|
registry[documentId] = legalCase;
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
const path = require('path');
|
|
2
|
-
const {
|
|
2
|
+
const { locateProjectCase } = require('../piecemaker-plugin/scripts/lib/case-folders.cjs');
|
|
3
3
|
|
|
4
4
|
function isInside(root, candidate) {
|
|
5
5
|
const relative = path.relative(root, candidate);
|
|
6
6
|
return relative !== '' && relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
/** Resolve a selected path to the
|
|
10
|
-
function
|
|
9
|
+
/** Resolve a selected path to the project folder that contains it. */
|
|
10
|
+
function resolveProjectCaseFolder(selectedFolder) {
|
|
11
11
|
if (!selectedFolder) throw new Error('Dossier de travail manquant.');
|
|
12
|
-
const located =
|
|
12
|
+
const located = locateProjectCase(selectedFolder);
|
|
13
13
|
if (!located) {
|
|
14
|
-
throw new Error('Ce dossier de travail n’est pas
|
|
14
|
+
throw new Error('Ce dossier de travail n’est pas un projet PieceMaker. Ouvrez-le comme projet.');
|
|
15
15
|
}
|
|
16
16
|
return located.caseRoot;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
module.exports = {
|
|
20
20
|
isInside,
|
|
21
|
-
|
|
21
|
+
resolveProjectCaseFolder,
|
|
22
22
|
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{$ as ln,a0 as an,a1 as y,a2 as tn,a3 as G,a4 as q,a5 as _,a6 as un,a7 as rn,a8 as K,a9 as o,aa as z,ab as sn,ac as on,ad as fn}from"./mermaid.core-DYUb_UUB.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,B,a){var O=I-l,i=D-h,n=B-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function V(l,h,I,D,v,A,B){var a=l-I,O=h-D,i=(B?A:-A)/K(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,C=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*K(fn(0,T*T*R-P*P)),$=(P*g-m*S)/R,j=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=$-C,e=j-t,r=w-C,F=p-t;return x*x+e*e>r*r+F*F&&($=w,j=p),{cx:$,cy:j,x01:-n,y01:-d,x11:$*(v/T-1),y11:j*(v/T-1)}}function hn(){var l=cn,h=yn,I=z(0),D=null,v=gn,A=dn,B=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-an,c=A.apply(this,arguments)-an,C=un(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(C>tn-y)a.moveTo(s*G(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*G(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=C,S=C,$=B.apply(this,arguments)/2,j=$>y&&(D?+D.apply(this,arguments):K(u*u+s*s)),w=_(un(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if(j>y){var F=sn(j/u*q($)),L=sn(j/s*q($));(P-=F*2)>y?(F*=t?1:-1,R+=F,T-=F):(P=0,R=T=(f+c)/2),(S-=L*2)>y?(L*=t?1:-1,m+=L,g-=L):(S=0,m=g=(f+c)/2)}var H=s*G(m),J=s*q(m),M=u*G(T),N=u*q(T);if(w>y){var Q=s*G(g),U=s*q(g),W=u*G(R),X=u*q(R),E;if(C<rn)if(E=pn(H,J,W,X,Q,U,M,N)){var Y=H-E[0],Z=J-E[1],b=Q-E[0],k=U-E[1],nn=1/q(on((Y*b+Z*k)/(K(Y*Y+Z*Z)*K(b*b+k*k)))/2),en=K(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=V(W,X,H,J,s,x,t),r=V(Q,U,M,N,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(H,J),a.arc(0,0,s,m,g,!t)):a.moveTo(H,J),!(u>y)||!(P>y)?a.lineTo(M,N):p>y?(e=V(M,N,Q,U,u,-p,t),r=V(H,J,W,X,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-rn/2;return[G(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:z(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:z(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:z(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:z(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:z(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:z(+n),i):A},i.padAngle=function(n){return arguments.length?(B=typeof n=="function"?n:z(+n),i):B},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};
|