@piecemaker-legal/piecemaker 2.0.17 → 2.0.19

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 (99) hide show
  1. package/dist/assets/{FindReplaceDialog-KU5TEIBJ-B4N6W1_z.js → FindReplaceDialog-KU5TEIBJ-D-E_iQrz.js} +1 -1
  2. package/dist/assets/{FootnotePropertiesDialog-W3YHM4BV-D_X_JkAZ.js → FootnotePropertiesDialog-W3YHM4BV-aF_8ncE9.js} +1 -1
  3. package/dist/assets/{HyperlinkDialog-ZYH7ZHRF-EbyukgDx.js → HyperlinkDialog-ZYH7ZHRF-BvhTCTt_.js} +4 -4
  4. package/dist/assets/{ImagePositionDialog-HEWYR6Q3-D9jEaxlE.js → ImagePositionDialog-HEWYR6Q3-CC7jJcbZ.js} +1 -1
  5. package/dist/assets/{ImagePropertiesDialog-RAB47C6M-DvA1kZnM.js → ImagePropertiesDialog-RAB47C6M-C5fs5OZU.js} +1 -1
  6. package/dist/assets/{PageSetupDialog-AIGIXO3E-ChfsKF43.js → PageSetupDialog-AIGIXO3E-DhHTvZ6Q.js} +1 -1
  7. package/dist/assets/{SplitCellDialog-IFBKYCD6-uM26FNXt.js → SplitCellDialog-IFBKYCD6-BoFyEVsb.js} +1 -1
  8. package/dist/assets/{TablePropertiesDialog-TMLKGOOW-By6EQI5w.js → TablePropertiesDialog-TMLKGOOW-CBb7GEtl.js} +1 -1
  9. package/dist/assets/{WatermarkDialog-KRL7WMIS-Bss9F6Ej.js → WatermarkDialog-KRL7WMIS-BJbsMnmA.js} +1 -1
  10. package/dist/assets/{abnfDiagram-VCTEODGH-yLjNPHY7.js → abnfDiagram-VCTEODGH-C6ojlqY3.js} +1 -1
  11. package/dist/assets/{arc-CMQiMSh4.js → arc-BoDdi4D9.js} +1 -1
  12. package/dist/assets/{architectureDiagram-5GKGNRK7-Cyna8IJZ.js → architectureDiagram-5GKGNRK7-CWIahr5B.js} +1 -1
  13. package/dist/assets/{blockDiagram-I7D4REHJ-DHAdjRYY.js → blockDiagram-I7D4REHJ-CLEp2VLU.js} +1 -1
  14. package/dist/assets/{c4Diagram-7LVT6UL2-qqZ0w4LC.js → c4Diagram-7LVT6UL2-BnPyO1ST.js} +1 -1
  15. package/dist/assets/channel-DV0VwszZ.js +1 -0
  16. package/dist/assets/{chunk-2Q5K7J3B-NS0halN6.js → chunk-2Q5K7J3B-C7HwgL9V.js} +1 -1
  17. package/dist/assets/{chunk-5VM5RSS4-BF6-6Cah.js → chunk-5VM5RSS4-DXEfMQFg.js} +1 -1
  18. package/dist/assets/{chunk-F27PBJKO-Dnj2jFRB.js → chunk-F27PBJKO-L8IW1AJ2.js} +1 -1
  19. package/dist/assets/{chunk-IMKFNOWR-CmRgl1EE.js → chunk-IMKFNOWR-M0u3FR4R.js} +1 -1
  20. package/dist/assets/{chunk-JWPE2WC7-BwC19UFc.js → chunk-JWPE2WC7-BTrrWfya.js} +1 -1
  21. package/dist/assets/{chunk-POPQ4Y6H-C1YWVD4-.js → chunk-POPQ4Y6H-DKzOkm9u.js} +1 -1
  22. package/dist/assets/{chunk-SVP7TREG-D7XQTPRq.js → chunk-SVP7TREG-ChWxgGeB.js} +1 -1
  23. package/dist/assets/{chunk-TICWLB2K-BkmTGk1O.js → chunk-TICWLB2K-FU0TG8_V.js} +1 -1
  24. package/dist/assets/{chunk-XXDRQBXY-CYW7YgXL.js → chunk-XXDRQBXY-D--n_LHM.js} +1 -1
  25. package/dist/assets/classDiagram-ZZMXUADV-QmelLege.js +1 -0
  26. package/dist/assets/classDiagram-v2-VYDZK3BY-QmelLege.js +1 -0
  27. package/dist/assets/{cose-bilkent-JH36ORCC-BSktt6pW.js → cose-bilkent-JH36ORCC-VcyzT4Am.js} +1 -1
  28. package/dist/assets/{cynefin-OW5HDTMX-BNMRWXNG.js → cynefin-OW5HDTMX-CF_CzN2W.js} +1 -1
  29. package/dist/assets/{cynefinDiagram-5FMLGOSQ-Dk59YHuO.js → cynefinDiagram-5FMLGOSQ-tYmbUXoj.js} +1 -1
  30. package/dist/assets/{dagre-GXQ25YYZ-DFhWeh0x.js → dagre-GXQ25YYZ-Dl-3sgkS.js} +1 -1
  31. package/dist/assets/{diagram-S7CK7UJ4-BH_8x-q5.js → diagram-S7CK7UJ4-DyYBtOKJ.js} +1 -1
  32. package/dist/assets/{diagram-UQ7AKVKN-DmxmlXg5.js → diagram-UQ7AKVKN-BfibAHRJ.js} +1 -1
  33. package/dist/assets/{diagram-VSXAHHWV-DpG29cD4.js → diagram-VSXAHHWV-BvuChn2K.js} +1 -1
  34. package/dist/assets/{diagram-VX7I27RA-CvvYXTie.js → diagram-VX7I27RA-ZSTD84JR.js} +1 -1
  35. package/dist/assets/{diagram-Z3DM3KII-xOXaaZqs.js → diagram-Z3DM3KII-CYWcW_j4.js} +1 -1
  36. package/dist/assets/{ebnfDiagram-PWID7BFC-CtfFGqJB.js → ebnfDiagram-PWID7BFC-CKssYpWu.js} +1 -1
  37. package/dist/assets/{erDiagram-RLTQ6QDP-AoCjoHUY.js → erDiagram-RLTQ6QDP-H6Rihy54.js} +1 -1
  38. package/dist/assets/{flowDiagram-HODETNUW-Bl9_mq95.js → flowDiagram-HODETNUW-BYcs_7fG.js} +1 -1
  39. package/dist/assets/{ganttDiagram-EL5Y4UJY-DREJQ2BY.js → ganttDiagram-EL5Y4UJY-Dt0zBRmP.js} +1 -1
  40. package/dist/assets/{gitGraphDiagram-WWUBYQGX-C1q5-iep.js → gitGraphDiagram-WWUBYQGX-DJ4ZVb5_.js} +1 -1
  41. package/dist/assets/{index-RKNvOXcq.js → index-skgP2UD3.js} +4 -4
  42. package/dist/assets/{infoDiagram-27XIBGKW-Cz2KUKWU.js → infoDiagram-27XIBGKW-DZmrJj_e.js} +1 -1
  43. package/dist/assets/{ishikawaDiagram-5VMMS53U-BU6SdWsw.js → ishikawaDiagram-5VMMS53U-zTPWVhqW.js} +1 -1
  44. package/dist/assets/{journeyDiagram-3NMN7TZE-CMMoiPf0.js → journeyDiagram-3NMN7TZE-CFxtAX_q.js} +1 -1
  45. package/dist/assets/{kanban-definition-UXKFOSKX-KpKnC3dd.js → kanban-definition-UXKFOSKX-BIBQGYrN.js} +1 -1
  46. package/dist/assets/{layout-6C8d-KNC.js → layout-5xNw8gsu.js} +1 -1
  47. package/dist/assets/{linear-CUINCO59.js → linear-CW6Efbjk.js} +1 -1
  48. package/dist/assets/{mermaid.core-ClgFTKfs.js → mermaid.core-CV1UELnp.js} +6 -6
  49. package/dist/assets/{mindmap-definition-YA3MSWOX-oywqmpy6.js → mindmap-definition-YA3MSWOX-zpWSRS8g.js} +1 -1
  50. package/dist/assets/{pegDiagram-XKGWAZYB-Uk65qoVL.js → pegDiagram-XKGWAZYB-4u0O4rTZ.js} +1 -1
  51. package/dist/assets/{pieDiagram-E7YTZNPT-XxQhMRKu.js → pieDiagram-E7YTZNPT-CXmymaRq.js} +1 -1
  52. package/dist/assets/{quadrantDiagram-AXDQQJYC-Djngo9IG.js → quadrantDiagram-AXDQQJYC-DpCRdfYk.js} +1 -1
  53. package/dist/assets/{railroadDiagram-O6MQD6OU-C4I8SNPI.js → railroadDiagram-O6MQD6OU-DisvzZ3q.js} +1 -1
  54. package/dist/assets/{requirementDiagram-BXWQKSXE-D62oiVFl.js → requirementDiagram-BXWQKSXE-DvU7Z8z5.js} +1 -1
  55. package/dist/assets/{sankeyDiagram-P5KCCOFB-HZuSub58.js → sankeyDiagram-P5KCCOFB-Df5nogtS.js} +1 -1
  56. package/dist/assets/{sequenceDiagram-WJ2MYXX4-B8_t7SDx.js → sequenceDiagram-WJ2MYXX4-B5BKf6O8.js} +1 -1
  57. package/dist/assets/{sizeCapture-INFHLROL-D2Lk0zlm.js → sizeCapture-INFHLROL-1EZabZaY.js} +1 -1
  58. package/dist/assets/{stateDiagram-D77RDMKH-DC3NnV2S.js → stateDiagram-D77RDMKH-DCSKdcyr.js} +1 -1
  59. package/dist/assets/{stateDiagram-v2-MP3YSRHH-DSsQOGCi.js → stateDiagram-v2-MP3YSRHH-Db5HOoa1.js} +1 -1
  60. package/dist/assets/{swimlanes-42K2YHIH-6RzklsF9.js → swimlanes-42K2YHIH-CmrUx1kp.js} +1 -1
  61. package/dist/assets/swimlanesDiagram-VR7AAH4N-B6BaxAGn.js +8 -0
  62. package/dist/assets/{timeline-definition-24CTP7MA-Beuacf_x.js → timeline-definition-24CTP7MA-D1e5FRLS.js} +1 -1
  63. package/dist/assets/{vennDiagram-4TSXK5OY-CMqthbQr.js → vennDiagram-4TSXK5OY-DbclmB6P.js} +1 -1
  64. package/dist/assets/{wardleyDiagram-VM6X3IG4-DKrdN08q.js → wardleyDiagram-VM6X3IG4-BL3cDBgt.js} +1 -1
  65. package/dist/assets/{xychartDiagram-S5SC5T6Z-BtMW2Qlh.js → xychartDiagram-S5SC5T6Z-BnyVnEkb.js} +1 -1
  66. package/dist/index.html +1 -1
  67. package/dist/sw.js +1 -1
  68. package/dist-server/server/piecemaker/library/connector-installation.js +68 -17
  69. package/dist-server/server/piecemaker/library/connector-installation.js.map +1 -1
  70. package/dist-server/server/piecemaker/library/global-state.js +60 -0
  71. package/dist-server/server/piecemaker/library/global-state.js.map +1 -0
  72. package/dist-server/server/piecemaker/library/index.js +10 -0
  73. package/dist-server/server/piecemaker/library/index.js.map +1 -1
  74. package/dist-server/server/piecemaker/library/marketplace.js +61 -42
  75. package/dist-server/server/piecemaker/library/marketplace.js.map +1 -1
  76. package/dist-server/server/piecemaker/library/migrate.js +0 -35
  77. package/dist-server/server/piecemaker/library/migrate.js.map +1 -1
  78. package/dist-server/server/piecemaker/library/routes.js +6 -2
  79. package/dist-server/server/piecemaker/library/routes.js.map +1 -1
  80. package/dist-server/server/piecemaker/library/store.js +95 -67
  81. package/dist-server/server/piecemaker/library/store.js.map +1 -1
  82. package/dist-server/server/piecemaker/library/workspace-installation.js +172 -87
  83. package/dist-server/server/piecemaker/library/workspace-installation.js.map +1 -1
  84. package/package.json +1 -1
  85. package/server/piecemaker/library/connector-installation.ts +65 -16
  86. package/server/piecemaker/library/global-state.ts +55 -0
  87. package/server/piecemaker/library/index.ts +7 -0
  88. package/server/piecemaker/library/marketplace.ts +52 -48
  89. package/server/piecemaker/library/migrate.ts +0 -35
  90. package/server/piecemaker/library/routes.ts +9 -2
  91. package/server/piecemaker/library/store.ts +94 -57
  92. package/server/piecemaker/library/workspace-installation.ts +180 -77
  93. package/dist/assets/channel-B3AYuE-l.js +0 -1
  94. package/dist/assets/classDiagram-ZZMXUADV-CE2Zkr7h.js +0 -1
  95. package/dist/assets/classDiagram-v2-VYDZK3BY-CE2Zkr7h.js +0 -1
  96. package/dist/assets/swimlanesDiagram-VR7AAH4N-ZU4NRSFy.js +0 -8
  97. package/dist-server/server/piecemaker/library/migrate-cli.js +0 -13
  98. package/dist-server/server/piecemaker/library/migrate-cli.js.map +0 -1
  99. package/server/piecemaker/library/migrate-cli.ts +0 -11
@@ -1,103 +1,206 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
+ import { createHash } from 'node:crypto';
3
4
 
4
- const SKILL_PROVIDERS = ['.claude', '.agents', '.cursor', '.opencode', '.grok'];
5
+ const SKILL_LINK_PROVIDERS = ['.claude', '.cursor', '.opencode', '.grok'];
5
6
 
6
7
  const AGENT_TARGETS = [
7
- { provider: '.claude', folder: 'agents', extension: '.md', sourceFile: 'agent.md' },
8
- { provider: '.codex', folder: 'agents', extension: '.toml', sourceFile: 'agent.toml' },
9
- { provider: '.opencode', folder: 'agent', extension: '.md', sourceFile: 'agent.md' },
10
- { provider: '.grok', folder: 'agents', extension: '.md', sourceFile: 'agent.md' },
8
+ { provider: '.claude', folder: 'agents', extension: '.md', format: 'markdown' },
9
+ { provider: '.codex', folder: 'agents', extension: '.toml', format: 'codex' },
10
+ { provider: '.vibe', folder: 'agents', extension: '.toml', format: 'vibe' },
11
+ { provider: '.opencode', folder: 'agent', extension: '.md', format: 'markdown' },
12
+ { provider: '.grok', folder: 'agents', extension: '.md', format: 'markdown' },
11
13
  ] as const;
12
14
 
15
+ const MANIFEST_PATH = '.piecemaker/library.json';
16
+
17
+ export type LibraryManifestEntry = {
18
+ id: string;
19
+ kind: 'skill' | 'agent' | 'connector';
20
+ name: string;
21
+ slug: string;
22
+ files: Record<string, string>;
23
+ skipClaude: boolean;
24
+ };
25
+
26
+ export type LibraryComponent =
27
+ | { kind: 'skill'; slug: string; files: Record<string, Buffer> }
28
+ | { kind: 'agent'; slug: string; markdown: string; codex: string; vibe: string };
29
+
13
30
  export function componentFolderName(name: string) {
14
31
  const slug = String(name).normalize('NFKD').replace(/[^\p{Letter}\p{Number}._-]+/gu, '-').replace(/^[-._]+|[-._]+$/g, '');
15
32
  if (!slug) throw new Error(`Nom de composant inutilisable : ${name}`);
16
33
  return slug;
17
34
  }
18
35
 
19
- function assertWorkspaceDirectory(workspace: string, directory: string, enabled: boolean) {
20
- if (!fs.existsSync(directory)) {
21
- if (enabled) fs.mkdirSync(directory);
22
- return;
36
+ function digest(bytes: Buffer) {
37
+ return createHash('sha256').update(bytes).digest('hex');
38
+ }
39
+
40
+ function assertWorkspaceParents(workspace: string, relative: string, create: boolean) {
41
+ let directory = workspace;
42
+ for (const segment of path.posix.dirname(relative).split('/')) {
43
+ directory = path.join(directory, segment);
44
+ if (!fs.existsSync(directory)) {
45
+ if (!create) return;
46
+ fs.mkdirSync(directory);
47
+ } else if (!fs.statSync(directory).isDirectory() || !fs.realpathSync(directory).startsWith(workspace + path.sep)) {
48
+ throw new Error(`Répertoire de composants hors du dossier : ${directory}`);
49
+ }
50
+ }
51
+ }
52
+
53
+ export function readLibraryManifest(workspace: string): LibraryManifestEntry[] | null {
54
+ const filename = path.join(workspace, MANIFEST_PATH);
55
+ if (!fs.existsSync(filename)) return null;
56
+ try {
57
+ const entries = JSON.parse(fs.readFileSync(filename, 'utf8')).entries;
58
+ return Array.isArray(entries) ? entries : [];
59
+ } catch {
60
+ return [];
23
61
  }
24
- if (!fs.statSync(directory).isDirectory() || !fs.realpathSync(directory).startsWith(workspace + path.sep)) {
25
- throw new Error(`Répertoire de composants hors du dossier : ${directory}`);
62
+ }
63
+
64
+ export function writeLibraryManifest(workspace: string, entries: LibraryManifestEntry[]) {
65
+ assertWorkspaceParents(workspace, MANIFEST_PATH, true);
66
+ const filename = path.join(workspace, MANIFEST_PATH);
67
+ const temporary = `${filename}.${process.pid}.tmp`;
68
+ fs.writeFileSync(temporary, `${JSON.stringify({ version: 1, entries }, null, 2)}\n`);
69
+ fs.renameSync(temporary, filename);
70
+ }
71
+
72
+ function skillRoot(slug: string) {
73
+ return path.posix.join('.agents', 'skills', slug);
74
+ }
75
+
76
+ function componentShape(kind: LibraryManifestEntry['kind'], slug: string, skipClaude: boolean) {
77
+ if (kind !== 'skill') return { root: null, links: [] as string[] };
78
+ return {
79
+ root: skillRoot(slug),
80
+ links: SKILL_LINK_PROVIDERS.filter((provider) => !(skipClaude && provider === '.claude')).map((provider) => path.posix.join(provider, 'skills', slug)),
81
+ };
82
+ }
83
+
84
+ function componentFiles(workspace: string, component: LibraryComponent, skipClaude: boolean) {
85
+ if (component.kind === 'agent') {
86
+ return Object.fromEntries(AGENT_TARGETS.filter((target) => !(skipClaude && target.provider === '.claude')).map((target) => [
87
+ path.posix.join(target.provider, target.folder, `${component.slug}${target.extension}`),
88
+ Buffer.from(component[target.format], 'utf8'),
89
+ ]));
90
+ }
91
+ const root = skillRoot(component.slug);
92
+ return Object.fromEntries(Object.entries(component.files).map(([name, bytes]) => {
93
+ const relative = path.posix.join(root, name);
94
+ if (!path.resolve(workspace, relative).startsWith(path.join(workspace, root) + path.sep)) throw new Error('Chemin associé invalide.');
95
+ return [relative, bytes];
96
+ }));
97
+ }
98
+
99
+ export function componentFileHashes(workspace: string, component: LibraryComponent, skipClaude: boolean) {
100
+ return Object.fromEntries(Object.entries(componentFiles(workspace, component, skipClaude)).map(([relative, bytes]) => [relative, digest(bytes)]));
101
+ }
102
+
103
+ function walkFiles(workspace: string, relative: string, visit: (relative: string) => void) {
104
+ for (const child of fs.readdirSync(path.join(workspace, relative), { withFileTypes: true })) {
105
+ const childPath = path.posix.join(relative, child.name);
106
+ if (child.isDirectory()) walkFiles(workspace, childPath, visit);
107
+ else visit(childPath);
26
108
  }
27
109
  }
28
110
 
29
- export function prepareWorkspaceInstallation(workspace: string, id: string, name: string, packageRoot: string, kind: 'skill' | 'agent', enabled: boolean) {
30
- const slug = componentFolderName(name);
31
- const targets = kind === 'skill'
32
- ? SKILL_PROVIDERS.map((provider) => {
33
- const parent = path.join(workspace, provider, 'skills');
34
- for (const directory of [path.dirname(parent), parent]) assertWorkspaceDirectory(workspace, directory, enabled);
35
- return {
36
- parent,
37
- target: path.join(parent, slug),
38
- legacy: path.join(parent, `piecemaker-${id}`),
39
- source: packageRoot,
40
- kind: 'skill' as const,
41
- };
42
- })
43
- : AGENT_TARGETS.map((entry) => {
44
- const parent = path.join(workspace, entry.provider, entry.folder);
45
- for (const directory of [path.dirname(parent), parent]) assertWorkspaceDirectory(workspace, directory, enabled);
46
- return {
47
- parent,
48
- target: path.join(parent, `${slug}${entry.extension}`),
49
- legacy: path.join(parent, `piecemaker-${id}${entry.extension}`),
50
- source: path.join(packageRoot, entry.sourceFile),
51
- kind: 'agent' as const,
52
- };
53
- });
54
-
55
- const prepared = targets.map((entry) => {
111
+ export function removeLegacyLinks(workspace: string, legacyDirectory: string) {
112
+ for (const provider of ['.agents', ...SKILL_LINK_PROVIDERS]) {
113
+ const parent = path.join(workspace, provider, 'skills');
114
+ if (!fs.existsSync(parent) || !fs.realpathSync(parent).startsWith(workspace + path.sep)) continue;
115
+ for (const child of fs.readdirSync(parent, { withFileTypes: true })) {
116
+ if (!child.isSymbolicLink()) continue;
117
+ const link = path.join(parent, child.name);
118
+ if (path.resolve(parent, fs.readlinkSync(link)).startsWith(legacyDirectory + path.sep)) fs.unlinkSync(link);
119
+ }
120
+ }
121
+ }
122
+
123
+ export function prepareWorkspaceInstallation(
124
+ workspace: string,
125
+ previous: LibraryManifestEntry | undefined,
126
+ next: { component: LibraryComponent; skipClaude: boolean } | null,
127
+ ) {
128
+ const before = previous ? componentShape(previous.kind, previous.slug, previous.skipClaude) : null;
129
+ const after = next ? componentShape(next.component.kind, next.component.slug, next.skipClaude) : null;
130
+ const nextFiles = next ? componentFiles(workspace, next.component, next.skipClaude) : {};
131
+ const owned = previous?.files ?? {};
132
+
133
+ for (const relative of [...Object.keys(nextFiles), ...(after?.links ?? [])]) assertWorkspaceParents(workspace, relative, true);
134
+ for (const relative of [...Object.keys(owned), ...(before?.links ?? [])]) assertWorkspaceParents(workspace, relative, false);
135
+
136
+ const snapshots = new Map<string, Buffer>();
137
+ const inspect = (relative: string) => {
138
+ const absolute = path.join(workspace, relative);
56
139
  let existing: fs.Stats;
57
- try { existing = fs.lstatSync(entry.target); }
140
+ try { existing = fs.lstatSync(absolute); }
58
141
  catch (error) {
59
- if ((error as NodeJS.ErrnoException).code === 'ENOENT') return { ...entry, installed: false, content: null };
142
+ if ((error as NodeJS.ErrnoException).code === 'ENOENT') return;
60
143
  throw error;
61
144
  }
62
- const content = entry.kind === 'agent' && existing.isFile() ? fs.readFileSync(entry.target) : null;
63
- const owned = entry.kind === 'skill'
64
- ? existing.isSymbolicLink() && path.resolve(entry.parent, fs.readlinkSync(entry.target)) === entry.source
65
- : content && fs.existsSync(entry.source) && content.equals(fs.readFileSync(entry.source));
66
- if (!owned) throw new Error(`Composant personnel préservé : ${entry.target}`);
67
- return { ...entry, installed: true, content };
68
- });
69
-
70
- return () => {
71
- const changed: typeof prepared = [];
72
- try {
73
- for (const entry of prepared) {
74
- const { target, source, installed, kind: targetKind } = entry;
75
- if (enabled && targetKind === 'agent') {
76
- fs.copyFileSync(source, target);
77
- changed.push(entry);
78
- } else if (enabled && !installed) {
79
- fs.symlinkSync(source, target, process.platform === 'win32' ? 'junction' : 'dir');
80
- changed.push(entry);
81
- } else if (!enabled && installed) {
82
- fs.unlinkSync(target);
83
- changed.push(entry);
84
- }
145
+ const bytes = existing.isFile() ? fs.readFileSync(absolute) : null;
146
+ if (!bytes || owned[relative] !== digest(bytes)) throw new Error(`Composant personnel préservé : ${absolute}`);
147
+ snapshots.set(relative, bytes);
148
+ };
149
+ for (const relative of new Set([...Object.keys(owned), ...Object.keys(nextFiles)])) inspect(relative);
150
+ for (const root of new Set([before?.root, after?.root])) {
151
+ if (!root || !fs.existsSync(path.join(workspace, root))) continue;
152
+ if (!fs.lstatSync(path.join(workspace, root)).isDirectory()) throw new Error(`Composant personnel préservé : ${path.join(workspace, root)}`);
153
+ walkFiles(workspace, root, inspect);
154
+ }
155
+
156
+ const existingLinks = new Map<string, string>();
157
+ for (const shape of [before, after]) {
158
+ for (const link of shape?.links ?? []) {
159
+ const absolute = path.join(workspace, link);
160
+ let existing: fs.Stats;
161
+ try { existing = fs.lstatSync(absolute); }
162
+ catch (error) {
163
+ if ((error as NodeJS.ErrnoException).code === 'ENOENT') continue;
164
+ throw error;
85
165
  }
86
- } catch (error) {
87
- for (const { target, source, content, installed } of changed.reverse()) {
88
- if (content) fs.writeFileSync(target, content);
89
- else if (!installed) fs.unlinkSync(target);
90
- else fs.symlinkSync(source, target, process.platform === 'win32' ? 'junction' : 'dir');
166
+ const target = path.join(workspace, shape!.root!);
167
+ if (!existing.isSymbolicLink() || path.resolve(path.dirname(absolute), fs.readlinkSync(absolute)) !== target) {
168
+ throw new Error(`Composant personnel préservé : ${absolute}`);
91
169
  }
92
- throw error;
93
- }
94
- for (const { legacy, source, kind: targetKind } of prepared) {
95
- let existing: fs.Stats;
96
- try { existing = fs.lstatSync(legacy); } catch { continue; }
97
- const owned = targetKind === 'skill'
98
- ? existing.isSymbolicLink() && fs.existsSync(source) && fs.realpathSync(legacy) === fs.realpathSync(source)
99
- : existing.isFile() && fs.existsSync(source) && fs.readFileSync(legacy).equals(fs.readFileSync(source));
100
- if (owned) fs.unlinkSync(legacy);
170
+ existingLinks.set(link, target);
101
171
  }
172
+ }
173
+
174
+ const link = (relative: string, target: string) => {
175
+ const absolute = path.join(workspace, relative);
176
+ if (process.platform === 'win32') fs.symlinkSync(target, absolute, 'junction');
177
+ else fs.symlinkSync(path.relative(path.dirname(absolute), target), absolute, 'dir');
178
+ };
179
+ const clear = (links: Iterable<string>, files: Iterable<string>, root: string | null | undefined) => {
180
+ for (const relative of links) fs.rmSync(path.join(workspace, relative), { force: true });
181
+ for (const relative of files) fs.rmSync(path.join(workspace, relative), { force: true });
182
+ if (root) fs.rmSync(path.join(workspace, root), { recursive: true, force: true });
183
+ };
184
+
185
+ return {
186
+ files: Object.fromEntries(Object.entries(nextFiles).map(([relative, bytes]) => [relative, digest(bytes)])),
187
+ commit() {
188
+ try {
189
+ clear(existingLinks.keys(), snapshots.keys(), before?.root);
190
+ for (const [relative, bytes] of Object.entries(nextFiles)) {
191
+ fs.mkdirSync(path.dirname(path.join(workspace, relative)), { recursive: true });
192
+ fs.writeFileSync(path.join(workspace, relative), bytes);
193
+ }
194
+ for (const relative of after?.links ?? []) link(relative, path.join(workspace, after!.root!));
195
+ } catch (error) {
196
+ clear(after?.links ?? [], Object.keys(nextFiles), after?.root);
197
+ for (const [relative, bytes] of snapshots) {
198
+ fs.mkdirSync(path.dirname(path.join(workspace, relative)), { recursive: true });
199
+ fs.writeFileSync(path.join(workspace, relative), bytes);
200
+ }
201
+ for (const [relative, target] of existingLinks) link(relative, target);
202
+ throw error;
203
+ }
204
+ },
102
205
  };
103
206
  }
@@ -1 +0,0 @@
1
- import{U as a,Q as n}from"./mermaid.core-ClgFTKfs.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-TICWLB2K-BkmTGk1O.js";import{_ as i}from"./mermaid.core-ClgFTKfs.js";import"./chunk-5VM5RSS4-BF6-6Cah.js";import"./chunk-XXDRQBXY-CYW7YgXL.js";import"./chunk-POPQ4Y6H-C1YWVD4-.js";import"./chunk-F27PBJKO-Dnj2jFRB.js";import"./index-RKNvOXcq.js";import"./vendor-codemirror-CN-sJePf.js";import"./vendor-react-B22wqN3J.js";import"./vendor-xterm-BWUgpGtR.js";var c={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{c as diagram};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-TICWLB2K-BkmTGk1O.js";import{_ as i}from"./mermaid.core-ClgFTKfs.js";import"./chunk-5VM5RSS4-BF6-6Cah.js";import"./chunk-XXDRQBXY-CYW7YgXL.js";import"./chunk-POPQ4Y6H-C1YWVD4-.js";import"./chunk-F27PBJKO-Dnj2jFRB.js";import"./index-RKNvOXcq.js";import"./vendor-codemirror-CN-sJePf.js";import"./vendor-react-B22wqN3J.js";import"./vendor-xterm-BWUgpGtR.js";var c={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{c as diagram};
@@ -1,8 +0,0 @@
1
- import{c as r,s as e}from"./flowDiagram-HODETNUW-Bl9_mq95.js";import{_ as a}from"./mermaid.core-ClgFTKfs.js";import"./chunk-5VM5RSS4-BF6-6Cah.js";import"./chunk-XXDRQBXY-CYW7YgXL.js";import"./chunk-POPQ4Y6H-C1YWVD4-.js";import"./chunk-F27PBJKO-Dnj2jFRB.js";import"./index-RKNvOXcq.js";import"./vendor-codemirror-CN-sJePf.js";import"./vendor-react-B22wqN3J.js";import"./vendor-xterm-BWUgpGtR.js";import"./channel-B3AYuE-l.js";var o=a(t=>`${e(t)}
2
- .swimlane.cluster rect {
3
- stroke: ${t.clusterBorder} !important;
4
- }
5
- [data-look="neo"].cluster rect {
6
- filter: none;
7
- }
8
- `,"getStyles"),m=o,g=r({defaultLayout:"swimlane",styles:m});export{g as diagram};
@@ -1,13 +0,0 @@
1
- import os from 'node:os';
2
- import path from 'node:path';
3
- import { createLibraryStore } from './store.js';
4
- import { migratePersonalLibrary } from './migrate.js';
5
- const store = createLibraryStore(process.env.PIECEMAKER_HOME || path.join(os.homedir(), '.piecemaker'));
6
- try {
7
- const imported = migratePersonalLibrary(store, os.homedir(), process.cwd(), process.argv.includes('--withdraw'));
8
- process.stdout.write(`${JSON.stringify({ imported: imported.map(({ id, source }) => ({ id, source })), catalog: store.list() }, null, 2)}\n`);
9
- }
10
- finally {
11
- store.close();
12
- }
13
- //# sourceMappingURL=migrate-cli.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrate-cli.js","sourceRoot":"","sources":["../../../../server/piecemaker/library/migrate-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;AACxG,IAAI,CAAC;IACH,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IACjH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAChJ,CAAC;QAAS,CAAC;IAAC,KAAK,CAAC,KAAK,EAAE,CAAC;AAAC,CAAC"}
@@ -1,11 +0,0 @@
1
- import os from 'node:os';
2
- import path from 'node:path';
3
-
4
- import { createLibraryStore } from './store.js';
5
- import { migratePersonalLibrary } from './migrate.js';
6
-
7
- const store = createLibraryStore(process.env.PIECEMAKER_HOME || path.join(os.homedir(), '.piecemaker'));
8
- try {
9
- const imported = migratePersonalLibrary(store, os.homedir(), process.cwd(), process.argv.includes('--withdraw'));
10
- process.stdout.write(`${JSON.stringify({ imported: imported.map(({ id, source }) => ({ id, source })), catalog: store.list() }, null, 2)}\n`);
11
- } finally { store.close(); }