icopilot 2.2.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/CHANGELOG.md +250 -0
- package/LICENSE +21 -0
- package/README.md +214 -0
- package/bin/icopilot.js +6 -0
- package/dist/acp/router.js +123 -0
- package/dist/acp/schema.js +53 -0
- package/dist/agents/aggregator.js +187 -0
- package/dist/agents/custom-agents.js +97 -0
- package/dist/agents/goal-driven.js +411 -0
- package/dist/agents/multi-repo.js +350 -0
- package/dist/agents/parallel-runner.js +181 -0
- package/dist/agents/router.js +144 -0
- package/dist/agents/self-heal.js +481 -0
- package/dist/agents/tdd-agent.js +278 -0
- package/dist/api/github-models.js +158 -0
- package/dist/bridge/ide-bridge.js +479 -0
- package/dist/cloud/routine-executor.js +34 -0
- package/dist/cloud/routine-scheduler.js +67 -0
- package/dist/cloud/routine-storage.js +297 -0
- package/dist/commands/acp-cmd.js +143 -0
- package/dist/commands/actions-cmd.js +624 -0
- package/dist/commands/agent-cmd.js +144 -0
- package/dist/commands/alias-cmd.js +132 -0
- package/dist/commands/bookmark-cmd.js +77 -0
- package/dist/commands/changelog-cmd.js +99 -0
- package/dist/commands/changes-cmd.js +120 -0
- package/dist/commands/clipboard-cmd.js +217 -0
- package/dist/commands/cloud-routine-cmd.js +265 -0
- package/dist/commands/codegen-cmd.js +544 -0
- package/dist/commands/compare-cmd.js +116 -0
- package/dist/commands/context-cmd.js +247 -0
- package/dist/commands/context-viz-cmd.js +43 -0
- package/dist/commands/conventions-cmd.js +116 -0
- package/dist/commands/cost-cmd.js +51 -0
- package/dist/commands/deps-cmd.js +294 -0
- package/dist/commands/diagram-cmd.js +658 -0
- package/dist/commands/diff-review-cmd.js +92 -0
- package/dist/commands/doc-cmd.js +412 -0
- package/dist/commands/doctor-cmd.js +152 -0
- package/dist/commands/editor-cmd.js +49 -0
- package/dist/commands/env-cmd.js +86 -0
- package/dist/commands/explain-cmd.js +78 -0
- package/dist/commands/explain-shell-cmd.js +22 -0
- package/dist/commands/explore-cmd.js +231 -0
- package/dist/commands/feedback-cmd.js +98 -0
- package/dist/commands/fix-cmd.js +17 -0
- package/dist/commands/generate-cmd.js +38 -0
- package/dist/commands/git-extra.js +197 -0
- package/dist/commands/git-log-cmd.js +98 -0
- package/dist/commands/git-undo-cmd.js +137 -0
- package/dist/commands/git.js +155 -0
- package/dist/commands/history-cmd.js +122 -0
- package/dist/commands/index-cmd.js +65 -0
- package/dist/commands/init-cmd.js +73 -0
- package/dist/commands/lint-cmd.js +133 -0
- package/dist/commands/memory-cmd.js +98 -0
- package/dist/commands/metrics-cmd.js +97 -0
- package/dist/commands/mode-prefix.js +30 -0
- package/dist/commands/multi-cmd.js +44 -0
- package/dist/commands/notify-cmd.js +204 -0
- package/dist/commands/profile-cmd.js +101 -0
- package/dist/commands/prompts.js +17 -0
- package/dist/commands/rag-cmd.js +60 -0
- package/dist/commands/readme-cmd.js +564 -0
- package/dist/commands/reasoning-cmd.js +34 -0
- package/dist/commands/refactor-cmd.js +96 -0
- package/dist/commands/release-cmd.js +450 -0
- package/dist/commands/repo-cmd.js +195 -0
- package/dist/commands/route-cmd.js +21 -0
- package/dist/commands/schedule-cmd.js +109 -0
- package/dist/commands/search-cmd.js +47 -0
- package/dist/commands/security-cmd.js +156 -0
- package/dist/commands/settings-cmd.js +238 -0
- package/dist/commands/skill-cmd.js +338 -0
- package/dist/commands/slash.js +2721 -0
- package/dist/commands/snippets-cmd.js +83 -0
- package/dist/commands/space-cmd.js +92 -0
- package/dist/commands/stash-cmd.js +156 -0
- package/dist/commands/stats-cmd.js +36 -0
- package/dist/commands/style-cmd.js +85 -0
- package/dist/commands/suggest-cmd.js +40 -0
- package/dist/commands/summary-cmd.js +138 -0
- package/dist/commands/task-cmd.js +58 -0
- package/dist/commands/team-memory-cmd.js +97 -0
- package/dist/commands/template-cmd.js +475 -0
- package/dist/commands/test-cmd.js +146 -0
- package/dist/commands/todo-cmd.js +172 -0
- package/dist/commands/tokens-cmd.js +277 -0
- package/dist/commands/trigger-cmd.js +147 -0
- package/dist/commands/undo-cmd.js +18 -0
- package/dist/commands/voice-cmd.js +89 -0
- package/dist/commands/watch-cmd.js +110 -0
- package/dist/commands/web-cmd.js +183 -0
- package/dist/commands/worktree-cmd.js +119 -0
- package/dist/config-profile.js +66 -0
- package/dist/config.js +288 -0
- package/dist/context/compactor.js +53 -0
- package/dist/context/dep-context.js +329 -0
- package/dist/context/file-refs.js +54 -0
- package/dist/context/git-context.js +229 -0
- package/dist/context/image-input.js +66 -0
- package/dist/context/memory.js +55 -0
- package/dist/context/persistent-memory.js +104 -0
- package/dist/context/pinned.js +96 -0
- package/dist/context/priority.js +150 -0
- package/dist/context/read-only.js +48 -0
- package/dist/context/smart-files.js +286 -0
- package/dist/context/team-memory.js +156 -0
- package/dist/extensions/loader.js +149 -0
- package/dist/extensions/marketplace.js +49 -0
- package/dist/extensions/slack-provider.js +181 -0
- package/dist/extensions/team.js +56 -0
- package/dist/extensions/teams-provider.js +222 -0
- package/dist/extensions/voice.js +18 -0
- package/dist/hooks/lifecycle.js +215 -0
- package/dist/hooks/precommit.js +463 -0
- package/dist/index/embeddings.js +23 -0
- package/dist/index/indexer.js +86 -0
- package/dist/index/retrieve.js +20 -0
- package/dist/index/store.js +95 -0
- package/dist/index.js +286 -0
- package/dist/intelligence/dead-code.js +457 -0
- package/dist/intelligence/error-watch.js +263 -0
- package/dist/intelligence/navigation.js +141 -0
- package/dist/intelligence/stack-trace.js +210 -0
- package/dist/intelligence/symbol-index.js +410 -0
- package/dist/knowledge/auto-memory.js +412 -0
- package/dist/knowledge/conventions.js +475 -0
- package/dist/knowledge/corrections.js +213 -0
- package/dist/knowledge/rag.js +450 -0
- package/dist/knowledge/style-learner.js +324 -0
- package/dist/logger.js +35 -0
- package/dist/mcp/client.js +144 -0
- package/dist/mcp/config.js +24 -0
- package/dist/mcp/index.js +89 -0
- package/dist/modes/auto-compact.js +20 -0
- package/dist/modes/autopilot.js +157 -0
- package/dist/modes/background.js +82 -0
- package/dist/modes/interactive.js +187 -0
- package/dist/modes/oneshot.js +36 -0
- package/dist/modes/tui.js +265 -0
- package/dist/modes/turn.js +342 -0
- package/dist/notifications/manager.js +107 -0
- package/dist/plugins/marketplace.js +244 -0
- package/dist/providers/custom-provider.js +298 -0
- package/dist/providers/local-model.js +121 -0
- package/dist/routing/profiles.js +44 -0
- package/dist/routing/router.js +18 -0
- package/dist/sandbox/container.js +151 -0
- package/dist/security/audit.js +237 -0
- package/dist/security/content-filter.js +449 -0
- package/dist/security/proxy.js +301 -0
- package/dist/security/retention.js +281 -0
- package/dist/security/roles.js +252 -0
- package/dist/server/api-server.js +679 -0
- package/dist/session/bookmarks.js +72 -0
- package/dist/session/cloud-session.js +291 -0
- package/dist/session/handoff.js +405 -0
- package/dist/session/manager.js +35 -0
- package/dist/session/session.js +296 -0
- package/dist/session/share.js +313 -0
- package/dist/session/undo-journal.js +91 -0
- package/dist/snippets/store.js +60 -0
- package/dist/spaces/space-config.js +156 -0
- package/dist/spaces/space.js +220 -0
- package/dist/stats/store.js +101 -0
- package/dist/tools/apply-patch.js +134 -0
- package/dist/tools/auto-check.js +218 -0
- package/dist/tools/diff-edit.js +150 -0
- package/dist/tools/diff-prompt.js +36 -0
- package/dist/tools/edit-file.js +66 -0
- package/dist/tools/file-ops.js +205 -0
- package/dist/tools/glob.js +17 -0
- package/dist/tools/grep.js +56 -0
- package/dist/tools/image.js +194 -0
- package/dist/tools/list-directory.js +228 -0
- package/dist/tools/memory.js +17 -0
- package/dist/tools/multi-edit.js +299 -0
- package/dist/tools/policy.js +95 -0
- package/dist/tools/registry.js +484 -0
- package/dist/tools/retry.js +74 -0
- package/dist/tools/run-in-terminal.js +162 -0
- package/dist/tools/safety.js +64 -0
- package/dist/tools/sandbox.js +15 -0
- package/dist/tools/search-symbols.js +212 -0
- package/dist/tools/shell.js +118 -0
- package/dist/tools/web.js +167 -0
- package/dist/ui/prompt.js +37 -0
- package/dist/ui/render.js +96 -0
- package/dist/ui/screen.js +13 -0
- package/dist/ui/theme.js +56 -0
- package/dist/util/browser.js +34 -0
- package/dist/util/completion.js +350 -0
- package/dist/util/cost.js +28 -0
- package/dist/util/keybindings.js +113 -0
- package/dist/util/lazy.js +26 -0
- package/dist/util/perf.js +25 -0
- package/dist/util/token-worker.js +11 -0
- package/dist/util/tokens.js +50 -0
- package/dist/workflows/builtins.js +128 -0
- package/dist/workflows/engine.js +496 -0
- package/dist/workflows/file-trigger.js +197 -0
- package/package.json +79 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { config } from '../config.js';
|
|
4
|
+
const DEFAULT_DEBOUNCE_MS = 500;
|
|
5
|
+
const TRIGGERS_FILE = 'triggers.json';
|
|
6
|
+
const TRIGGERS_DIR = '.icopilot';
|
|
7
|
+
const VALID_ACTIONS = new Set(['workflow', 'command', 'prompt']);
|
|
8
|
+
export class FileTriggerManager {
|
|
9
|
+
rootDir;
|
|
10
|
+
triggers = [];
|
|
11
|
+
watchFn;
|
|
12
|
+
watchers = new Set();
|
|
13
|
+
callbacks = new Set();
|
|
14
|
+
debounceTimers = new Map();
|
|
15
|
+
constructor(opts = {}) {
|
|
16
|
+
this.rootDir = path.resolve(opts.rootDir ?? config.cwd);
|
|
17
|
+
this.watchFn = opts.watch ?? fs.watch.bind(fs);
|
|
18
|
+
this.triggers = this.readTriggers();
|
|
19
|
+
}
|
|
20
|
+
addTrigger(trigger) {
|
|
21
|
+
const normalized = normalizeTrigger(trigger);
|
|
22
|
+
const next = this.triggers.filter((entry) => entry.pattern !== normalized.pattern);
|
|
23
|
+
next.push(normalized);
|
|
24
|
+
this.triggers = next.sort((a, b) => a.pattern.localeCompare(b.pattern));
|
|
25
|
+
this.writeTriggers();
|
|
26
|
+
}
|
|
27
|
+
removeTrigger(pattern) {
|
|
28
|
+
const trimmedPattern = pattern.trim();
|
|
29
|
+
if (!trimmedPattern)
|
|
30
|
+
return;
|
|
31
|
+
this.triggers = this.triggers.filter((entry) => entry.pattern !== trimmedPattern);
|
|
32
|
+
this.writeTriggers();
|
|
33
|
+
for (const [key, timer] of this.debounceTimers.entries()) {
|
|
34
|
+
if (!key.startsWith(`${trimmedPattern}\0`))
|
|
35
|
+
continue;
|
|
36
|
+
clearTimeout(timer);
|
|
37
|
+
this.debounceTimers.delete(key);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
listTriggers() {
|
|
41
|
+
return this.triggers.map((trigger) => ({ ...trigger }));
|
|
42
|
+
}
|
|
43
|
+
start(rootDir) {
|
|
44
|
+
this.stop();
|
|
45
|
+
this.rootDir = path.resolve(rootDir || this.rootDir);
|
|
46
|
+
this.triggers = this.readTriggers();
|
|
47
|
+
const watcher = this.watchFn(this.rootDir, { recursive: true }, (_eventType, filename) => this.handleWatchEvent(filename));
|
|
48
|
+
this.watchers.add(watcher);
|
|
49
|
+
}
|
|
50
|
+
stop() {
|
|
51
|
+
for (const watcher of this.watchers)
|
|
52
|
+
watcher.close();
|
|
53
|
+
this.watchers.clear();
|
|
54
|
+
for (const timer of this.debounceTimers.values())
|
|
55
|
+
clearTimeout(timer);
|
|
56
|
+
this.debounceTimers.clear();
|
|
57
|
+
}
|
|
58
|
+
onTrigger(callback) {
|
|
59
|
+
this.callbacks.add(callback);
|
|
60
|
+
}
|
|
61
|
+
getRootDir() {
|
|
62
|
+
return this.rootDir;
|
|
63
|
+
}
|
|
64
|
+
handleWatchEvent(filename) {
|
|
65
|
+
const relativePath = normalizeWatchedPath(filename);
|
|
66
|
+
if (!relativePath)
|
|
67
|
+
return;
|
|
68
|
+
for (const trigger of this.triggers) {
|
|
69
|
+
if (!matchesFileTriggerPattern(trigger.pattern, relativePath))
|
|
70
|
+
continue;
|
|
71
|
+
const key = `${trigger.pattern}\0${relativePath}`;
|
|
72
|
+
const existing = this.debounceTimers.get(key);
|
|
73
|
+
if (existing)
|
|
74
|
+
clearTimeout(existing);
|
|
75
|
+
const timer = setTimeout(() => {
|
|
76
|
+
this.debounceTimers.delete(key);
|
|
77
|
+
for (const callback of this.callbacks)
|
|
78
|
+
callback({ ...trigger }, relativePath);
|
|
79
|
+
}, normalizeDebounce(trigger.debounce));
|
|
80
|
+
this.debounceTimers.set(key, timer);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
readTriggers() {
|
|
84
|
+
const file = triggerConfigPath(this.rootDir);
|
|
85
|
+
if (!fs.existsSync(file))
|
|
86
|
+
return [];
|
|
87
|
+
try {
|
|
88
|
+
const parsed = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
89
|
+
if (!Array.isArray(parsed))
|
|
90
|
+
return [];
|
|
91
|
+
return parsed.filter(isFileTrigger).map((trigger) => normalizeTrigger(trigger));
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
writeTriggers() {
|
|
98
|
+
const file = triggerConfigPath(this.rootDir);
|
|
99
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
100
|
+
fs.writeFileSync(file, `${JSON.stringify(this.triggers, null, 2)}\n`, 'utf8');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const managers = new Map();
|
|
104
|
+
export function getFileTriggerManager(rootDir = config.cwd) {
|
|
105
|
+
const resolvedRoot = path.resolve(rootDir);
|
|
106
|
+
const existing = managers.get(resolvedRoot);
|
|
107
|
+
if (existing)
|
|
108
|
+
return existing;
|
|
109
|
+
const manager = new FileTriggerManager({ rootDir: resolvedRoot });
|
|
110
|
+
managers.set(resolvedRoot, manager);
|
|
111
|
+
return manager;
|
|
112
|
+
}
|
|
113
|
+
export function triggerConfigPath(rootDir = config.cwd) {
|
|
114
|
+
return path.join(path.resolve(rootDir), TRIGGERS_DIR, TRIGGERS_FILE);
|
|
115
|
+
}
|
|
116
|
+
export function matchesFileTriggerPattern(pattern, file) {
|
|
117
|
+
return fileTriggerPatternToRegExp(pattern).test(normalizePattern(file));
|
|
118
|
+
}
|
|
119
|
+
export function fileTriggerPatternToRegExp(pattern) {
|
|
120
|
+
const normalized = normalizePattern(pattern);
|
|
121
|
+
let source = '';
|
|
122
|
+
for (let index = 0; index < normalized.length; index += 1) {
|
|
123
|
+
const char = normalized[index];
|
|
124
|
+
if (char === '*') {
|
|
125
|
+
const nextChar = normalized[index + 1];
|
|
126
|
+
const thirdChar = normalized[index + 2];
|
|
127
|
+
if (nextChar === '*') {
|
|
128
|
+
if (thirdChar === '/') {
|
|
129
|
+
source += '(?:.*/)?';
|
|
130
|
+
index += 2;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
source += '.*';
|
|
134
|
+
index += 1;
|
|
135
|
+
}
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
source += '[^/]*';
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
if (char === '?') {
|
|
142
|
+
source += '[^/]';
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
source += escapeRegExp(char);
|
|
146
|
+
}
|
|
147
|
+
return new RegExp(`^${source}$`);
|
|
148
|
+
}
|
|
149
|
+
function normalizeTrigger(trigger) {
|
|
150
|
+
const action = trigger.action;
|
|
151
|
+
if (!VALID_ACTIONS.has(action)) {
|
|
152
|
+
throw new Error(`invalid trigger action: ${String(trigger.action)}`);
|
|
153
|
+
}
|
|
154
|
+
const pattern = normalizePattern(trigger.pattern);
|
|
155
|
+
if (!pattern)
|
|
156
|
+
throw new Error('trigger pattern is required');
|
|
157
|
+
const target = trigger.target.trim();
|
|
158
|
+
if (!target)
|
|
159
|
+
throw new Error('trigger target is required');
|
|
160
|
+
const debounce = normalizeDebounce(trigger.debounce);
|
|
161
|
+
return debounce === DEFAULT_DEBOUNCE_MS
|
|
162
|
+
? { pattern, action, target }
|
|
163
|
+
: { pattern, action, target, debounce };
|
|
164
|
+
}
|
|
165
|
+
function normalizeDebounce(value) {
|
|
166
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {
|
|
167
|
+
return DEFAULT_DEBOUNCE_MS;
|
|
168
|
+
}
|
|
169
|
+
return Math.floor(value);
|
|
170
|
+
}
|
|
171
|
+
function normalizePattern(value) {
|
|
172
|
+
if (value === null || value === undefined)
|
|
173
|
+
return '';
|
|
174
|
+
const text = typeof value === 'string' ? value : value.toString('utf8');
|
|
175
|
+
return text.replace(/\\/g, '/').replace(/^\.\//, '').replace(/^\/+/, '').trim();
|
|
176
|
+
}
|
|
177
|
+
function normalizeWatchedPath(filename) {
|
|
178
|
+
const normalized = normalizePattern(filename);
|
|
179
|
+
if (!normalized || normalized.startsWith(`${TRIGGERS_DIR}/`))
|
|
180
|
+
return '';
|
|
181
|
+
return normalized;
|
|
182
|
+
}
|
|
183
|
+
function escapeRegExp(value) {
|
|
184
|
+
return value.replace(/[|\\{}()[\]^$+?.]/g, '\\$&');
|
|
185
|
+
}
|
|
186
|
+
function isFileTrigger(value) {
|
|
187
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
188
|
+
return false;
|
|
189
|
+
const trigger = value;
|
|
190
|
+
return (typeof trigger.pattern === 'string' &&
|
|
191
|
+
VALID_ACTIONS.has(trigger.action) &&
|
|
192
|
+
typeof trigger.target === 'string' &&
|
|
193
|
+
(trigger.debounce === undefined ||
|
|
194
|
+
(typeof trigger.debounce === 'number' &&
|
|
195
|
+
Number.isFinite(trigger.debounce) &&
|
|
196
|
+
trigger.debounce >= 0)));
|
|
197
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "icopilot",
|
|
3
|
+
"version": "2.2.0",
|
|
4
|
+
"description": "iCopilot — terminal-native agentic CLI powered by GitHub Models",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"icopilot": "bin/icopilot.js",
|
|
8
|
+
"icli": "bin/icopilot.js"
|
|
9
|
+
},
|
|
10
|
+
"main": "dist/index.js",
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc -p .",
|
|
13
|
+
"dev": "tsc -p . --watch",
|
|
14
|
+
"start": "node bin/icopilot.js",
|
|
15
|
+
"lint": "eslint \"src/**/*.ts\" \"tests/**/*.ts\"",
|
|
16
|
+
"lint:fix": "eslint --fix \"src/**/*.ts\" \"tests/**/*.ts\"",
|
|
17
|
+
"format": "prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"*.md\"",
|
|
18
|
+
"format:check": "prettier --check \"src/**/*.ts\" \"tests/**/*.ts\"",
|
|
19
|
+
"test": "vitest run",
|
|
20
|
+
"test:watch": "vitest",
|
|
21
|
+
"coverage": "vitest run --coverage",
|
|
22
|
+
"typecheck": "tsc -p . --noEmit",
|
|
23
|
+
"prepare": "tsc -p .",
|
|
24
|
+
"release": "node scripts/release.mjs",
|
|
25
|
+
"release:patch": "node scripts/release.mjs patch",
|
|
26
|
+
"release:minor": "node scripts/release.mjs minor",
|
|
27
|
+
"release:major": "node scripts/release.mjs major",
|
|
28
|
+
"changelog": "node scripts/changelog.mjs",
|
|
29
|
+
"smoke": "node scripts/smoke.mjs",
|
|
30
|
+
"test:smoke": "vitest run tests/smoke --config vitest.smoke.config.ts",
|
|
31
|
+
"screenshots": "node scripts/screenshots.mjs",
|
|
32
|
+
"perf:cold-start": "node scripts/cold-start.mjs"
|
|
33
|
+
},
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">=18.17.0"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@inquirer/prompts": "^5.3.8",
|
|
39
|
+
"chalk": "^5.3.0",
|
|
40
|
+
"commander": "^12.1.0",
|
|
41
|
+
"diff": "^5.2.0",
|
|
42
|
+
"dotenv": "^16.4.5",
|
|
43
|
+
"fast-glob": "^3.3.2",
|
|
44
|
+
"gpt-tokenizer": "^2.1.2",
|
|
45
|
+
"marked": "^13.0.3",
|
|
46
|
+
"marked-terminal": "^7.1.0",
|
|
47
|
+
"openai": "^4.56.0",
|
|
48
|
+
"ora": "^8.0.1",
|
|
49
|
+
"proxy-agent": "^6.5.0",
|
|
50
|
+
"simple-git": "^3.25.0",
|
|
51
|
+
"yaml": "^2.9.0"
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@types/diff": "^5.2.1",
|
|
55
|
+
"@types/marked-terminal": "^6.1.1",
|
|
56
|
+
"@types/node": "^20.14.10",
|
|
57
|
+
"@typescript-eslint/eslint-plugin": "^7.18.0",
|
|
58
|
+
"@typescript-eslint/parser": "^7.18.0",
|
|
59
|
+
"@vitest/coverage-v8": "^1.6.0",
|
|
60
|
+
"eslint": "^8.57.0",
|
|
61
|
+
"eslint-config-prettier": "^9.1.0",
|
|
62
|
+
"eslint-plugin-prettier": "^5.2.1",
|
|
63
|
+
"prettier": "^3.3.3",
|
|
64
|
+
"typescript": "^5.5.4",
|
|
65
|
+
"vitest": "^1.6.0"
|
|
66
|
+
},
|
|
67
|
+
"license": "MIT",
|
|
68
|
+
"files": [
|
|
69
|
+
"bin",
|
|
70
|
+
"dist",
|
|
71
|
+
"README.md",
|
|
72
|
+
"CHANGELOG.md",
|
|
73
|
+
"LICENSE"
|
|
74
|
+
],
|
|
75
|
+
"repository": {
|
|
76
|
+
"type": "git",
|
|
77
|
+
"url": ""
|
|
78
|
+
}
|
|
79
|
+
}
|