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.
- package/CHANGELOG.md +114 -0
- package/bin/prjct.ts +131 -10
- package/core/__tests__/agentic/memory-system.test.ts +39 -26
- package/core/__tests__/agentic/plan-mode.test.ts +64 -46
- package/core/__tests__/agentic/prompt-builder.test.ts +14 -14
- package/core/__tests__/services/project-index.test.ts +353 -0
- package/core/__tests__/types/fs.test.ts +3 -3
- package/core/__tests__/utils/date-helper.test.ts +10 -10
- package/core/__tests__/utils/output.test.ts +9 -6
- package/core/__tests__/utils/project-commands.test.ts +5 -6
- package/core/agentic/agent-router.ts +9 -10
- package/core/agentic/chain-of-thought.ts +16 -4
- package/core/agentic/command-executor.ts +66 -40
- package/core/agentic/context-builder.ts +8 -5
- package/core/agentic/ground-truth.ts +15 -9
- package/core/agentic/index.ts +145 -152
- package/core/agentic/loop-detector.ts +40 -11
- package/core/agentic/memory-system.ts +98 -35
- package/core/agentic/orchestrator-executor.ts +135 -71
- package/core/agentic/plan-mode.ts +46 -16
- package/core/agentic/prompt-builder.ts +108 -42
- package/core/agentic/services.ts +10 -9
- package/core/agentic/skill-loader.ts +9 -15
- package/core/agentic/smart-context.ts +129 -79
- package/core/agentic/template-executor.ts +13 -12
- package/core/agentic/template-loader.ts +7 -4
- package/core/agentic/tool-registry.ts +16 -13
- package/core/agents/index.ts +1 -1
- package/core/agents/performance.ts +10 -27
- package/core/ai-tools/formatters.ts +8 -6
- package/core/ai-tools/generator.ts +4 -4
- package/core/ai-tools/index.ts +1 -1
- package/core/ai-tools/registry.ts +21 -11
- package/core/bus/bus.ts +23 -16
- package/core/bus/index.ts +2 -2
- package/core/cli/linear.ts +3 -5
- package/core/cli/start.ts +28 -25
- package/core/commands/analysis.ts +287 -29
- package/core/commands/analytics.ts +52 -44
- package/core/commands/base.ts +15 -13
- package/core/commands/cleanup.ts +6 -13
- package/core/commands/command-data.ts +49 -8
- package/core/commands/commands.ts +60 -23
- package/core/commands/context.ts +4 -4
- package/core/commands/design.ts +3 -10
- package/core/commands/index.ts +5 -8
- package/core/commands/maintenance.ts +7 -4
- package/core/commands/planning.ts +179 -56
- package/core/commands/register.ts +14 -9
- package/core/commands/registry.ts +15 -14
- package/core/commands/setup.ts +26 -14
- package/core/commands/shipping.ts +11 -16
- package/core/commands/snapshots.ts +16 -32
- package/core/commands/uninstall.ts +541 -0
- package/core/commands/workflow.ts +24 -28
- package/core/constants/index.ts +10 -22
- package/core/context/generator.ts +82 -33
- package/core/context-tools/files-tool.ts +583 -0
- package/core/context-tools/imports-tool.ts +403 -0
- package/core/context-tools/index.ts +433 -0
- package/core/context-tools/recent-tool.ts +307 -0
- package/core/context-tools/signatures-tool.ts +501 -0
- package/core/context-tools/summary-tool.ts +307 -0
- package/core/context-tools/token-counter.ts +284 -0
- package/core/context-tools/types.ts +253 -0
- package/core/domain/agent-generator.ts +7 -5
- package/core/domain/agent-loader.ts +2 -2
- package/core/domain/analyzer.ts +19 -16
- package/core/domain/architecture-generator.ts +6 -3
- package/core/domain/context-estimator.ts +3 -4
- package/core/domain/snapshot-manager.ts +25 -22
- package/core/domain/task-stack.ts +24 -14
- package/core/errors.ts +1 -1
- package/core/events/events.ts +2 -4
- package/core/events/index.ts +1 -2
- package/core/index.ts +28 -12
- package/core/infrastructure/agent-detector.ts +3 -3
- package/core/infrastructure/ai-provider.ts +23 -20
- package/core/infrastructure/author-detector.ts +16 -10
- package/core/infrastructure/capability-installer.ts +2 -2
- package/core/infrastructure/claude-agent.ts +6 -6
- package/core/infrastructure/command-installer.ts +22 -17
- package/core/infrastructure/config-manager.ts +18 -14
- package/core/infrastructure/editors-config.ts +8 -4
- package/core/infrastructure/path-manager.ts +8 -6
- package/core/infrastructure/permission-manager.ts +20 -17
- package/core/infrastructure/setup.ts +42 -38
- package/core/infrastructure/update-checker.ts +5 -5
- package/core/integrations/issue-tracker/enricher.ts +8 -19
- package/core/integrations/issue-tracker/index.ts +2 -2
- package/core/integrations/issue-tracker/manager.ts +15 -15
- package/core/integrations/issue-tracker/types.ts +5 -22
- package/core/integrations/jira/client.ts +67 -59
- package/core/integrations/jira/index.ts +11 -14
- package/core/integrations/jira/mcp-adapter.ts +5 -10
- package/core/integrations/jira/service.ts +10 -10
- package/core/integrations/linear/client.ts +27 -18
- package/core/integrations/linear/index.ts +9 -12
- package/core/integrations/linear/service.ts +11 -11
- package/core/integrations/linear/sync.ts +8 -8
- package/core/outcomes/analyzer.ts +5 -18
- package/core/outcomes/index.ts +2 -2
- package/core/outcomes/recorder.ts +3 -3
- package/core/plugin/builtin/webhook.ts +19 -15
- package/core/plugin/hooks.ts +29 -21
- package/core/plugin/index.ts +7 -7
- package/core/plugin/loader.ts +19 -19
- package/core/plugin/registry.ts +12 -23
- package/core/schemas/agents.ts +1 -1
- package/core/schemas/analysis.ts +1 -1
- package/core/schemas/enriched-task.ts +62 -49
- package/core/schemas/ideas.ts +13 -13
- package/core/schemas/index.ts +17 -27
- package/core/schemas/issues.ts +40 -25
- package/core/schemas/metrics.ts +143 -0
- package/core/schemas/outcomes.ts +70 -62
- package/core/schemas/permissions.ts +15 -12
- package/core/schemas/prd.ts +27 -14
- package/core/schemas/project.ts +3 -3
- package/core/schemas/roadmap.ts +47 -34
- package/core/schemas/schemas.ts +3 -4
- package/core/schemas/shipped.ts +3 -3
- package/core/schemas/state.ts +43 -29
- package/core/server/index.ts +5 -6
- package/core/server/routes-extended.ts +68 -72
- package/core/server/routes.ts +3 -3
- package/core/server/server.ts +31 -26
- package/core/services/agent-generator.ts +237 -0
- package/core/services/agent-service.ts +2 -2
- package/core/services/breakdown-service.ts +2 -4
- package/core/services/context-generator.ts +299 -0
- package/core/services/context-selector.ts +420 -0
- package/core/services/doctor-service.ts +426 -0
- package/core/services/file-categorizer.ts +448 -0
- package/core/services/file-scorer.ts +270 -0
- package/core/services/git-analyzer.ts +267 -0
- package/core/services/index.ts +27 -10
- package/core/services/memory-service.ts +3 -4
- package/core/services/project-index.ts +911 -0
- package/core/services/project-service.ts +4 -4
- package/core/services/skill-installer.ts +14 -17
- package/core/services/skill-lock.ts +3 -3
- package/core/services/skill-service.ts +12 -6
- package/core/services/stack-detector.ts +245 -0
- package/core/services/sync-service.ts +170 -329
- package/core/services/watch-service.ts +294 -0
- package/core/session/compaction.ts +23 -31
- package/core/session/index.ts +11 -5
- package/core/session/log-migration.ts +3 -3
- package/core/session/metrics.ts +19 -14
- package/core/session/session-log-manager.ts +12 -17
- package/core/session/task-session-manager.ts +25 -25
- package/core/session/utils.ts +1 -1
- package/core/storage/ideas-storage.ts +41 -57
- package/core/storage/index-storage.ts +514 -0
- package/core/storage/index.ts +41 -13
- package/core/storage/metrics-storage.ts +320 -0
- package/core/storage/queue-storage.ts +35 -45
- package/core/storage/shipped-storage.ts +17 -20
- package/core/storage/state-storage.ts +50 -30
- package/core/storage/storage-manager.ts +6 -6
- package/core/storage/storage.ts +18 -15
- package/core/sync/auth-config.ts +3 -3
- package/core/sync/index.ts +13 -19
- package/core/sync/oauth-handler.ts +3 -3
- package/core/sync/sync-client.ts +4 -9
- package/core/sync/sync-manager.ts +12 -14
- package/core/types/commands.ts +42 -7
- package/core/types/index.ts +284 -302
- package/core/types/integrations.ts +3 -3
- package/core/types/storage.ts +49 -0
- package/core/types/utils.ts +3 -3
- package/core/utils/agent-stream.ts +3 -1
- package/core/utils/animations.ts +14 -11
- package/core/utils/branding.ts +7 -7
- package/core/utils/cache.ts +1 -3
- package/core/utils/collection-filters.ts +3 -15
- package/core/utils/date-helper.ts +2 -7
- package/core/utils/file-helper.ts +13 -8
- package/core/utils/jsonl-helper.ts +13 -10
- package/core/utils/keychain.ts +4 -8
- package/core/utils/logger.ts +1 -1
- package/core/utils/next-steps.ts +3 -3
- package/core/utils/output.ts +58 -11
- package/core/utils/project-commands.ts +6 -6
- package/core/utils/project-credentials.ts +5 -12
- package/core/utils/runtime.ts +2 -2
- package/core/utils/session-helper.ts +3 -4
- package/core/utils/version.ts +3 -3
- package/core/wizard/index.ts +13 -0
- package/core/wizard/onboarding.ts +633 -0
- package/core/workflow/state-machine.ts +7 -7
- package/dist/bin/prjct.mjs +18907 -13189
- package/dist/core/infrastructure/command-installer.js +96 -111
- package/dist/core/infrastructure/editors-config.js +6 -6
- package/dist/core/infrastructure/setup.js +256 -257
- package/dist/core/utils/version.js +9 -9
- package/package.json +11 -12
- package/scripts/build.js +3 -3
- package/scripts/postinstall.js +2 -2
- package/templates/mcp-config.json +6 -1
- package/templates/permissions/permissive.jsonc +1 -1
- package/templates/permissions/strict.jsonc +5 -9
- package/templates/global/docs/agents.md +0 -88
- package/templates/global/docs/architecture.md +0 -103
- package/templates/global/docs/commands.md +0 -96
- 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,
|
|
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,
|
|
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
|
|
118
|
+
return import_node_fs2.default.existsSync(config.configDir);
|
|
119
119
|
}
|
|
120
120
|
function getProviderBranding(provider) {
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
|
152
|
-
|
|
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 =
|
|
158
|
-
const rulesDir =
|
|
159
|
-
const routerPath =
|
|
160
|
-
const detected =
|
|
161
|
-
const routerInstalled =
|
|
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 =
|
|
174
|
-
const rulesDir =
|
|
175
|
-
const routerPath =
|
|
176
|
-
const detected =
|
|
177
|
-
const routerInstalled =
|
|
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 =
|
|
194
|
-
const skillPath =
|
|
195
|
-
const skillInstalled =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
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:
|
|
248
|
+
configDir: import_node_path2.default.join(import_node_os.default.homedir(), ".claude"),
|
|
271
249
|
contextFile: "CLAUDE.md",
|
|
272
|
-
skillsDir:
|
|
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:
|
|
263
|
+
configDir: import_node_path2.default.join(import_node_os.default.homedir(), ".gemini"),
|
|
286
264
|
contextFile: "GEMINI.md",
|
|
287
|
-
skillsDir:
|
|
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:
|
|
279
|
+
configDir: import_node_path2.default.join(import_node_os.default.homedir(), ".gemini", "antigravity"),
|
|
302
280
|
contextFile: "ANTIGRAVITY.md",
|
|
303
|
-
skillsDir:
|
|
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
|
|
427
|
-
var
|
|
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
|
|
431
|
-
var
|
|
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 =
|
|
442
|
-
if (
|
|
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(
|
|
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 =
|
|
436
|
+
currentDir = import_node_path.default.dirname(currentDir);
|
|
453
437
|
}
|
|
454
|
-
cachedPackageRoot =
|
|
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 =
|
|
464
|
-
const packageJson = JSON.parse(
|
|
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 =
|
|
487
|
-
const templateDocsDir =
|
|
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 =
|
|
493
|
-
const destPath =
|
|
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 =
|
|
519
|
-
const templatePath =
|
|
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 (
|
|
524
|
-
const fallbackTemplatePath =
|
|
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
|
|
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 =
|
|
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 =
|
|
586
|
+
this.claudeCommandsPath = import_node_path3.default.join(activeProvider.configDir, "commands");
|
|
602
587
|
} else {
|
|
603
|
-
this.claudeCommandsPath =
|
|
588
|
+
this.claudeCommandsPath = import_node_path3.default.join(activeProvider.configDir, "commands", "p");
|
|
604
589
|
}
|
|
605
590
|
this.claudeConfigPath = activeProvider.configDir;
|
|
606
|
-
this.templatesDir =
|
|
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 (
|
|
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 =
|
|
681
|
-
const destPath =
|
|
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 =
|
|
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 (
|
|
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 =
|
|
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 =
|
|
817
|
-
const routerDest =
|
|
818
|
-
await import_promises.default.mkdir(
|
|
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 =
|
|
868
|
-
const destPath =
|
|
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 =
|
|
891
|
+
const homeDir = import_node_os2.default.homedir();
|
|
907
892
|
return {
|
|
908
893
|
claude: {
|
|
909
|
-
commands:
|
|
910
|
-
config:
|
|
911
|
-
router:
|
|
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:
|
|
915
|
-
config:
|
|
916
|
-
router:
|
|
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
|
|
39
|
-
var
|
|
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 =
|
|
49
|
-
this.configDir =
|
|
50
|
-
this.configFile =
|
|
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
|