prjct-cli 0.44.1 → 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 +114 -0
  2. package/bin/prjct.ts +131 -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 +287 -29
  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 +49 -8
  43. package/core/commands/commands.ts +60 -23
  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 +14 -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 +583 -0
  59. package/core/context-tools/imports-tool.ts +403 -0
  60. package/core/context-tools/index.ts +433 -0
  61. package/core/context-tools/recent-tool.ts +307 -0
  62. package/core/context-tools/signatures-tool.ts +501 -0
  63. package/core/context-tools/summary-tool.ts +307 -0
  64. package/core/context-tools/token-counter.ts +284 -0
  65. package/core/context-tools/types.ts +253 -0
  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 -12
  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 +143 -0
  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 +170 -329
  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 -13
  157. package/core/storage/metrics-storage.ts +320 -0
  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 -302
  170. package/core/types/integrations.ts +3 -3
  171. package/core/types/storage.ts +49 -0
  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 +18907 -13189
  194. package/dist/core/infrastructure/command-installer.js +96 -111
  195. package/dist/core/infrastructure/editors-config.js +6 -6
  196. package/dist/core/infrastructure/setup.js +256 -257
  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,50 +115,28 @@ 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
- const config = Providers[provider];
122
- if (provider === "gemini") {
123
- return {
124
- commitFooter: `\u{1F916} Generated with [p/](https://www.prjct.app/)
125
- Designed for [Gemini](${config.websiteUrl})`,
126
- signature: "\u26A1 prjct + Gemini"
127
- };
128
- }
129
- if (provider === "cursor") {
130
- return {
131
- commitFooter: `\u{1F916} Generated with [p/](https://www.prjct.app/)
132
- Built with [Cursor](${config.websiteUrl})`,
133
- signature: "\u26A1 prjct + Cursor"
134
- };
135
- }
136
- if (provider === "antigravity") {
137
- return {
138
- commitFooter: `\u{1F916} Generated with [p/](https://www.prjct.app/)
139
- Powered by [Antigravity](${config.websiteUrl})`,
140
- signature: "\u26A1 prjct + Antigravity"
141
- };
142
- }
143
- if (provider === "windsurf") {
144
- return {
145
- commitFooter: `\u{1F916} Generated with [p/](https://www.prjct.app/)
146
- Built with [Windsurf](${config.websiteUrl})`,
147
- signature: "\u26A1 prjct + Windsurf"
148
- };
149
- }
121
+ const commitFooter = `Generated with [p/](https://www.prjct.app/)`;
122
+ const signatures = {
123
+ claude: "\u26A1 prjct + Claude",
124
+ gemini: "\u26A1 prjct + Gemini",
125
+ cursor: "\u26A1 prjct + Cursor",
126
+ antigravity: "\u26A1 prjct + Antigravity",
127
+ windsurf: "\u26A1 prjct + Windsurf"
128
+ };
150
129
  return {
151
- commitFooter: `\u{1F916} Generated with [p/](https://www.prjct.app/)
152
- Designed for [Claude](${config.websiteUrl})`,
153
- signature: "\u26A1 prjct + Claude"
130
+ commitFooter,
131
+ signature: signatures[provider] || "\u26A1 prjct"
154
132
  };
155
133
  }
156
134
  function detectCursorProject(projectRoot) {
157
- const cursorDir = import_path2.default.join(projectRoot, ".cursor");
158
- const rulesDir = import_path2.default.join(cursorDir, "rules");
159
- const routerPath = import_path2.default.join(rulesDir, "prjct.mdc");
160
- const detected = import_fs2.default.existsSync(cursorDir);
161
- 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);
162
140
  return {
163
141
  detected,
164
142
  routerInstalled,
@@ -170,11 +148,11 @@ function needsCursorRouterRegeneration(projectRoot) {
170
148
  return detection.detected && !detection.routerInstalled;
171
149
  }
172
150
  function detectWindsurfProject(projectRoot) {
173
- const windsurfDir = import_path2.default.join(projectRoot, ".windsurf");
174
- const rulesDir = import_path2.default.join(windsurfDir, "rules");
175
- const routerPath = import_path2.default.join(rulesDir, "prjct.md");
176
- const detected = import_fs2.default.existsSync(windsurfDir);
177
- 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);
178
156
  return {
179
157
  detected,
180
158
  routerInstalled,
@@ -190,9 +168,9 @@ function detectAntigravity() {
190
168
  if (!configPath) {
191
169
  return { installed: false, skillInstalled: false };
192
170
  }
193
- const installed = import_fs2.default.existsSync(configPath);
194
- const skillPath = import_path2.default.join(configPath, "skills", "prjct", "SKILL.md");
195
- 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);
196
174
  return {
197
175
  installed,
198
176
  skillInstalled,
@@ -204,14 +182,14 @@ function getGlobalContextPath(provider) {
204
182
  if (!config.configDir) {
205
183
  return null;
206
184
  }
207
- return import_path2.default.join(config.configDir, config.contextFile);
185
+ return import_node_path2.default.join(config.configDir, config.contextFile);
208
186
  }
209
187
  function getGlobalSettingsPath(provider) {
210
188
  const config = Providers[provider];
211
189
  if (!config.configDir || !config.settingsFile) {
212
190
  return null;
213
191
  }
214
- return import_path2.default.join(config.configDir, config.settingsFile);
192
+ return import_node_path2.default.join(config.configDir, config.settingsFile);
215
193
  }
216
194
  function getSkillsPath(provider) {
217
195
  return Providers[provider].skillsDir;
@@ -221,7 +199,7 @@ function getCommandsDir(provider) {
221
199
  }
222
200
  function getProjectCommandsPath(provider, projectRoot) {
223
201
  const config = Providers[provider];
224
- return import_path2.default.join(projectRoot, config.commandsDir);
202
+ return import_node_path2.default.join(projectRoot, config.commandsDir);
225
203
  }
226
204
  function selectProvider() {
227
205
  const detection = detectAllProviders();
@@ -255,21 +233,21 @@ function selectProvider() {
255
233
  detection
256
234
  };
257
235
  }
258
- 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;
259
237
  var init_ai_provider = __esm({
260
238
  "core/infrastructure/ai-provider.ts"() {
261
239
  "use strict";
262
- import_child_process = require("child_process");
263
- import_fs2 = __toESM(require("fs"));
264
- import_path2 = __toESM(require("path"));
265
- 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"));
266
244
  ClaudeProvider = {
267
245
  name: "claude",
268
246
  displayName: "Claude Code",
269
247
  cliCommand: "claude",
270
- configDir: import_path2.default.join(import_os.default.homedir(), ".claude"),
248
+ configDir: import_node_path2.default.join(import_node_os.default.homedir(), ".claude"),
271
249
  contextFile: "CLAUDE.md",
272
- 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"),
273
251
  commandsDir: ".claude/commands",
274
252
  commandFormat: "md",
275
253
  settingsFile: "settings.json",
@@ -282,9 +260,9 @@ var init_ai_provider = __esm({
282
260
  name: "gemini",
283
261
  displayName: "Gemini CLI",
284
262
  cliCommand: "gemini",
285
- configDir: import_path2.default.join(import_os.default.homedir(), ".gemini"),
263
+ configDir: import_node_path2.default.join(import_node_os.default.homedir(), ".gemini"),
286
264
  contextFile: "GEMINI.md",
287
- 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"),
288
266
  commandsDir: ".gemini/commands",
289
267
  commandFormat: "toml",
290
268
  settingsFile: "settings.json",
@@ -298,9 +276,9 @@ var init_ai_provider = __esm({
298
276
  displayName: "Google Antigravity",
299
277
  cliCommand: null,
300
278
  // Not a CLI command, but a platform/app
301
- 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"),
302
280
  contextFile: "ANTIGRAVITY.md",
303
- 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"),
304
282
  commandsDir: ".agent/skills",
305
283
  // Antigravity uses .agent/skills in projects
306
284
  commandFormat: "md",
@@ -422,13 +400,19 @@ __export(command_installer_exports, {
422
400
  isRouterInstalled: () => isRouterInstalled
423
401
  });
424
402
  module.exports = __toCommonJS(command_installer_exports);
425
- var import_promises = __toESM(require("fs/promises"));
426
- var import_path3 = __toESM(require("path"));
427
- 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");
428
412
 
429
413
  // core/utils/version.ts
430
- var import_fs = __toESM(require("fs"));
431
- var import_path = __toESM(require("path"));
414
+ var import_node_fs = __toESM(require("node:fs"));
415
+ var import_node_path = __toESM(require("node:path"));
432
416
  var cachedVersion = null;
433
417
  var cachedPackageJson = null;
434
418
  var cachedPackageRoot = null;
@@ -438,10 +422,10 @@ function getPackageRoot() {
438
422
  }
439
423
  let currentDir = __dirname;
440
424
  for (let i = 0; i < 5; i++) {
441
- const packageJsonPath = import_path.default.join(currentDir, "package.json");
442
- 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)) {
443
427
  try {
444
- const pkg = JSON.parse(import_fs.default.readFileSync(packageJsonPath, "utf-8"));
428
+ const pkg = JSON.parse(import_node_fs.default.readFileSync(packageJsonPath, "utf-8"));
445
429
  if (pkg.name === "prjct-cli") {
446
430
  cachedPackageRoot = currentDir;
447
431
  return currentDir;
@@ -449,9 +433,9 @@ function getPackageRoot() {
449
433
  } catch (_error) {
450
434
  }
451
435
  }
452
- currentDir = import_path.default.dirname(currentDir);
436
+ currentDir = import_node_path.default.dirname(currentDir);
453
437
  }
454
- cachedPackageRoot = import_path.default.join(__dirname, "..", "..", "..");
438
+ cachedPackageRoot = import_node_path.default.join(__dirname, "..", "..", "..");
455
439
  return cachedPackageRoot;
456
440
  }
457
441
  __name(getPackageRoot, "getPackageRoot");
@@ -460,8 +444,8 @@ function getVersion() {
460
444
  return cachedVersion;
461
445
  }
462
446
  try {
463
- const packageJsonPath = import_path.default.join(getPackageRoot(), "package.json");
464
- 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"));
465
449
  cachedVersion = packageJson.version;
466
450
  cachedPackageJson = packageJson;
467
451
  return cachedVersion;
@@ -474,23 +458,17 @@ __name(getVersion, "getVersion");
474
458
  var VERSION = getVersion();
475
459
  var PACKAGE_ROOT = getPackageRoot();
476
460
 
477
- // core/types/fs.ts
478
- function isNotFoundError(error) {
479
- return error?.code === "ENOENT";
480
- }
481
- __name(isNotFoundError, "isNotFoundError");
482
-
483
461
  // core/infrastructure/command-installer.ts
484
462
  async function installDocs() {
485
463
  try {
486
- const docsDir = import_path3.default.join(import_os2.default.homedir(), ".prjct-cli", "docs");
487
- 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");
488
466
  await import_promises.default.mkdir(docsDir, { recursive: true });
489
467
  const docFiles = await import_promises.default.readdir(templateDocsDir);
490
468
  for (const file of docFiles) {
491
469
  if (file.endsWith(".md")) {
492
- const srcPath = import_path3.default.join(templateDocsDir, file);
493
- 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);
494
472
  const content = await import_promises.default.readFile(srcPath, "utf-8");
495
473
  await import_promises.default.writeFile(destPath, content, "utf-8");
496
474
  }
@@ -515,13 +493,18 @@ async function installGlobalConfig() {
515
493
  }
516
494
  try {
517
495
  await import_promises.default.mkdir(activeProvider.configDir, { recursive: true });
518
- const globalConfigPath = import_path3.default.join(activeProvider.configDir, activeProvider.contextFile);
519
- 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
+ );
520
503
  let templateContent = "";
521
504
  try {
522
505
  templateContent = await import_promises.default.readFile(templatePath, "utf-8");
523
- } catch (error) {
524
- 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");
525
508
  templateContent = await import_promises.default.readFile(fallbackTemplatePath, "utf-8");
526
509
  if (providerName === "gemini") {
527
510
  templateContent = templateContent.replace(/Claude/g, "Gemini");
@@ -551,7 +534,9 @@ async function installGlobalConfig() {
551
534
  const endMarker = "<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";
552
535
  const hasMarkers = existingContent.includes(startMarker) && existingContent.includes(endMarker);
553
536
  if (!hasMarkers) {
554
- const updatedContent = existingContent + "\n\n" + templateContent;
537
+ const updatedContent = `${existingContent}
538
+
539
+ ${templateContent}`;
555
540
  await import_promises.default.writeFile(globalConfigPath, updatedContent, "utf-8");
556
541
  return {
557
542
  success: true,
@@ -594,16 +579,16 @@ var CommandInstaller = class {
594
579
  claudeConfigPath;
595
580
  templatesDir;
596
581
  constructor() {
597
- this.homeDir = import_os2.default.homedir();
582
+ this.homeDir = import_node_os2.default.homedir();
598
583
  const aiProvider = (init_ai_provider(), __toCommonJS(ai_provider_exports));
599
584
  const activeProvider = aiProvider.getActiveProvider();
600
585
  if (activeProvider.name === "gemini") {
601
- this.claudeCommandsPath = import_path3.default.join(activeProvider.configDir, "commands");
586
+ this.claudeCommandsPath = import_node_path3.default.join(activeProvider.configDir, "commands");
602
587
  } else {
603
- this.claudeCommandsPath = import_path3.default.join(activeProvider.configDir, "commands", "p");
588
+ this.claudeCommandsPath = import_node_path3.default.join(activeProvider.configDir, "commands", "p");
604
589
  }
605
590
  this.claudeConfigPath = activeProvider.configDir;
606
- this.templatesDir = import_path3.default.join(getPackageRoot(), "templates", "commands");
591
+ this.templatesDir = import_node_path3.default.join(getPackageRoot(), "templates", "commands");
607
592
  }
608
593
  /**
609
594
  * Detect if active provider is installed
@@ -632,7 +617,7 @@ var CommandInstaller = class {
632
617
  try {
633
618
  const files = await import_promises.default.readdir(this.templatesDir);
634
619
  return files.filter((f) => f.endsWith(".md"));
635
- } catch (error) {
620
+ } catch (_error) {
636
621
  return [
637
622
  "init.md",
638
623
  "now.md",
@@ -677,8 +662,8 @@ var CommandInstaller = class {
677
662
  const errors = [];
678
663
  for (const file of commandFiles) {
679
664
  try {
680
- const sourcePath = import_path3.default.join(this.templatesDir, file);
681
- 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);
682
667
  const content = await import_promises.default.readFile(sourcePath, "utf-8");
683
668
  await import_promises.default.writeFile(destPath, content, "utf-8");
684
669
  installed.push(file.replace(".md", ""));
@@ -709,7 +694,7 @@ var CommandInstaller = class {
709
694
  const errors = [];
710
695
  for (const file of commandFiles) {
711
696
  try {
712
- const filePath = import_path3.default.join(this.claudeCommandsPath, file);
697
+ const filePath = import_node_path3.default.join(this.claudeCommandsPath, file);
713
698
  await import_promises.default.unlink(filePath);
714
699
  uninstalled.push(file.replace(".md", ""));
715
700
  } catch (error) {
@@ -720,7 +705,7 @@ var CommandInstaller = class {
720
705
  }
721
706
  try {
722
707
  await import_promises.default.rmdir(this.claudeCommandsPath);
723
- } catch (error) {
708
+ } catch (_error) {
724
709
  }
725
710
  return {
726
711
  success: true,
@@ -794,7 +779,7 @@ var CommandInstaller = class {
794
779
  */
795
780
  async verifyTemplate(commandName) {
796
781
  try {
797
- const templatePath = import_path3.default.join(this.templatesDir, `${commandName}.md`);
782
+ const templatePath = import_node_path3.default.join(this.templatesDir, `${commandName}.md`);
798
783
  await import_promises.default.access(templatePath);
799
784
  return true;
800
785
  } catch (error) {
@@ -813,9 +798,9 @@ var CommandInstaller = class {
813
798
  const activeProvider = aiProvider.getActiveProvider();
814
799
  const routerFile = activeProvider.name === "gemini" ? "p.toml" : "p.md";
815
800
  try {
816
- const routerSource = import_path3.default.join(this.templatesDir, routerFile);
817
- const routerDest = import_path3.default.join(activeProvider.configDir, "commands", routerFile);
818
- 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 });
819
804
  const content = await import_promises.default.readFile(routerSource, "utf-8");
820
805
  await import_promises.default.writeFile(routerDest, content, "utf-8");
821
806
  return true;
@@ -864,8 +849,8 @@ var CommandInstaller = class {
864
849
  };
865
850
  for (const file of templateFiles) {
866
851
  try {
867
- const sourcePath = import_path3.default.join(this.templatesDir, file);
868
- 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);
869
854
  const exists = installedFiles.includes(file);
870
855
  const content = await import_promises.default.readFile(sourcePath, "utf-8");
871
856
  await import_promises.default.writeFile(destPath, content, "utf-8");
@@ -903,17 +888,17 @@ var CommandInstaller = class {
903
888
  }
904
889
  };
905
890
  function getProviderPaths() {
906
- const homeDir = import_os2.default.homedir();
891
+ const homeDir = import_node_os2.default.homedir();
907
892
  return {
908
893
  claude: {
909
- commands: import_path3.default.join(homeDir, ".claude", "commands", "p"),
910
- config: import_path3.default.join(homeDir, ".claude"),
911
- 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")
912
897
  },
913
898
  gemini: {
914
- commands: import_path3.default.join(homeDir, ".gemini", "commands"),
915
- config: import_path3.default.join(homeDir, ".gemini"),
916
- 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")
917
902
  }
918
903
  };
919
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