@piecemaker-legal/piecemaker 2.0.11 → 2.0.12
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 → FindReplaceDialog-KU5TEIBJ-BBxf1he7.js} +1 -1
- package/dist/assets/{FootnotePropertiesDialog-W3YHM4BV-D5UqbelV.js → FootnotePropertiesDialog-W3YHM4BV-BYqp6U4x.js} +1 -1
- package/dist/assets/{HyperlinkDialog-ZYH7ZHRF-8yEhLigd.js → HyperlinkDialog-ZYH7ZHRF-BVC9zOMs.js} +4 -4
- package/dist/assets/{ImagePositionDialog-HEWYR6Q3-wGIBYxCm.js → ImagePositionDialog-HEWYR6Q3-Xn2mC64y.js} +1 -1
- package/dist/assets/{ImagePropertiesDialog-RAB47C6M-D86PckZ2.js → ImagePropertiesDialog-RAB47C6M-CFcdqEif.js} +1 -1
- package/dist/assets/{PageSetupDialog-AIGIXO3E-DLETP-7v.js → PageSetupDialog-AIGIXO3E-DECaeRS9.js} +1 -1
- package/dist/assets/{SplitCellDialog-IFBKYCD6-CwdQBXeb.js → SplitCellDialog-IFBKYCD6-ByYa04H_.js} +1 -1
- package/dist/assets/{TablePropertiesDialog-TMLKGOOW-j2nA7KJs.js → TablePropertiesDialog-TMLKGOOW-BuyqZB5A.js} +1 -1
- package/dist/assets/{WatermarkDialog-KRL7WMIS-XFJ9gTkC.js → WatermarkDialog-KRL7WMIS-ByZ1Acr2.js} +1 -1
- package/dist/assets/{abnfDiagram-VCTEODGH-DiCrND_Y.js → abnfDiagram-VCTEODGH-BtttzdZA.js} +1 -1
- package/dist/assets/{arc-DOjgbMYz.js → arc-DN4m1tLs.js} +1 -1
- package/dist/assets/{architectureDiagram-5GKGNRK7-brzIFVhl.js → architectureDiagram-5GKGNRK7-Bt-zFumG.js} +1 -1
- package/dist/assets/{blockDiagram-I7D4REHJ-C8JhTjQQ.js → blockDiagram-I7D4REHJ-D14V8v4j.js} +1 -1
- package/dist/assets/{c4Diagram-7LVT6UL2-jfYxccyk.js → c4Diagram-7LVT6UL2-BynDo1-W.js} +1 -1
- package/dist/assets/channel-C4gJXzYa.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-CrlEShp9.js → chunk-2Q5K7J3B-B8gKhSj9.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-DzPlUHGq.js → chunk-5VM5RSS4-GvOpglRR.js} +1 -1
- package/dist/assets/{chunk-F27PBJKO-Cp9cpeWU.js → chunk-F27PBJKO-CAgZy0qc.js} +1 -1
- package/dist/assets/{chunk-IMKFNOWR-BifUldEN.js → chunk-IMKFNOWR-gf8Ux8Zd.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-ggPEIkWu.js → chunk-JWPE2WC7-D4zFFRMp.js} +1 -1
- package/dist/assets/{chunk-POPQ4Y6H-3h_nayRX.js → chunk-POPQ4Y6H-Ct8X_LaT.js} +1 -1
- package/dist/assets/{chunk-SVP7TREG-CH29aG6J.js → chunk-SVP7TREG-g5iH1bs5.js} +1 -1
- package/dist/assets/{chunk-TICWLB2K-PluJUM5k.js → chunk-TICWLB2K-89-VFKTn.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-DXU39Vwg.js → chunk-XXDRQBXY-CaQbdObb.js} +1 -1
- package/dist/assets/classDiagram-ZZMXUADV-Cm08FeYk.js +1 -0
- package/dist/assets/classDiagram-v2-VYDZK3BY-Cm08FeYk.js +1 -0
- package/dist/assets/{cose-bilkent-JH36ORCC-Dz6roYrN.js → cose-bilkent-JH36ORCC-BiYOGJAU.js} +1 -1
- package/dist/assets/{cynefin-OW5HDTMX-BLzrpSit.js → cynefin-OW5HDTMX-F6mJ-4tj.js} +1 -1
- package/dist/assets/{cynefinDiagram-5FMLGOSQ-kfxnERDZ.js → cynefinDiagram-5FMLGOSQ-q-Rggn6r.js} +1 -1
- package/dist/assets/{dagre-GXQ25YYZ-DP57bp-N.js → dagre-GXQ25YYZ-COqImSUH.js} +1 -1
- package/dist/assets/{diagram-S7CK7UJ4-DAlsrQVW.js → diagram-S7CK7UJ4-BAg1dyEc.js} +1 -1
- package/dist/assets/{diagram-UQ7AKVKN-By5yrMer.js → diagram-UQ7AKVKN-DFJS8qCV.js} +1 -1
- package/dist/assets/{diagram-VSXAHHWV-Dx89kryN.js → diagram-VSXAHHWV-BfldL35r.js} +1 -1
- package/dist/assets/{diagram-VX7I27RA-B9fARitZ.js → diagram-VX7I27RA-kLjovpYe.js} +1 -1
- package/dist/assets/{diagram-Z3DM3KII-DC15CEH1.js → diagram-Z3DM3KII-Dhwvi3Iu.js} +1 -1
- package/dist/assets/{ebnfDiagram-PWID7BFC-BKQzghGF.js → ebnfDiagram-PWID7BFC-Bp4YE1i7.js} +1 -1
- package/dist/assets/{erDiagram-RLTQ6QDP-CPY6RM7G.js → erDiagram-RLTQ6QDP-BKDdaSWz.js} +1 -1
- package/dist/assets/{flowDiagram-HODETNUW-4dL4GJcf.js → flowDiagram-HODETNUW-zHProVxL.js} +1 -1
- package/dist/assets/{ganttDiagram-EL5Y4UJY-D4-cVcfb.js → ganttDiagram-EL5Y4UJY-B-B-BI6j.js} +1 -1
- package/dist/assets/{gitGraphDiagram-WWUBYQGX-BMeVIEiX.js → gitGraphDiagram-WWUBYQGX-BTHMg5CH.js} +1 -1
- package/dist/assets/index-C5slQNvE.css +1 -0
- package/dist/assets/{index-DNtFDOni.js → index-CJP4dZ-c.js} +146 -146
- package/dist/assets/{infoDiagram-27XIBGKW-D5qMSUEU.js → infoDiagram-27XIBGKW-mabp4H9I.js} +1 -1
- package/dist/assets/{ishikawaDiagram-5VMMS53U-BDnyKRHm.js → ishikawaDiagram-5VMMS53U-CLNhcCrM.js} +1 -1
- package/dist/assets/{journeyDiagram-3NMN7TZE-dGz5ZGzq.js → journeyDiagram-3NMN7TZE-CGEi2RB6.js} +1 -1
- package/dist/assets/{kanban-definition-UXKFOSKX-D7UAz7o_.js → kanban-definition-UXKFOSKX-B2fLX1fK.js} +1 -1
- package/dist/assets/{layout-DKrmEGrz.js → layout-CloKWsFq.js} +1 -1
- package/dist/assets/{linear-CrTdMY-p.js → linear-BFyydI0c.js} +1 -1
- package/dist/assets/{mermaid.core-CXQOT5G6.js → mermaid.core-Dxl3LVAh.js} +6 -6
- package/dist/assets/{mindmap-definition-YA3MSWOX-VgEiYfay.js → mindmap-definition-YA3MSWOX-FT4pm55s.js} +1 -1
- package/dist/assets/{pegDiagram-XKGWAZYB-9IqT8gGx.js → pegDiagram-XKGWAZYB-okyIfJWM.js} +1 -1
- package/dist/assets/{pieDiagram-E7YTZNPT-D98pRE-t.js → pieDiagram-E7YTZNPT-NF61CQz8.js} +1 -1
- package/dist/assets/{quadrantDiagram-AXDQQJYC-b9PwkYzL.js → quadrantDiagram-AXDQQJYC-uVfvZzzt.js} +1 -1
- package/dist/assets/{railroadDiagram-O6MQD6OU-Dz87hsPE.js → railroadDiagram-O6MQD6OU-Dp8IpeoH.js} +1 -1
- package/dist/assets/{requirementDiagram-BXWQKSXE-CkcV73dK.js → requirementDiagram-BXWQKSXE-D8VV0oQe.js} +1 -1
- package/dist/assets/{sankeyDiagram-P5KCCOFB-UBN31Yrs.js → sankeyDiagram-P5KCCOFB-D-xhxjob.js} +1 -1
- package/dist/assets/{sequenceDiagram-WJ2MYXX4-CpQxd5Za.js → sequenceDiagram-WJ2MYXX4-BAQBK95h.js} +1 -1
- package/dist/assets/{sizeCapture-INFHLROL-mCsFmyzw.js → sizeCapture-INFHLROL-C6rk9SVx.js} +1 -1
- package/dist/assets/{stateDiagram-D77RDMKH-B0MTBN-3.js → stateDiagram-D77RDMKH-DshqaEOj.js} +1 -1
- package/dist/assets/{stateDiagram-v2-MP3YSRHH-DzBPN39W.js → stateDiagram-v2-MP3YSRHH-BohZIrk5.js} +1 -1
- package/dist/assets/{swimlanes-42K2YHIH-Dzydjm0e.js → swimlanes-42K2YHIH-DgcPDy4l.js} +1 -1
- package/dist/assets/swimlanesDiagram-VR7AAH4N-CuM3Su0K.js +8 -0
- package/dist/assets/{timeline-definition-24CTP7MA-Dz0toOLu.js → timeline-definition-24CTP7MA-OgpIe-gQ.js} +1 -1
- package/dist/assets/{vennDiagram-4TSXK5OY-DOWp7dkf.js → vennDiagram-4TSXK5OY-BZzGd6jt.js} +1 -1
- package/dist/assets/{wardleyDiagram-VM6X3IG4-CUxsztUB.js → wardleyDiagram-VM6X3IG4-1tg-H7l_.js} +1 -1
- package/dist/assets/{xychartDiagram-S5SC5T6Z-DS96vNED.js → xychartDiagram-S5SC5T6Z-ByTsX8g0.js} +1 -1
- package/dist/index.html +2 -2
- package/dist/sw.js +1 -1
- package/dist-server/plugins/piecemaker-dossier/src/knowledge.js +61 -1
- package/dist-server/plugins/piecemaker-dossier/src/knowledge.js.map +1 -1
- package/dist-server/plugins/piecemaker-dossier/src/scan-result.js +0 -48
- package/dist-server/plugins/piecemaker-dossier/src/scan-result.js.map +1 -1
- package/dist-server/server/piecemaker/knowledge/pipeline.js +25 -29
- package/dist-server/server/piecemaker/knowledge/pipeline.js.map +1 -1
- package/dist-server/server/piecemaker/knowledge/service.js +1 -16
- package/dist-server/server/piecemaker/knowledge/service.js.map +1 -1
- package/dist-server/server/piecemaker/project-registry.js +5 -5
- package/dist-server/server/piecemaker/project-registry.js.map +1 -1
- package/package.json +1 -1
- package/server/piecemaker/anonymizer/hudsucker-fixture.cjs +1 -1
- package/server/piecemaker/anonymizer/hudsucker-proxy/src/main.rs +2 -1
- package/server/piecemaker/anonymizer/rewrite.cjs +2 -2
- package/server/piecemaker/anonymizer/service.cjs +3 -2
- package/server/piecemaker/anonymizer/sqlite-dictionary.cjs +3 -31
- package/server/piecemaker/index.ts +1 -1
- package/server/piecemaker/knowledge/pipeline.ts +24 -31
- package/server/piecemaker/knowledge/service.ts +1 -14
- package/server/piecemaker/project-registry.ts +6 -6
- package/server/piecemaker/vendor/installer/bin/piecemaker.mjs +9 -162
- package/server/piecemaker/vendor/installer/lib/commandes.mjs +1 -2
- package/server/piecemaker/vendor/installer/lib/conversion-client.mjs +62 -3
- package/server/piecemaker/vendor/installer/steps/06-hooks.mjs +23 -69
- package/server/piecemaker/vendor/installer/steps/12-mcp-piecemaker.mjs +3 -3
- package/server/piecemaker/vendor/mcp/README.md +1 -1
- package/server/piecemaker/vendor/mcp/piecemaker/server.mjs +12 -75
- package/server/piecemaker/vendor/piecemaker-plugin/hooks/hooks.json +0 -40
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/compile-recherche.mjs +2 -2
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folders.cjs +26 -7
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/commits.cjs +0 -28
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/hook-io.mjs +0 -13
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/institutional-terms.cjs +3 -3
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/mapping.cjs +10 -143
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/protection.cjs +1 -1
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/session-timing.cjs +0 -65
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/protect-originals.mjs +11 -2
- package/server/piecemaker/vendor/piecemaker-plugin/skills/conversion-md/SKILL.md +9 -5
- package/server/piecemaker/vendor/websocket-server/admin-routes.cjs +2 -150
- package/server/piecemaker/vendor/websocket-server/claude-hooks.cjs +3 -0
- package/server/piecemaker/vendor/websocket-server/originals-pipeline.cjs +23 -372
- package/server/piecemaker/vendor/websocket-server/renamed-originals.cjs +136 -0
- package/server/piecemaker/vendor/websocket-server/scripts/convert_and_scan_pipeline.py +115 -96
- package/dist/assets/channel-Dajzu2W1.js +0 -1
- package/dist/assets/classDiagram-ZZMXUADV-dDEP_giv.js +0 -1
- package/dist/assets/classDiagram-v2-VYDZK3BY-dDEP_giv.js +0 -1
- package/dist/assets/index-Dc9wNuS4.css +0 -1
- package/dist/assets/swimlanesDiagram-VR7AAH4N-BXQpbUMD.js +0 -8
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/billing-track.mjs +0 -194
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/commit-track.mjs +0 -71
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/session-commit-worker.mjs +0 -260
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/session-commit.mjs +0 -83
|
@@ -16,6 +16,10 @@
|
|
|
16
16
|
* le skill `docx-cli` est disponible : il travaille par le binaire `docx`
|
|
17
17
|
* (`docx read pièce.docx`, `docx find`…), qui contournerait entièrement un
|
|
18
18
|
* garde-fou limité à Read/Grep/Glob.
|
|
19
|
+
*
|
|
20
|
+
* Le hook n'agit que dans un dossier au bouclier vert : anonymisation terminée
|
|
21
|
+
* (publiée par le serveur dans `~/.piecemaker/anonymized-projects.json`) et
|
|
22
|
+
* protection non levée. Ailleurs, il laisse tout passer.
|
|
19
23
|
*/
|
|
20
24
|
|
|
21
25
|
import fs from 'node:fs';
|
|
@@ -27,6 +31,7 @@ const require = createRequire(import.meta.url);
|
|
|
27
31
|
const { locateProjectCase } = require('./lib/case-folders.cjs');
|
|
28
32
|
const {
|
|
29
33
|
isMappingFile,
|
|
34
|
+
isProtectionBypassed,
|
|
30
35
|
isSecretFile,
|
|
31
36
|
isProtectedFile,
|
|
32
37
|
markdownCounterpart,
|
|
@@ -153,6 +158,10 @@ function caseRootHasMapping(located) {
|
|
|
153
158
|
}
|
|
154
159
|
}
|
|
155
160
|
|
|
161
|
+
function shieldActive(located) {
|
|
162
|
+
return Boolean(located?.anonymized) && !isProtectionBypassed(located.caseRoot);
|
|
163
|
+
}
|
|
164
|
+
|
|
156
165
|
async function main() {
|
|
157
166
|
const payload = await readHookPayload(2000);
|
|
158
167
|
if (!payload) return null;
|
|
@@ -163,7 +172,7 @@ async function main() {
|
|
|
163
172
|
if (toolName === 'Bash') {
|
|
164
173
|
for (const candidate of commandPaths(payload.tool_input?.command, cwd)) {
|
|
165
174
|
const located = locateProjectCase(candidate);
|
|
166
|
-
if (!located) continue;
|
|
175
|
+
if (!shieldActive(located)) continue;
|
|
167
176
|
if (isMappingFile(candidate)) return deny(mappingReason(candidate));
|
|
168
177
|
if (isSecretFile(candidate)) return deny(secretReason(candidate));
|
|
169
178
|
if (isProtectedFile(candidate, located.caseRoot)) {
|
|
@@ -178,7 +187,7 @@ async function main() {
|
|
|
178
187
|
const target = absolutePath(payload.tool_input?.file_path || payload.tool_input?.path, cwd);
|
|
179
188
|
if (!target) return null;
|
|
180
189
|
const located = locateProjectCase(target);
|
|
181
|
-
if (!located) return null;
|
|
190
|
+
if (!shieldActive(located)) return null;
|
|
182
191
|
|
|
183
192
|
// Un répertoire n'est pas une pièce : `Grep`/`Glob` en visent un couramment,
|
|
184
193
|
// et c'est `isBroadCaseSearch` qui décide s'il est sûr de le parcourir.
|
|
@@ -46,12 +46,16 @@ Bridge (`taskpane/modules/python-bridge.js` →
|
|
|
46
46
|
|
|
47
47
|
## Enchaînement avec le scan PII
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
`
|
|
51
|
-
|
|
49
|
+
Le scan PII passe uniquement par PieceMaker (outil `conversion` du serveur MCP
|
|
50
|
+
`piecemaker`, ou le scan du dossier dans l'interface) : ne pas lancer
|
|
51
|
+
`websocket-server/scripts/convert_and_scan_pipeline.py` à la main. Ce script
|
|
52
|
+
appelle `smart_converter.py` puis le worker
|
|
52
53
|
`websocket-server/scripts/presidio-gliner/scanner_worker.py` (GLiNER chargé
|
|
53
|
-
une fois pour tout le lot)
|
|
54
|
-
|
|
54
|
+
une fois pour tout le lot) ; il exige `--database` (les codes déjà attribués
|
|
55
|
+
par tous les dossiers y sont réservés), reçoit le mapping du dossier sur son
|
|
56
|
+
entrée standard et renvoie le mapping fusionné en lignes `MAPPING:` que
|
|
57
|
+
PieceMaker écrit en base. Aucun fichier de mapping n'est écrit. Sortie
|
|
58
|
+
persistante : un Markdown par fichier. Dans le
|
|
55
59
|
pipeline d'administration d'un dossier, `-o` vise le sous-dossier
|
|
56
60
|
`Fichiers convertis PieceMaker/` du dossier (racine réservée aux originaux) ;
|
|
57
61
|
le manifeste technique caché `.piecemaker/anonymization-state.json` reste, lui, à
|
|
@@ -19,24 +19,16 @@ const {
|
|
|
19
19
|
createHistoryBranch,
|
|
20
20
|
historyBranches,
|
|
21
21
|
historyMonths,
|
|
22
|
-
isTechnicalCaseDirectoryName,
|
|
23
22
|
listCases,
|
|
24
23
|
listHistory,
|
|
25
24
|
listHistoryPeriod,
|
|
26
|
-
resolveCasesRoot,
|
|
27
25
|
resolveCommitIdentity,
|
|
28
26
|
restoreRevision,
|
|
29
27
|
revisionDetails,
|
|
30
28
|
safeCaseFiles,
|
|
31
29
|
worktreeDetails,
|
|
32
30
|
} = require('../piecemaker-plugin/scripts/lib/commits.cjs');
|
|
33
|
-
const {
|
|
34
|
-
listOriginals,
|
|
35
|
-
readCaseMapping,
|
|
36
|
-
rebuildCaseMapping,
|
|
37
|
-
saveCaseMapping,
|
|
38
|
-
writeCaseMapping,
|
|
39
|
-
} = require('./originals-pipeline.cjs');
|
|
31
|
+
const { listOriginals } = require('./originals-pipeline.cjs');
|
|
40
32
|
const { invalidateOriginals, listOriginalsCached } = require('../../originals-cache.cjs');
|
|
41
33
|
const {
|
|
42
34
|
documentKey,
|
|
@@ -81,44 +73,6 @@ const ENV_KEYS = new Set([
|
|
|
81
73
|
'SMART_CONVERTER_PATH',
|
|
82
74
|
]);
|
|
83
75
|
|
|
84
|
-
function validateNewCaseName(value) {
|
|
85
|
-
const name = String(value || '').trim();
|
|
86
|
-
if (!name || name.length > 120 || name === '.' || name === '..' || path.basename(name) !== name
|
|
87
|
-
|| name.startsWith('.') || /[\x00-\x1f\x7f]/.test(name) || isTechnicalCaseDirectoryName(name)) {
|
|
88
|
-
throw new Error('Nom de dossier juridique invalide.');
|
|
89
|
-
}
|
|
90
|
-
return name;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
async function createLegalCase({ casesRoot, homeDir, name }) {
|
|
94
|
-
const root = resolveCasesRoot(casesRoot);
|
|
95
|
-
const safeName = validateNewCaseName(name);
|
|
96
|
-
const directory = path.join(root, safeName);
|
|
97
|
-
if (fs.existsSync(directory)) throw new Error(`Le dossier juridique « ${safeName} » existe déjà.`);
|
|
98
|
-
fs.mkdirSync(directory);
|
|
99
|
-
try {
|
|
100
|
-
writeProtection(directory, { unprotected: [] });
|
|
101
|
-
const mapping = writeCaseMapping(directory, { mapping: {}, reverse_mapping: {} });
|
|
102
|
-
await createCommit({
|
|
103
|
-
casesRoot: root,
|
|
104
|
-
caseName: safeName,
|
|
105
|
-
homeDir,
|
|
106
|
-
label: 'Création du dossier juridique',
|
|
107
|
-
event: 'admin-case-create',
|
|
108
|
-
// Le mapping vit dans le sous-dossier des fichiers produits : le commit doit
|
|
109
|
-
// viser son chemin relatif au dossier, pas seulement son nom de base.
|
|
110
|
-
paths: [path.relative(directory, mapping.file).split(path.sep).join('/')],
|
|
111
|
-
waitForLockMs: 10_000,
|
|
112
|
-
});
|
|
113
|
-
const folder = await caseOverview(root, homeDir, safeName);
|
|
114
|
-
folder.branches = await historyBranches(root, homeDir, safeName);
|
|
115
|
-
return folder;
|
|
116
|
-
} catch (error) {
|
|
117
|
-
fs.rmSync(directory, { recursive: true, force: true });
|
|
118
|
-
throw error;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
76
|
/** Native folder-picker commands. Arguments stay separate from the shell. */
|
|
123
77
|
function folderPickerCommands(platform, initialFolder) {
|
|
124
78
|
const start = path.resolve(initialFolder || os.homedir());
|
|
@@ -195,10 +149,6 @@ async function registerLegalCase({
|
|
|
195
149
|
if (!entry) throw new Error('Ce dossier n’est pas un projet enregistré.');
|
|
196
150
|
const protection = readProtection(root);
|
|
197
151
|
if (!protection.exists) writeProtection(root, { unprotected: [] });
|
|
198
|
-
const currentMapping = readCaseMapping(root);
|
|
199
|
-
const mapping = currentMapping.exists
|
|
200
|
-
? currentMapping
|
|
201
|
-
: writeCaseMapping(root, { mapping: {}, reverse_mapping: {} });
|
|
202
152
|
|
|
203
153
|
const folderOverview = await caseOverview(path.dirname(root), homeDir, path.basename(root));
|
|
204
154
|
folderOverview.path = entry.id;
|
|
@@ -208,7 +158,6 @@ async function registerLegalCase({
|
|
|
208
158
|
return {
|
|
209
159
|
folder: folderOverview,
|
|
210
160
|
installed: {
|
|
211
|
-
mapping: path.relative(root, mapping.file).split(path.sep).join('/'),
|
|
212
161
|
protection: path.relative(root, protection.file).split(path.sep).join('/'),
|
|
213
162
|
},
|
|
214
163
|
};
|
|
@@ -688,8 +637,6 @@ async function configurationOverview({ repoRoot, homeDir, userHome, getRuntimeSt
|
|
|
688
637
|
].filter(Boolean);
|
|
689
638
|
const hookFiles = [
|
|
690
639
|
'protect-originals.mjs',
|
|
691
|
-
'commit-track.mjs',
|
|
692
|
-
'billing-track.mjs',
|
|
693
640
|
].map((name) => path.join(repoRoot, 'piecemaker-plugin', 'scripts', name));
|
|
694
641
|
const hooksReady = hookFiles.every((file) => fs.existsSync(file))
|
|
695
642
|
&& fs.existsSync(path.join(repoRoot, 'piecemaker-plugin', 'hooks', 'hooks.json'));
|
|
@@ -2371,18 +2318,12 @@ function createAdminRouter({
|
|
|
2371
2318
|
folder.location = legalCase.root;
|
|
2372
2319
|
folder.registered = legalCase.registered;
|
|
2373
2320
|
// Les Markdown convertis vivent déjà dans l'historique ; ce cadre ne
|
|
2374
|
-
// présente que les pièces originales
|
|
2375
|
-
const mapping = readCaseMapping(legalCase.root);
|
|
2321
|
+
// présente que les pièces originales.
|
|
2376
2322
|
const [originals, branches] = await Promise.all([
|
|
2377
2323
|
listOriginalsCached(legalCase.root),
|
|
2378
2324
|
historyBranches(legalCase.casesRoot, homeDir, legalCase.caseName),
|
|
2379
2325
|
]);
|
|
2380
2326
|
folder.originals = originals;
|
|
2381
|
-
folder.mapping = {
|
|
2382
|
-
exists: mapping.exists,
|
|
2383
|
-
name: path.basename(mapping.file),
|
|
2384
|
-
entries: Object.keys(mapping.mapping).length,
|
|
2385
|
-
};
|
|
2386
2327
|
folder.branches = branches;
|
|
2387
2328
|
finishAdminTiming(res, 'case', startedAt, {
|
|
2388
2329
|
changes: folder.changes,
|
|
@@ -2663,94 +2604,6 @@ function createAdminRouter({
|
|
|
2663
2604
|
}
|
|
2664
2605
|
});
|
|
2665
2606
|
|
|
2666
|
-
// Le mapping du dossier est le seul fichier de l'administration qui contient
|
|
2667
|
-
// des données personnelles en clair : il n'est jamais journalisé, seulement
|
|
2668
|
-
// rendu au navigateur local qui l'a demandé.
|
|
2669
|
-
router.get('/mapping', (req, res) => {
|
|
2670
|
-
try {
|
|
2671
|
-
const legalCase = selectedCase(req.query.case);
|
|
2672
|
-
const mapping = readCaseMapping(legalCase.root);
|
|
2673
|
-
res.json({
|
|
2674
|
-
case: legalCase.id,
|
|
2675
|
-
name: path.basename(mapping.file),
|
|
2676
|
-
exists: mapping.exists,
|
|
2677
|
-
mapping: mapping.mapping,
|
|
2678
|
-
reverse_mapping: mapping.reverse_mapping,
|
|
2679
|
-
informations_dossier: mapping.informations_dossier,
|
|
2680
|
-
});
|
|
2681
|
-
} catch (error) {
|
|
2682
|
-
res.status(400).json({ error: error.message });
|
|
2683
|
-
}
|
|
2684
|
-
});
|
|
2685
|
-
|
|
2686
|
-
router.put('/mapping', async (req, res) => {
|
|
2687
|
-
try {
|
|
2688
|
-
if (!req.body?.mapping || typeof req.body.mapping !== 'object' || Array.isArray(req.body.mapping)) {
|
|
2689
|
-
throw new Error('Le mapping doit être un objet { entité: code }.');
|
|
2690
|
-
}
|
|
2691
|
-
const legalCase = selectedCase(req.body?.case);
|
|
2692
|
-
const saved = saveCaseMapping(legalCase.root, {
|
|
2693
|
-
mapping: req.body.mapping,
|
|
2694
|
-
reverse_mapping: req.body.reverse_mapping,
|
|
2695
|
-
...(req.body.informations_dossier !== undefined
|
|
2696
|
-
? { informations_dossier: req.body.informations_dossier }
|
|
2697
|
-
: {}),
|
|
2698
|
-
});
|
|
2699
|
-
const commit = await createCommit({
|
|
2700
|
-
casesRoot: legalCase.casesRoot,
|
|
2701
|
-
caseName: legalCase.caseName,
|
|
2702
|
-
homeDir,
|
|
2703
|
-
label: 'Modification du mapping d’anonymisation',
|
|
2704
|
-
event: 'admin-mapping-edit',
|
|
2705
|
-
paths: [path.relative(legalCase.root, saved.file).split(path.sep).join('/')],
|
|
2706
|
-
waitForLockMs: 10_000,
|
|
2707
|
-
});
|
|
2708
|
-
if (commit.skipped === 'busy') throw new Error('Mapping enregistré, mais historique occupé : commit automatique non créé.');
|
|
2709
|
-
res.json({
|
|
2710
|
-
ok: true,
|
|
2711
|
-
case: legalCase.id,
|
|
2712
|
-
name: path.basename(saved.file),
|
|
2713
|
-
exists: true,
|
|
2714
|
-
mapping: saved.mapping,
|
|
2715
|
-
reverse_mapping: saved.reverse_mapping,
|
|
2716
|
-
informations_dossier: saved.informations_dossier,
|
|
2717
|
-
commit: { created: commit.created, hash: commit.commit || null },
|
|
2718
|
-
});
|
|
2719
|
-
} catch (error) {
|
|
2720
|
-
res.status(400).json({ error: error.message });
|
|
2721
|
-
}
|
|
2722
|
-
});
|
|
2723
|
-
|
|
2724
|
-
router.post('/mapping/rebuild', async (req, res) => {
|
|
2725
|
-
try {
|
|
2726
|
-
const legalCase = selectedCase(req.body?.case);
|
|
2727
|
-
const rebuilt = await rebuildCaseMapping(legalCase.root);
|
|
2728
|
-
const commit = await createCommit({
|
|
2729
|
-
casesRoot: legalCase.casesRoot,
|
|
2730
|
-
caseName: legalCase.caseName,
|
|
2731
|
-
homeDir,
|
|
2732
|
-
label: 'Régénération du mapping d’anonymisation',
|
|
2733
|
-
event: 'admin-mapping-rebuild',
|
|
2734
|
-
paths: [path.relative(legalCase.root, rebuilt.file).split(path.sep).join('/')],
|
|
2735
|
-
waitForLockMs: 10_000,
|
|
2736
|
-
});
|
|
2737
|
-
if (commit.skipped === 'busy') throw new Error('Mapping régénéré, mais historique occupé : commit automatique non créé.');
|
|
2738
|
-
res.json({
|
|
2739
|
-
ok: true,
|
|
2740
|
-
case: legalCase.id,
|
|
2741
|
-
name: path.basename(rebuilt.file),
|
|
2742
|
-
added: rebuilt.added,
|
|
2743
|
-
total: rebuilt.total,
|
|
2744
|
-
mapping: rebuilt.mapping,
|
|
2745
|
-
reverse_mapping: rebuilt.reverse_mapping,
|
|
2746
|
-
informations_dossier: rebuilt.informations_dossier,
|
|
2747
|
-
commit: { created: commit.created, hash: commit.commit || null },
|
|
2748
|
-
});
|
|
2749
|
-
} catch (error) {
|
|
2750
|
-
res.status(400).json({ error: error.message });
|
|
2751
|
-
}
|
|
2752
|
-
});
|
|
2753
|
-
|
|
2754
2607
|
router.get('/history', async (req, res) => {
|
|
2755
2608
|
const startedAt = performance.now();
|
|
2756
2609
|
try {
|
|
@@ -2896,7 +2749,6 @@ module.exports = {
|
|
|
2896
2749
|
applyPluginComponentSelection,
|
|
2897
2750
|
checkOllamaModelUpdate,
|
|
2898
2751
|
configurationOverview,
|
|
2899
|
-
createLegalCase,
|
|
2900
2752
|
createAdminRouter,
|
|
2901
2753
|
createManagedFile,
|
|
2902
2754
|
deleteManagedAsset,
|