@pupt/cli 0.0.1 → 2.3.0
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/LICENSE +21 -0
- package/README.md +54 -29
- package/dist/annotations/annotation-analyzer.d.ts +17 -0
- package/dist/annotations/annotation-analyzer.d.ts.map +1 -0
- package/dist/annotations/annotation-analyzer.js +145 -0
- package/dist/annotations/annotation-analyzer.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +435 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +5 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +164 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/annotate.d.ts +2 -0
- package/dist/commands/annotate.d.ts.map +1 -0
- package/dist/commands/annotate.js +99 -0
- package/dist/commands/annotate.js.map +1 -0
- package/dist/commands/base-command.d.ts +23 -0
- package/dist/commands/base-command.d.ts.map +1 -0
- package/dist/commands/base-command.js +41 -0
- package/dist/commands/base-command.js.map +1 -0
- package/dist/commands/cache.d.ts +9 -0
- package/dist/commands/cache.d.ts.map +1 -0
- package/dist/commands/cache.js +31 -0
- package/dist/commands/cache.js.map +1 -0
- package/dist/commands/config.d.ts +8 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +93 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/edit.d.ts +2 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +35 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/help.d.ts +2 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +26 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/history.d.ts +12 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +317 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +137 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +16 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +263 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/review.d.ts +3 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +160 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/run.d.ts +32 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +367 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/uninstall.d.ts +2 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +45 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +113 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/config/config-manager.d.ts +19 -0
- package/dist/config/config-manager.d.ts.map +1 -0
- package/dist/config/config-manager.js +221 -0
- package/dist/config/config-manager.js.map +1 -0
- package/dist/config/global-paths.d.ts +5 -0
- package/dist/config/global-paths.d.ts.map +1 -0
- package/dist/config/global-paths.js +16 -0
- package/dist/config/global-paths.js.map +1 -0
- package/dist/config/migration.d.ts +12 -0
- package/dist/config/migration.d.ts.map +1 -0
- package/dist/config/migration.js +270 -0
- package/dist/config/migration.js.map +1 -0
- package/dist/history/enhanced-history-manager.d.ts +27 -0
- package/dist/history/enhanced-history-manager.d.ts.map +1 -0
- package/dist/history/enhanced-history-manager.js +116 -0
- package/dist/history/enhanced-history-manager.js.map +1 -0
- package/dist/history/history-manager.d.ts +43 -0
- package/dist/history/history-manager.d.ts.map +1 -0
- package/dist/history/history-manager.js +229 -0
- package/dist/history/history-manager.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/input-types/file-search-prompt.d.ts +11 -0
- package/dist/prompts/input-types/file-search-prompt.d.ts.map +1 -0
- package/dist/prompts/input-types/file-search-prompt.js +53 -0
- package/dist/prompts/input-types/file-search-prompt.js.map +1 -0
- package/dist/prompts/input-types/review-file-prompt.d.ts +3 -0
- package/dist/prompts/input-types/review-file-prompt.d.ts.map +1 -0
- package/dist/prompts/input-types/review-file-prompt.js +9 -0
- package/dist/prompts/input-types/review-file-prompt.js.map +1 -0
- package/dist/schemas/config-schema.d.ts +1637 -0
- package/dist/schemas/config-schema.d.ts.map +1 -0
- package/dist/schemas/config-schema.js +136 -0
- package/dist/schemas/config-schema.js.map +1 -0
- package/dist/search/search-engine.d.ts +8 -0
- package/dist/search/search-engine.d.ts.map +1 -0
- package/dist/search/search-engine.js +53 -0
- package/dist/search/search-engine.js.map +1 -0
- package/dist/services/git-service.d.ts +28 -0
- package/dist/services/git-service.d.ts.map +1 -0
- package/dist/services/git-service.js +157 -0
- package/dist/services/git-service.js.map +1 -0
- package/dist/services/input-collector.d.ts +9 -0
- package/dist/services/input-collector.d.ts.map +1 -0
- package/dist/services/input-collector.js +162 -0
- package/dist/services/input-collector.js.map +1 -0
- package/dist/services/logging-service.d.ts +49 -0
- package/dist/services/logging-service.d.ts.map +1 -0
- package/dist/services/logging-service.js +203 -0
- package/dist/services/logging-service.js.map +1 -0
- package/dist/services/module-cache.d.ts +42 -0
- package/dist/services/module-cache.d.ts.map +1 -0
- package/dist/services/module-cache.js +205 -0
- package/dist/services/module-cache.js.map +1 -0
- package/dist/services/module-entry-builder.d.ts +20 -0
- package/dist/services/module-entry-builder.d.ts.map +1 -0
- package/dist/services/module-entry-builder.js +71 -0
- package/dist/services/module-entry-builder.js.map +1 -0
- package/dist/services/output-capture-service.d.ts +28 -0
- package/dist/services/output-capture-service.d.ts.map +1 -0
- package/dist/services/output-capture-service.js +348 -0
- package/dist/services/output-capture-service.js.map +1 -0
- package/dist/services/package-manager.d.ts +18 -0
- package/dist/services/package-manager.d.ts.map +1 -0
- package/dist/services/package-manager.js +141 -0
- package/dist/services/package-manager.js.map +1 -0
- package/dist/services/pattern-detector.d.ts +15 -0
- package/dist/services/pattern-detector.d.ts.map +1 -0
- package/dist/services/pattern-detector.js +228 -0
- package/dist/services/pattern-detector.js.map +1 -0
- package/dist/services/prompt-resolver.d.ts +32 -0
- package/dist/services/prompt-resolver.d.ts.map +1 -0
- package/dist/services/prompt-resolver.js +73 -0
- package/dist/services/prompt-resolver.js.map +1 -0
- package/dist/services/pupt-prompt-source.d.ts +16 -0
- package/dist/services/pupt-prompt-source.d.ts.map +1 -0
- package/dist/services/pupt-prompt-source.js +74 -0
- package/dist/services/pupt-prompt-source.js.map +1 -0
- package/dist/services/pupt-service.d.ts +33 -0
- package/dist/services/pupt-service.d.ts.map +1 -0
- package/dist/services/pupt-service.js +119 -0
- package/dist/services/pupt-service.js.map +1 -0
- package/dist/services/review-data-builder.d.ts +25 -0
- package/dist/services/review-data-builder.d.ts.map +1 -0
- package/dist/services/review-data-builder.js +333 -0
- package/dist/services/review-data-builder.js.map +1 -0
- package/dist/services/suggestion-generator.d.ts +11 -0
- package/dist/services/suggestion-generator.d.ts.map +1 -0
- package/dist/services/suggestion-generator.js +158 -0
- package/dist/services/suggestion-generator.js.map +1 -0
- package/dist/services/ui-service.d.ts +49 -0
- package/dist/services/ui-service.d.ts.map +1 -0
- package/dist/services/ui-service.js +196 -0
- package/dist/services/ui-service.js.map +1 -0
- package/dist/types/annotations.d.ts +50 -0
- package/dist/types/annotations.d.ts.map +1 -0
- package/dist/types/annotations.js +2 -0
- package/dist/types/annotations.js.map +1 -0
- package/dist/types/config.d.ts +110 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +12 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/history.d.ts +36 -0
- package/dist/types/history.d.ts.map +1 -0
- package/dist/types/history.js +2 -0
- package/dist/types/history.js.map +1 -0
- package/dist/types/patterns.d.ts +25 -0
- package/dist/types/patterns.d.ts.map +1 -0
- package/dist/types/patterns.js +2 -0
- package/dist/types/patterns.js.map +1 -0
- package/dist/types/prompt.d.ts +29 -0
- package/dist/types/prompt.d.ts.map +1 -0
- package/dist/types/prompt.js +24 -0
- package/dist/types/prompt.js.map +1 -0
- package/dist/types/review.d.ts +81 -0
- package/dist/types/review.d.ts.map +1 -0
- package/dist/types/review.js +2 -0
- package/dist/types/review.js.map +1 -0
- package/dist/ui/console-ui.d.ts +30 -0
- package/dist/ui/console-ui.d.ts.map +1 -0
- package/dist/ui/console-ui.js +88 -0
- package/dist/ui/console-ui.js.map +1 -0
- package/dist/ui/interactive-search.d.ts +8 -0
- package/dist/ui/interactive-search.d.ts.map +1 -0
- package/dist/ui/interactive-search.js +29 -0
- package/dist/ui/interactive-search.js.map +1 -0
- package/dist/utils/annotation-migration.d.ts +12 -0
- package/dist/utils/annotation-migration.d.ts.map +1 -0
- package/dist/utils/annotation-migration.js +88 -0
- package/dist/utils/annotation-migration.js.map +1 -0
- package/dist/utils/date-formatter.d.ts +10 -0
- package/dist/utils/date-formatter.d.ts.map +1 -0
- package/dist/utils/date-formatter.js +46 -0
- package/dist/utils/date-formatter.js.map +1 -0
- package/dist/utils/editor.d.ts +14 -0
- package/dist/utils/editor.d.ts.map +1 -0
- package/dist/utils/editor.js +52 -0
- package/dist/utils/editor.js.map +1 -0
- package/dist/utils/errors.d.ts +58 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +275 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/git-info.d.ts +10 -0
- package/dist/utils/git-info.d.ts.map +1 -0
- package/dist/utils/git-info.js +44 -0
- package/dist/utils/git-info.js.map +1 -0
- package/dist/utils/gitignore.d.ts +10 -0
- package/dist/utils/gitignore.d.ts.map +1 -0
- package/dist/utils/gitignore.js +72 -0
- package/dist/utils/gitignore.js.map +1 -0
- package/dist/utils/logger.d.ts +39 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +143 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/platform.d.ts +9 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +45 -0
- package/dist/utils/platform.js.map +1 -0
- package/dist/utils/project-root.d.ts +22 -0
- package/dist/utils/project-root.d.ts.map +1 -0
- package/dist/utils/project-root.js +226 -0
- package/dist/utils/project-root.js.map +1 -0
- package/dist/utils/prompt-dir-resolver.d.ts +5 -0
- package/dist/utils/prompt-dir-resolver.d.ts.map +1 -0
- package/dist/utils/prompt-dir-resolver.js +25 -0
- package/dist/utils/prompt-dir-resolver.js.map +1 -0
- package/dist/utils/security.d.ts +5 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +57 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/utils/tool-detection.d.ts +14 -0
- package/dist/utils/tool-detection.d.ts.map +1 -0
- package/dist/utils/tool-detection.js +43 -0
- package/dist/utils/tool-detection.js.map +1 -0
- package/package.json +79 -7
- package/prompts/prompts/ad-hoc-long.prompt +60 -0
- package/prompts/prompts/ad-hoc.prompt +29 -0
- package/prompts/prompts/code-review.prompt +99 -0
- package/prompts/prompts/debugging-error-message.prompt +81 -0
- package/prompts/prompts/fix-github-actions.prompt +62 -0
- package/prompts/prompts/fix-test-errors.prompt +73 -0
- package/prompts/prompts/git-commit-comment.prompt +61 -0
- package/prompts/prompts/implementation-phase.prompt +53 -0
- package/prompts/prompts/implementation-plan.prompt +101 -0
- package/prompts/prompts/new-feature.prompt +89 -0
- package/prompts/prompts/new-project.prompt +9 -0
- package/prompts/prompts/one-shot-change.prompt +79 -0
- package/prompts/prompts/pupt-prompt-improvement.prompt +270 -0
- package/prompts/prompts/simple-test.prompt +8 -0
- package/prompts/prompts/update-design.prompt +71 -0
- package/prompts/prompts/update-documentation.prompt +6 -0
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import crypto from 'node:crypto';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { confirm } from '@inquirer/prompts';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { pathExists } from 'fs-extra';
|
|
7
|
+
import { ConfigManager } from '../config/config-manager.js';
|
|
8
|
+
import { HistoryManager } from '../history/history-manager.js';
|
|
9
|
+
import { buildModuleEntries } from '../services/module-entry-builder.js';
|
|
10
|
+
import { OutputCaptureService } from '../services/output-capture-service.js';
|
|
11
|
+
import { resolvePrompt } from '../services/prompt-resolver.js';
|
|
12
|
+
import { DateFormats } from '../utils/date-formatter.js';
|
|
13
|
+
import { editorLauncher } from '../utils/editor.js';
|
|
14
|
+
import { errors } from '../utils/errors.js';
|
|
15
|
+
import { logger } from '../utils/logger.js';
|
|
16
|
+
import { getToolByCommand, isInteractiveTUI } from '../utils/tool-detection.js';
|
|
17
|
+
export function parseRunArgs(args) {
|
|
18
|
+
const separatorIndex = args.indexOf('--');
|
|
19
|
+
if (separatorIndex === -1) {
|
|
20
|
+
// No separator, all args go to tool
|
|
21
|
+
return {
|
|
22
|
+
tool: args[0],
|
|
23
|
+
toolArgs: args.slice(1),
|
|
24
|
+
extraArgs: []
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
// Split at separator
|
|
28
|
+
const beforeSeparator = args.slice(0, separatorIndex);
|
|
29
|
+
const afterSeparator = args.slice(separatorIndex + 1);
|
|
30
|
+
return {
|
|
31
|
+
tool: beforeSeparator[0],
|
|
32
|
+
toolArgs: beforeSeparator.slice(1),
|
|
33
|
+
extraArgs: afterSeparator
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export async function runCommand(args, options) {
|
|
37
|
+
// Capture start timestamp for history
|
|
38
|
+
const startTimestamp = new Date();
|
|
39
|
+
// Generate filename components once for synchronized naming
|
|
40
|
+
const dateStr = DateFormats.YYYYMMDD(startTimestamp);
|
|
41
|
+
const hours = String(startTimestamp.getHours()).padStart(2, '0');
|
|
42
|
+
const minutes = String(startTimestamp.getMinutes()).padStart(2, '0');
|
|
43
|
+
const seconds = String(startTimestamp.getSeconds()).padStart(2, '0');
|
|
44
|
+
const timeStr = `${hours}${minutes}${seconds}`;
|
|
45
|
+
const randomSuffix = crypto.randomBytes(4).toString('hex');
|
|
46
|
+
// Load configuration
|
|
47
|
+
const configResult = await ConfigManager.loadWithPath();
|
|
48
|
+
const { config } = configResult;
|
|
49
|
+
// Parse arguments
|
|
50
|
+
const { tool, toolArgs, extraArgs } = parseRunArgs(args);
|
|
51
|
+
// Determine which tool to use
|
|
52
|
+
let finalTool;
|
|
53
|
+
let finalArgs;
|
|
54
|
+
if (tool) {
|
|
55
|
+
// Explicit tool specified
|
|
56
|
+
finalTool = tool;
|
|
57
|
+
if (toolArgs.length === 0) {
|
|
58
|
+
// No explicit args — use defaults from SUPPORTED_TOOLS if available
|
|
59
|
+
const toolConfig = getToolByCommand(tool);
|
|
60
|
+
finalArgs = [...(toolConfig?.defaultArgs || []), ...extraArgs];
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
finalArgs = [...toolArgs, ...extraArgs];
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else if (config.defaultCmd && config.defaultCmd.trim() !== '') {
|
|
67
|
+
// Use configured tool
|
|
68
|
+
finalTool = config.defaultCmd;
|
|
69
|
+
finalArgs = [...(config.defaultCmdArgs || []), ...extraArgs];
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
throw errors.toolNotFound('', ['claude', 'copilot', 'chat']);
|
|
73
|
+
}
|
|
74
|
+
let promptResult;
|
|
75
|
+
let templateInfo;
|
|
76
|
+
let exitCode = null;
|
|
77
|
+
// Check if using provided prompt (from autoRun)
|
|
78
|
+
if (options.prompt) {
|
|
79
|
+
promptResult = options.prompt;
|
|
80
|
+
// Use templateInfo if provided
|
|
81
|
+
if (options.templateInfo) {
|
|
82
|
+
({ templateInfo } = options);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else if (options.historyIndex) {
|
|
86
|
+
// Validate history is enabled
|
|
87
|
+
if (!config.historyDir) {
|
|
88
|
+
throw errors.featureNotEnabled('History tracking', [
|
|
89
|
+
'Track all your prompts',
|
|
90
|
+
'Re-run previous prompts',
|
|
91
|
+
'Add annotations'
|
|
92
|
+
]);
|
|
93
|
+
}
|
|
94
|
+
// Load prompt from history
|
|
95
|
+
const historyManager = new HistoryManager(config.historyDir);
|
|
96
|
+
const historyEntry = await historyManager.getHistoryEntry(options.historyIndex);
|
|
97
|
+
if (!historyEntry) {
|
|
98
|
+
const entries = await historyManager.listHistory();
|
|
99
|
+
throw errors.historyNotFound(options.historyIndex, entries.length);
|
|
100
|
+
}
|
|
101
|
+
logger.log(chalk.blue(`\nUsing prompt from history #${options.historyIndex}`));
|
|
102
|
+
logger.log(chalk.dim(`Original: ${historyEntry.title || 'Untitled'}`));
|
|
103
|
+
logger.log(chalk.dim(`From: ${new Date(historyEntry.timestamp).toLocaleString()}\n`));
|
|
104
|
+
promptResult = historyEntry.finalPrompt;
|
|
105
|
+
// Set up templateInfo for saving to history with rerun reference
|
|
106
|
+
templateInfo = {
|
|
107
|
+
templatePath: historyEntry.templatePath,
|
|
108
|
+
templateContent: historyEntry.templateContent,
|
|
109
|
+
variables: new Map(Object.entries(historyEntry.variables)),
|
|
110
|
+
finalPrompt: historyEntry.finalPrompt,
|
|
111
|
+
title: historyEntry.title,
|
|
112
|
+
timestamp: startTimestamp,
|
|
113
|
+
summary: historyEntry.summary,
|
|
114
|
+
// Store the original history filename for rerun reference
|
|
115
|
+
rerunFrom: historyEntry.filename
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// Normal flow - discover, select, collect inputs, render
|
|
120
|
+
const modules = await buildModuleEntries({
|
|
121
|
+
config,
|
|
122
|
+
cliPromptDirs: options.promptDirOverrides,
|
|
123
|
+
});
|
|
124
|
+
const resolved = await resolvePrompt({
|
|
125
|
+
modules,
|
|
126
|
+
promptName: options.promptName,
|
|
127
|
+
noInteractive: options.noInteractive,
|
|
128
|
+
startTimestamp,
|
|
129
|
+
environment: config.environment,
|
|
130
|
+
});
|
|
131
|
+
({ text: promptResult, templateInfo } = resolved);
|
|
132
|
+
}
|
|
133
|
+
// Handle coding tool options - always prompt when using default tool with options configured
|
|
134
|
+
if (!tool && config.defaultCmd && config.defaultCmd.trim() !== '' && config.defaultCmdOptions) {
|
|
135
|
+
// Prompt for each option
|
|
136
|
+
const selectedOptions = [];
|
|
137
|
+
if (options.noInteractive) {
|
|
138
|
+
// In no-interactive mode, don't add any optional flags
|
|
139
|
+
logger.log(chalk.dim('Skipping tool options in non-interactive mode'));
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
for (const [question, arg] of Object.entries(config.defaultCmdOptions || {})) {
|
|
143
|
+
const answer = await confirm({
|
|
144
|
+
message: question,
|
|
145
|
+
default: false
|
|
146
|
+
});
|
|
147
|
+
if (answer) {
|
|
148
|
+
selectedOptions.push(arg);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Insert options before extra args
|
|
153
|
+
finalArgs = [
|
|
154
|
+
...(config.defaultCmdArgs || []),
|
|
155
|
+
...selectedOptions,
|
|
156
|
+
...extraArgs
|
|
157
|
+
];
|
|
158
|
+
}
|
|
159
|
+
// Execute tool with prompt
|
|
160
|
+
logger.log(chalk.blue(`\nRunning: ${finalTool} ${finalArgs.join(' ')}`));
|
|
161
|
+
logger.log(chalk.dim('─'.repeat(60)));
|
|
162
|
+
const startTime = Date.now();
|
|
163
|
+
let outputFile;
|
|
164
|
+
let outputSize;
|
|
165
|
+
try {
|
|
166
|
+
// Check if output capture is enabled
|
|
167
|
+
if (config.outputCapture?.enabled && config.historyDir) {
|
|
168
|
+
const isTUI = isInteractiveTUI(finalTool);
|
|
169
|
+
const result = await executeToolWithCapture(finalTool, finalArgs, promptResult, config, {
|
|
170
|
+
dateStr,
|
|
171
|
+
timeStr,
|
|
172
|
+
randomSuffix
|
|
173
|
+
}, isTUI);
|
|
174
|
+
({ exitCode, outputFile, outputSize } = result);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
exitCode = await executeTool(finalTool, finalArgs, promptResult, isInteractiveTUI(finalTool));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
finally {
|
|
181
|
+
const executionTime = Date.now() - startTime;
|
|
182
|
+
// Save to history regardless of exit code
|
|
183
|
+
if (config.historyDir && templateInfo && promptResult.trim().length > 0) {
|
|
184
|
+
const historyManager = new HistoryManager(config.historyDir, config.annotationDir);
|
|
185
|
+
await historyManager.savePrompt({
|
|
186
|
+
...templateInfo,
|
|
187
|
+
outputFile,
|
|
188
|
+
outputSize,
|
|
189
|
+
executionTime,
|
|
190
|
+
exitCode,
|
|
191
|
+
filenameComponents: {
|
|
192
|
+
dateStr,
|
|
193
|
+
timeStr,
|
|
194
|
+
randomSuffix
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
// Handle post-run file reviews
|
|
199
|
+
if (templateInfo?.reviewFiles && templateInfo.reviewFiles.length > 0) {
|
|
200
|
+
await handlePostRunReviews(templateInfo.reviewFiles, config, options.isAutoRun || options.noInteractive);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Exit with the same code as the tool
|
|
204
|
+
if (exitCode !== null && exitCode !== 0) {
|
|
205
|
+
process.exit(exitCode);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
async function executeToolWithCapture(tool, args, prompt, config, filenameComponents, isTUI = false) {
|
|
209
|
+
const outputCapture = new OutputCaptureService({
|
|
210
|
+
outputDirectory: config.outputCapture?.directory ?? config.historyDir ?? '',
|
|
211
|
+
maxOutputSize: (config.outputCapture?.maxSizeMB || 10) * 1024 * 1024
|
|
212
|
+
});
|
|
213
|
+
// Use provided filename components for synchronized naming
|
|
214
|
+
const { dateStr, timeStr, randomSuffix } = filenameComponents;
|
|
215
|
+
const outputFilename = `${dateStr}-${timeStr}-${randomSuffix}-output.json`;
|
|
216
|
+
const outputPath = path.join(config.outputCapture?.directory ?? config.historyDir ?? '', outputFilename);
|
|
217
|
+
// For interactive TUI tools (Claude, Kiro), pass prompt as argument; for others, use stdin
|
|
218
|
+
let finalArgs = args;
|
|
219
|
+
let finalPrompt = prompt;
|
|
220
|
+
if (isTUI) {
|
|
221
|
+
finalArgs = [...args, prompt];
|
|
222
|
+
finalPrompt = ''; // Don't send via stdin
|
|
223
|
+
}
|
|
224
|
+
const result = await outputCapture.captureCommand(tool, finalArgs, finalPrompt, outputPath);
|
|
225
|
+
return {
|
|
226
|
+
exitCode: result.exitCode,
|
|
227
|
+
outputFile: outputPath,
|
|
228
|
+
outputSize: result.outputSize
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
async function executeTool(tool, args, prompt, isTUI = false) {
|
|
232
|
+
// For interactive TUI tools (Claude, Kiro), pass prompt as argument; for others, use stdin
|
|
233
|
+
let finalArgs = args;
|
|
234
|
+
let finalPrompt = prompt;
|
|
235
|
+
if (isTUI) {
|
|
236
|
+
finalArgs = [...args, prompt];
|
|
237
|
+
finalPrompt = ''; // Don't send via stdin
|
|
238
|
+
}
|
|
239
|
+
return new Promise((resolve, reject) => {
|
|
240
|
+
// When running interactive TUI tools, inherit stdin for TTY access
|
|
241
|
+
// For other tools, pipe stdin to send the prompt
|
|
242
|
+
const child = spawn(tool, finalArgs, {
|
|
243
|
+
stdio: [isTUI ? 'inherit' : 'pipe', 'inherit', tool === 'claude' ? 'pipe' : 'inherit']
|
|
244
|
+
});
|
|
245
|
+
let _stderrData = '';
|
|
246
|
+
let errorDetected = false;
|
|
247
|
+
// Capture stderr for Claude-specific error detection
|
|
248
|
+
if (tool === 'claude' && child.stderr) {
|
|
249
|
+
child.stderr.on('data', (data) => {
|
|
250
|
+
const output = data.toString();
|
|
251
|
+
_stderrData += output;
|
|
252
|
+
// Still write to stderr so user sees the output
|
|
253
|
+
process.stderr.write(data);
|
|
254
|
+
// Check for the raw mode error
|
|
255
|
+
if (output.includes('Raw mode is not supported') && output.includes('Ink')) {
|
|
256
|
+
errorDetected = true;
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
child.on('error', (error) => {
|
|
261
|
+
if (error.code === 'ENOENT') {
|
|
262
|
+
// Try to suggest similar tools
|
|
263
|
+
const commonTools = ['claude', 'kiro-cli', 'code', 'cat', 'less', 'vim'];
|
|
264
|
+
const suggestions = commonTools.filter(t => t.toLowerCase().includes(tool.toLowerCase()) ||
|
|
265
|
+
tool.toLowerCase().includes(t.toLowerCase()));
|
|
266
|
+
reject(errors.toolNotFound(tool, suggestions));
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
reject(error);
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
child.on('close', (code) => {
|
|
273
|
+
// Handle Claude raw mode error specifically
|
|
274
|
+
// Only show error if Claude actually failed (non-zero exit code)
|
|
275
|
+
if (tool === 'claude' && errorDetected && code !== 0) {
|
|
276
|
+
logger.error(chalk.red('\nError: Claude cannot run in interactive mode when launched from pt.'));
|
|
277
|
+
logger.log(chalk.yellow('\nThis typically happens when Claude needs to ask for directory trust permissions.'));
|
|
278
|
+
logger.log(chalk.blue('\nTo fix this:'));
|
|
279
|
+
logger.log(chalk.white('1. Run Claude directly in this directory: ') + chalk.cyan('claude'));
|
|
280
|
+
logger.log(chalk.white('2. When prompted, trust the directory'));
|
|
281
|
+
logger.log(chalk.white('3. Then run your pt command again\n'));
|
|
282
|
+
logger.log(chalk.dim('Alternatively, you can use: ') + chalk.cyan('pt run claude -- --permission-mode acceptEdits'));
|
|
283
|
+
reject(new Error('Claude requires interactive trust setup. Please see instructions above.'));
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
resolve(code);
|
|
287
|
+
});
|
|
288
|
+
// Write prompt to stdin (only if not Claude Code)
|
|
289
|
+
if (finalPrompt) {
|
|
290
|
+
try {
|
|
291
|
+
if (child.stdin) {
|
|
292
|
+
// Only add error handler if stdin has on method (not mocked in tests)
|
|
293
|
+
if (typeof child.stdin.on === 'function') {
|
|
294
|
+
child.stdin.on('error', (error) => {
|
|
295
|
+
// Ignore EPIPE errors which happen when the tool closes stdin early
|
|
296
|
+
const errorCode = error.code;
|
|
297
|
+
if (errorCode !== 'EPIPE') {
|
|
298
|
+
logger.error(`stdin error: ${error}`);
|
|
299
|
+
}
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
child.stdin.write(finalPrompt);
|
|
303
|
+
child.stdin.end();
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
// Ignore EPIPE errors which happen when the tool closes stdin early
|
|
308
|
+
const errorCode = error.code;
|
|
309
|
+
if (errorCode !== 'EPIPE') {
|
|
310
|
+
reject(new Error(`Failed to write prompt to tool: ${error instanceof Error ? error.message : String(error)}`));
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
else if (child.stdin) {
|
|
315
|
+
// Close stdin even if we're not writing to it
|
|
316
|
+
child.stdin.end();
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
async function handlePostRunReviews(reviewFiles, config, isAutoRun) {
|
|
321
|
+
logger.log(chalk.dim(`\n${'─'.repeat(60)}`));
|
|
322
|
+
for (const { name, value } of reviewFiles) {
|
|
323
|
+
const filePath = String(value);
|
|
324
|
+
// Check if file exists
|
|
325
|
+
const fileExists = await pathExists(filePath);
|
|
326
|
+
if (!fileExists) {
|
|
327
|
+
logger.log(chalk.yellow(`\nFile for '${name}' not found: ${filePath}`));
|
|
328
|
+
continue;
|
|
329
|
+
}
|
|
330
|
+
// In autoRun mode, skip the confirmation prompt and directly open the file
|
|
331
|
+
let shouldReview = false;
|
|
332
|
+
if (isAutoRun) {
|
|
333
|
+
shouldReview = true;
|
|
334
|
+
logger.log(chalk.blue(`\nAuto-reviewing file '${name}' (${filePath})`));
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
// Prompt user to review the file
|
|
338
|
+
shouldReview = await confirm({
|
|
339
|
+
message: `Would you like to review the file '${name}' (${filePath})?`,
|
|
340
|
+
default: true
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
if (shouldReview) {
|
|
344
|
+
// Check autoReview setting (default to true)
|
|
345
|
+
const autoReview = config.autoReview ?? true;
|
|
346
|
+
if (autoReview) {
|
|
347
|
+
// Find an editor and open the file
|
|
348
|
+
const editor = await editorLauncher.findEditor();
|
|
349
|
+
if (!editor) {
|
|
350
|
+
logger.log(chalk.yellow('No editor found. Please configure an editor or set autoReview to false.'));
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
try {
|
|
354
|
+
logger.log(chalk.blue(`Opening ${filePath} in ${editor}...`));
|
|
355
|
+
await editorLauncher.openInEditor(editor, filePath);
|
|
356
|
+
}
|
|
357
|
+
catch (error) {
|
|
358
|
+
logger.error(chalk.red(`Failed to open editor: ${error instanceof Error ? error.message : String(error)}`));
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
logger.log(chalk.dim(`File saved at: ${filePath}`));
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AASA,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyClE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import { ConfigManager } from '../config/config-manager.js';
|
|
4
|
+
import { getDataDir } from '../config/global-paths.js';
|
|
5
|
+
import { GlobalPackageManager } from '../services/package-manager.js';
|
|
6
|
+
import { logger } from '../utils/logger.js';
|
|
7
|
+
export async function uninstallCommand(name) {
|
|
8
|
+
if (!name) {
|
|
9
|
+
throw new Error('Please provide a library name to uninstall. Use "pt config" to see installed libraries.');
|
|
10
|
+
}
|
|
11
|
+
const config = await ConfigManager.load();
|
|
12
|
+
const libraries = config.libraries ?? [];
|
|
13
|
+
const libraryIndex = libraries.findIndex(lib => lib.name === name);
|
|
14
|
+
if (libraryIndex === -1) {
|
|
15
|
+
throw new Error(`Library "${name}" not found. Use "pt config" to see installed libraries.`);
|
|
16
|
+
}
|
|
17
|
+
const library = libraries[libraryIndex];
|
|
18
|
+
const dataDir = getDataDir();
|
|
19
|
+
if (library.type === 'npm') {
|
|
20
|
+
// Uninstall npm package
|
|
21
|
+
const packageManager = new GlobalPackageManager(dataDir);
|
|
22
|
+
try {
|
|
23
|
+
await packageManager.uninstall(library.name);
|
|
24
|
+
logger.log(`Removed npm package: ${library.name}`);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
28
|
+
logger.warn(`Warning: Failed to uninstall npm package: ${errorMessage}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
// Remove git library directory
|
|
33
|
+
const libraryPath = path.join(dataDir, 'libraries', library.name);
|
|
34
|
+
if (await fs.pathExists(libraryPath)) {
|
|
35
|
+
await fs.remove(libraryPath);
|
|
36
|
+
logger.log(`Removed library directory: ${libraryPath}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Remove library entry from config
|
|
40
|
+
libraries.splice(libraryIndex, 1);
|
|
41
|
+
config.libraries = libraries;
|
|
42
|
+
await ConfigManager.save(config);
|
|
43
|
+
logger.log(`Successfully uninstalled library "${name}".`);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,MAAM,UAAU,CAAC;AAE1B,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY;IACjD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,yFAAyF,CAAC,CAAC;IAC7G,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IAEzC,MAAM,YAAY,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACnE,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,0DAA0D,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,OAAO,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC3B,wBAAwB;QACxB,MAAM,cAAc,GAAG,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,CAAC,GAAG,CAAC,wBAAwB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,MAAM,CAAC,IAAI,CAAC,6CAA6C,YAAY,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;SAAM,CAAC;QACN,+BAA+B;QAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAClE,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAC7B,MAAM,CAAC,GAAG,CAAC,8BAA8B,WAAW,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,SAAS,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IAClC,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,MAAM,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEjC,MAAM,CAAC,GAAG,CAAC,qCAAqC,IAAI,IAAI,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AA8EA,wBAAsB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDhE"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import simpleGit from 'simple-git';
|
|
4
|
+
import { ConfigManager } from '../config/config-manager.js';
|
|
5
|
+
import { getDataDir } from '../config/global-paths.js';
|
|
6
|
+
import { GlobalPackageManager } from '../services/package-manager.js';
|
|
7
|
+
import { logger } from '../utils/logger.js';
|
|
8
|
+
import { loadConfigFromDirectory } from './install.js';
|
|
9
|
+
async function updateGitLibrary(library) {
|
|
10
|
+
const dataDir = getDataDir();
|
|
11
|
+
const libraryPath = path.join(dataDir, 'libraries', library.name);
|
|
12
|
+
// Check if library directory exists
|
|
13
|
+
if (!await fs.pathExists(libraryPath)) {
|
|
14
|
+
throw new Error(`Library directory not found: ${libraryPath}. Try reinstalling with "pt install ${library.source}".`);
|
|
15
|
+
}
|
|
16
|
+
logger.log(`Updating library "${library.name}"...`);
|
|
17
|
+
// Git pull to update
|
|
18
|
+
const git = simpleGit(libraryPath);
|
|
19
|
+
try {
|
|
20
|
+
await git.pull();
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
24
|
+
throw new Error(`Failed to update library "${library.name}": ${errorMessage}`);
|
|
25
|
+
}
|
|
26
|
+
// Get new commit hash
|
|
27
|
+
let newVersion;
|
|
28
|
+
try {
|
|
29
|
+
const log = await git.log({ maxCount: 1 });
|
|
30
|
+
newVersion = log.latest?.hash?.substring(0, 8);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// Version is optional
|
|
34
|
+
}
|
|
35
|
+
// Re-read library config to detect promptDirs changes
|
|
36
|
+
const newPromptDirs = await loadConfigFromDirectory(libraryPath);
|
|
37
|
+
// Update the library entry
|
|
38
|
+
if (newVersion) {
|
|
39
|
+
library.version = newVersion;
|
|
40
|
+
}
|
|
41
|
+
if (newPromptDirs && newPromptDirs.length > 0) {
|
|
42
|
+
library.promptDirs = newPromptDirs;
|
|
43
|
+
}
|
|
44
|
+
logger.log(`Successfully updated library "${library.name}"${newVersion ? ` to ${newVersion}` : ''}`);
|
|
45
|
+
}
|
|
46
|
+
async function updateNpmLibrary(library) {
|
|
47
|
+
const dataDir = getDataDir();
|
|
48
|
+
const packageManager = new GlobalPackageManager(dataDir);
|
|
49
|
+
logger.log(`Updating package "${library.name}"...`);
|
|
50
|
+
await packageManager.update(library.name);
|
|
51
|
+
// Get new version
|
|
52
|
+
const newVersion = await packageManager.getInstalledVersion(library.name);
|
|
53
|
+
if (newVersion) {
|
|
54
|
+
library.version = newVersion;
|
|
55
|
+
}
|
|
56
|
+
// Re-detect promptDirs in case they changed
|
|
57
|
+
const newPromptDirs = await packageManager.detectPromptDirs(library.name);
|
|
58
|
+
if (newPromptDirs.length > 0) {
|
|
59
|
+
library.promptDirs = newPromptDirs;
|
|
60
|
+
}
|
|
61
|
+
logger.log(`Successfully updated package "${library.name}"${newVersion ? ` to v${newVersion}` : ''}`);
|
|
62
|
+
}
|
|
63
|
+
export async function updateCommand(name) {
|
|
64
|
+
const config = await ConfigManager.load();
|
|
65
|
+
const libraries = config.libraries ?? [];
|
|
66
|
+
if (libraries.length === 0) {
|
|
67
|
+
logger.log('No libraries installed. Use "pt install" to install a library.');
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (name) {
|
|
71
|
+
// Update specific library
|
|
72
|
+
const library = libraries.find(lib => lib.name === name);
|
|
73
|
+
if (!library) {
|
|
74
|
+
throw new Error(`Library "${name}" not found. Use "pt config" to see installed libraries.`);
|
|
75
|
+
}
|
|
76
|
+
if (library.type === 'git') {
|
|
77
|
+
await updateGitLibrary(library);
|
|
78
|
+
}
|
|
79
|
+
else if (library.type === 'npm') {
|
|
80
|
+
await updateNpmLibrary(library);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// Update all libraries
|
|
85
|
+
let successCount = 0;
|
|
86
|
+
let errorCount = 0;
|
|
87
|
+
for (const library of libraries) {
|
|
88
|
+
try {
|
|
89
|
+
if (library.type === 'git') {
|
|
90
|
+
await updateGitLibrary(library);
|
|
91
|
+
}
|
|
92
|
+
else if (library.type === 'npm') {
|
|
93
|
+
await updateNpmLibrary(library);
|
|
94
|
+
}
|
|
95
|
+
successCount++;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
99
|
+
logger.error(`Failed to update "${library.name}": ${errorMessage}`);
|
|
100
|
+
errorCount++;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (successCount > 0) {
|
|
104
|
+
logger.log(`\nUpdated ${successCount} library${successCount > 1 ? 'ies' : ''}.`);
|
|
105
|
+
}
|
|
106
|
+
if (errorCount > 0) {
|
|
107
|
+
logger.log(`${errorCount} library${errorCount > 1 ? 'ies' : ''} failed to update.`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Save updated config
|
|
111
|
+
await ConfigManager.save(config);
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Config } from '../types/config.js';
|
|
2
|
+
interface ConfigResult {
|
|
3
|
+
config: Config;
|
|
4
|
+
filepath?: string;
|
|
5
|
+
configDir?: string;
|
|
6
|
+
}
|
|
7
|
+
declare function load(startDir?: string): Promise<Config>;
|
|
8
|
+
declare function loadWithPath(_startDir?: string): Promise<ConfigResult>;
|
|
9
|
+
/**
|
|
10
|
+
* Save a config object to the global config path.
|
|
11
|
+
*/
|
|
12
|
+
declare function save(config: Config): Promise<void>;
|
|
13
|
+
export declare const ConfigManager: {
|
|
14
|
+
load: typeof load;
|
|
15
|
+
loadWithPath: typeof loadWithPath;
|
|
16
|
+
save: typeof save;
|
|
17
|
+
};
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=config-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/config/config-manager.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,EAAkB,MAAM,oBAAoB,CAAC;AAQ5D,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAkLD,iBAAe,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGtD;AAED,iBAAe,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CA+CrE;AAED;;GAEG;AACH,iBAAe,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjD;AAED,eAAO,MAAM,aAAa;;;;CAIzB,CAAC"}
|