@piecemaker-legal/piecemaker 1.0.6 → 1.0.7

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 (209) hide show
  1. package/dist/assets/{abnfDiagram-VCTEODGH-DF7LFtT-.js → abnfDiagram-VCTEODGH-CR3_ADBu.js} +1 -1
  2. package/dist/assets/{arc-xOmjWeVH.js → arc-b92imMmc.js} +1 -1
  3. package/dist/assets/{architectureDiagram-5GKGNRK7-CESzNPwa.js → architectureDiagram-5GKGNRK7-Dfm5Epud.js} +1 -1
  4. package/dist/assets/{blockDiagram-I7D4REHJ-BjdN78Ad.js → blockDiagram-I7D4REHJ-B8kLLyAv.js} +1 -1
  5. package/dist/assets/{c4Diagram-7LVT6UL2-BcK9EDWT.js → c4Diagram-7LVT6UL2-BWSyAAWX.js} +1 -1
  6. package/dist/assets/channel-BbcW_Tkh.js +1 -0
  7. package/dist/assets/{chunk-2Q5K7J3B-DGUN1JFP.js → chunk-2Q5K7J3B-Ci743mcC.js} +1 -1
  8. package/dist/assets/{chunk-5VM5RSS4-BG3BBcFr.js → chunk-5VM5RSS4-SdXpal6h.js} +1 -1
  9. package/dist/assets/{chunk-F27PBJKO-CLIOfrF5.js → chunk-F27PBJKO-Rof94ueX.js} +1 -1
  10. package/dist/assets/{chunk-IMKFNOWR-D6lGkqij.js → chunk-IMKFNOWR-B3st6ECc.js} +1 -1
  11. package/dist/assets/{chunk-JWPE2WC7-BmF9vLBT.js → chunk-JWPE2WC7-alXmu5xU.js} +1 -1
  12. package/dist/assets/{chunk-POPQ4Y6H-C_0SR3ak.js → chunk-POPQ4Y6H-dMs1OCce.js} +1 -1
  13. package/dist/assets/{chunk-SVP7TREG-rT20Wfpp.js → chunk-SVP7TREG-BmM8FsmF.js} +1 -1
  14. package/dist/assets/{chunk-TICWLB2K-Cn2hkmcf.js → chunk-TICWLB2K-CL1LytYG.js} +1 -1
  15. package/dist/assets/{chunk-XXDRQBXY-Dm_eP1_v.js → chunk-XXDRQBXY-7U9iRPT1.js} +1 -1
  16. package/dist/assets/classDiagram-ZZMXUADV-D9_YRZ7i.js +1 -0
  17. package/dist/assets/classDiagram-v2-VYDZK3BY-D9_YRZ7i.js +1 -0
  18. package/dist/assets/{cose-bilkent-JH36ORCC-cJeeJsep.js → cose-bilkent-JH36ORCC-DFOMlhj2.js} +1 -1
  19. package/dist/assets/{cynefin-OW5HDTMX-DX2ePIXe.js → cynefin-OW5HDTMX-CDdJFd9d.js} +1 -1
  20. package/dist/assets/{cynefinDiagram-5FMLGOSQ-BvWXN-RR.js → cynefinDiagram-5FMLGOSQ-DPyVNrMW.js} +1 -1
  21. package/dist/assets/{dagre-GXQ25YYZ-CkwPRhGR.js → dagre-GXQ25YYZ-B3bpHa9D.js} +1 -1
  22. package/dist/assets/{diagram-S7CK7UJ4-CBGNzYyv.js → diagram-S7CK7UJ4-DeFO2rXB.js} +1 -1
  23. package/dist/assets/{diagram-UQ7AKVKN-CiwCU0SJ.js → diagram-UQ7AKVKN-CbdGTOVf.js} +1 -1
  24. package/dist/assets/{diagram-VSXAHHWV-Aekg4nTk.js → diagram-VSXAHHWV-DFfNQyMd.js} +1 -1
  25. package/dist/assets/{diagram-VX7I27RA-DPFP5K7r.js → diagram-VX7I27RA-DbNZ6_X3.js} +1 -1
  26. package/dist/assets/{diagram-Z3DM3KII-BHJkxoey.js → diagram-Z3DM3KII-B8F-ZkNJ.js} +1 -1
  27. package/dist/assets/{ebnfDiagram-PWID7BFC-2rV1P32T.js → ebnfDiagram-PWID7BFC-BfCCPPAP.js} +1 -1
  28. package/dist/assets/{erDiagram-RLTQ6QDP-C4BjyS_H.js → erDiagram-RLTQ6QDP-DcV-3Kzv.js} +1 -1
  29. package/dist/assets/{flowDiagram-HODETNUW-DL1TBlAG.js → flowDiagram-HODETNUW-BwSkJXCo.js} +1 -1
  30. package/dist/assets/{ganttDiagram-EL5Y4UJY-MKjvzCWz.js → ganttDiagram-EL5Y4UJY-BffHk77T.js} +1 -1
  31. package/dist/assets/{gitGraphDiagram-WWUBYQGX-CS_oTGK5.js → gitGraphDiagram-WWUBYQGX-CQ1EWa74.js} +1 -1
  32. package/dist/assets/{index-XOGQDqU3.js → index-BqK33gaZ.js} +120 -120
  33. package/dist/assets/index-D_Dc_nQv.css +1 -0
  34. package/dist/assets/{infoDiagram-27XIBGKW-ihUr2GjN.js → infoDiagram-27XIBGKW-DqIaBXQn.js} +1 -1
  35. package/dist/assets/{ishikawaDiagram-5VMMS53U-D2YAnuir.js → ishikawaDiagram-5VMMS53U-HlhsaZgv.js} +1 -1
  36. package/dist/assets/{journeyDiagram-3NMN7TZE-Bc2hSZGD.js → journeyDiagram-3NMN7TZE-BYO8-7rN.js} +1 -1
  37. package/dist/assets/{kanban-definition-UXKFOSKX-LRMGNonX.js → kanban-definition-UXKFOSKX-DXb8zHGT.js} +1 -1
  38. package/dist/assets/{layout-CcfWOlPV.js → layout-CREOVuEZ.js} +1 -1
  39. package/dist/assets/{linear-7JoS2gQO.js → linear-CVCrIRIY.js} +1 -1
  40. package/dist/assets/{mermaid.core-ijh_SsuN.js → mermaid.core-DFqeWtQR.js} +6 -6
  41. package/dist/assets/{mindmap-definition-YA3MSWOX-DCE4nzfF.js → mindmap-definition-YA3MSWOX-SUpXz333.js} +1 -1
  42. package/dist/assets/{pegDiagram-XKGWAZYB-SjaGa7lE.js → pegDiagram-XKGWAZYB-D-yWpve3.js} +1 -1
  43. package/dist/assets/{pieDiagram-E7YTZNPT-1xcRidSZ.js → pieDiagram-E7YTZNPT-BJX4Zp4Z.js} +1 -1
  44. package/dist/assets/{quadrantDiagram-AXDQQJYC-obHAHnYV.js → quadrantDiagram-AXDQQJYC-CHajheTu.js} +1 -1
  45. package/dist/assets/{railroadDiagram-O6MQD6OU-BsCVcRZb.js → railroadDiagram-O6MQD6OU-DHJWzW5A.js} +1 -1
  46. package/dist/assets/{requirementDiagram-BXWQKSXE-CUNkhvqb.js → requirementDiagram-BXWQKSXE-DigUIdso.js} +1 -1
  47. package/dist/assets/{sankeyDiagram-P5KCCOFB-DhezXMKm.js → sankeyDiagram-P5KCCOFB-CFUDDbA5.js} +1 -1
  48. package/dist/assets/{sequenceDiagram-WJ2MYXX4-CL9VswXH.js → sequenceDiagram-WJ2MYXX4-6tSaXfYD.js} +1 -1
  49. package/dist/assets/{sizeCapture-INFHLROL-t0g9jiEz.js → sizeCapture-INFHLROL-CXASEDKe.js} +1 -1
  50. package/dist/assets/{stateDiagram-D77RDMKH-BW-g-IOz.js → stateDiagram-D77RDMKH-DWTCAQfZ.js} +1 -1
  51. package/dist/assets/stateDiagram-v2-MP3YSRHH-HDQF4MGA.js +1 -0
  52. package/dist/assets/{swimlanes-42K2YHIH-LsuyeBte.js → swimlanes-42K2YHIH-7-oz5r-e.js} +1 -1
  53. package/dist/assets/swimlanesDiagram-VR7AAH4N-CJbgQFt8.js +8 -0
  54. package/dist/assets/{timeline-definition-24CTP7MA-B0cFka1R.js → timeline-definition-24CTP7MA-DVH5g4ty.js} +1 -1
  55. package/dist/assets/{vendor-codemirror-C5qqu4R7.js → vendor-codemirror-CjW0lHR5.js} +5 -5
  56. package/dist/assets/{vennDiagram-4TSXK5OY-D3HNCDR3.js → vennDiagram-4TSXK5OY-CQvY_ALZ.js} +1 -1
  57. package/dist/assets/{wardleyDiagram-VM6X3IG4-DJ3Co8nb.js → wardleyDiagram-VM6X3IG4-BdlTJgEc.js} +1 -1
  58. package/dist/assets/{xychartDiagram-S5SC5T6Z-Cz5E9New.js → xychartDiagram-S5SC5T6Z-CYn2sV77.js} +1 -1
  59. package/dist/favicon.png +0 -0
  60. package/dist/favicon.svg +1 -9
  61. package/dist/generate-icons.js +47 -46
  62. package/dist/icons/icon-128x128.png +0 -0
  63. package/dist/icons/icon-128x128.svg +1 -12
  64. package/dist/icons/icon-144x144.png +0 -0
  65. package/dist/icons/icon-144x144.svg +1 -12
  66. package/dist/icons/icon-152x152.png +0 -0
  67. package/dist/icons/icon-152x152.svg +1 -12
  68. package/dist/icons/icon-192x192.png +0 -0
  69. package/dist/icons/icon-192x192.svg +1 -12
  70. package/dist/icons/icon-384x384.png +0 -0
  71. package/dist/icons/icon-384x384.svg +1 -12
  72. package/dist/icons/icon-512x512.png +0 -0
  73. package/dist/icons/icon-512x512.svg +1 -12
  74. package/dist/icons/icon-72x72.png +0 -0
  75. package/dist/icons/icon-72x72.svg +1 -12
  76. package/dist/icons/icon-96x96.png +0 -0
  77. package/dist/icons/icon-96x96.svg +1 -12
  78. package/dist/index.html +3 -3
  79. package/dist/logo-128.png +0 -0
  80. package/dist/logo-256.png +0 -0
  81. package/dist/logo-32.png +0 -0
  82. package/dist/logo-512.png +0 -0
  83. package/dist/logo-64.png +0 -0
  84. package/dist/logo-sources/logo-black.png +0 -0
  85. package/dist/logo-sources/logo-white.png +0 -0
  86. package/dist/logo.svg +1 -17
  87. package/dist/sw.js +1 -1
  88. package/dist-server/plugins/piecemaker-dossier/src/institutional-terms.js +91 -0
  89. package/dist-server/plugins/piecemaker-dossier/src/institutional-terms.js.map +1 -0
  90. package/dist-server/plugins/piecemaker-dossier/src/knowledge.js +112 -10
  91. package/dist-server/plugins/piecemaker-dossier/src/knowledge.js.map +1 -1
  92. package/dist-server/plugins/piecemaker-dossier/src/scan-result.js +5 -1
  93. package/dist-server/plugins/piecemaker-dossier/src/scan-result.js.map +1 -1
  94. package/dist-server/server/index.js +60 -26
  95. package/dist-server/server/index.js.map +1 -1
  96. package/dist-server/server/modules/database/repositories/projects.db.js +28 -6
  97. package/dist-server/server/modules/database/repositories/projects.db.js.map +1 -1
  98. package/dist-server/server/modules/database/tests/projects.db.integration.test.js +58 -1
  99. package/dist-server/server/modules/database/tests/projects.db.integration.test.js.map +1 -1
  100. package/dist-server/server/modules/plugins/plugins.routes.js +8 -1
  101. package/dist-server/server/modules/plugins/plugins.routes.js.map +1 -1
  102. package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js +2 -0
  103. package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js.map +1 -1
  104. package/dist-server/server/piecemaker/bodacc-search.js +191 -0
  105. package/dist-server/server/piecemaker/bodacc-search.js.map +1 -0
  106. package/dist-server/server/piecemaker/company-search.js +145 -0
  107. package/dist-server/server/piecemaker/company-search.js.map +1 -0
  108. package/dist-server/server/piecemaker/company-search.test.js +18 -0
  109. package/dist-server/server/piecemaker/company-search.test.js.map +1 -0
  110. package/dist-server/server/piecemaker/index.js +6 -2
  111. package/dist-server/server/piecemaker/index.js.map +1 -1
  112. package/dist-server/server/piecemaker/knowledge/index.js +9 -4
  113. package/dist-server/server/piecemaker/knowledge/index.js.map +1 -1
  114. package/dist-server/server/piecemaker/knowledge/pipeline.js +68 -58
  115. package/dist-server/server/piecemaker/knowledge/pipeline.js.map +1 -1
  116. package/dist-server/server/piecemaker/knowledge/routes.js +2 -4
  117. package/dist-server/server/piecemaker/knowledge/routes.js.map +1 -1
  118. package/dist-server/server/piecemaker/knowledge/scan-jobs.js +91 -0
  119. package/dist-server/server/piecemaker/knowledge/scan-jobs.js.map +1 -0
  120. package/dist-server/server/piecemaker/knowledge/service.js +18 -36
  121. package/dist-server/server/piecemaker/knowledge/service.js.map +1 -1
  122. package/dist-server/server/piecemaker/library/connector-installation.js +224 -0
  123. package/dist-server/server/piecemaker/library/connector-installation.js.map +1 -0
  124. package/dist-server/server/piecemaker/library/index.js +11 -1
  125. package/dist-server/server/piecemaker/library/index.js.map +1 -1
  126. package/dist-server/server/piecemaker/library/marketplace.js +102 -43
  127. package/dist-server/server/piecemaker/library/marketplace.js.map +1 -1
  128. package/dist-server/server/piecemaker/library/migrate.js +8 -1
  129. package/dist-server/server/piecemaker/library/migrate.js.map +1 -1
  130. package/dist-server/server/piecemaker/library/provider-agents.js +50 -0
  131. package/dist-server/server/piecemaker/library/provider-agents.js.map +1 -0
  132. package/dist-server/server/piecemaker/library/provider-connectors.js +80 -0
  133. package/dist-server/server/piecemaker/library/provider-connectors.js.map +1 -0
  134. package/dist-server/server/piecemaker/library/provider-skills.js +11 -2
  135. package/dist-server/server/piecemaker/library/provider-skills.js.map +1 -1
  136. package/dist-server/server/piecemaker/library/store.js +125 -35
  137. package/dist-server/server/piecemaker/library/store.js.map +1 -1
  138. package/dist-server/server/piecemaker/library/workspace-installation.js +53 -29
  139. package/dist-server/server/piecemaker/library/workspace-installation.js.map +1 -1
  140. package/dist-server/server/piecemaker/timesheet/service.js +4 -21
  141. package/dist-server/server/piecemaker/timesheet/service.js.map +1 -1
  142. package/package.json +3 -2
  143. package/scripts/piecemaker/cli/install-command.mjs +35 -9
  144. package/scripts/piecemaker/cli/lib/config.mjs +1 -0
  145. package/scripts/piecemaker/cli/lib/piecemaker-anonymizer.mjs +78 -0
  146. package/scripts/piecemaker/cli/lib/plugins.mjs +2 -0
  147. package/scripts/piecemaker/cli/lib/pwa.mjs +46 -7
  148. package/scripts/piecemaker/cli/lib/services.mjs +65 -4
  149. package/scripts/piecemaker/cli/piecemaker-command.test.mjs +25 -0
  150. package/scripts/piecemaker/cli/piecemaker.mjs +45 -44
  151. package/scripts/piecemaker/cli/piecemaker.ps1 +8 -0
  152. package/scripts/piecemaker/cli/piecemaker.sh +6 -1
  153. package/server/index.ts +52 -23
  154. package/server/modules/database/repositories/projects.db.ts +28 -6
  155. package/server/modules/database/tests/projects.db.integration.test.ts +63 -1
  156. package/server/modules/plugins/plugins.routes.ts +8 -1
  157. package/server/modules/projects/services/projects-with-sessions-fetch.service.ts +5 -0
  158. package/server/piecemaker/anonymizer/client-config.cjs +10 -2
  159. package/server/piecemaker/anonymizer/dictionary.cjs +6 -72
  160. package/server/piecemaker/bodacc-search.ts +205 -0
  161. package/server/piecemaker/company-search.test.ts +26 -0
  162. package/server/piecemaker/company-search.ts +183 -0
  163. package/server/piecemaker/index.ts +8 -2
  164. package/server/piecemaker/knowledge/index.ts +9 -4
  165. package/server/piecemaker/knowledge/pipeline.ts +89 -57
  166. package/server/piecemaker/knowledge/routes.ts +2 -4
  167. package/server/piecemaker/knowledge/scan-jobs.ts +111 -0
  168. package/server/piecemaker/knowledge/service.ts +18 -33
  169. package/server/piecemaker/library/connector-installation.ts +248 -0
  170. package/server/piecemaker/library/index.ts +5 -1
  171. package/server/piecemaker/library/marketplace.ts +104 -39
  172. package/server/piecemaker/library/migrate.ts +8 -1
  173. package/server/piecemaker/library/provider-agents.ts +49 -0
  174. package/server/piecemaker/library/provider-connectors.ts +89 -0
  175. package/server/piecemaker/library/provider-skills.ts +10 -1
  176. package/server/piecemaker/library/store.ts +129 -36
  177. package/server/piecemaker/library/workspace-installation.ts +54 -29
  178. package/server/piecemaker/router.cjs +2 -1
  179. package/server/piecemaker/timesheet/service.ts +4 -16
  180. package/server/piecemaker/vendor/installer/steps/03-python-gliner.mjs +0 -27
  181. package/server/piecemaker/vendor/installer/steps/14-mxc-sandbox.mjs +1 -1
  182. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/substitution.cjs +2 -3
  183. package/server/piecemaker/vendor/piecemaker-plugin/skills/conversion-md/SKILL.md +3 -3
  184. package/server/piecemaker/vendor/websocket-server/admin-routes.cjs +3 -10
  185. package/server/piecemaker/vendor/websocket-server/originals-pipeline.cjs +135 -4
  186. package/server/piecemaker/vendor/websocket-server/process-group.cjs +95 -0
  187. package/server/piecemaker/vendor/websocket-server/scripts/__pycache__/scan_utils.cpython-312.pyc +0 -0
  188. package/server/piecemaker/vendor/websocket-server/scripts/convert_and_scan_pipeline.py +280 -149
  189. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/__pycache__/model_config.cpython-312.pyc +0 -0
  190. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/__pycache__/scanner_worker.cpython-312.pyc +0 -0
  191. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/scanner_worker.py +35 -29
  192. package/server/piecemaker/vendor/websocket-server/scripts/requirements.txt +0 -5
  193. package/server/shared/types.ts +1 -0
  194. package/dist/assets/channel-Dz3eE5vU.js +0 -1
  195. package/dist/assets/classDiagram-ZZMXUADV-BC1eKV2j.js +0 -1
  196. package/dist/assets/classDiagram-v2-VYDZK3BY-BC1eKV2j.js +0 -1
  197. package/dist/assets/index-DhwJpHCq.css +0 -1
  198. package/dist/assets/stateDiagram-v2-MP3YSRHH-BXuT4zDG.js +0 -1
  199. package/dist/assets/swimlanesDiagram-VR7AAH4N-B0eYrB4U.js +0 -8
  200. package/server/piecemaker/vendor/websocket-server/case-instructions.cjs +0 -111
  201. package/server/piecemaker/vendor/websocket-server/scripts/ADDRESS_ANONYMIZATION.md +0 -216
  202. package/server/piecemaker/vendor/websocket-server/scripts/DEDUPLICATION_CHANGES.md +0 -134
  203. package/server/piecemaker/vendor/websocket-server/scripts/GLINER2_README.md +0 -138
  204. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/AUDIT_PERF_QUALITE.md +0 -246
  205. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/MODELE_COREML.md +0 -62
  206. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/__pycache__/coreml_runtime.cpython-312.pyc +0 -0
  207. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/build_coreml.py +0 -118
  208. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/coreml_runtime.py +0 -164
  209. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/presidio-gliner.py +0 -479
@@ -1,13 +1,13 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
1
  import { exclusionNodeOperation } from '../../../plugins/piecemaker-dossier/src/scan-result.js';
4
2
  import { legacyExclusions } from './pipeline.js';
3
+ import { createKnowledgeScanJobs } from './scan-jobs.js';
5
4
  function projectId(value) {
6
5
  if (typeof value !== 'string' || !value.trim())
7
6
  throw new TypeError('projectId is required.');
8
7
  return value.trim();
9
8
  }
10
9
  export function createKnowledgeService(store, projects, pipeline) {
10
+ const scanJobs = createKnowledgeScanJobs();
11
11
  const ensureProject = (value) => {
12
12
  const id = projectId(value);
13
13
  if (!projects.getProjectById(id))
@@ -33,45 +33,27 @@ export function createKnowledgeService(store, projects, pipeline) {
33
33
  update(input) {
34
34
  return store.update({ ...input, projectId: ensureProject(input.projectId) });
35
35
  },
36
- overview(value) {
37
- const id = ensureProject(value);
38
- const nodes = snapshot(id).nodes;
39
- const counts = nodes.reduce((result, node) => {
40
- result[node.kind] = (result[node.kind] || 0) + 1;
41
- return result;
42
- }, {});
43
- return { projectId: id, counts, total: nodes.length };
44
- },
45
- mapping(value) {
46
- const id = ensureProject(value);
47
- const current = snapshot(id);
48
- return { projectId: id, nodes: current.nodes.filter((node) => node.kind !== 'document'), mappings: current.mappings, exclusions: current.exclusions || [] };
49
- },
50
- chronology(value) {
51
- const id = ensureProject(value);
52
- const current = snapshot(id);
53
- return { projectId: id, documents: current.nodes.filter((node) => node.kind === 'document'), links: current.links.filter((link) => link.relation === 'mentions') };
54
- },
55
36
  graph(value) {
56
37
  const id = ensureProject(value);
57
38
  return snapshot(id);
58
39
  },
59
- agents(value) {
60
- const id = ensureProject(value);
61
- const project = projects.getProjectById(id);
62
- if (!project)
63
- throw new Error('Project not found.');
64
- const root = fs.realpathSync(project.project_path);
65
- const candidate = path.join(root, 'AGENTS.md');
66
- if (!fs.existsSync(candidate))
67
- return { projectId: id, content: '', exists: false };
68
- const real = fs.realpathSync(candidate);
69
- if (real !== root && !real.startsWith(`${root}${path.sep}`))
70
- throw new Error('Invalid AGENTS.md path.');
71
- return { projectId: id, content: fs.readFileSync(real, 'utf8').slice(0, 2_000_000), exists: true };
72
- },
73
40
  scan(value, files) {
74
- return pipeline.scan(ensureProject(value), files);
41
+ const id = ensureProject(value);
42
+ return {
43
+ job: scanJobs.start(id, async (report, signal) => {
44
+ const result = await pipeline.scan(id, files, report, signal);
45
+ store.markAnonymizationComplete(id);
46
+ return result;
47
+ }),
48
+ };
49
+ },
50
+ scanJob(jobId, value) {
51
+ const job = scanJobs.get(jobId) || (value ? scanJobs.runningForProject(ensureProject(value)) : null);
52
+ return { job };
53
+ },
54
+ cancelScan(jobId, value) {
55
+ const job = scanJobs.get(jobId) || (value ? scanJobs.runningForProject(ensureProject(value)) : null);
56
+ return { job: scanJobs.cancel(job) };
75
57
  },
76
58
  };
77
59
  }
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../server/piecemaker/knowledge/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,wDAAwD,CAAC;AAEhG,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAOjD,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,SAAS,CAAC,wBAAwB,CAAC,CAAC;IAC9F,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAqB,EAAE,QAAuB,EAAE,QAAoD;IACzI,MAAM,aAAa,GAAG,CAAC,KAAc,EAAU,EAAE;QAC/C,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxE,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAE,EAAE;QAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,OAAO,CAAC,qBAAqB;YAAE,OAAO,OAAO,CAAC;QAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO,OAAO,CAAC;QACnC,MAAM,SAAS,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACjD,KAAK,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACzD,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC,CAAC;IACF,OAAO;QACL,KAAK,CAAC,KAA0B;YAC9B,OAAO,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;QACtG,CAAC;QACD,MAAM,CAAC,KAA2B;YAChC,OAAO,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,QAAQ,CAAC,KAAc;YACrB,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC;YACjC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAyB,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;gBACnE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACjD,OAAO,MAAM,CAAC;YAChB,CAAC,EAAE,EAAE,CAAC,CAAC;YACP,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QACxD,CAAC;QACD,OAAO,CAAC,KAAc;YACpB,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC7B,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;QAC9J,CAAC;QACD,UAAU,CAAC,KAAc;YACvB,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC7B,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,UAAU,CAAC,EAAE,CAAC;QACrK,CAAC;QACD,KAAK,CAAC,KAAc;YAClB,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YAChC,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC;QACD,MAAM,CAAC,KAAc;YACnB,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAC5C,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACpD,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YACnD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YACpF,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACxC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACxG,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACrG,CAAC;QACD,IAAI,CAAC,KAAc,EAAE,KAAe;YAClC,OAAO,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../server/piecemaker/knowledge/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,224 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { createRequire } from 'node:module';
4
+ const require = createRequire(import.meta.url);
5
+ const TOML = require('@iarna/toml');
6
+ function readJson(filePath) {
7
+ if (!fs.existsSync(filePath))
8
+ return {};
9
+ const value = JSON.parse(fs.readFileSync(filePath, 'utf8'));
10
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
11
+ }
12
+ function readToml(filePath) {
13
+ if (!fs.existsSync(filePath))
14
+ return {};
15
+ const value = TOML.parse(fs.readFileSync(filePath, 'utf8'));
16
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
17
+ }
18
+ function writeJson(filePath, value) {
19
+ fs.mkdirSync(path.dirname(filePath), { recursive: true, mode: 0o700 });
20
+ fs.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`, { mode: 0o600 });
21
+ }
22
+ function writeToml(filePath, value) {
23
+ fs.mkdirSync(path.dirname(filePath), { recursive: true, mode: 0o700 });
24
+ fs.writeFileSync(filePath, TOML.stringify(value), { mode: 0o600 });
25
+ }
26
+ function snapshotFile(filePath) {
27
+ return { filePath, previous: fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf8') : null };
28
+ }
29
+ function restoreFile({ filePath, previous }) {
30
+ if (previous === null) {
31
+ fs.rmSync(filePath, { force: true });
32
+ return;
33
+ }
34
+ fs.mkdirSync(path.dirname(filePath), { recursive: true, mode: 0o700 });
35
+ fs.writeFileSync(filePath, previous, { mode: 0o600 });
36
+ }
37
+ function assertWorkspaceFile(workspace, filePath) {
38
+ const resolvedWorkspace = fs.realpathSync(workspace);
39
+ const parent = path.dirname(filePath);
40
+ if (fs.existsSync(parent)) {
41
+ const resolvedParent = fs.realpathSync(parent);
42
+ if (resolvedParent !== resolvedWorkspace && !resolvedParent.startsWith(resolvedWorkspace + path.sep)) {
43
+ throw new Error(`Répertoire de composants hors du dossier : ${parent}`);
44
+ }
45
+ }
46
+ else if (!parent.startsWith(resolvedWorkspace + path.sep) && parent !== resolvedWorkspace) {
47
+ throw new Error(`Répertoire de composants hors du dossier : ${parent}`);
48
+ }
49
+ }
50
+ function objectRecord(value) {
51
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
52
+ }
53
+ function claudeServer(config) {
54
+ if (config.transport === 'http') {
55
+ return {
56
+ type: 'http',
57
+ url: config.url,
58
+ ...(config.headers && Object.keys(config.headers).length ? { headers: config.headers } : {}),
59
+ };
60
+ }
61
+ return {
62
+ type: 'stdio',
63
+ command: config.command,
64
+ args: config.args ?? [],
65
+ ...(config.env && Object.keys(config.env).length ? { env: config.env } : {}),
66
+ };
67
+ }
68
+ function cursorServer(config, enabled) {
69
+ const server = config.transport === 'http'
70
+ ? { url: config.url, ...(config.headers && Object.keys(config.headers).length ? { headers: config.headers } : {}) }
71
+ : { command: config.command, args: config.args ?? [], ...(config.env && Object.keys(config.env).length ? { env: config.env } : {}) };
72
+ return enabled ? server : { ...server, disabled: true };
73
+ }
74
+ function codexServer(config, enabled) {
75
+ if (config.transport === 'http') {
76
+ return {
77
+ url: config.url,
78
+ enabled,
79
+ ...(config.headers && Object.keys(config.headers).length ? { http_headers: config.headers } : {}),
80
+ };
81
+ }
82
+ return {
83
+ command: config.command,
84
+ args: config.args ?? [],
85
+ enabled,
86
+ ...(config.env && Object.keys(config.env).length ? { env: config.env } : {}),
87
+ };
88
+ }
89
+ function grokServer(config, enabled) {
90
+ if (config.transport === 'http') {
91
+ return {
92
+ url: config.url,
93
+ enabled,
94
+ ...(config.headers && Object.keys(config.headers).length ? { headers: config.headers } : {}),
95
+ };
96
+ }
97
+ return {
98
+ command: config.command,
99
+ args: config.args ?? [],
100
+ enabled,
101
+ ...(config.env && Object.keys(config.env).length ? { env: config.env } : {}),
102
+ };
103
+ }
104
+ function opencodeServer(config, enabled) {
105
+ if (config.transport === 'http') {
106
+ return {
107
+ type: 'remote',
108
+ url: config.url,
109
+ enabled,
110
+ ...(config.headers && Object.keys(config.headers).length ? { headers: config.headers } : {}),
111
+ };
112
+ }
113
+ return {
114
+ type: 'local',
115
+ command: [config.command, ...(config.args ?? [])].filter(Boolean),
116
+ enabled,
117
+ ...(config.env && Object.keys(config.env).length ? { environment: config.env } : {}),
118
+ };
119
+ }
120
+ function opencodeConfigPath(workspace) {
121
+ const jsonPath = path.join(workspace, 'opencode.json');
122
+ const jsoncPath = path.join(workspace, 'opencode.jsonc');
123
+ if (fs.existsSync(jsonPath))
124
+ return jsonPath;
125
+ if (fs.existsSync(jsoncPath))
126
+ return jsoncPath;
127
+ return jsonPath;
128
+ }
129
+ export function parseConnectorConfig(content) {
130
+ const parsed = JSON.parse(content);
131
+ if (parsed?.transport !== 'http' && parsed?.transport !== 'stdio')
132
+ throw new Error('Connecteur invalide.');
133
+ if (parsed.transport === 'http' && typeof parsed.url !== 'string')
134
+ throw new Error('Connecteur invalide.');
135
+ if (parsed.transport === 'stdio' && typeof parsed.command !== 'string')
136
+ throw new Error('Connecteur invalide.');
137
+ return parsed;
138
+ }
139
+ export function normalizeProviderConnector(raw) {
140
+ const config = objectRecord(raw);
141
+ if (typeof config.url === 'string' || config.type === 'http' || config.type === 'remote' || config.type === 'sse') {
142
+ const url = typeof config.url === 'string' ? config.url : '';
143
+ if (!url)
144
+ return null;
145
+ const headers = { ...objectRecord(config.headers), ...objectRecord(config.http_headers) };
146
+ return {
147
+ transport: 'http',
148
+ url,
149
+ headers: Object.fromEntries(Object.entries(headers).filter((entry) => typeof entry[1] === 'string')),
150
+ };
151
+ }
152
+ const commandParts = typeof config.command === 'string'
153
+ ? [config.command, ...(Array.isArray(config.args) ? config.args.filter((value) => typeof value === 'string') : [])]
154
+ : Array.isArray(config.command) ? config.command.filter((value) => typeof value === 'string') : [];
155
+ if (!commandParts[0])
156
+ return null;
157
+ const env = { ...objectRecord(config.env), ...objectRecord(config.environment) };
158
+ return {
159
+ transport: 'stdio',
160
+ command: commandParts[0],
161
+ args: commandParts.slice(1),
162
+ env: Object.fromEntries(Object.entries(env).filter((entry) => typeof entry[1] === 'string')),
163
+ };
164
+ }
165
+ export function prepareConnectorInstallation(workspace, name, config, enabled) {
166
+ const mcpJsonPath = path.join(workspace, '.mcp.json');
167
+ const claudeSettingsPath = path.join(workspace, '.claude', 'settings.local.json');
168
+ const codexPath = path.join(workspace, '.codex', 'config.toml');
169
+ const cursorPath = path.join(workspace, '.cursor', 'mcp.json');
170
+ const opencodePath = opencodeConfigPath(workspace);
171
+ const grokPath = path.join(workspace, '.grok', 'config.toml');
172
+ for (const filePath of [mcpJsonPath, claudeSettingsPath, codexPath, cursorPath, opencodePath, grokPath]) {
173
+ assertWorkspaceFile(workspace, filePath);
174
+ }
175
+ const snapshots = [mcpJsonPath, claudeSettingsPath, codexPath, cursorPath, opencodePath, grokPath].map(snapshotFile);
176
+ return () => {
177
+ try {
178
+ const mcpJson = readJson(mcpJsonPath);
179
+ const mcpServers = objectRecord(mcpJson.mcpServers);
180
+ if (enabled)
181
+ mcpServers[name] = claudeServer(config);
182
+ else
183
+ delete mcpServers[name];
184
+ mcpJson.mcpServers = mcpServers;
185
+ writeJson(mcpJsonPath, mcpJson);
186
+ const claudeSettings = readJson(claudeSettingsPath);
187
+ const disabled = Array.isArray(claudeSettings.disabledMcpServers)
188
+ ? claudeSettings.disabledMcpServers.filter((entry) => entry !== name)
189
+ : [];
190
+ claudeSettings.disabledMcpServers = enabled ? disabled : [...disabled, name];
191
+ writeJson(claudeSettingsPath, claudeSettings);
192
+ const codexConfig = readToml(codexPath);
193
+ const codexServers = objectRecord(codexConfig.mcp_servers);
194
+ codexServers[name] = enabled
195
+ ? codexServer(config, true)
196
+ : { ...objectRecord(codexServers[name]), ...codexServer(config, false), enabled: false };
197
+ codexConfig.mcp_servers = codexServers;
198
+ writeToml(codexPath, codexConfig);
199
+ const cursorConfig = readJson(cursorPath);
200
+ const cursorServers = objectRecord(cursorConfig.mcpServers);
201
+ cursorServers[name] = cursorServer(config, enabled);
202
+ cursorConfig.mcpServers = cursorServers;
203
+ writeJson(cursorPath, cursorConfig);
204
+ const opencodeConfig = readJson(opencodePath);
205
+ const opencodeServers = objectRecord(opencodeConfig.mcp);
206
+ opencodeServers[name] = opencodeServer(config, enabled);
207
+ opencodeConfig.mcp = opencodeServers;
208
+ writeJson(opencodePath, opencodeConfig);
209
+ const grokConfig = readToml(grokPath);
210
+ const grokServers = objectRecord(grokConfig.mcp_servers);
211
+ grokServers[name] = enabled
212
+ ? grokServer(config, true)
213
+ : { ...objectRecord(grokServers[name]), ...grokServer(config, false), enabled: false };
214
+ grokConfig.mcp_servers = grokServers;
215
+ writeToml(grokPath, grokConfig);
216
+ }
217
+ catch (error) {
218
+ for (const snapshot of snapshots.reverse())
219
+ restoreFile(snapshot);
220
+ throw error;
221
+ }
222
+ };
223
+ }
224
+ //# sourceMappingURL=connector-installation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector-installation.js","sourceRoot":"","sources":["../../../../server/piecemaker/library/connector-installation.ts"],"names":[],"mappings":"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"}
@@ -7,12 +7,22 @@ import express from 'express';
7
7
  import { createLibraryStore } from './store.js';
8
8
  import { createLibraryRouter } from './routes.js';
9
9
  import { createLibraryMarketplaceRouter, scanInstalledLibraryCollections } from './marketplace.js';
10
+ import { scanAndPersistLibraryProviderAgents } from './provider-agents.js';
11
+ import { scanAndPersistLibraryProviderConnectors } from './provider-connectors.js';
10
12
  import { scanAndPersistLibraryProviderSkills } from './provider-skills.js';
11
13
  export { installLibraryRuntime } from './runtime.js';
12
14
  export async function startLibraryBackend(home, applicationRoot) {
13
15
  const store = createLibraryStore(home);
14
16
  try {
15
- await scanAndPersistLibraryProviderSkills(store, undefined);
17
+ await scanAndPersistLibraryProviderSkills(store, undefined, undefined, os.homedir());
18
+ }
19
+ catch { }
20
+ try {
21
+ scanAndPersistLibraryProviderAgents(store, os.homedir());
22
+ }
23
+ catch { }
24
+ try {
25
+ scanAndPersistLibraryProviderConnectors(store, os.homedir());
16
26
  }
17
27
  catch { }
18
28
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/piecemaker/library/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/piecemaker/library/index.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,11 @@ import path from 'node:path';
3
3
  import { createRequire } from 'node:module';
4
4
  import { spawnSync } from 'node:child_process';
5
5
  import express from 'express';
6
+ import { normalizeProviderConnector } from './connector-installation.js';
6
7
  import { importLibraryDirectory } from './migrate.js';
8
+ import { scanAndPersistLibraryProviderAgents } from './provider-agents.js';
9
+ import { scanAndPersistLibraryProviderConnectors } from './provider-connectors.js';
10
+ import { scanAndPersistLibraryProviderSkills } from './provider-skills.js';
7
11
  function marketplaceManifest(userHome, marketplaceName) {
8
12
  const root = path.join(userHome, '.claude', 'plugins', 'marketplaces', marketplaceName);
9
13
  try {
@@ -35,15 +39,26 @@ function marketplacePackageKinds(userHome, marketplaceName, plugin, registry) {
35
39
  }
36
40
  if (Array.isArray(entry?.skills) && entry.skills.length)
37
41
  kinds.add('skill');
38
- const searchable = `${plugin.name} ${plugin.description || ''}`.toLowerCase();
39
- if (/\bmcp\b|\bconnect(?:or|eur|s|ed|ion)?\b|\bintegration\b/.test(searchable))
42
+ if (marketplaceName === 'mcp-legifrance')
40
43
  kinds.add('connector');
41
- if (/\bskills?\b|\btoolkit\b|\bworkflow\b/.test(searchable))
42
- kinds.add('skill');
43
- if (/\bagents?\b/.test(searchable))
44
- kinds.add('agent');
45
44
  return [...kinds];
46
45
  }
46
+ function disableNativeClaudePlugin(userHome, id) {
47
+ const settingsFilename = path.join(userHome, '.claude/settings.json');
48
+ const settings = fs.existsSync(settingsFilename)
49
+ ? JSON.parse(fs.readFileSync(settingsFilename, 'utf8'))
50
+ : {};
51
+ const enabledPlugins = settings.enabledPlugins && typeof settings.enabledPlugins === 'object' && !Array.isArray(settings.enabledPlugins)
52
+ ? settings.enabledPlugins
53
+ : {};
54
+ if (enabledPlugins[id] === false)
55
+ return;
56
+ settings.enabledPlugins = { ...enabledPlugins, [id]: false };
57
+ fs.mkdirSync(path.dirname(settingsFilename), { recursive: true, mode: 0o700 });
58
+ const temporary = `${settingsFilename}.library.tmp`;
59
+ fs.writeFileSync(temporary, JSON.stringify(settings, null, 2), { mode: 0o600 });
60
+ fs.renameSync(temporary, settingsFilename);
61
+ }
47
62
  export function scanInstalledLibraryCollections(store, userHome) {
48
63
  const filename = path.join(userHome, '.claude/plugins/installed_plugins.json');
49
64
  const registry = fs.existsSync(filename) ? JSON.parse(fs.readFileSync(filename, 'utf8')).plugins || {} : {};
@@ -52,8 +67,6 @@ export function scanInstalledLibraryCollections(store, userHome) {
52
67
  return;
53
68
  const pluginsRoot = fs.realpathSync(pluginsDirectory);
54
69
  for (const [id, installs] of Object.entries(registry)) {
55
- if (store.hasCollection(id))
56
- continue;
57
70
  if (!Array.isArray(installs))
58
71
  continue;
59
72
  const install = installs.find((entry) => entry && typeof entry.installPath === 'string');
@@ -81,26 +94,34 @@ export function scanInstalledLibraryCollections(store, userHome) {
81
94
  imported.push({ source, id: store.importFile(source, 'skill', false), linked: false });
82
95
  }
83
96
  }
84
- const files = [];
85
- let totalSize = 0;
86
- const collect = (directory, relative = '') => {
87
- for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
88
- if (entry.name === '.git' || entry.name === 'node_modules' || entry.name === '__pycache__' || entry.isSymbolicLink())
89
- continue;
90
- const relativePath = path.posix.join(relative.split(path.sep).join('/'), entry.name);
91
- const absolutePath = path.join(directory, entry.name);
92
- if (entry.isDirectory())
93
- collect(absolutePath, relativePath);
94
- else if (entry.isFile()) {
95
- const content = fs.readFileSync(absolutePath);
96
- totalSize += content.length;
97
- if (totalSize > 30 * 1024 * 1024 || files.length >= 5000)
98
- throw new Error(`Plugin trop volumineux : ${id}`);
99
- files.push({ path: relativePath, content });
97
+ const mcpPath = path.join(installRoot, '.mcp.json');
98
+ if (fs.existsSync(mcpPath) && !fs.lstatSync(mcpPath).isSymbolicLink()) {
99
+ try {
100
+ const parsed = JSON.parse(fs.readFileSync(mcpPath, 'utf8'));
101
+ const servers = parsed?.mcpServers && typeof parsed.mcpServers === 'object' && !Array.isArray(parsed.mcpServers)
102
+ ? parsed.mcpServers
103
+ : {};
104
+ for (const [name, raw] of Object.entries(servers)) {
105
+ const config = normalizeProviderConnector(raw);
106
+ if (!config)
107
+ continue;
108
+ const source = `${mcpPath}#${name}`;
109
+ imported.push({
110
+ source,
111
+ id: store.importConnector({
112
+ name,
113
+ description: config.url || config.command || name,
114
+ config,
115
+ source,
116
+ namespace: id,
117
+ }),
118
+ linked: false,
119
+ rootPath: `mcp/${name}.json`,
120
+ });
100
121
  }
101
122
  }
102
- };
103
- collect(installRoot);
123
+ catch { }
124
+ }
104
125
  const fallbackEntryName = imported.length ? store.document(imported[0].id).name : null;
105
126
  store.upsertCollection({
106
127
  id,
@@ -109,12 +130,40 @@ export function scanInstalledLibraryCollections(store, userHome) {
109
130
  source: installRoot,
110
131
  entries: imported.map((entry) => ({
111
132
  entryId: entry.id,
112
- rootPath: path.relative(installRoot, entry.source).split(path.sep).join('/'),
133
+ rootPath: entry.rootPath || path.relative(installRoot, entry.source).split(path.sep).join('/'),
113
134
  })),
114
- files,
135
+ files: [],
115
136
  });
116
137
  }
117
138
  }
139
+ function readInstalledClaudePlugins(userHome) {
140
+ const filename = path.join(userHome, '.claude/plugins/installed_plugins.json');
141
+ if (!fs.existsSync(filename))
142
+ return {};
143
+ const config = JSON.parse(fs.readFileSync(filename, 'utf8'));
144
+ return config.plugins && typeof config.plugins === 'object' && !Array.isArray(config.plugins)
145
+ ? config.plugins
146
+ : {};
147
+ }
148
+ function synchronizeInstalledPluginActivation(store, userHome, workspacePath) {
149
+ const settingsFilename = path.join(userHome, '.claude/settings.json');
150
+ if (!fs.existsSync(settingsFilename))
151
+ return store.listCollections(workspacePath);
152
+ const settings = JSON.parse(fs.readFileSync(settingsFilename, 'utf8'));
153
+ const enabledPlugins = settings.enabledPlugins && typeof settings.enabledPlugins === 'object' && !Array.isArray(settings.enabledPlugins)
154
+ ? settings.enabledPlugins
155
+ : {};
156
+ const installedPlugins = readInstalledClaudePlugins(userHome);
157
+ const collections = store.listCollections(workspacePath);
158
+ for (const id of Object.keys(installedPlugins)) {
159
+ const collection = collections.find((entry) => entry.id === id);
160
+ const enabled = enabledPlugins[id];
161
+ if (!collection || collection.componentCount === 0 || typeof enabled !== 'boolean' || collection.enabled === enabled)
162
+ continue;
163
+ store.setCollectionEnabled(workspacePath, id, enabled);
164
+ }
165
+ return store.listCollections(workspacePath);
166
+ }
118
167
  export function createLibraryMarketplaceRouter(store, applicationRoot, userHome) {
119
168
  const require = createRequire(import.meta.url);
120
169
  const { listMarketplaceConnectors, registerOfficialMarketplace } = require(path.join(applicationRoot, 'server/piecemaker/vendor/websocket-server/admin-routes.cjs'));
@@ -137,15 +186,6 @@ export function createLibraryMarketplaceRouter(store, applicationRoot, userHome)
137
186
  return fs.existsSync(filename) ? JSON.parse(fs.readFileSync(filename, 'utf8')).plugins || {} : {};
138
187
  };
139
188
  const importInstalledCollections = () => scanInstalledLibraryCollections(store, userHome);
140
- const disable = (id) => {
141
- const filename = path.join(userHome, '.claude/settings.json');
142
- const settings = fs.existsSync(filename) ? JSON.parse(fs.readFileSync(filename, 'utf8')) : {};
143
- settings.enabledPlugins = { ...settings.enabledPlugins, [id]: false };
144
- fs.mkdirSync(path.dirname(filename), { recursive: true, mode: 0o700 });
145
- const temporary = `${filename}.library.tmp`;
146
- fs.writeFileSync(temporary, JSON.stringify(settings, null, 2), { mode: 0o600 });
147
- fs.renameSync(temporary, filename);
148
- };
149
189
  router.get('/plugin/marketplace', (req, res) => {
150
190
  try {
151
191
  const marketplace = scope(req.query.scope);
@@ -170,7 +210,26 @@ export function createLibraryMarketplaceRouter(store, applicationRoot, userHome)
170
210
  });
171
211
  router.get('/plugins', (req, res) => {
172
212
  try {
173
- res.json({ plugins: store.listCollections(typeof req.query.workspacePath === 'string' ? req.query.workspacePath : undefined) });
213
+ const workspacePath = typeof req.query.workspacePath === 'string' ? req.query.workspacePath : undefined;
214
+ res.json({ plugins: store.listCollections(workspacePath) });
215
+ }
216
+ catch (error) {
217
+ res.status(400).json({ error: error.message });
218
+ }
219
+ });
220
+ router.post('/plugins/sync', async (req, res) => {
221
+ try {
222
+ const workspacePath = typeof req.body?.workspacePath === 'string' ? req.body.workspacePath : undefined;
223
+ await scanAndPersistLibraryProviderSkills(store, workspacePath, undefined, userHome);
224
+ scanAndPersistLibraryProviderAgents(store, userHome);
225
+ scanAndPersistLibraryProviderConnectors(store, userHome);
226
+ scanInstalledLibraryCollections(store, userHome);
227
+ res.json({
228
+ ok: true,
229
+ plugins: workspacePath
230
+ ? synchronizeInstalledPluginActivation(store, userHome, workspacePath)
231
+ : store.listCollections(),
232
+ });
174
233
  }
175
234
  catch (error) {
176
235
  res.status(400).json({ error: error.message });
@@ -230,19 +289,19 @@ export function createLibraryMarketplaceRouter(store, applicationRoot, userHome)
230
289
  const marketplace = scope(req.body?.scope);
231
290
  const id = req.body?.id;
232
291
  if (typeof id !== 'string' || !/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+$/.test(id) || !id.endsWith(`@${marketplace.name}`))
233
- throw new Error('Connecteur invalide.');
292
+ throw new Error('Élément invalide.');
234
293
  if (installed()[id])
235
- throw new Error('Connecteur déjà installé. Son activation se règle par dossier.');
294
+ throw new Error('Déjà installé. Son activation se règle par dossier.');
236
295
  const catalog = listMarketplaceConnectors(run, { marketplaceName: marketplace.name });
237
296
  if (!catalog.plugins.some((plugin) => plugin.id === id))
238
- throw new Error('Connecteur absent du catalogue.');
239
- disable(id);
297
+ throw new Error('Élément absent du catalogue.');
298
+ disableNativeClaudePlugin(userHome, id);
240
299
  let result;
241
300
  try {
242
301
  result = run('claude', ['plugin', 'install', id, '--scope', 'user']);
243
302
  }
244
303
  finally {
245
- disable(id);
304
+ disableNativeClaudePlugin(userHome, id);
246
305
  }
247
306
  if (!result.ok)
248
307
  throw new Error(result.output || 'Installation impossible.');