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.
- package/CHANGELOG.md +75 -0
- package/bin/prjct.ts +117 -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 +58 -39
- 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 +28 -4
- package/core/commands/commands.ts +57 -24
- 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 +13 -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 +18 -19
- package/core/context-tools/imports-tool.ts +13 -33
- package/core/context-tools/index.ts +29 -54
- package/core/context-tools/recent-tool.ts +16 -22
- package/core/context-tools/signatures-tool.ts +17 -26
- package/core/context-tools/summary-tool.ts +20 -22
- package/core/context-tools/token-counter.ts +25 -20
- package/core/context-tools/types.ts +5 -5
- 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 -16
- 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 +25 -25
- 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 +87 -345
- 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 -17
- package/core/storage/metrics-storage.ts +39 -34
- 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 -305
- package/core/types/integrations.ts +3 -3
- package/core/types/storage.ts +14 -14
- 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 +18755 -15574
- package/dist/core/infrastructure/command-installer.js +86 -79
- package/dist/core/infrastructure/editors-config.js +6 -6
- package/dist/core/infrastructure/setup.js +246 -225
- 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,7 +115,7 @@ 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
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 =
|
|
136
|
-
const rulesDir =
|
|
137
|
-
const routerPath =
|
|
138
|
-
const detected =
|
|
139
|
-
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);
|
|
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 =
|
|
152
|
-
const rulesDir =
|
|
153
|
-
const routerPath =
|
|
154
|
-
const detected =
|
|
155
|
-
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);
|
|
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 =
|
|
172
|
-
const skillPath =
|
|
173
|
-
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);
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
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:
|
|
248
|
+
configDir: import_node_path2.default.join(import_node_os.default.homedir(), ".claude"),
|
|
249
249
|
contextFile: "CLAUDE.md",
|
|
250
|
-
skillsDir:
|
|
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:
|
|
263
|
+
configDir: import_node_path2.default.join(import_node_os.default.homedir(), ".gemini"),
|
|
264
264
|
contextFile: "GEMINI.md",
|
|
265
|
-
skillsDir:
|
|
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:
|
|
279
|
+
configDir: import_node_path2.default.join(import_node_os.default.homedir(), ".gemini", "antigravity"),
|
|
280
280
|
contextFile: "ANTIGRAVITY.md",
|
|
281
|
-
skillsDir:
|
|
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
|
|
405
|
-
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");
|
|
406
412
|
|
|
407
413
|
// core/utils/version.ts
|
|
408
|
-
var
|
|
409
|
-
var
|
|
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 =
|
|
420
|
-
if (
|
|
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(
|
|
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 =
|
|
436
|
+
currentDir = import_node_path.default.dirname(currentDir);
|
|
431
437
|
}
|
|
432
|
-
cachedPackageRoot =
|
|
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 =
|
|
442
|
-
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"));
|
|
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 =
|
|
465
|
-
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");
|
|
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 =
|
|
471
|
-
const destPath =
|
|
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 =
|
|
497
|
-
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
|
+
);
|
|
498
503
|
let templateContent = "";
|
|
499
504
|
try {
|
|
500
505
|
templateContent = await import_promises.default.readFile(templatePath, "utf-8");
|
|
501
|
-
} catch (
|
|
502
|
-
const fallbackTemplatePath =
|
|
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
|
|
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 =
|
|
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 =
|
|
586
|
+
this.claudeCommandsPath = import_node_path3.default.join(activeProvider.configDir, "commands");
|
|
580
587
|
} else {
|
|
581
|
-
this.claudeCommandsPath =
|
|
588
|
+
this.claudeCommandsPath = import_node_path3.default.join(activeProvider.configDir, "commands", "p");
|
|
582
589
|
}
|
|
583
590
|
this.claudeConfigPath = activeProvider.configDir;
|
|
584
|
-
this.templatesDir =
|
|
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 (
|
|
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 =
|
|
659
|
-
const destPath =
|
|
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 =
|
|
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 (
|
|
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 =
|
|
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 =
|
|
795
|
-
const routerDest =
|
|
796
|
-
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 });
|
|
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 =
|
|
846
|
-
const destPath =
|
|
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 =
|
|
891
|
+
const homeDir = import_node_os2.default.homedir();
|
|
885
892
|
return {
|
|
886
893
|
claude: {
|
|
887
|
-
commands:
|
|
888
|
-
config:
|
|
889
|
-
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")
|
|
890
897
|
},
|
|
891
898
|
gemini: {
|
|
892
|
-
commands:
|
|
893
|
-
config:
|
|
894
|
-
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")
|
|
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
|
|
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
|