codegrunt 0.1.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/README.md +351 -0
- package/dist/cli/at-resolver.d.ts +10 -0
- package/dist/cli/at-resolver.js +138 -0
- package/dist/cli/at-resolver.js.map +1 -0
- package/dist/cli/banner.d.ts +1 -0
- package/dist/cli/banner.js +111 -0
- package/dist/cli/banner.js.map +1 -0
- package/dist/cli/commands.d.ts +25 -0
- package/dist/cli/commands.js +799 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +142 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/input.d.ts +14 -0
- package/dist/cli/input.js +742 -0
- package/dist/cli/input.js.map +1 -0
- package/dist/cli/repl.d.ts +2 -0
- package/dist/cli/repl.js +217 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/cli/setup.d.ts +7 -0
- package/dist/cli/setup.js +82 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/skills.d.ts +28 -0
- package/dist/cli/skills.js +299 -0
- package/dist/cli/skills.js.map +1 -0
- package/dist/cli/update.d.ts +7 -0
- package/dist/cli/update.js +135 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.js +93 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent/loop.d.ts +17 -0
- package/dist/core/agent/loop.js +353 -0
- package/dist/core/agent/loop.js.map +1 -0
- package/dist/core/context/manager.d.ts +26 -0
- package/dist/core/context/manager.js +98 -0
- package/dist/core/context/manager.js.map +1 -0
- package/dist/core/context/project-guide.d.ts +1 -0
- package/dist/core/context/project-guide.js +17 -0
- package/dist/core/context/project-guide.js.map +1 -0
- package/dist/core/tools/edit_file.d.ts +2 -0
- package/dist/core/tools/edit_file.js +54 -0
- package/dist/core/tools/edit_file.js.map +1 -0
- package/dist/core/tools/execute_shell.d.ts +2 -0
- package/dist/core/tools/execute_shell.js +67 -0
- package/dist/core/tools/execute_shell.js.map +1 -0
- package/dist/core/tools/executor.d.ts +3 -0
- package/dist/core/tools/executor.js +86 -0
- package/dist/core/tools/executor.js.map +1 -0
- package/dist/core/tools/list_directory.d.ts +2 -0
- package/dist/core/tools/list_directory.js +74 -0
- package/dist/core/tools/list_directory.js.map +1 -0
- package/dist/core/tools/read_file.d.ts +2 -0
- package/dist/core/tools/read_file.js +40 -0
- package/dist/core/tools/read_file.js.map +1 -0
- package/dist/core/tools/registry.d.ts +4 -0
- package/dist/core/tools/registry.js +24 -0
- package/dist/core/tools/registry.js.map +1 -0
- package/dist/core/tools/search_files.d.ts +2 -0
- package/dist/core/tools/search_files.js +88 -0
- package/dist/core/tools/search_files.js.map +1 -0
- package/dist/core/tools/write_file.d.ts +2 -0
- package/dist/core/tools/write_file.js +43 -0
- package/dist/core/tools/write_file.js.map +1 -0
- package/dist/providers/deepseek/client.d.ts +8 -0
- package/dist/providers/deepseek/client.js +27 -0
- package/dist/providers/deepseek/client.js.map +1 -0
- package/dist/providers/deepseek/provider.d.ts +8 -0
- package/dist/providers/deepseek/provider.js +165 -0
- package/dist/providers/deepseek/provider.js.map +1 -0
- package/dist/types.d.ts +111 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/billing.d.ts +40 -0
- package/dist/utils/billing.js +165 -0
- package/dist/utils/billing.js.map +1 -0
- package/dist/utils/confirm.d.ts +3 -0
- package/dist/utils/confirm.js +242 -0
- package/dist/utils/confirm.js.map +1 -0
- package/dist/utils/display.d.ts +10 -0
- package/dist/utils/display.js +121 -0
- package/dist/utils/display.js.map +1 -0
- package/dist/utils/interrupt.d.ts +5 -0
- package/dist/utils/interrupt.js +13 -0
- package/dist/utils/interrupt.js.map +1 -0
- package/dist/utils/markdown.d.ts +18 -0
- package/dist/utils/markdown.js +223 -0
- package/dist/utils/markdown.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { readdir, readFile, writeFile, access, mkdir, rm, unlink } from 'fs/promises';
|
|
2
|
+
import { join, resolve, basename } from 'path';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
import AdmZip from 'adm-zip';
|
|
5
|
+
/** Parse YAML-style frontmatter from a markdown file.
|
|
6
|
+
* Supports both simple `key: value` pairs and multi-line literal blocks
|
|
7
|
+
* (`key: |` followed by indented content). */
|
|
8
|
+
function parseFrontmatter(raw) {
|
|
9
|
+
const meta = {};
|
|
10
|
+
if (!raw.startsWith('---'))
|
|
11
|
+
return { meta, body: raw };
|
|
12
|
+
const end = raw.indexOf('\n---', 3);
|
|
13
|
+
if (end === -1)
|
|
14
|
+
return { meta, body: raw };
|
|
15
|
+
const fm = raw.slice(3, end);
|
|
16
|
+
const lines = fm.split('\n');
|
|
17
|
+
let i = 0;
|
|
18
|
+
while (i < lines.length) {
|
|
19
|
+
const line = lines[i];
|
|
20
|
+
const colon = line.indexOf(':');
|
|
21
|
+
if (colon === -1) {
|
|
22
|
+
i++;
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const key = line.slice(0, colon).trim();
|
|
26
|
+
const rest = line.slice(colon + 1).trim();
|
|
27
|
+
if (rest === '|' || rest === '|-' || rest === '>') {
|
|
28
|
+
// Multi-line literal / folded block scalar
|
|
29
|
+
i++;
|
|
30
|
+
const valueLines = [];
|
|
31
|
+
let baseIndent = null;
|
|
32
|
+
while (i < lines.length) {
|
|
33
|
+
const nl = lines[i];
|
|
34
|
+
if (nl.trim() === '') {
|
|
35
|
+
valueLines.push('');
|
|
36
|
+
i++;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const indent = nl.length - nl.trimStart().length;
|
|
40
|
+
if (baseIndent === null)
|
|
41
|
+
baseIndent = indent;
|
|
42
|
+
// Stop when we hit a non-empty line at lower indentation than the block base
|
|
43
|
+
if (indent < (baseIndent ?? 0))
|
|
44
|
+
break;
|
|
45
|
+
valueLines.push(nl.slice(baseIndent ?? indent));
|
|
46
|
+
i++;
|
|
47
|
+
}
|
|
48
|
+
meta[key] = valueLines.join('\n').trim();
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// Simple key: value
|
|
52
|
+
meta[key] = rest.replace(/^["']|["']$/g, '');
|
|
53
|
+
i++;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return { meta, body: raw.slice(end + 4).trim() };
|
|
57
|
+
}
|
|
58
|
+
async function loadSkillsFromDir(dir, source) {
|
|
59
|
+
try {
|
|
60
|
+
await access(dir);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
const skills = [];
|
|
66
|
+
let entries;
|
|
67
|
+
try {
|
|
68
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
for (const entry of entries) {
|
|
74
|
+
// Flat .md file directly in the skills dir
|
|
75
|
+
if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
76
|
+
try {
|
|
77
|
+
const raw = await readFile(join(dir, entry.name), 'utf-8');
|
|
78
|
+
const { meta, body } = parseFrontmatter(raw);
|
|
79
|
+
const skillName = meta['name'] ?? entry.name.replace(/\.md$/, '');
|
|
80
|
+
skills.push({
|
|
81
|
+
name: skillName,
|
|
82
|
+
description: meta['description'],
|
|
83
|
+
system: meta['system'],
|
|
84
|
+
content: body,
|
|
85
|
+
source,
|
|
86
|
+
file: entry.name,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// skip unreadable files
|
|
91
|
+
}
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
// Subdirectory = a skill package (e.g. installed from zip)
|
|
95
|
+
if (entry.isDirectory() && !entry.name.startsWith('.')) {
|
|
96
|
+
const subDir = join(dir, entry.name);
|
|
97
|
+
try {
|
|
98
|
+
const subEntries = await readdir(subDir, { withFileTypes: true });
|
|
99
|
+
const mdFiles = subEntries.filter((e) => e.isFile() && e.name.endsWith('.md'));
|
|
100
|
+
if (mdFiles.length === 0)
|
|
101
|
+
continue;
|
|
102
|
+
// Concatenate all .md contents; prefer frontmatter name, fallback to directory name
|
|
103
|
+
const parts = [];
|
|
104
|
+
let description;
|
|
105
|
+
let system;
|
|
106
|
+
let frontmatterName;
|
|
107
|
+
for (const md of mdFiles) {
|
|
108
|
+
const raw = await readFile(join(subDir, md.name), 'utf-8');
|
|
109
|
+
const { meta, body } = parseFrontmatter(raw);
|
|
110
|
+
if (!description && meta['description'])
|
|
111
|
+
description = meta['description'];
|
|
112
|
+
if (!system && meta['system'])
|
|
113
|
+
system = meta['system'];
|
|
114
|
+
if (!frontmatterName && meta['name'])
|
|
115
|
+
frontmatterName = meta['name'];
|
|
116
|
+
parts.push(body);
|
|
117
|
+
}
|
|
118
|
+
skills.push({
|
|
119
|
+
name: frontmatterName ?? entry.name,
|
|
120
|
+
description,
|
|
121
|
+
system,
|
|
122
|
+
content: parts.join('\n\n'),
|
|
123
|
+
source,
|
|
124
|
+
file: entry.name + '/',
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// skip unreadable directories
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return skills;
|
|
133
|
+
}
|
|
134
|
+
/** Global skills directory: ~/.codegrunt/skills/ */
|
|
135
|
+
export function getGlobalSkillsDir() {
|
|
136
|
+
return join(homedir(), '.codegrunt', 'skills');
|
|
137
|
+
}
|
|
138
|
+
/** Project skills directory: .codegrunt/skills/ */
|
|
139
|
+
export function getProjectSkillsDir(cwd) {
|
|
140
|
+
return resolve(cwd, '.codegrunt', 'skills');
|
|
141
|
+
}
|
|
142
|
+
/** Load skills from project (.codegrunt/skills/) and global (~/.codegrunt/skills/) directories */
|
|
143
|
+
export async function loadSkills(cwd) {
|
|
144
|
+
const projectDir = getProjectSkillsDir(cwd);
|
|
145
|
+
const globalDir = getGlobalSkillsDir();
|
|
146
|
+
const [projectSkills, globalSkills] = await Promise.all([
|
|
147
|
+
loadSkillsFromDir(projectDir, 'project'),
|
|
148
|
+
loadSkillsFromDir(globalDir, 'global'),
|
|
149
|
+
]);
|
|
150
|
+
// Project skills take precedence over global ones with the same name
|
|
151
|
+
const seen = new Set();
|
|
152
|
+
const result = [];
|
|
153
|
+
for (const skill of [...projectSkills, ...globalSkills]) {
|
|
154
|
+
if (!seen.has(skill.name)) {
|
|
155
|
+
seen.add(skill.name);
|
|
156
|
+
result.push(skill);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return result;
|
|
160
|
+
}
|
|
161
|
+
/** Create a new skill file in the global skills directory */
|
|
162
|
+
export async function createSkill(name, description, content, system) {
|
|
163
|
+
const dir = getGlobalSkillsDir();
|
|
164
|
+
await mkdir(dir, { recursive: true });
|
|
165
|
+
// Sanitize the skill name to a safe filename: only allow alphanumerics, hyphens,
|
|
166
|
+
// and underscores. This prevents path traversal (e.g. "../evil") and reserved
|
|
167
|
+
// Windows filenames (e.g. "con", "prn") from causing silent failures.
|
|
168
|
+
const safeName = name.replace(/[^a-z0-9_-]/gi, '-').toLowerCase();
|
|
169
|
+
// After sanitization, reject names that are empty or consist only of hyphens
|
|
170
|
+
// (which means the original name had no valid characters at all).
|
|
171
|
+
if (!safeName || /^-+$/.test(safeName)) {
|
|
172
|
+
throw new Error(`Invalid skill name "${name}". Use letters, numbers, hyphens, or underscores.`);
|
|
173
|
+
}
|
|
174
|
+
const fileName = safeName + '.md';
|
|
175
|
+
const filePath = join(dir, fileName);
|
|
176
|
+
const frontmatterLines = [
|
|
177
|
+
'---',
|
|
178
|
+
`name: ${name}`,
|
|
179
|
+
`description: ${description}`,
|
|
180
|
+
];
|
|
181
|
+
if (system) {
|
|
182
|
+
// Use YAML literal block scalar for multi-line system prompts
|
|
183
|
+
frontmatterLines.push('system: |');
|
|
184
|
+
for (const line of system.split('\n')) {
|
|
185
|
+
frontmatterLines.push(' ' + line);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
frontmatterLines.push('---', '', content);
|
|
189
|
+
await writeFile(filePath, frontmatterLines.join('\n'), 'utf-8');
|
|
190
|
+
return fileName;
|
|
191
|
+
}
|
|
192
|
+
/** Install a skill from a .zip file into the global skills directory.
|
|
193
|
+
* Supports Claude Code skill zip format: one directory with .md files inside. */
|
|
194
|
+
export async function installSkillFromZip(zipPath) {
|
|
195
|
+
const dir = getGlobalSkillsDir();
|
|
196
|
+
await mkdir(dir, { recursive: true });
|
|
197
|
+
let zip;
|
|
198
|
+
try {
|
|
199
|
+
zip = new AdmZip(zipPath);
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
throw new Error(`Failed to read zip file: ${err instanceof Error ? err.message : String(err)}`);
|
|
203
|
+
}
|
|
204
|
+
const entries = zip.getEntries();
|
|
205
|
+
if (entries.length === 0) {
|
|
206
|
+
throw new Error('Zip file is empty');
|
|
207
|
+
}
|
|
208
|
+
// Collect all .md files and their paths
|
|
209
|
+
const mdEntries = entries.filter((e) => e.entryName.endsWith('.md') && !e.isDirectory);
|
|
210
|
+
if (mdEntries.length === 0) {
|
|
211
|
+
throw new Error('No .md skill files found in zip');
|
|
212
|
+
}
|
|
213
|
+
// Determine the skill name from the common root directory, or use the first .md filename
|
|
214
|
+
let skillName;
|
|
215
|
+
// If all .md files are under a single root directory, use that directory name
|
|
216
|
+
const rootDirs = new Set();
|
|
217
|
+
for (const e of mdEntries) {
|
|
218
|
+
const parts = e.entryName.split('/');
|
|
219
|
+
if (parts.length > 1) {
|
|
220
|
+
rootDirs.add(parts[0]);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (rootDirs.size === 1) {
|
|
224
|
+
skillName = [...rootDirs][0];
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
// No common root — use the zip filename (without extension)
|
|
228
|
+
skillName = basename(zipPath).replace(/\.zip$/i, '');
|
|
229
|
+
}
|
|
230
|
+
// Extract all files into ~/.codegrunt/skills/<skillName>/
|
|
231
|
+
const skillDir = join(dir, skillName);
|
|
232
|
+
await mkdir(skillDir, { recursive: true });
|
|
233
|
+
// Extract all non-directory entries
|
|
234
|
+
let fileCount = 0;
|
|
235
|
+
for (const entry of entries) {
|
|
236
|
+
if (entry.isDirectory)
|
|
237
|
+
continue;
|
|
238
|
+
// Determine the relative path within the skill directory
|
|
239
|
+
let relPath = entry.entryName;
|
|
240
|
+
// Strip the common root prefix if there is one
|
|
241
|
+
if (rootDirs.size === 1) {
|
|
242
|
+
const prefix = skillName + '/';
|
|
243
|
+
if (relPath.startsWith(prefix)) {
|
|
244
|
+
relPath = relPath.slice(prefix.length);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (!relPath)
|
|
248
|
+
continue;
|
|
249
|
+
// Guard against path traversal: a malicious zip could contain entries like
|
|
250
|
+
// "../../.bashrc" which would resolve outside skillDir after join().
|
|
251
|
+
// Reject any entry whose normalized path escapes the skill directory.
|
|
252
|
+
const destPath = join(skillDir, relPath);
|
|
253
|
+
if (!destPath.startsWith(skillDir + '/') && !destPath.startsWith(skillDir + '\\')) {
|
|
254
|
+
// Skip silently — don't throw, so a single bad entry doesn't abort the whole install
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
// Ensure parent directory exists
|
|
258
|
+
const destDir = resolve(destPath, '..');
|
|
259
|
+
if (destDir !== skillDir) {
|
|
260
|
+
await mkdir(destDir, { recursive: true });
|
|
261
|
+
}
|
|
262
|
+
try {
|
|
263
|
+
const content = entry.getData();
|
|
264
|
+
await writeFile(destPath, content);
|
|
265
|
+
fileCount++;
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
// skip files that can't be written
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return { name: skillName, fileCount };
|
|
272
|
+
}
|
|
273
|
+
/** Remove a skill from the global skills directory.
|
|
274
|
+
* Tries directory (zip-installed) first, then flat .md file. */
|
|
275
|
+
export async function removeSkill(name) {
|
|
276
|
+
const dir = getGlobalSkillsDir();
|
|
277
|
+
const skillDir = join(dir, name);
|
|
278
|
+
const skillFile = join(dir, name + '.md');
|
|
279
|
+
// Try removing a subdirectory first (zip-installed skill)
|
|
280
|
+
try {
|
|
281
|
+
await access(skillDir);
|
|
282
|
+
await rm(skillDir, { recursive: true });
|
|
283
|
+
return name;
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
// Not a directory
|
|
287
|
+
}
|
|
288
|
+
// Try removing a flat .md file
|
|
289
|
+
try {
|
|
290
|
+
await access(skillFile);
|
|
291
|
+
await unlink(skillFile);
|
|
292
|
+
return name;
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
// Not a file either
|
|
296
|
+
}
|
|
297
|
+
throw new Error(`Skill "${name}" not found in ${dir}`);
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/cli/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import { readFileSync } from 'fs';
|
|
3
|
+
import { dirname, resolve } from 'path';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import ora from 'ora';
|
|
7
|
+
import { printError } from '../utils/display.js';
|
|
8
|
+
// ── Version utilities ────────────────────────────────────────────────────────
|
|
9
|
+
/**
|
|
10
|
+
* Parse a semver string into [major, minor, patch].
|
|
11
|
+
* Returns [0,0,0] for non-standard formats.
|
|
12
|
+
*/
|
|
13
|
+
function parseSemver(v) {
|
|
14
|
+
const parts = v.split('.');
|
|
15
|
+
return [
|
|
16
|
+
parseInt(parts[0], 10) || 0,
|
|
17
|
+
parseInt(parts[1], 10) || 0,
|
|
18
|
+
parseInt(parts[2], 10) || 0,
|
|
19
|
+
];
|
|
20
|
+
}
|
|
21
|
+
/** Returns true if version `a` is strictly newer than `b` */
|
|
22
|
+
function isNewer(a, b) {
|
|
23
|
+
const [a1, a2, a3] = parseSemver(a);
|
|
24
|
+
const [b1, b2, b3] = parseSemver(b);
|
|
25
|
+
if (a1 !== b1)
|
|
26
|
+
return a1 > b1;
|
|
27
|
+
if (a2 !== b2)
|
|
28
|
+
return a2 > b2;
|
|
29
|
+
return a3 > b3;
|
|
30
|
+
}
|
|
31
|
+
// ── Current version ──────────────────────────────────────────────────────────
|
|
32
|
+
function getCurrentVersion() {
|
|
33
|
+
try {
|
|
34
|
+
// dist/cli/update.js → go up 2 levels to project root → package.json
|
|
35
|
+
const pkgPath = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..', 'package.json');
|
|
36
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
37
|
+
return pkg.version || '0.0.0';
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return '0.0.0';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// ── Fetch latest ─────────────────────────────────────────────────────────────
|
|
44
|
+
const NPM_REGISTRY = 'https://registry.npmjs.org/codegrunt/latest';
|
|
45
|
+
async function fetchLatestVersion() {
|
|
46
|
+
const controller = new AbortController();
|
|
47
|
+
const timeout = setTimeout(() => controller.abort(), 5000);
|
|
48
|
+
try {
|
|
49
|
+
const response = await fetch(NPM_REGISTRY, {
|
|
50
|
+
signal: controller.signal,
|
|
51
|
+
headers: { 'Accept': 'application/json' },
|
|
52
|
+
});
|
|
53
|
+
if (!response.ok)
|
|
54
|
+
return null;
|
|
55
|
+
const data = (await response.json());
|
|
56
|
+
return data.version || null;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
clearTimeout(timeout);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// ── Install ──────────────────────────────────────────────────────────────────
|
|
66
|
+
function runNpmInstall(version) {
|
|
67
|
+
return new Promise((resolve_p) => {
|
|
68
|
+
const child = spawn('npm', ['install', '-g', `codegrunt@${version}`], {
|
|
69
|
+
stdio: 'inherit',
|
|
70
|
+
// shell:true on Windows so .cmd wrappers work
|
|
71
|
+
shell: process.platform === 'win32',
|
|
72
|
+
});
|
|
73
|
+
child.on('close', (code) => {
|
|
74
|
+
resolve_p(code === 0);
|
|
75
|
+
});
|
|
76
|
+
child.on('error', () => {
|
|
77
|
+
resolve_p(false);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
// ── Main entry ───────────────────────────────────────────────────────────────
|
|
82
|
+
export async function runUpdate(opts) {
|
|
83
|
+
const currentVersion = getCurrentVersion();
|
|
84
|
+
const spinner = ora('Checking for updates...').start();
|
|
85
|
+
const latestVersion = await fetchLatestVersion();
|
|
86
|
+
if (!latestVersion) {
|
|
87
|
+
spinner.fail('Unable to reach npm registry');
|
|
88
|
+
console.log(chalk.gray(' Check your network connection and try again.'));
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
spinner.stop();
|
|
92
|
+
// ── Already up to date ──
|
|
93
|
+
if (!isNewer(latestVersion, currentVersion)) {
|
|
94
|
+
console.log(chalk.green('✓ codegrunt is up to date') +
|
|
95
|
+
chalk.gray(` (v${currentVersion})`));
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
// ── Update available ──
|
|
99
|
+
console.log();
|
|
100
|
+
console.log(chalk.gray(' codegrunt ') +
|
|
101
|
+
chalk.yellow(`v${currentVersion}`) +
|
|
102
|
+
chalk.gray(' → ') +
|
|
103
|
+
chalk.green(`v${latestVersion}`));
|
|
104
|
+
console.log();
|
|
105
|
+
if (opts.checkOnly) {
|
|
106
|
+
console.log(chalk.gray(` Run ${chalk.cyan('codegrunt update')} to upgrade.`));
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
// ── Confirm ──
|
|
110
|
+
if (!opts.confirm) {
|
|
111
|
+
const readline = await import('readline');
|
|
112
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
113
|
+
const answer = await new Promise((resolve) => {
|
|
114
|
+
rl.question(chalk.bold('Upgrade now? [y/N] '), resolve);
|
|
115
|
+
});
|
|
116
|
+
rl.close();
|
|
117
|
+
if (!answer.toLowerCase().startsWith('y')) {
|
|
118
|
+
console.log(chalk.gray('Update cancelled.'));
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// ── Install ──
|
|
123
|
+
console.log(chalk.gray(`\nRunning ${chalk.cyan(`npm install -g codegrunt@${latestVersion}`)}...\n`));
|
|
124
|
+
const success = await runNpmInstall(latestVersion);
|
|
125
|
+
if (success) {
|
|
126
|
+
console.log();
|
|
127
|
+
console.log(chalk.green(`✓ Upgraded to codegrunt@${latestVersion}`));
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
console.log();
|
|
131
|
+
printError(`Upgrade failed. Try manually: ${chalk.cyan('npm install -g codegrunt@latest')}`);
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/cli/update.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { CodeGruntConfig } from './types.js';
|
|
2
|
+
export declare function loadConfig(): Promise<CodeGruntConfig>;
|
|
3
|
+
export declare function saveConfig(config: CodeGruntConfig): Promise<void>;
|
|
4
|
+
/**
|
|
5
|
+
* Detect whether the current model is a DeepSeek "pure" reasoner (R1) model.
|
|
6
|
+
* R1 models do NOT support `temperature`, reject the `system` role, and
|
|
7
|
+
* require the system prompt to be embedded in the first user message.
|
|
8
|
+
*/
|
|
9
|
+
export declare function isReasonerModel(model: string): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Detect whether the model supports reasoning/thinking capabilities
|
|
12
|
+
* (emits reasoning_content, supports reasoning_effort parameter).
|
|
13
|
+
* This includes R1 reasoner models AND V4 Pro models.
|
|
14
|
+
*/
|
|
15
|
+
export declare function supportsReasoning(model: string): boolean;
|
|
16
|
+
/** Reasoner models have a huge context (1M tokens) — give them more room */
|
|
17
|
+
export declare const CONTEXT_BUDGET = 100000;
|
|
18
|
+
/** Chat model context window is 128K — budget for conversation history */
|
|
19
|
+
export declare const CHAT_CONTEXT_BUDGET = 90000;
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'fs/promises';
|
|
2
|
+
import { homedir } from 'os';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
const CONFIG_DIR = join(homedir(), '.codegrunt');
|
|
5
|
+
const CONFIG_PATH = join(CONFIG_DIR, 'config.json');
|
|
6
|
+
const DEFAULTS = {
|
|
7
|
+
provider: 'deepseek',
|
|
8
|
+
model: 'deepseek-v4-pro',
|
|
9
|
+
maxTokens: 8192,
|
|
10
|
+
temperature: 0.2,
|
|
11
|
+
apiKey: '',
|
|
12
|
+
baseURL: 'https://api.deepseek.com',
|
|
13
|
+
reasoningEffort: 'medium',
|
|
14
|
+
};
|
|
15
|
+
async function loadConfigFile() {
|
|
16
|
+
try {
|
|
17
|
+
const raw = await readFile(CONFIG_PATH, 'utf-8');
|
|
18
|
+
return JSON.parse(raw);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return {};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/** Parse an integer env var, returning the fallback if the value is missing or NaN. */
|
|
25
|
+
function envInt(name, fallback) {
|
|
26
|
+
const raw = process.env[name];
|
|
27
|
+
if (!raw)
|
|
28
|
+
return fallback;
|
|
29
|
+
const n = parseInt(raw, 10);
|
|
30
|
+
return isNaN(n) ? fallback : n;
|
|
31
|
+
}
|
|
32
|
+
function envFloat(name, fallback) {
|
|
33
|
+
const raw = process.env[name];
|
|
34
|
+
if (!raw)
|
|
35
|
+
return fallback;
|
|
36
|
+
const n = parseFloat(raw);
|
|
37
|
+
return isNaN(n) ? fallback : n;
|
|
38
|
+
}
|
|
39
|
+
export async function loadConfig() {
|
|
40
|
+
const fileConfig = await loadConfigFile();
|
|
41
|
+
return {
|
|
42
|
+
provider: process.env.CODEGRUNT_PROVIDER ?? fileConfig.provider ?? DEFAULTS.provider,
|
|
43
|
+
model: process.env.CODEGRUNT_MODEL ?? fileConfig.model ?? DEFAULTS.model,
|
|
44
|
+
maxTokens: envInt('CODEGRUNT_MAX_TOKENS', fileConfig.maxTokens ?? DEFAULTS.maxTokens),
|
|
45
|
+
temperature: envFloat('CODEGRUNT_TEMPERATURE', fileConfig.temperature ?? DEFAULTS.temperature),
|
|
46
|
+
apiKey: process.env.DEEPSEEK_API_KEY ?? fileConfig.apiKey ?? '',
|
|
47
|
+
baseURL: process.env.CODEGRUNT_BASE_URL ?? fileConfig.baseURL ?? DEFAULTS.baseURL,
|
|
48
|
+
reasoningEffort: process.env.CODEGRUNT_REASONING_EFFORT
|
|
49
|
+
?? fileConfig.reasoningEffort
|
|
50
|
+
?? DEFAULTS.reasoningEffort,
|
|
51
|
+
topP: envFloat('CODEGRUNT_TOP_P', fileConfig.topP ?? DEFAULTS.topP),
|
|
52
|
+
frequencyPenalty: envFloat('CODEGRUNT_FREQUENCY_PENALTY', fileConfig.frequencyPenalty ?? DEFAULTS.frequencyPenalty),
|
|
53
|
+
presencePenalty: envFloat('CODEGRUNT_PRESENCE_PENALTY', fileConfig.presencePenalty ?? DEFAULTS.presencePenalty),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export async function saveConfig(config) {
|
|
57
|
+
await mkdir(CONFIG_DIR, { recursive: true });
|
|
58
|
+
await writeFile(CONFIG_PATH, JSON.stringify({
|
|
59
|
+
apiKey: config.apiKey,
|
|
60
|
+
model: config.model,
|
|
61
|
+
maxTokens: config.maxTokens,
|
|
62
|
+
temperature: config.temperature,
|
|
63
|
+
reasoningEffort: config.reasoningEffort,
|
|
64
|
+
topP: config.topP,
|
|
65
|
+
frequencyPenalty: config.frequencyPenalty,
|
|
66
|
+
presencePenalty: config.presencePenalty,
|
|
67
|
+
}, null, 2), 'utf-8');
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Detect whether the current model is a DeepSeek "pure" reasoner (R1) model.
|
|
71
|
+
* R1 models do NOT support `temperature`, reject the `system` role, and
|
|
72
|
+
* require the system prompt to be embedded in the first user message.
|
|
73
|
+
*/
|
|
74
|
+
export function isReasonerModel(model) {
|
|
75
|
+
const lower = model.toLowerCase();
|
|
76
|
+
return lower.includes('reasoner') || lower.includes('r1');
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Detect whether the model supports reasoning/thinking capabilities
|
|
80
|
+
* (emits reasoning_content, supports reasoning_effort parameter).
|
|
81
|
+
* This includes R1 reasoner models AND V4 Pro models.
|
|
82
|
+
*/
|
|
83
|
+
export function supportsReasoning(model) {
|
|
84
|
+
const lower = model.toLowerCase();
|
|
85
|
+
return isReasonerModel(model)
|
|
86
|
+
|| lower.includes('v4')
|
|
87
|
+
|| lower.includes('pro');
|
|
88
|
+
}
|
|
89
|
+
/** Reasoner models have a huge context (1M tokens) — give them more room */
|
|
90
|
+
export const CONTEXT_BUDGET = 100_000;
|
|
91
|
+
/** Chat model context window is 128K — budget for conversation history */
|
|
92
|
+
export const CHAT_CONTEXT_BUDGET = 90_000;
|
|
93
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AgentRunOptions } from '../../types.js';
|
|
2
|
+
declare const sessionUsage: {
|
|
3
|
+
inputTokens: number;
|
|
4
|
+
outputTokens: number;
|
|
5
|
+
cacheHitTokens: number;
|
|
6
|
+
cacheMissTokens: number;
|
|
7
|
+
};
|
|
8
|
+
export declare function addUsage(u: {
|
|
9
|
+
inputTokens: number;
|
|
10
|
+
outputTokens: number;
|
|
11
|
+
cacheHitTokens: number;
|
|
12
|
+
cacheMissTokens: number;
|
|
13
|
+
}): void;
|
|
14
|
+
export declare function getSessionUsage(): typeof sessionUsage;
|
|
15
|
+
export declare function resetSessionUsage(): void;
|
|
16
|
+
export declare function runAgentLoop(options: AgentRunOptions): Promise<void>;
|
|
17
|
+
export {};
|