prjct-cli 0.45.0 → 0.45.3

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 (207) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/bin/prjct.ts +117 -10
  3. package/core/__tests__/agentic/memory-system.test.ts +39 -26
  4. package/core/__tests__/agentic/plan-mode.test.ts +64 -46
  5. package/core/__tests__/agentic/prompt-builder.test.ts +14 -14
  6. package/core/__tests__/services/project-index.test.ts +353 -0
  7. package/core/__tests__/types/fs.test.ts +3 -3
  8. package/core/__tests__/utils/date-helper.test.ts +10 -10
  9. package/core/__tests__/utils/output.test.ts +9 -6
  10. package/core/__tests__/utils/project-commands.test.ts +5 -6
  11. package/core/agentic/agent-router.ts +9 -10
  12. package/core/agentic/chain-of-thought.ts +16 -4
  13. package/core/agentic/command-executor.ts +66 -40
  14. package/core/agentic/context-builder.ts +8 -5
  15. package/core/agentic/ground-truth.ts +15 -9
  16. package/core/agentic/index.ts +145 -152
  17. package/core/agentic/loop-detector.ts +40 -11
  18. package/core/agentic/memory-system.ts +98 -35
  19. package/core/agentic/orchestrator-executor.ts +135 -71
  20. package/core/agentic/plan-mode.ts +46 -16
  21. package/core/agentic/prompt-builder.ts +108 -42
  22. package/core/agentic/services.ts +10 -9
  23. package/core/agentic/skill-loader.ts +9 -15
  24. package/core/agentic/smart-context.ts +129 -79
  25. package/core/agentic/template-executor.ts +13 -12
  26. package/core/agentic/template-loader.ts +7 -4
  27. package/core/agentic/tool-registry.ts +16 -13
  28. package/core/agents/index.ts +1 -1
  29. package/core/agents/performance.ts +10 -27
  30. package/core/ai-tools/formatters.ts +8 -6
  31. package/core/ai-tools/generator.ts +4 -4
  32. package/core/ai-tools/index.ts +1 -1
  33. package/core/ai-tools/registry.ts +21 -11
  34. package/core/bus/bus.ts +23 -16
  35. package/core/bus/index.ts +2 -2
  36. package/core/cli/linear.ts +3 -5
  37. package/core/cli/start.ts +28 -25
  38. package/core/commands/analysis.ts +58 -39
  39. package/core/commands/analytics.ts +52 -44
  40. package/core/commands/base.ts +15 -13
  41. package/core/commands/cleanup.ts +6 -13
  42. package/core/commands/command-data.ts +28 -4
  43. package/core/commands/commands.ts +57 -24
  44. package/core/commands/context.ts +4 -4
  45. package/core/commands/design.ts +3 -10
  46. package/core/commands/index.ts +5 -8
  47. package/core/commands/maintenance.ts +7 -4
  48. package/core/commands/planning.ts +179 -56
  49. package/core/commands/register.ts +13 -9
  50. package/core/commands/registry.ts +15 -14
  51. package/core/commands/setup.ts +26 -14
  52. package/core/commands/shipping.ts +11 -16
  53. package/core/commands/snapshots.ts +16 -32
  54. package/core/commands/uninstall.ts +541 -0
  55. package/core/commands/workflow.ts +24 -28
  56. package/core/constants/index.ts +10 -22
  57. package/core/context/generator.ts +82 -33
  58. package/core/context-tools/files-tool.ts +18 -19
  59. package/core/context-tools/imports-tool.ts +13 -33
  60. package/core/context-tools/index.ts +29 -54
  61. package/core/context-tools/recent-tool.ts +16 -22
  62. package/core/context-tools/signatures-tool.ts +17 -26
  63. package/core/context-tools/summary-tool.ts +20 -22
  64. package/core/context-tools/token-counter.ts +25 -20
  65. package/core/context-tools/types.ts +5 -5
  66. package/core/domain/agent-generator.ts +7 -5
  67. package/core/domain/agent-loader.ts +2 -2
  68. package/core/domain/analyzer.ts +19 -16
  69. package/core/domain/architecture-generator.ts +6 -3
  70. package/core/domain/context-estimator.ts +3 -4
  71. package/core/domain/snapshot-manager.ts +25 -22
  72. package/core/domain/task-stack.ts +24 -14
  73. package/core/errors.ts +1 -1
  74. package/core/events/events.ts +2 -4
  75. package/core/events/index.ts +1 -2
  76. package/core/index.ts +28 -16
  77. package/core/infrastructure/agent-detector.ts +3 -3
  78. package/core/infrastructure/ai-provider.ts +23 -20
  79. package/core/infrastructure/author-detector.ts +16 -10
  80. package/core/infrastructure/capability-installer.ts +2 -2
  81. package/core/infrastructure/claude-agent.ts +6 -6
  82. package/core/infrastructure/command-installer.ts +22 -17
  83. package/core/infrastructure/config-manager.ts +18 -14
  84. package/core/infrastructure/editors-config.ts +8 -4
  85. package/core/infrastructure/path-manager.ts +8 -6
  86. package/core/infrastructure/permission-manager.ts +20 -17
  87. package/core/infrastructure/setup.ts +42 -38
  88. package/core/infrastructure/update-checker.ts +5 -5
  89. package/core/integrations/issue-tracker/enricher.ts +8 -19
  90. package/core/integrations/issue-tracker/index.ts +2 -2
  91. package/core/integrations/issue-tracker/manager.ts +15 -15
  92. package/core/integrations/issue-tracker/types.ts +5 -22
  93. package/core/integrations/jira/client.ts +67 -59
  94. package/core/integrations/jira/index.ts +11 -14
  95. package/core/integrations/jira/mcp-adapter.ts +5 -10
  96. package/core/integrations/jira/service.ts +10 -10
  97. package/core/integrations/linear/client.ts +27 -18
  98. package/core/integrations/linear/index.ts +9 -12
  99. package/core/integrations/linear/service.ts +11 -11
  100. package/core/integrations/linear/sync.ts +8 -8
  101. package/core/outcomes/analyzer.ts +5 -18
  102. package/core/outcomes/index.ts +2 -2
  103. package/core/outcomes/recorder.ts +3 -3
  104. package/core/plugin/builtin/webhook.ts +19 -15
  105. package/core/plugin/hooks.ts +29 -21
  106. package/core/plugin/index.ts +7 -7
  107. package/core/plugin/loader.ts +19 -19
  108. package/core/plugin/registry.ts +12 -23
  109. package/core/schemas/agents.ts +1 -1
  110. package/core/schemas/analysis.ts +1 -1
  111. package/core/schemas/enriched-task.ts +62 -49
  112. package/core/schemas/ideas.ts +13 -13
  113. package/core/schemas/index.ts +17 -27
  114. package/core/schemas/issues.ts +40 -25
  115. package/core/schemas/metrics.ts +25 -25
  116. package/core/schemas/outcomes.ts +70 -62
  117. package/core/schemas/permissions.ts +15 -12
  118. package/core/schemas/prd.ts +27 -14
  119. package/core/schemas/project.ts +3 -3
  120. package/core/schemas/roadmap.ts +47 -34
  121. package/core/schemas/schemas.ts +3 -4
  122. package/core/schemas/shipped.ts +3 -3
  123. package/core/schemas/state.ts +43 -29
  124. package/core/server/index.ts +5 -6
  125. package/core/server/routes-extended.ts +68 -72
  126. package/core/server/routes.ts +3 -3
  127. package/core/server/server.ts +31 -26
  128. package/core/services/agent-generator.ts +237 -0
  129. package/core/services/agent-service.ts +2 -2
  130. package/core/services/breakdown-service.ts +2 -4
  131. package/core/services/context-generator.ts +299 -0
  132. package/core/services/context-selector.ts +420 -0
  133. package/core/services/doctor-service.ts +426 -0
  134. package/core/services/file-categorizer.ts +448 -0
  135. package/core/services/file-scorer.ts +270 -0
  136. package/core/services/git-analyzer.ts +267 -0
  137. package/core/services/index.ts +27 -10
  138. package/core/services/memory-service.ts +3 -4
  139. package/core/services/project-index.ts +911 -0
  140. package/core/services/project-service.ts +4 -4
  141. package/core/services/skill-installer.ts +14 -17
  142. package/core/services/skill-lock.ts +3 -3
  143. package/core/services/skill-service.ts +12 -6
  144. package/core/services/stack-detector.ts +245 -0
  145. package/core/services/sync-service.ts +87 -345
  146. package/core/services/watch-service.ts +294 -0
  147. package/core/session/compaction.ts +23 -31
  148. package/core/session/index.ts +11 -5
  149. package/core/session/log-migration.ts +3 -3
  150. package/core/session/metrics.ts +19 -14
  151. package/core/session/session-log-manager.ts +12 -17
  152. package/core/session/task-session-manager.ts +25 -25
  153. package/core/session/utils.ts +1 -1
  154. package/core/storage/ideas-storage.ts +41 -57
  155. package/core/storage/index-storage.ts +514 -0
  156. package/core/storage/index.ts +41 -17
  157. package/core/storage/metrics-storage.ts +39 -34
  158. package/core/storage/queue-storage.ts +35 -45
  159. package/core/storage/shipped-storage.ts +17 -20
  160. package/core/storage/state-storage.ts +50 -30
  161. package/core/storage/storage-manager.ts +6 -6
  162. package/core/storage/storage.ts +18 -15
  163. package/core/sync/auth-config.ts +3 -3
  164. package/core/sync/index.ts +13 -19
  165. package/core/sync/oauth-handler.ts +3 -3
  166. package/core/sync/sync-client.ts +4 -9
  167. package/core/sync/sync-manager.ts +12 -14
  168. package/core/types/commands.ts +42 -7
  169. package/core/types/index.ts +284 -305
  170. package/core/types/integrations.ts +3 -3
  171. package/core/types/storage.ts +14 -14
  172. package/core/types/utils.ts +3 -3
  173. package/core/utils/agent-stream.ts +3 -1
  174. package/core/utils/animations.ts +14 -11
  175. package/core/utils/branding.ts +7 -7
  176. package/core/utils/cache.ts +1 -3
  177. package/core/utils/collection-filters.ts +3 -15
  178. package/core/utils/date-helper.ts +2 -7
  179. package/core/utils/file-helper.ts +13 -8
  180. package/core/utils/jsonl-helper.ts +13 -10
  181. package/core/utils/keychain.ts +4 -8
  182. package/core/utils/logger.ts +1 -1
  183. package/core/utils/next-steps.ts +3 -3
  184. package/core/utils/output.ts +58 -11
  185. package/core/utils/project-commands.ts +6 -6
  186. package/core/utils/project-credentials.ts +5 -12
  187. package/core/utils/runtime.ts +2 -2
  188. package/core/utils/session-helper.ts +3 -4
  189. package/core/utils/version.ts +3 -3
  190. package/core/wizard/index.ts +13 -0
  191. package/core/wizard/onboarding.ts +633 -0
  192. package/core/workflow/state-machine.ts +7 -7
  193. package/dist/bin/prjct.mjs +18755 -15574
  194. package/dist/core/infrastructure/command-installer.js +86 -79
  195. package/dist/core/infrastructure/editors-config.js +6 -6
  196. package/dist/core/infrastructure/setup.js +246 -225
  197. package/dist/core/utils/version.js +9 -9
  198. package/package.json +11 -12
  199. package/scripts/build.js +3 -3
  200. package/scripts/postinstall.js +2 -2
  201. package/templates/mcp-config.json +6 -1
  202. package/templates/permissions/permissive.jsonc +1 -1
  203. package/templates/permissions/strict.jsonc +5 -9
  204. package/templates/global/docs/agents.md +0 -88
  205. package/templates/global/docs/architecture.md +0 -103
  206. package/templates/global/docs/commands.md +0 -96
  207. package/templates/global/docs/validation.md +0 -95
@@ -60,7 +60,7 @@ __export(ai_provider_exports, {
60
60
  });
61
61
  function whichCommand(command) {
62
62
  try {
63
- const result = (0, import_child_process.execSync)(`which ${command}`, { stdio: "pipe", encoding: "utf-8" });
63
+ const result = (0, import_node_child_process.execSync)(`which ${command}`, { stdio: "pipe", encoding: "utf-8" });
64
64
  return result.trim();
65
65
  } catch {
66
66
  return null;
@@ -68,7 +68,7 @@ function whichCommand(command) {
68
68
  }
69
69
  function getCliVersion(command) {
70
70
  try {
71
- const result = (0, import_child_process.execSync)(`${command} --version`, { stdio: "pipe", encoding: "utf-8" });
71
+ const result = (0, import_node_child_process.execSync)(`${command} --version`, { stdio: "pipe", encoding: "utf-8" });
72
72
  const match = result.match(/\d+\.\d+\.\d+/);
73
73
  return match ? match[0] : result.trim();
74
74
  } catch {
@@ -115,7 +115,7 @@ function hasProviderConfig(provider) {
115
115
  if (!config.configDir) {
116
116
  return false;
117
117
  }
118
- return import_fs2.default.existsSync(config.configDir);
118
+ return import_node_fs2.default.existsSync(config.configDir);
119
119
  }
120
120
  function getProviderBranding(provider) {
121
121
  const commitFooter = `Generated with [p/](https://www.prjct.app/)`;
@@ -132,11 +132,11 @@ function getProviderBranding(provider) {
132
132
  };
133
133
  }
134
134
  function detectCursorProject(projectRoot) {
135
- const cursorDir = import_path2.default.join(projectRoot, ".cursor");
136
- const rulesDir = import_path2.default.join(cursorDir, "rules");
137
- const routerPath = import_path2.default.join(rulesDir, "prjct.mdc");
138
- const detected = import_fs2.default.existsSync(cursorDir);
139
- const routerInstalled = import_fs2.default.existsSync(routerPath);
135
+ const cursorDir = import_node_path2.default.join(projectRoot, ".cursor");
136
+ const rulesDir = import_node_path2.default.join(cursorDir, "rules");
137
+ const routerPath = import_node_path2.default.join(rulesDir, "prjct.mdc");
138
+ const detected = import_node_fs2.default.existsSync(cursorDir);
139
+ const routerInstalled = import_node_fs2.default.existsSync(routerPath);
140
140
  return {
141
141
  detected,
142
142
  routerInstalled,
@@ -148,11 +148,11 @@ function needsCursorRouterRegeneration(projectRoot) {
148
148
  return detection.detected && !detection.routerInstalled;
149
149
  }
150
150
  function detectWindsurfProject(projectRoot) {
151
- const windsurfDir = import_path2.default.join(projectRoot, ".windsurf");
152
- const rulesDir = import_path2.default.join(windsurfDir, "rules");
153
- const routerPath = import_path2.default.join(rulesDir, "prjct.md");
154
- const detected = import_fs2.default.existsSync(windsurfDir);
155
- const routerInstalled = import_fs2.default.existsSync(routerPath);
151
+ const windsurfDir = import_node_path2.default.join(projectRoot, ".windsurf");
152
+ const rulesDir = import_node_path2.default.join(windsurfDir, "rules");
153
+ const routerPath = import_node_path2.default.join(rulesDir, "prjct.md");
154
+ const detected = import_node_fs2.default.existsSync(windsurfDir);
155
+ const routerInstalled = import_node_fs2.default.existsSync(routerPath);
156
156
  return {
157
157
  detected,
158
158
  routerInstalled,
@@ -168,9 +168,9 @@ function detectAntigravity() {
168
168
  if (!configPath) {
169
169
  return { installed: false, skillInstalled: false };
170
170
  }
171
- const installed = import_fs2.default.existsSync(configPath);
172
- const skillPath = import_path2.default.join(configPath, "skills", "prjct", "SKILL.md");
173
- const skillInstalled = import_fs2.default.existsSync(skillPath);
171
+ const installed = import_node_fs2.default.existsSync(configPath);
172
+ const skillPath = import_node_path2.default.join(configPath, "skills", "prjct", "SKILL.md");
173
+ const skillInstalled = import_node_fs2.default.existsSync(skillPath);
174
174
  return {
175
175
  installed,
176
176
  skillInstalled,
@@ -182,14 +182,14 @@ function getGlobalContextPath(provider) {
182
182
  if (!config.configDir) {
183
183
  return null;
184
184
  }
185
- return import_path2.default.join(config.configDir, config.contextFile);
185
+ return import_node_path2.default.join(config.configDir, config.contextFile);
186
186
  }
187
187
  function getGlobalSettingsPath(provider) {
188
188
  const config = Providers[provider];
189
189
  if (!config.configDir || !config.settingsFile) {
190
190
  return null;
191
191
  }
192
- return import_path2.default.join(config.configDir, config.settingsFile);
192
+ return import_node_path2.default.join(config.configDir, config.settingsFile);
193
193
  }
194
194
  function getSkillsPath(provider) {
195
195
  return Providers[provider].skillsDir;
@@ -199,7 +199,7 @@ function getCommandsDir(provider) {
199
199
  }
200
200
  function getProjectCommandsPath(provider, projectRoot) {
201
201
  const config = Providers[provider];
202
- return import_path2.default.join(projectRoot, config.commandsDir);
202
+ return import_node_path2.default.join(projectRoot, config.commandsDir);
203
203
  }
204
204
  function selectProvider() {
205
205
  const detection = detectAllProviders();
@@ -233,21 +233,21 @@ function selectProvider() {
233
233
  detection
234
234
  };
235
235
  }
236
- var import_child_process, import_fs2, import_path2, import_os, ClaudeProvider, GeminiProvider, AntigravityProvider, CursorProvider, WindsurfProvider, Providers, ai_provider_default;
236
+ var import_node_child_process, import_node_fs2, import_node_os, import_node_path2, ClaudeProvider, GeminiProvider, AntigravityProvider, CursorProvider, WindsurfProvider, Providers, ai_provider_default;
237
237
  var init_ai_provider = __esm({
238
238
  "core/infrastructure/ai-provider.ts"() {
239
239
  "use strict";
240
- import_child_process = require("child_process");
241
- import_fs2 = __toESM(require("fs"));
242
- import_path2 = __toESM(require("path"));
243
- import_os = __toESM(require("os"));
240
+ import_node_child_process = require("node:child_process");
241
+ import_node_fs2 = __toESM(require("node:fs"));
242
+ import_node_os = __toESM(require("node:os"));
243
+ import_node_path2 = __toESM(require("node:path"));
244
244
  ClaudeProvider = {
245
245
  name: "claude",
246
246
  displayName: "Claude Code",
247
247
  cliCommand: "claude",
248
- configDir: import_path2.default.join(import_os.default.homedir(), ".claude"),
248
+ configDir: import_node_path2.default.join(import_node_os.default.homedir(), ".claude"),
249
249
  contextFile: "CLAUDE.md",
250
- skillsDir: import_path2.default.join(import_os.default.homedir(), ".claude", "skills"),
250
+ skillsDir: import_node_path2.default.join(import_node_os.default.homedir(), ".claude", "skills"),
251
251
  commandsDir: ".claude/commands",
252
252
  commandFormat: "md",
253
253
  settingsFile: "settings.json",
@@ -260,9 +260,9 @@ var init_ai_provider = __esm({
260
260
  name: "gemini",
261
261
  displayName: "Gemini CLI",
262
262
  cliCommand: "gemini",
263
- configDir: import_path2.default.join(import_os.default.homedir(), ".gemini"),
263
+ configDir: import_node_path2.default.join(import_node_os.default.homedir(), ".gemini"),
264
264
  contextFile: "GEMINI.md",
265
- skillsDir: import_path2.default.join(import_os.default.homedir(), ".gemini", "skills"),
265
+ skillsDir: import_node_path2.default.join(import_node_os.default.homedir(), ".gemini", "skills"),
266
266
  commandsDir: ".gemini/commands",
267
267
  commandFormat: "toml",
268
268
  settingsFile: "settings.json",
@@ -276,9 +276,9 @@ var init_ai_provider = __esm({
276
276
  displayName: "Google Antigravity",
277
277
  cliCommand: null,
278
278
  // Not a CLI command, but a platform/app
279
- configDir: import_path2.default.join(import_os.default.homedir(), ".gemini", "antigravity"),
279
+ configDir: import_node_path2.default.join(import_node_os.default.homedir(), ".gemini", "antigravity"),
280
280
  contextFile: "ANTIGRAVITY.md",
281
- skillsDir: import_path2.default.join(import_os.default.homedir(), ".gemini", "antigravity", "global_skills"),
281
+ skillsDir: import_node_path2.default.join(import_node_os.default.homedir(), ".gemini", "antigravity", "global_skills"),
282
282
  commandsDir: ".agent/skills",
283
283
  // Antigravity uses .agent/skills in projects
284
284
  commandFormat: "md",
@@ -400,13 +400,19 @@ __export(command_installer_exports, {
400
400
  isRouterInstalled: () => isRouterInstalled
401
401
  });
402
402
  module.exports = __toCommonJS(command_installer_exports);
403
- var import_promises = __toESM(require("fs/promises"));
404
- var import_path3 = __toESM(require("path"));
405
- var import_os2 = __toESM(require("os"));
403
+ var import_promises = __toESM(require("node:fs/promises"));
404
+ var import_node_os2 = __toESM(require("node:os"));
405
+ var import_node_path3 = __toESM(require("node:path"));
406
+
407
+ // core/types/fs.ts
408
+ function isNotFoundError(error) {
409
+ return error?.code === "ENOENT";
410
+ }
411
+ __name(isNotFoundError, "isNotFoundError");
406
412
 
407
413
  // core/utils/version.ts
408
- var import_fs = __toESM(require("fs"));
409
- var import_path = __toESM(require("path"));
414
+ var import_node_fs = __toESM(require("node:fs"));
415
+ var import_node_path = __toESM(require("node:path"));
410
416
  var cachedVersion = null;
411
417
  var cachedPackageJson = null;
412
418
  var cachedPackageRoot = null;
@@ -416,10 +422,10 @@ function getPackageRoot() {
416
422
  }
417
423
  let currentDir = __dirname;
418
424
  for (let i = 0; i < 5; i++) {
419
- const packageJsonPath = import_path.default.join(currentDir, "package.json");
420
- if (import_fs.default.existsSync(packageJsonPath)) {
425
+ const packageJsonPath = import_node_path.default.join(currentDir, "package.json");
426
+ if (import_node_fs.default.existsSync(packageJsonPath)) {
421
427
  try {
422
- const pkg = JSON.parse(import_fs.default.readFileSync(packageJsonPath, "utf-8"));
428
+ const pkg = JSON.parse(import_node_fs.default.readFileSync(packageJsonPath, "utf-8"));
423
429
  if (pkg.name === "prjct-cli") {
424
430
  cachedPackageRoot = currentDir;
425
431
  return currentDir;
@@ -427,9 +433,9 @@ function getPackageRoot() {
427
433
  } catch (_error) {
428
434
  }
429
435
  }
430
- currentDir = import_path.default.dirname(currentDir);
436
+ currentDir = import_node_path.default.dirname(currentDir);
431
437
  }
432
- cachedPackageRoot = import_path.default.join(__dirname, "..", "..", "..");
438
+ cachedPackageRoot = import_node_path.default.join(__dirname, "..", "..", "..");
433
439
  return cachedPackageRoot;
434
440
  }
435
441
  __name(getPackageRoot, "getPackageRoot");
@@ -438,8 +444,8 @@ function getVersion() {
438
444
  return cachedVersion;
439
445
  }
440
446
  try {
441
- const packageJsonPath = import_path.default.join(getPackageRoot(), "package.json");
442
- const packageJson = JSON.parse(import_fs.default.readFileSync(packageJsonPath, "utf-8"));
447
+ const packageJsonPath = import_node_path.default.join(getPackageRoot(), "package.json");
448
+ const packageJson = JSON.parse(import_node_fs.default.readFileSync(packageJsonPath, "utf-8"));
443
449
  cachedVersion = packageJson.version;
444
450
  cachedPackageJson = packageJson;
445
451
  return cachedVersion;
@@ -452,23 +458,17 @@ __name(getVersion, "getVersion");
452
458
  var VERSION = getVersion();
453
459
  var PACKAGE_ROOT = getPackageRoot();
454
460
 
455
- // core/types/fs.ts
456
- function isNotFoundError(error) {
457
- return error?.code === "ENOENT";
458
- }
459
- __name(isNotFoundError, "isNotFoundError");
460
-
461
461
  // core/infrastructure/command-installer.ts
462
462
  async function installDocs() {
463
463
  try {
464
- const docsDir = import_path3.default.join(import_os2.default.homedir(), ".prjct-cli", "docs");
465
- const templateDocsDir = import_path3.default.join(getPackageRoot(), "templates/global/docs");
464
+ const docsDir = import_node_path3.default.join(import_node_os2.default.homedir(), ".prjct-cli", "docs");
465
+ const templateDocsDir = import_node_path3.default.join(getPackageRoot(), "templates/global/docs");
466
466
  await import_promises.default.mkdir(docsDir, { recursive: true });
467
467
  const docFiles = await import_promises.default.readdir(templateDocsDir);
468
468
  for (const file of docFiles) {
469
469
  if (file.endsWith(".md")) {
470
- const srcPath = import_path3.default.join(templateDocsDir, file);
471
- const destPath = import_path3.default.join(docsDir, file);
470
+ const srcPath = import_node_path3.default.join(templateDocsDir, file);
471
+ const destPath = import_node_path3.default.join(docsDir, file);
472
472
  const content = await import_promises.default.readFile(srcPath, "utf-8");
473
473
  await import_promises.default.writeFile(destPath, content, "utf-8");
474
474
  }
@@ -493,13 +493,18 @@ async function installGlobalConfig() {
493
493
  }
494
494
  try {
495
495
  await import_promises.default.mkdir(activeProvider.configDir, { recursive: true });
496
- const globalConfigPath = import_path3.default.join(activeProvider.configDir, activeProvider.contextFile);
497
- const templatePath = import_path3.default.join(getPackageRoot(), "templates", "global", activeProvider.contextFile);
496
+ const globalConfigPath = import_node_path3.default.join(activeProvider.configDir, activeProvider.contextFile);
497
+ const templatePath = import_node_path3.default.join(
498
+ getPackageRoot(),
499
+ "templates",
500
+ "global",
501
+ activeProvider.contextFile
502
+ );
498
503
  let templateContent = "";
499
504
  try {
500
505
  templateContent = await import_promises.default.readFile(templatePath, "utf-8");
501
- } catch (error) {
502
- const fallbackTemplatePath = import_path3.default.join(getPackageRoot(), "templates/global/CLAUDE.md");
506
+ } catch (_error) {
507
+ const fallbackTemplatePath = import_node_path3.default.join(getPackageRoot(), "templates/global/CLAUDE.md");
503
508
  templateContent = await import_promises.default.readFile(fallbackTemplatePath, "utf-8");
504
509
  if (providerName === "gemini") {
505
510
  templateContent = templateContent.replace(/Claude/g, "Gemini");
@@ -529,7 +534,9 @@ async function installGlobalConfig() {
529
534
  const endMarker = "<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";
530
535
  const hasMarkers = existingContent.includes(startMarker) && existingContent.includes(endMarker);
531
536
  if (!hasMarkers) {
532
- const updatedContent = existingContent + "\n\n" + templateContent;
537
+ const updatedContent = `${existingContent}
538
+
539
+ ${templateContent}`;
533
540
  await import_promises.default.writeFile(globalConfigPath, updatedContent, "utf-8");
534
541
  return {
535
542
  success: true,
@@ -572,16 +579,16 @@ var CommandInstaller = class {
572
579
  claudeConfigPath;
573
580
  templatesDir;
574
581
  constructor() {
575
- this.homeDir = import_os2.default.homedir();
582
+ this.homeDir = import_node_os2.default.homedir();
576
583
  const aiProvider = (init_ai_provider(), __toCommonJS(ai_provider_exports));
577
584
  const activeProvider = aiProvider.getActiveProvider();
578
585
  if (activeProvider.name === "gemini") {
579
- this.claudeCommandsPath = import_path3.default.join(activeProvider.configDir, "commands");
586
+ this.claudeCommandsPath = import_node_path3.default.join(activeProvider.configDir, "commands");
580
587
  } else {
581
- this.claudeCommandsPath = import_path3.default.join(activeProvider.configDir, "commands", "p");
588
+ this.claudeCommandsPath = import_node_path3.default.join(activeProvider.configDir, "commands", "p");
582
589
  }
583
590
  this.claudeConfigPath = activeProvider.configDir;
584
- this.templatesDir = import_path3.default.join(getPackageRoot(), "templates", "commands");
591
+ this.templatesDir = import_node_path3.default.join(getPackageRoot(), "templates", "commands");
585
592
  }
586
593
  /**
587
594
  * Detect if active provider is installed
@@ -610,7 +617,7 @@ var CommandInstaller = class {
610
617
  try {
611
618
  const files = await import_promises.default.readdir(this.templatesDir);
612
619
  return files.filter((f) => f.endsWith(".md"));
613
- } catch (error) {
620
+ } catch (_error) {
614
621
  return [
615
622
  "init.md",
616
623
  "now.md",
@@ -655,8 +662,8 @@ var CommandInstaller = class {
655
662
  const errors = [];
656
663
  for (const file of commandFiles) {
657
664
  try {
658
- const sourcePath = import_path3.default.join(this.templatesDir, file);
659
- const destPath = import_path3.default.join(this.claudeCommandsPath, file);
665
+ const sourcePath = import_node_path3.default.join(this.templatesDir, file);
666
+ const destPath = import_node_path3.default.join(this.claudeCommandsPath, file);
660
667
  const content = await import_promises.default.readFile(sourcePath, "utf-8");
661
668
  await import_promises.default.writeFile(destPath, content, "utf-8");
662
669
  installed.push(file.replace(".md", ""));
@@ -687,7 +694,7 @@ var CommandInstaller = class {
687
694
  const errors = [];
688
695
  for (const file of commandFiles) {
689
696
  try {
690
- const filePath = import_path3.default.join(this.claudeCommandsPath, file);
697
+ const filePath = import_node_path3.default.join(this.claudeCommandsPath, file);
691
698
  await import_promises.default.unlink(filePath);
692
699
  uninstalled.push(file.replace(".md", ""));
693
700
  } catch (error) {
@@ -698,7 +705,7 @@ var CommandInstaller = class {
698
705
  }
699
706
  try {
700
707
  await import_promises.default.rmdir(this.claudeCommandsPath);
701
- } catch (error) {
708
+ } catch (_error) {
702
709
  }
703
710
  return {
704
711
  success: true,
@@ -772,7 +779,7 @@ var CommandInstaller = class {
772
779
  */
773
780
  async verifyTemplate(commandName) {
774
781
  try {
775
- const templatePath = import_path3.default.join(this.templatesDir, `${commandName}.md`);
782
+ const templatePath = import_node_path3.default.join(this.templatesDir, `${commandName}.md`);
776
783
  await import_promises.default.access(templatePath);
777
784
  return true;
778
785
  } catch (error) {
@@ -791,9 +798,9 @@ var CommandInstaller = class {
791
798
  const activeProvider = aiProvider.getActiveProvider();
792
799
  const routerFile = activeProvider.name === "gemini" ? "p.toml" : "p.md";
793
800
  try {
794
- const routerSource = import_path3.default.join(this.templatesDir, routerFile);
795
- const routerDest = import_path3.default.join(activeProvider.configDir, "commands", routerFile);
796
- await import_promises.default.mkdir(import_path3.default.dirname(routerDest), { recursive: true });
801
+ const routerSource = import_node_path3.default.join(this.templatesDir, routerFile);
802
+ const routerDest = import_node_path3.default.join(activeProvider.configDir, "commands", routerFile);
803
+ await import_promises.default.mkdir(import_node_path3.default.dirname(routerDest), { recursive: true });
797
804
  const content = await import_promises.default.readFile(routerSource, "utf-8");
798
805
  await import_promises.default.writeFile(routerDest, content, "utf-8");
799
806
  return true;
@@ -842,8 +849,8 @@ var CommandInstaller = class {
842
849
  };
843
850
  for (const file of templateFiles) {
844
851
  try {
845
- const sourcePath = import_path3.default.join(this.templatesDir, file);
846
- const destPath = import_path3.default.join(this.claudeCommandsPath, file);
852
+ const sourcePath = import_node_path3.default.join(this.templatesDir, file);
853
+ const destPath = import_node_path3.default.join(this.claudeCommandsPath, file);
847
854
  const exists = installedFiles.includes(file);
848
855
  const content = await import_promises.default.readFile(sourcePath, "utf-8");
849
856
  await import_promises.default.writeFile(destPath, content, "utf-8");
@@ -881,17 +888,17 @@ var CommandInstaller = class {
881
888
  }
882
889
  };
883
890
  function getProviderPaths() {
884
- const homeDir = import_os2.default.homedir();
891
+ const homeDir = import_node_os2.default.homedir();
885
892
  return {
886
893
  claude: {
887
- commands: import_path3.default.join(homeDir, ".claude", "commands", "p"),
888
- config: import_path3.default.join(homeDir, ".claude"),
889
- router: import_path3.default.join(homeDir, ".claude", "commands", "p.md")
894
+ commands: import_node_path3.default.join(homeDir, ".claude", "commands", "p"),
895
+ config: import_node_path3.default.join(homeDir, ".claude"),
896
+ router: import_node_path3.default.join(homeDir, ".claude", "commands", "p.md")
890
897
  },
891
898
  gemini: {
892
- commands: import_path3.default.join(homeDir, ".gemini", "commands"),
893
- config: import_path3.default.join(homeDir, ".gemini"),
894
- router: import_path3.default.join(homeDir, ".gemini", "commands", "p.toml")
899
+ commands: import_node_path3.default.join(homeDir, ".gemini", "commands"),
900
+ config: import_node_path3.default.join(homeDir, ".gemini"),
901
+ router: import_node_path3.default.join(homeDir, ".gemini", "commands", "p.toml")
895
902
  }
896
903
  };
897
904
  }
@@ -34,9 +34,9 @@ __export(editors_config_exports, {
34
34
  default: () => editors_config_default
35
35
  });
36
36
  module.exports = __toCommonJS(editors_config_exports);
37
- var import_promises = __toESM(require("fs/promises"));
38
- var import_path = __toESM(require("path"));
39
- var import_os = __toESM(require("os"));
37
+ var import_promises = __toESM(require("node:fs/promises"));
38
+ var import_node_os = __toESM(require("node:os"));
39
+ var import_node_path = __toESM(require("node:path"));
40
40
  var EditorsConfig = class {
41
41
  static {
42
42
  __name(this, "EditorsConfig");
@@ -45,9 +45,9 @@ var EditorsConfig = class {
45
45
  configDir;
46
46
  configFile;
47
47
  constructor() {
48
- this.homeDir = import_os.default.homedir();
49
- this.configDir = import_path.default.join(this.homeDir, ".prjct-cli", "config");
50
- this.configFile = import_path.default.join(this.configDir, "installed-editors.json");
48
+ this.homeDir = import_node_os.default.homedir();
49
+ this.configDir = import_node_path.default.join(this.homeDir, ".prjct-cli", "config");
50
+ this.configFile = import_node_path.default.join(this.configDir, "installed-editors.json");
51
51
  }
52
52
  /**
53
53
  * Ensure config directory exists