@piecemaker-legal/piecemaker 2.0.4 → 2.0.6

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 (95) hide show
  1. package/dist/assets/{abnfDiagram-VCTEODGH-DlGzBdcC.js → abnfDiagram-VCTEODGH-BjxE1Fb2.js} +1 -1
  2. package/dist/assets/{arc-CAY5CASS.js → arc-t06qxUn5.js} +1 -1
  3. package/dist/assets/{architectureDiagram-5GKGNRK7-C22GLcpz.js → architectureDiagram-5GKGNRK7-DmOrQe4F.js} +1 -1
  4. package/dist/assets/{blockDiagram-I7D4REHJ-n9OdruT4.js → blockDiagram-I7D4REHJ-BGBb9OST.js} +1 -1
  5. package/dist/assets/{c4Diagram-7LVT6UL2-CbssP92k.js → c4Diagram-7LVT6UL2-BQcPYP_U.js} +1 -1
  6. package/dist/assets/channel-CC5raRMY.js +1 -0
  7. package/dist/assets/{chunk-2Q5K7J3B-u0dhWkMH.js → chunk-2Q5K7J3B-BNU472sO.js} +1 -1
  8. package/dist/assets/{chunk-5VM5RSS4-rsYItuXP.js → chunk-5VM5RSS4-y5M1iAFI.js} +1 -1
  9. package/dist/assets/{chunk-F27PBJKO-BF0_-cQV.js → chunk-F27PBJKO-Uhp9iy-p.js} +1 -1
  10. package/dist/assets/{chunk-IMKFNOWR-yWAiocYD.js → chunk-IMKFNOWR-BC4Q6nZf.js} +1 -1
  11. package/dist/assets/{chunk-JWPE2WC7-HvRHBZAs.js → chunk-JWPE2WC7-CrEtedNr.js} +1 -1
  12. package/dist/assets/{chunk-POPQ4Y6H-CrxjxjWM.js → chunk-POPQ4Y6H-Bsx9z7eQ.js} +1 -1
  13. package/dist/assets/{chunk-SVP7TREG-MHx0bjhd.js → chunk-SVP7TREG-DG4yBGdk.js} +1 -1
  14. package/dist/assets/{chunk-TICWLB2K-D04IOhjD.js → chunk-TICWLB2K-gevHL1Rc.js} +1 -1
  15. package/dist/assets/{chunk-XXDRQBXY-DQa0UAw4.js → chunk-XXDRQBXY-CNrpurdU.js} +1 -1
  16. package/dist/assets/classDiagram-ZZMXUADV-Cpy80B6Z.js +1 -0
  17. package/dist/assets/classDiagram-v2-VYDZK3BY-Cpy80B6Z.js +1 -0
  18. package/dist/assets/{cose-bilkent-JH36ORCC-QnkI3Nt_.js → cose-bilkent-JH36ORCC-CW2D0sQc.js} +1 -1
  19. package/dist/assets/{cynefin-OW5HDTMX-Df-UckPc.js → cynefin-OW5HDTMX-BoosPC_g.js} +1 -1
  20. package/dist/assets/{cynefinDiagram-5FMLGOSQ-BUFwULN4.js → cynefinDiagram-5FMLGOSQ-CV3DVMW5.js} +1 -1
  21. package/dist/assets/{dagre-GXQ25YYZ-CgW9MjIM.js → dagre-GXQ25YYZ-CWspAFA-.js} +1 -1
  22. package/dist/assets/{diagram-S7CK7UJ4-B0_JXbLY.js → diagram-S7CK7UJ4-D-1VkdZy.js} +1 -1
  23. package/dist/assets/{diagram-UQ7AKVKN-D0DsK3pp.js → diagram-UQ7AKVKN-Bg5oHpzG.js} +1 -1
  24. package/dist/assets/{diagram-VSXAHHWV-DABHiycq.js → diagram-VSXAHHWV-DJDZDE7f.js} +1 -1
  25. package/dist/assets/{diagram-VX7I27RA-99VLYwy8.js → diagram-VX7I27RA-BgTf9h__.js} +1 -1
  26. package/dist/assets/{diagram-Z3DM3KII-DFSnpOMW.js → diagram-Z3DM3KII-2aT0_lX9.js} +1 -1
  27. package/dist/assets/{ebnfDiagram-PWID7BFC-B8IE_nqB.js → ebnfDiagram-PWID7BFC-aM0ECXNE.js} +1 -1
  28. package/dist/assets/{erDiagram-RLTQ6QDP-7Z1X369Y.js → erDiagram-RLTQ6QDP-Kdj931HB.js} +1 -1
  29. package/dist/assets/{flowDiagram-HODETNUW-Do7aQF9c.js → flowDiagram-HODETNUW-LSrcM-k8.js} +1 -1
  30. package/dist/assets/{ganttDiagram-EL5Y4UJY-BRlwUpXR.js → ganttDiagram-EL5Y4UJY-DoPsqpDg.js} +1 -1
  31. package/dist/assets/{gitGraphDiagram-WWUBYQGX-3Ys-0hlu.js → gitGraphDiagram-WWUBYQGX-1FZ5VaAe.js} +1 -1
  32. package/dist/assets/{index-Di2QXQ2F.js → index-xK4CjNQK.js} +88 -88
  33. package/dist/assets/{infoDiagram-27XIBGKW-BZcs-adJ.js → infoDiagram-27XIBGKW-CSjAh0be.js} +1 -1
  34. package/dist/assets/{ishikawaDiagram-5VMMS53U-CQjs_3VK.js → ishikawaDiagram-5VMMS53U-BNLcM1df.js} +1 -1
  35. package/dist/assets/{journeyDiagram-3NMN7TZE-CznzOymr.js → journeyDiagram-3NMN7TZE-mnnNYQqO.js} +1 -1
  36. package/dist/assets/{kanban-definition-UXKFOSKX-B_nmkwMP.js → kanban-definition-UXKFOSKX-twObmj3o.js} +1 -1
  37. package/dist/assets/{layout-DLMp8H-H.js → layout-BsyKF3-6.js} +1 -1
  38. package/dist/assets/{linear-Djl8IKeq.js → linear-CjJLfGLP.js} +1 -1
  39. package/dist/assets/{mermaid.core-fkRIkj9z.js → mermaid.core-0nImXSAw.js} +6 -6
  40. package/dist/assets/{mindmap-definition-YA3MSWOX-qFNdGgq0.js → mindmap-definition-YA3MSWOX-CNDiMLhB.js} +1 -1
  41. package/dist/assets/{pegDiagram-XKGWAZYB-vR3m5aZI.js → pegDiagram-XKGWAZYB-C7cjnGDK.js} +1 -1
  42. package/dist/assets/{pieDiagram-E7YTZNPT-ClQYckH1.js → pieDiagram-E7YTZNPT-DwjW1oPU.js} +1 -1
  43. package/dist/assets/{quadrantDiagram-AXDQQJYC-BcmgGvJx.js → quadrantDiagram-AXDQQJYC-C6RVSuXC.js} +1 -1
  44. package/dist/assets/{railroadDiagram-O6MQD6OU-DnmDO_LH.js → railroadDiagram-O6MQD6OU-jVgGmg49.js} +1 -1
  45. package/dist/assets/{requirementDiagram-BXWQKSXE-BLmZRJj_.js → requirementDiagram-BXWQKSXE-_TJw4zqX.js} +1 -1
  46. package/dist/assets/{sankeyDiagram-P5KCCOFB-Cq2ZncN-.js → sankeyDiagram-P5KCCOFB-BbszN2u8.js} +1 -1
  47. package/dist/assets/{sequenceDiagram-WJ2MYXX4-C-EKDBKS.js → sequenceDiagram-WJ2MYXX4-CXUJ1Lf1.js} +1 -1
  48. package/dist/assets/{sizeCapture-INFHLROL-BkJgCxiC.js → sizeCapture-INFHLROL-Bn-0L4zo.js} +1 -1
  49. package/dist/assets/{stateDiagram-D77RDMKH-SSiAeC11.js → stateDiagram-D77RDMKH-BYm0d_eJ.js} +1 -1
  50. package/dist/assets/{stateDiagram-v2-MP3YSRHH-CO9puBoE.js → stateDiagram-v2-MP3YSRHH-DUm7LB5K.js} +1 -1
  51. package/dist/assets/{swimlanes-42K2YHIH-CEtlr0Lx.js → swimlanes-42K2YHIH-89iqoyp5.js} +1 -1
  52. package/dist/assets/swimlanesDiagram-VR7AAH4N-YF3mW6jv.js +8 -0
  53. package/dist/assets/{timeline-definition-24CTP7MA-BD-YIPYv.js → timeline-definition-24CTP7MA-DM6OtrjI.js} +1 -1
  54. package/dist/assets/{vennDiagram-4TSXK5OY-BM0hcI0U.js → vennDiagram-4TSXK5OY-DFr_WPgx.js} +1 -1
  55. package/dist/assets/{wardleyDiagram-VM6X3IG4-BaxvAOHG.js → wardleyDiagram-VM6X3IG4-Bt5NzXv1.js} +1 -1
  56. package/dist/assets/{xychartDiagram-S5SC5T6Z-SUyb0Kvx.js → xychartDiagram-S5SC5T6Z-BbodYb2k.js} +1 -1
  57. package/dist/index.html +1 -1
  58. package/dist/sw.js +1 -1
  59. package/dist-server/server/index.js +2 -1
  60. package/dist-server/server/index.js.map +1 -1
  61. package/dist-server/server/load-env.js +2 -1
  62. package/dist-server/server/load-env.js.map +1 -1
  63. package/dist-server/server/piecemaker/claude-executable.js +41 -0
  64. package/dist-server/server/piecemaker/claude-executable.js.map +1 -0
  65. package/dist-server/server/piecemaker/desktop-update/index.js +45 -0
  66. package/dist-server/server/piecemaker/desktop-update/index.js.map +1 -0
  67. package/dist-server/server/piecemaker/desktop-update/routes.js +23 -0
  68. package/dist-server/server/piecemaker/desktop-update/routes.js.map +1 -0
  69. package/dist-server/server/piecemaker/desktop-update/service.js +68 -0
  70. package/dist-server/server/piecemaker/desktop-update/service.js.map +1 -0
  71. package/dist-server/server/piecemaker/index.js +2 -0
  72. package/dist-server/server/piecemaker/index.js.map +1 -1
  73. package/dist-server/server/piecemaker/knowledge/index.js +6 -1
  74. package/dist-server/server/piecemaker/knowledge/index.js.map +1 -1
  75. package/dist-server/server/piecemaker/knowledge/legacy-import.js +87 -0
  76. package/dist-server/server/piecemaker/knowledge/legacy-import.js.map +1 -0
  77. package/dist-server/server/shared/utils.js +2 -1
  78. package/dist-server/server/shared/utils.js.map +1 -1
  79. package/package.json +1 -1
  80. package/scripts/release/prepare-desktop-app.js +1 -0
  81. package/server/index.ts +2 -1
  82. package/server/load-env.ts +3 -1
  83. package/server/piecemaker/anonymizer/hudsucker-proxy/src/main.rs +31 -1
  84. package/server/piecemaker/claude-executable.ts +46 -0
  85. package/server/piecemaker/desktop-update/index.ts +49 -0
  86. package/server/piecemaker/desktop-update/routes.ts +29 -0
  87. package/server/piecemaker/desktop-update/service.ts +101 -0
  88. package/server/piecemaker/index.ts +2 -0
  89. package/server/piecemaker/knowledge/index.ts +6 -1
  90. package/server/piecemaker/knowledge/legacy-import.ts +101 -0
  91. package/server/shared/utils.ts +3 -1
  92. package/dist/assets/channel-DHZHDI2B.js +0 -1
  93. package/dist/assets/classDiagram-ZZMXUADV-rZtwSkPv.js +0 -1
  94. package/dist/assets/classDiagram-v2-VYDZK3BY-rZtwSkPv.js +0 -1
  95. package/dist/assets/swimlanesDiagram-VR7AAH4N-DiheMwz8.js +0 -8
@@ -0,0 +1,101 @@
1
+ type ShellResult = {
2
+ exitCode: number | null;
3
+ output: string;
4
+ errorOutput: string;
5
+ };
6
+
7
+ export type DesktopUpdateDependencies = {
8
+ appRoot: string;
9
+ platform: NodeJS.Platform;
10
+ repository: string | null;
11
+ applicationPid: number;
12
+ environment: NodeJS.ProcessEnv;
13
+ runInstaller(command: string, environment: NodeJS.ProcessEnv): Promise<ShellResult>;
14
+ launchDetached(command: string): void;
15
+ logInfo(message: string): void;
16
+ };
17
+
18
+ export type DesktopUpdateResult =
19
+ | { success: true; output: string; message: string }
20
+ | { success: false; error: string; output?: string; errorOutput?: string };
21
+
22
+ const MAC_BUNDLE_APP_ROOT = /^(.+\.app)\/Contents\/Resources\/app\/?$/;
23
+ const SERVER_ONLY_VARIABLES = ['ELECTRON_RUN_AS_NODE', 'HOST', 'SERVER_PORT', 'PORT', 'CLOUDCLI_HOME', 'DATABASE_PATH'];
24
+ const RELAUNCH_DELAY_SECONDS = 3;
25
+ const QUIT_GRACE_SECONDS = 30;
26
+ const ANSI_ESCAPE = /\u001b\[[0-9;]*m/g;
27
+
28
+ function withoutAnsi(text: string): string {
29
+ return text.replace(ANSI_ESCAPE, '');
30
+ }
31
+
32
+ function shellQuote(value: string): string {
33
+ return `'${value.replace(/'/g, `'\\''`)}'`;
34
+ }
35
+
36
+ export function desktopBundlePath(appRoot: string, platform: NodeJS.Platform): string | null {
37
+ if (platform !== 'darwin') return null;
38
+ return MAC_BUNDLE_APP_ROOT.exec(appRoot)?.[1] ?? null;
39
+ }
40
+
41
+ export function installerCommand(repository: string): string {
42
+ const scriptUrl = `https://raw.githubusercontent.com/${repository}/main/desktop-bootstrap/install.sh`;
43
+ return `curl -fsSL ${shellQuote(scriptUrl)} | sh -s -- --no-launch`;
44
+ }
45
+
46
+ export function relaunchCommand(bundlePath: string, applicationPid: number): string {
47
+ const bundle = shellQuote(bundlePath);
48
+ return [
49
+ `sleep ${RELAUNCH_DELAY_SECONDS}`,
50
+ `osascript -e ${shellQuote(`tell application "${bundlePath}" to quit`)} >/dev/null 2>&1`,
51
+ `i=0; while kill -0 ${applicationPid} 2>/dev/null && [ $i -lt ${QUIT_GRACE_SECONDS} ]; do sleep 1; i=$((i+1)); done`,
52
+ `kill ${applicationPid} 2>/dev/null`,
53
+ 'sleep 1',
54
+ `open ${bundle}`,
55
+ ].join('; ');
56
+ }
57
+
58
+ export function installerEnvironment(environment: NodeJS.ProcessEnv): NodeJS.ProcessEnv {
59
+ const cleaned = { ...environment };
60
+ for (const variable of SERVER_ONLY_VARIABLES) delete cleaned[variable];
61
+ return cleaned;
62
+ }
63
+
64
+ export function createDesktopUpdateService(dependencies: DesktopUpdateDependencies) {
65
+ const { repository } = dependencies;
66
+ const bundlePath = repository ? desktopBundlePath(dependencies.appRoot, dependencies.platform) : null;
67
+
68
+ return {
69
+ isDesktopInstall(): boolean {
70
+ return bundlePath !== null;
71
+ },
72
+
73
+ async update(): Promise<DesktopUpdateResult> {
74
+ if (!bundlePath || !repository) {
75
+ return { success: false, error: "Mise à jour intégrée disponible uniquement dans l'application de bureau macOS." };
76
+ }
77
+
78
+ dependencies.logInfo(`Mise à jour de ${bundlePath} depuis ${repository}`);
79
+ const result = await dependencies.runInstaller(
80
+ installerCommand(repository),
81
+ installerEnvironment(dependencies.environment),
82
+ );
83
+
84
+ if (result.exitCode !== 0) {
85
+ return {
86
+ success: false,
87
+ error: "Échec du téléchargement ou de l'installation de la nouvelle version",
88
+ output: withoutAnsi(result.output),
89
+ errorOutput: withoutAnsi(result.errorOutput),
90
+ };
91
+ }
92
+
93
+ dependencies.launchDetached(relaunchCommand(bundlePath, dependencies.applicationPid));
94
+ return {
95
+ success: true,
96
+ output: withoutAnsi(result.output),
97
+ message: "Nouvelle version installée. L'application redémarre dans quelques secondes.",
98
+ };
99
+ },
100
+ };
101
+ }
@@ -8,6 +8,7 @@ import { findApplicationRoot, getModuleDirectory } from '@/shared/utils.js';
8
8
 
9
9
 
10
10
  import { startRequiredAnonymizer } from './anonymizer/lifecycle.js';
11
+ import { useBundledClaudeWhenMissingFromPath } from './claude-executable.js';
11
12
  import { createCitationStore } from './harness/citation-store.js';
12
13
  import { installChatCitationHarness } from './harness/chat-harness.js';
13
14
  import { createCitationsRouter } from './harness/citations.routes.js';
@@ -41,6 +42,7 @@ type PieceMakerVendorModule = {
41
42
  stopOriginalsJobs(): Promise<void>;
42
43
  };
43
44
 
45
+ useBundledClaudeWhenMissingFromPath();
44
46
  const vendor = createRequire(import.meta.url)(routerPath) as PieceMakerVendorModule;
45
47
 
46
48
  export const { piecemakerHome, stopOriginalsJobs } = vendor;
@@ -4,6 +4,7 @@ import { getConnection, projectsDb } from '@/modules/database/index.js';
4
4
 
5
5
  import { KnowledgeStore } from '../../../plugins/piecemaker-dossier/src/knowledge.js';
6
6
 
7
+ import { importLegacyKnowledge } from './legacy-import.js';
7
8
  import { createKnowledgeLocalRouter } from './local-routes.js';
8
9
  import { createKnowledgePipeline } from './pipeline.js';
9
10
  import { createKnowledgeRouter } from './routes.js';
@@ -13,7 +14,11 @@ export function createKnowledgeBackend(applicationRoot: string) {
13
14
  let store: KnowledgeStore | null = null;
14
15
  let service: ReturnType<typeof createKnowledgeService> | null = null;
15
16
  const getStore = () => {
16
- if (!store) store = new KnowledgeStore(getConnection());
17
+ if (!store) {
18
+ store = new KnowledgeStore(getConnection());
19
+ const report = importLegacyKnowledge(getConnection());
20
+ if (report?.imported.length) console.info(`[piecemaker] analyses importées depuis ${report.source} : ${report.imported.join(', ')}`);
21
+ }
17
22
  return store;
18
23
  };
19
24
  const getService = () => {
@@ -0,0 +1,101 @@
1
+ import fs from 'node:fs';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+
5
+ import type Database from 'better-sqlite3';
6
+
7
+ type LegacyProject = {
8
+ project_id: string;
9
+ project_path: string;
10
+ custom_project_name: string | null;
11
+ isStarred: number | null;
12
+ isArchived: number | null;
13
+ };
14
+
15
+ export type LegacyImportReport = { source: string; imported: string[]; skipped: string[] };
16
+
17
+ const NODE_COLUMNS = 'id,kind,label,search_text,aliases_json,data_json,origin,created_at,updated_at';
18
+ const LINK_COLUMNS = 'from_node_id,to_node_id,relation,data_json,origin,created_at,updated_at';
19
+ const MAPPING_COLUMNS = 'node_id,real_value,masked_value,search_text,data_json,origin,created_at,updated_at';
20
+
21
+ export function legacyDatabasePath(): string {
22
+ return path.join(os.homedir(), '.cloudcli', 'auth.db');
23
+ }
24
+
25
+ function sameFile(left: string, right: string): boolean {
26
+ try {
27
+ return fs.realpathSync(left) === fs.realpathSync(right);
28
+ } catch {
29
+ return path.resolve(left) === path.resolve(right);
30
+ }
31
+ }
32
+
33
+ function legacyHasTable(database: Database.Database, table: string): boolean {
34
+ return Boolean(database.prepare(`SELECT 1 FROM legacy.sqlite_master WHERE type='table' AND name=?`).get(table));
35
+ }
36
+
37
+ function hasKnowledge(database: Database.Database, projectId: string): boolean {
38
+ return Boolean(database.prepare(`
39
+ SELECT 1 FROM piecemaker_mappings WHERE project_id=?
40
+ UNION ALL SELECT 1 FROM piecemaker_anonymization_status WHERE project_id=?
41
+ LIMIT 1
42
+ `).get(projectId, projectId));
43
+ }
44
+
45
+ function targetProjectId(database: Database.Database, legacy: LegacyProject): string {
46
+ const existing = database.prepare('SELECT project_id FROM projects WHERE project_path=?').get(legacy.project_path) as { project_id: string } | undefined;
47
+ if (existing) return existing.project_id;
48
+ database.prepare(`
49
+ INSERT INTO projects (project_id, project_path, custom_project_name, isStarred, isArchived)
50
+ VALUES (?, ?, ?, ?, ?)
51
+ `).run(legacy.project_id, legacy.project_path, legacy.custom_project_name, legacy.isStarred ?? 0, legacy.isArchived ?? 0);
52
+ return legacy.project_id;
53
+ }
54
+
55
+ function copyProject(database: Database.Database, sourceId: string, targetId: string, withStatus: boolean): void {
56
+ database.prepare('DELETE FROM piecemaker_links WHERE project_id=?').run(targetId);
57
+ database.prepare('DELETE FROM piecemaker_mappings WHERE project_id=?').run(targetId);
58
+ database.prepare('DELETE FROM piecemaker_nodes WHERE project_id=?').run(targetId);
59
+ database.prepare(`INSERT INTO piecemaker_nodes (project_id,${NODE_COLUMNS}) SELECT ?,${NODE_COLUMNS} FROM legacy.piecemaker_nodes WHERE project_id=?`).run(targetId, sourceId);
60
+ database.prepare(`INSERT INTO piecemaker_links (project_id,${LINK_COLUMNS}) SELECT ?,${LINK_COLUMNS} FROM legacy.piecemaker_links WHERE project_id=?`).run(targetId, sourceId);
61
+ database.prepare(`INSERT INTO piecemaker_mappings (project_id,${MAPPING_COLUMNS}) SELECT ?,${MAPPING_COLUMNS} FROM legacy.piecemaker_mappings WHERE project_id=?`).run(targetId, sourceId);
62
+ if (withStatus) {
63
+ database.prepare(`INSERT OR IGNORE INTO piecemaker_anonymization_status (project_id, completed_at) SELECT ?, completed_at FROM legacy.piecemaker_anonymization_status WHERE project_id=?`).run(targetId, sourceId);
64
+ }
65
+ }
66
+
67
+ export function importLegacyKnowledge(database: Database.Database, source = legacyDatabasePath()): LegacyImportReport | null {
68
+ const target = database.name;
69
+ if (!fs.existsSync(source) || (target && sameFile(source, target))) return null;
70
+ database.exec('CREATE TABLE IF NOT EXISTS piecemaker_legacy_imports (source TEXT PRIMARY KEY NOT NULL, imported_at TEXT NOT NULL)');
71
+ const resolvedSource = path.resolve(source);
72
+ if (database.prepare('SELECT 1 FROM piecemaker_legacy_imports WHERE source=?').get(resolvedSource)) return null;
73
+ const report: LegacyImportReport = { source: resolvedSource, imported: [], skipped: [] };
74
+ database.prepare('ATTACH DATABASE ? AS legacy').run(resolvedSource);
75
+ try {
76
+ database.transaction(() => {
77
+ if (legacyHasTable(database, 'piecemaker_nodes') && legacyHasTable(database, 'projects')) {
78
+ const withStatus = legacyHasTable(database, 'piecemaker_anonymization_status');
79
+ const projects = database.prepare(`
80
+ SELECT p.project_id, p.project_path, p.custom_project_name, p.isStarred, p.isArchived
81
+ FROM legacy.projects p
82
+ WHERE EXISTS (SELECT 1 FROM legacy.piecemaker_nodes n WHERE n.project_id=p.project_id AND n.id NOT LIKE 'system:%')
83
+ ORDER BY p.project_path
84
+ `).all() as LegacyProject[];
85
+ for (const project of projects) {
86
+ const targetId = targetProjectId(database, project);
87
+ if (hasKnowledge(database, targetId)) {
88
+ report.skipped.push(project.project_path);
89
+ continue;
90
+ }
91
+ copyProject(database, project.project_id, targetId, withStatus);
92
+ report.imported.push(project.project_path);
93
+ }
94
+ }
95
+ database.prepare('INSERT INTO piecemaker_legacy_imports (source, imported_at) VALUES (?, ?)').run(resolvedSource, new Date().toISOString());
96
+ })();
97
+ } finally {
98
+ database.exec('DETACH DATABASE legacy');
99
+ }
100
+ return report;
101
+ }
@@ -31,6 +31,8 @@ import type {
31
31
  WorkspacePathValidationResult,
32
32
  } from '@/shared/types.js';
33
33
 
34
+ import { productDataRoot } from '../../shared/product-config.mjs';
35
+
34
36
  //----------------- ENVIRONMENT UTILITIES ------------
35
37
  /**
36
38
  * Indicates whether the backend is running in hosted Platform mode rather than
@@ -48,7 +50,7 @@ export const IS_PLATFORM = process.env.VITE_IS_PLATFORM === 'true';
48
50
  * this root and must not be redirected through this helper.
49
51
  */
50
52
  export function getApplicationDataRoot(): string {
51
- return process.env.CLOUDCLI_HOME || path.join(os.homedir(), '.cloudcli');
53
+ return productDataRoot(path.join(os.homedir(), '.cloudcli'));
52
54
  }
53
55
 
54
56
  // ---------------------------
@@ -1 +0,0 @@
1
- import{ah as o,ai as n}from"./mermaid.core-fkRIkj9z.js";const t=(a,r)=>o.lang.round(n.parse(a)[r]);export{t as c};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-TICWLB2K-D04IOhjD.js";import{_ as i}from"./mermaid.core-fkRIkj9z.js";import"./chunk-5VM5RSS4-rsYItuXP.js";import"./chunk-XXDRQBXY-DQa0UAw4.js";import"./chunk-POPQ4Y6H-CrxjxjWM.js";import"./chunk-F27PBJKO-BF0_-cQV.js";import"./index-Di2QXQ2F.js";import"./vendor-codemirror-CjW0lHR5.js";import"./vendor-react-D809iwXR.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-D04IOhjD.js";import{_ as i}from"./mermaid.core-fkRIkj9z.js";import"./chunk-5VM5RSS4-rsYItuXP.js";import"./chunk-XXDRQBXY-DQa0UAw4.js";import"./chunk-POPQ4Y6H-CrxjxjWM.js";import"./chunk-F27PBJKO-BF0_-cQV.js";import"./index-Di2QXQ2F.js";import"./vendor-codemirror-CjW0lHR5.js";import"./vendor-react-D809iwXR.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-Do7aQF9c.js";import{_ as a}from"./mermaid.core-fkRIkj9z.js";import"./chunk-5VM5RSS4-rsYItuXP.js";import"./chunk-XXDRQBXY-DQa0UAw4.js";import"./chunk-POPQ4Y6H-CrxjxjWM.js";import"./chunk-F27PBJKO-BF0_-cQV.js";import"./index-Di2QXQ2F.js";import"./vendor-codemirror-CjW0lHR5.js";import"./vendor-react-D809iwXR.js";import"./vendor-xterm-BWUgpGtR.js";import"./channel-DHZHDI2B.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};