@eldrforge/kodrdriv 0.0.19 → 0.0.24
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/dist/arguments.js +664 -0
- package/dist/arguments.js.map +1 -0
- package/dist/commands/audio-commit.js +99 -0
- package/dist/commands/audio-commit.js.map +1 -0
- package/dist/commands/audio-review.js +110 -0
- package/dist/commands/audio-review.js.map +1 -0
- package/dist/commands/clean.js +36 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/commit.js +125 -0
- package/dist/commands/commit.js.map +1 -0
- package/dist/commands/link.js +184 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/publish.js +301 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/release.js +85 -0
- package/dist/commands/release.js.map +1 -0
- package/dist/commands/review.js +268 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/select-audio.js +29 -0
- package/dist/commands/select-audio.js.map +1 -0
- package/dist/commands/unlink.js +180 -0
- package/dist/commands/unlink.js.map +1 -0
- package/dist/constants.js +154 -0
- package/dist/constants.js.map +1 -0
- package/dist/content/diff.js +220 -0
- package/dist/content/diff.js.map +1 -0
- package/dist/content/issues.js +360 -0
- package/dist/content/issues.js.map +1 -0
- package/dist/content/log.js +53 -0
- package/dist/content/log.js.map +1 -0
- package/dist/content/releaseNotes.js +90 -0
- package/dist/content/releaseNotes.js.map +1 -0
- package/dist/error/ExitError.js +9 -0
- package/dist/error/ExitError.js.map +1 -0
- package/dist/logging.js +103 -0
- package/dist/logging.js.map +1 -0
- package/dist/main.js +30 -3707
- package/dist/main.js.map +1 -1
- package/dist/prompt/commit.js +56 -0
- package/dist/prompt/commit.js.map +1 -0
- package/dist/prompt/release.js +52 -0
- package/dist/prompt/release.js.map +1 -0
- package/dist/prompt/review.js +64 -0
- package/dist/prompt/review.js.map +1 -0
- package/dist/types.js +88 -0
- package/dist/types.js.map +1 -0
- package/dist/util/child.js +23 -0
- package/dist/util/child.js.map +1 -0
- package/dist/util/general.js +96 -0
- package/dist/util/general.js.map +1 -0
- package/dist/util/github.js +208 -0
- package/dist/util/github.js.map +1 -0
- package/dist/util/openai.js +146 -0
- package/dist/util/openai.js.map +1 -0
- package/dist/util/stdin.js +101 -0
- package/dist/util/stdin.js.map +1 -0
- package/dist/util/storage.js +149 -0
- package/dist/util/storage.js.map +1 -0
- package/package.json +5 -5
- /package/dist/{src/prompt → prompt}/instructions/commit.md +0 -0
- /package/dist/{src/prompt → prompt}/instructions/release.md +0 -0
- /package/dist/{src/prompt → prompt}/instructions/review.md +0 -0
- /package/dist/{src/prompt → prompt}/personas/releaser.md +0 -0
- /package/dist/{src/prompt → prompt}/personas/you.md +0 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import yaml from 'js-yaml';
|
|
3
|
+
import { getLogger } from '../logging.js';
|
|
4
|
+
import { create } from '../util/storage.js';
|
|
5
|
+
import { run } from '../util/child.js';
|
|
6
|
+
|
|
7
|
+
const scanDirectoryForPackages = async (rootDir, storage)=>{
|
|
8
|
+
const logger = getLogger();
|
|
9
|
+
const packageMap = new Map(); // packageName -> relativePath
|
|
10
|
+
const absoluteRootDir = path.resolve(process.cwd(), rootDir);
|
|
11
|
+
logger.verbose(`Scanning directory for packages: ${absoluteRootDir}`);
|
|
12
|
+
if (!await storage.exists(absoluteRootDir) || !await storage.isDirectory(absoluteRootDir)) {
|
|
13
|
+
logger.verbose(`Root directory does not exist or is not a directory: ${absoluteRootDir}`);
|
|
14
|
+
return packageMap;
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
// Get all subdirectories in the root directory
|
|
18
|
+
const items = await storage.listFiles(absoluteRootDir);
|
|
19
|
+
for (const item of items){
|
|
20
|
+
const itemPath = path.join(absoluteRootDir, item);
|
|
21
|
+
if (await storage.isDirectory(itemPath)) {
|
|
22
|
+
const packageJsonPath = path.join(itemPath, 'package.json');
|
|
23
|
+
if (await storage.exists(packageJsonPath)) {
|
|
24
|
+
try {
|
|
25
|
+
const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');
|
|
26
|
+
const packageJson = JSON.parse(packageJsonContent);
|
|
27
|
+
if (packageJson.name) {
|
|
28
|
+
const relativePath = path.relative(process.cwd(), itemPath);
|
|
29
|
+
packageMap.set(packageJson.name, relativePath);
|
|
30
|
+
logger.debug(`Found package: ${packageJson.name} at ${relativePath}`);
|
|
31
|
+
}
|
|
32
|
+
} catch (error) {
|
|
33
|
+
logger.debug(`Failed to parse package.json at ${packageJsonPath}: ${error}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
} catch (error) {
|
|
39
|
+
logger.warn(`Failed to read directory ${absoluteRootDir}: ${error}`);
|
|
40
|
+
}
|
|
41
|
+
return packageMap;
|
|
42
|
+
};
|
|
43
|
+
const findPackagesToUnlink = async (scopeRoots, storage)=>{
|
|
44
|
+
const logger = getLogger();
|
|
45
|
+
const packagesToUnlink = [];
|
|
46
|
+
logger.silly(`Finding packages to unlink from scope roots: ${JSON.stringify(scopeRoots)}`);
|
|
47
|
+
// Scan all scope roots to build a comprehensive map of packages that should be unlinked
|
|
48
|
+
const allScopePackages = new Map(); // packageName -> relativePath
|
|
49
|
+
for (const [scope, rootDir] of Object.entries(scopeRoots)){
|
|
50
|
+
logger.verbose(`Scanning scope ${scope} at root directory: ${rootDir}`);
|
|
51
|
+
const scopePackages = await scanDirectoryForPackages(rootDir, storage);
|
|
52
|
+
// Add packages from this scope to the overall map
|
|
53
|
+
for (const [packageName, packagePath] of scopePackages){
|
|
54
|
+
if (packageName.startsWith(scope)) {
|
|
55
|
+
allScopePackages.set(packageName, packagePath);
|
|
56
|
+
packagesToUnlink.push(packagePath);
|
|
57
|
+
logger.debug(`Package to unlink: ${packageName} -> ${packagePath}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return packagesToUnlink;
|
|
62
|
+
};
|
|
63
|
+
const readCurrentWorkspaceFile = async (workspaceFilePath, storage)=>{
|
|
64
|
+
if (await storage.exists(workspaceFilePath)) {
|
|
65
|
+
try {
|
|
66
|
+
const content = await storage.readFile(workspaceFilePath, 'utf-8');
|
|
67
|
+
return yaml.load(content) || {};
|
|
68
|
+
} catch (error) {
|
|
69
|
+
throw new Error(`Failed to parse existing workspace file: ${error}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return {};
|
|
73
|
+
};
|
|
74
|
+
const writeWorkspaceFile = async (workspaceFilePath, config, storage)=>{
|
|
75
|
+
let yamlContent = yaml.dump(config, {
|
|
76
|
+
indent: 2,
|
|
77
|
+
lineWidth: -1,
|
|
78
|
+
noRefs: true,
|
|
79
|
+
sortKeys: false,
|
|
80
|
+
quotingType: "'",
|
|
81
|
+
forceQuotes: true
|
|
82
|
+
});
|
|
83
|
+
// Post-process to fix numeric values that shouldn't be quoted
|
|
84
|
+
yamlContent = yamlContent.replace(/: '(\d+(?:\.\d+)*)'/g, ': $1');
|
|
85
|
+
await storage.writeFile(workspaceFilePath, yamlContent, 'utf-8');
|
|
86
|
+
};
|
|
87
|
+
const execute = async (runConfig)=>{
|
|
88
|
+
var _runConfig_link, _runConfig_link1, _runConfig_link2;
|
|
89
|
+
const logger = getLogger();
|
|
90
|
+
const storage = create({
|
|
91
|
+
log: logger.info
|
|
92
|
+
});
|
|
93
|
+
logger.verbose('Starting pnpm workspace unlink management...');
|
|
94
|
+
// Read current package.json
|
|
95
|
+
const packageJsonPath = path.join(process.cwd(), 'package.json');
|
|
96
|
+
if (!await storage.exists(packageJsonPath)) {
|
|
97
|
+
throw new Error('package.json not found in current directory.');
|
|
98
|
+
}
|
|
99
|
+
let packageJson;
|
|
100
|
+
try {
|
|
101
|
+
const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');
|
|
102
|
+
packageJson = JSON.parse(packageJsonContent);
|
|
103
|
+
} catch (error) {
|
|
104
|
+
throw new Error(`Failed to parse package.json: ${error}`);
|
|
105
|
+
}
|
|
106
|
+
logger.verbose(`Processing package: ${packageJson.name || 'unnamed'}`);
|
|
107
|
+
// Get configuration
|
|
108
|
+
const scopeRoots = ((_runConfig_link = runConfig.link) === null || _runConfig_link === void 0 ? void 0 : _runConfig_link.scopeRoots) || {};
|
|
109
|
+
const workspaceFileName = ((_runConfig_link1 = runConfig.link) === null || _runConfig_link1 === void 0 ? void 0 : _runConfig_link1.workspaceFile) || 'pnpm-workspace.yaml';
|
|
110
|
+
const isDryRun = runConfig.dryRun || ((_runConfig_link2 = runConfig.link) === null || _runConfig_link2 === void 0 ? void 0 : _runConfig_link2.dryRun) || false;
|
|
111
|
+
logger.silly('Extracted scopeRoots:', JSON.stringify(scopeRoots));
|
|
112
|
+
logger.debug('Extracted workspaceFileName:', workspaceFileName);
|
|
113
|
+
logger.debug('Extracted isDryRun:', isDryRun);
|
|
114
|
+
if (Object.keys(scopeRoots).length === 0) {
|
|
115
|
+
logger.verbose('No scope roots configured. Skipping unlink management.');
|
|
116
|
+
return 'No scope roots configured. Skipping unlink management.';
|
|
117
|
+
}
|
|
118
|
+
logger.silly(`Configured scope roots: ${JSON.stringify(scopeRoots)}`);
|
|
119
|
+
// Find packages to unlink based on scope roots
|
|
120
|
+
const packagesToUnlinkPaths = await findPackagesToUnlink(scopeRoots, storage);
|
|
121
|
+
if (packagesToUnlinkPaths.length === 0) {
|
|
122
|
+
logger.verbose('No packages found matching scope roots for unlinking.');
|
|
123
|
+
return 'No packages found matching scope roots for unlinking.';
|
|
124
|
+
}
|
|
125
|
+
logger.verbose(`Found ${packagesToUnlinkPaths.length} packages that could be unlinked: ${packagesToUnlinkPaths.join(', ')}`);
|
|
126
|
+
// Read existing workspace configuration
|
|
127
|
+
const workspaceFilePath = path.join(process.cwd(), workspaceFileName);
|
|
128
|
+
const workspaceConfig = await readCurrentWorkspaceFile(workspaceFilePath, storage);
|
|
129
|
+
if (!workspaceConfig.overrides || Object.keys(workspaceConfig.overrides).length === 0) {
|
|
130
|
+
logger.verbose('No overrides found in workspace file. Nothing to do.');
|
|
131
|
+
return 'No overrides found in workspace file. Nothing to do.';
|
|
132
|
+
}
|
|
133
|
+
// Filter out packages that match our scope roots from overrides
|
|
134
|
+
const existingOverrides = workspaceConfig.overrides || {};
|
|
135
|
+
const remainingOverrides = {};
|
|
136
|
+
const actuallyRemovedPackages = [];
|
|
137
|
+
const packagesToUnlinkSet = new Set(packagesToUnlinkPaths.map((p)=>`link:${p}`));
|
|
138
|
+
for (const [pkgName, pkgLink] of Object.entries(existingOverrides)){
|
|
139
|
+
if (packagesToUnlinkSet.has(pkgLink)) {
|
|
140
|
+
actuallyRemovedPackages.push(pkgName);
|
|
141
|
+
} else {
|
|
142
|
+
remainingOverrides[pkgName] = pkgLink;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (actuallyRemovedPackages.length === 0) {
|
|
146
|
+
logger.verbose('No linked packages found in workspace file that match scope roots.');
|
|
147
|
+
return 'No linked packages found in workspace file that match scope roots.';
|
|
148
|
+
}
|
|
149
|
+
const updatedConfig = {
|
|
150
|
+
...workspaceConfig,
|
|
151
|
+
overrides: remainingOverrides
|
|
152
|
+
};
|
|
153
|
+
if (Object.keys(remainingOverrides).length === 0) {
|
|
154
|
+
delete updatedConfig.overrides;
|
|
155
|
+
}
|
|
156
|
+
// Write the updated workspace file
|
|
157
|
+
if (isDryRun) {
|
|
158
|
+
logger.verbose('DRY RUN: Would write the following workspace configuration:');
|
|
159
|
+
logger.silly(yaml.dump(updatedConfig, {
|
|
160
|
+
indent: 2
|
|
161
|
+
}));
|
|
162
|
+
logger.verbose(`DRY RUN: Would remove ${actuallyRemovedPackages.length} packages: ${actuallyRemovedPackages.join(', ')}`);
|
|
163
|
+
} else {
|
|
164
|
+
await writeWorkspaceFile(workspaceFilePath, updatedConfig, storage);
|
|
165
|
+
logger.verbose(`Updated ${workspaceFileName} - removed ${actuallyRemovedPackages.length} linked packages from overrides.`);
|
|
166
|
+
// Rebuild pnpm lock file and node_modules
|
|
167
|
+
logger.verbose('Rebuilding pnpm lock file and node_modules...');
|
|
168
|
+
try {
|
|
169
|
+
await run('pnpm install');
|
|
170
|
+
logger.verbose('Successfully rebuilt pnpm lock file and node_modules');
|
|
171
|
+
} catch (error) {
|
|
172
|
+
logger.warn(`Failed to rebuild dependencies: ${error}. You may need to run 'pnpm install' manually.`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
const summary = `Successfully unlinked ${actuallyRemovedPackages.length} sibling packages:\n${actuallyRemovedPackages.map((pkg)=>` - ${pkg}`).join('\n')}`;
|
|
176
|
+
return summary;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
export { execute };
|
|
180
|
+
//# sourceMappingURL=unlink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unlink.js","sources":["../../src/commands/unlink.ts"],"sourcesContent":["import path from 'path';\nimport yaml from 'js-yaml';\nimport { getLogger } from '../logging';\nimport { Config } from '../types';\nimport { create as createStorage } from '../util/storage';\nimport { run } from '../util/child';\n\ninterface PackageJson {\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n}\n\ninterface PnpmWorkspaceFile {\n packages?: string[];\n overrides?: Record<string, string>;\n}\n\nconst scanDirectoryForPackages = async (rootDir: string, storage: any): Promise<Map<string, string>> => {\n const logger = getLogger();\n const packageMap = new Map<string, string>(); // packageName -> relativePath\n\n const absoluteRootDir = path.resolve(process.cwd(), rootDir);\n logger.verbose(`Scanning directory for packages: ${absoluteRootDir}`);\n\n if (!await storage.exists(absoluteRootDir) || !await storage.isDirectory(absoluteRootDir)) {\n logger.verbose(`Root directory does not exist or is not a directory: ${absoluteRootDir}`);\n return packageMap;\n }\n\n try {\n // Get all subdirectories in the root directory\n const items = await storage.listFiles(absoluteRootDir);\n\n for (const item of items) {\n const itemPath = path.join(absoluteRootDir, item);\n\n if (await storage.isDirectory(itemPath)) {\n const packageJsonPath = path.join(itemPath, 'package.json');\n\n if (await storage.exists(packageJsonPath)) {\n try {\n const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');\n const packageJson = JSON.parse(packageJsonContent) as PackageJson;\n\n if (packageJson.name) {\n const relativePath = path.relative(process.cwd(), itemPath);\n packageMap.set(packageJson.name, relativePath);\n logger.debug(`Found package: ${packageJson.name} at ${relativePath}`);\n }\n } catch (error) {\n logger.debug(`Failed to parse package.json at ${packageJsonPath}: ${error}`);\n }\n }\n }\n }\n } catch (error) {\n logger.warn(`Failed to read directory ${absoluteRootDir}: ${error}`);\n }\n\n return packageMap;\n};\n\nconst findPackagesToUnlink = async (scopeRoots: Record<string, string>, storage: any): Promise<string[]> => {\n const logger = getLogger();\n const packagesToUnlink: string[] = [];\n\n logger.silly(`Finding packages to unlink from scope roots: ${JSON.stringify(scopeRoots)}`);\n\n // Scan all scope roots to build a comprehensive map of packages that should be unlinked\n const allScopePackages = new Map<string, string>(); // packageName -> relativePath\n\n for (const [scope, rootDir] of Object.entries(scopeRoots)) {\n logger.verbose(`Scanning scope ${scope} at root directory: ${rootDir}`);\n const scopePackages = await scanDirectoryForPackages(rootDir, storage);\n\n // Add packages from this scope to the overall map\n for (const [packageName, packagePath] of scopePackages) {\n if (packageName.startsWith(scope)) {\n allScopePackages.set(packageName, packagePath);\n packagesToUnlink.push(packagePath);\n logger.debug(`Package to unlink: ${packageName} -> ${packagePath}`);\n }\n }\n }\n\n return packagesToUnlink;\n};\n\nconst readCurrentWorkspaceFile = async (workspaceFilePath: string, storage: any): Promise<PnpmWorkspaceFile> => {\n if (await storage.exists(workspaceFilePath)) {\n try {\n const content = await storage.readFile(workspaceFilePath, 'utf-8');\n return (yaml.load(content) as PnpmWorkspaceFile) || {};\n } catch (error) {\n throw new Error(`Failed to parse existing workspace file: ${error}`);\n }\n }\n return {};\n};\n\nconst writeWorkspaceFile = async (workspaceFilePath: string, config: PnpmWorkspaceFile, storage: any): Promise<void> => {\n let yamlContent = yaml.dump(config, {\n indent: 2,\n lineWidth: -1,\n noRefs: true,\n sortKeys: false,\n quotingType: \"'\",\n forceQuotes: true\n });\n\n // Post-process to fix numeric values that shouldn't be quoted\n yamlContent = yamlContent.replace(/: '(\\d+(?:\\.\\d+)*)'/g, ': $1');\n\n await storage.writeFile(workspaceFilePath, yamlContent, 'utf-8');\n};\n\nexport const execute = async (runConfig: Config): Promise<string> => {\n const logger = getLogger();\n const storage = createStorage({ log: logger.info });\n\n logger.verbose('Starting pnpm workspace unlink management...');\n\n // Read current package.json\n const packageJsonPath = path.join(process.cwd(), 'package.json');\n if (!await storage.exists(packageJsonPath)) {\n throw new Error('package.json not found in current directory.');\n }\n\n let packageJson: PackageJson;\n try {\n const packageJsonContent = await storage.readFile(packageJsonPath, 'utf-8');\n packageJson = JSON.parse(packageJsonContent);\n } catch (error) {\n throw new Error(`Failed to parse package.json: ${error}`);\n }\n\n logger.verbose(`Processing package: ${packageJson.name || 'unnamed'}`);\n\n // Get configuration\n const scopeRoots = runConfig.link?.scopeRoots || {};\n const workspaceFileName = runConfig.link?.workspaceFile || 'pnpm-workspace.yaml';\n const isDryRun = runConfig.dryRun || runConfig.link?.dryRun || false;\n\n logger.silly('Extracted scopeRoots:', JSON.stringify(scopeRoots));\n logger.debug('Extracted workspaceFileName:', workspaceFileName);\n logger.debug('Extracted isDryRun:', isDryRun);\n\n if (Object.keys(scopeRoots).length === 0) {\n logger.verbose('No scope roots configured. Skipping unlink management.');\n return 'No scope roots configured. Skipping unlink management.';\n }\n\n logger.silly(`Configured scope roots: ${JSON.stringify(scopeRoots)}`);\n\n // Find packages to unlink based on scope roots\n const packagesToUnlinkPaths = await findPackagesToUnlink(scopeRoots, storage);\n\n if (packagesToUnlinkPaths.length === 0) {\n logger.verbose('No packages found matching scope roots for unlinking.');\n return 'No packages found matching scope roots for unlinking.';\n }\n\n logger.verbose(`Found ${packagesToUnlinkPaths.length} packages that could be unlinked: ${packagesToUnlinkPaths.join(', ')}`);\n\n // Read existing workspace configuration\n const workspaceFilePath = path.join(process.cwd(), workspaceFileName);\n const workspaceConfig = await readCurrentWorkspaceFile(workspaceFilePath, storage);\n\n if (!workspaceConfig.overrides || Object.keys(workspaceConfig.overrides).length === 0) {\n logger.verbose('No overrides found in workspace file. Nothing to do.');\n return 'No overrides found in workspace file. Nothing to do.';\n }\n\n // Filter out packages that match our scope roots from overrides\n const existingOverrides = workspaceConfig.overrides || {};\n const remainingOverrides: Record<string, string> = {};\n const actuallyRemovedPackages: string[] = [];\n const packagesToUnlinkSet = new Set(packagesToUnlinkPaths.map(p => `link:${p}`));\n\n for (const [pkgName, pkgLink] of Object.entries(existingOverrides)) {\n if (packagesToUnlinkSet.has(pkgLink)) {\n actuallyRemovedPackages.push(pkgName);\n } else {\n remainingOverrides[pkgName] = pkgLink;\n }\n }\n\n if (actuallyRemovedPackages.length === 0) {\n logger.verbose('No linked packages found in workspace file that match scope roots.');\n return 'No linked packages found in workspace file that match scope roots.';\n }\n\n const updatedConfig: PnpmWorkspaceFile = {\n ...workspaceConfig,\n overrides: remainingOverrides\n };\n\n if (Object.keys(remainingOverrides).length === 0) {\n delete updatedConfig.overrides;\n }\n\n // Write the updated workspace file\n if (isDryRun) {\n logger.verbose('DRY RUN: Would write the following workspace configuration:');\n logger.silly(yaml.dump(updatedConfig, { indent: 2 }));\n logger.verbose(`DRY RUN: Would remove ${actuallyRemovedPackages.length} packages: ${actuallyRemovedPackages.join(', ')}`);\n } else {\n await writeWorkspaceFile(workspaceFilePath, updatedConfig, storage);\n logger.verbose(`Updated ${workspaceFileName} - removed ${actuallyRemovedPackages.length} linked packages from overrides.`);\n\n // Rebuild pnpm lock file and node_modules\n logger.verbose('Rebuilding pnpm lock file and node_modules...');\n try {\n await run('pnpm install');\n logger.verbose('Successfully rebuilt pnpm lock file and node_modules');\n } catch (error) {\n logger.warn(`Failed to rebuild dependencies: ${error}. You may need to run 'pnpm install' manually.`);\n }\n }\n\n const summary = `Successfully unlinked ${actuallyRemovedPackages.length} sibling packages:\\n${actuallyRemovedPackages.map(pkg => ` - ${pkg}`).join('\\n')}`;\n\n return summary;\n};\n"],"names":["scanDirectoryForPackages","rootDir","storage","logger","getLogger","packageMap","Map","absoluteRootDir","path","resolve","process","cwd","verbose","exists","isDirectory","items","listFiles","item","itemPath","join","packageJsonPath","packageJsonContent","readFile","packageJson","JSON","parse","name","relativePath","relative","set","debug","error","warn","findPackagesToUnlink","scopeRoots","packagesToUnlink","silly","stringify","allScopePackages","scope","Object","entries","scopePackages","packageName","packagePath","startsWith","push","readCurrentWorkspaceFile","workspaceFilePath","content","yaml","load","Error","writeWorkspaceFile","config","yamlContent","dump","indent","lineWidth","noRefs","sortKeys","quotingType","forceQuotes","replace","writeFile","execute","runConfig","createStorage","log","info","link","workspaceFileName","workspaceFile","isDryRun","dryRun","keys","length","packagesToUnlinkPaths","workspaceConfig","overrides","existingOverrides","remainingOverrides","actuallyRemovedPackages","packagesToUnlinkSet","Set","map","p","pkgName","pkgLink","has","updatedConfig","run","summary","pkg"],"mappings":"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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import os from 'os';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
|
|
4
|
+
const VERSION = '0.0.24 (HEAD/4de864a T:v0.0.24 2025-07-05 10:23:05 -0700) linux x64 v22.16.0';
|
|
5
|
+
const PROGRAM_NAME = 'kodrdriv';
|
|
6
|
+
const DEFAULT_OVERRIDES = false;
|
|
7
|
+
const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = 'YYYY-MM-DD-HHmmss.SSS';
|
|
8
|
+
const DEFAULT_VERBOSE = false;
|
|
9
|
+
const DEFAULT_DRY_RUN = false;
|
|
10
|
+
const DEFAULT_DEBUG = false;
|
|
11
|
+
const DEFAULT_MODEL = 'gpt-4o-mini';
|
|
12
|
+
const DEFAULT_OUTPUT_DIRECTORY = 'output/kodrdriv';
|
|
13
|
+
const DEFAULT_CONTEXT_DIRECTORIES = [];
|
|
14
|
+
const DEFAULT_CONFIG_DIR = '.kodrdriv';
|
|
15
|
+
const DEFAULT_PREFERENCES_DIRECTORY = path.join(os.homedir(), '.kodrdriv');
|
|
16
|
+
const DEFAULT_FROM_COMMIT_ALIAS = 'origin/HEAD';
|
|
17
|
+
const DEFAULT_TO_COMMIT_ALIAS = 'HEAD';
|
|
18
|
+
const DEFAULT_ADD = false;
|
|
19
|
+
const DEFAULT_CACHED = false;
|
|
20
|
+
const DEFAULT_SENDIT_MODE = false;
|
|
21
|
+
const DEFAULT_MESSAGE_LIMIT = 50;
|
|
22
|
+
const DEFAULT_MERGE_METHOD = 'squash';
|
|
23
|
+
const DEFAULT_EXCLUDED_PATTERNS = [
|
|
24
|
+
'node_modules',
|
|
25
|
+
'pnpm-lock.yaml',
|
|
26
|
+
'package-lock.json',
|
|
27
|
+
'yarn.lock',
|
|
28
|
+
'bun.lockb',
|
|
29
|
+
'composer.lock',
|
|
30
|
+
'Cargo.lock',
|
|
31
|
+
'Gemfile.lock',
|
|
32
|
+
'dist',
|
|
33
|
+
'build',
|
|
34
|
+
'out',
|
|
35
|
+
'.next',
|
|
36
|
+
'.nuxt',
|
|
37
|
+
'coverage',
|
|
38
|
+
'.vscode',
|
|
39
|
+
'.idea',
|
|
40
|
+
'.DS_Store',
|
|
41
|
+
'.git',
|
|
42
|
+
'.gitignore',
|
|
43
|
+
'logs',
|
|
44
|
+
'tmp',
|
|
45
|
+
'.cache',
|
|
46
|
+
'*.log',
|
|
47
|
+
'.env',
|
|
48
|
+
'.env.*',
|
|
49
|
+
'*.pem',
|
|
50
|
+
'*.crt',
|
|
51
|
+
'*.key',
|
|
52
|
+
'*.sqlite',
|
|
53
|
+
'*.db',
|
|
54
|
+
'*.zip',
|
|
55
|
+
'*.tar',
|
|
56
|
+
'*.gz',
|
|
57
|
+
'*.exe',
|
|
58
|
+
'*.bin'
|
|
59
|
+
];
|
|
60
|
+
const COMMAND_COMMIT = 'commit';
|
|
61
|
+
const COMMAND_AUDIO_COMMIT = 'audio-commit';
|
|
62
|
+
const COMMAND_SELECT_AUDIO = 'select-audio';
|
|
63
|
+
const COMMAND_RELEASE = 'release';
|
|
64
|
+
const COMMAND_REVIEW = 'review';
|
|
65
|
+
const COMMAND_AUDIO_REVIEW = 'audio-review';
|
|
66
|
+
const COMMAND_PUBLISH = 'publish';
|
|
67
|
+
const COMMAND_LINK = 'link';
|
|
68
|
+
const COMMAND_UNLINK = 'unlink';
|
|
69
|
+
const COMMAND_CLEAN = 'clean';
|
|
70
|
+
const COMMAND_CHECK_CONFIG = 'check-config';
|
|
71
|
+
const COMMAND_INIT_CONFIG = 'init-config';
|
|
72
|
+
const ALLOWED_COMMANDS = [
|
|
73
|
+
COMMAND_COMMIT,
|
|
74
|
+
COMMAND_AUDIO_COMMIT,
|
|
75
|
+
COMMAND_SELECT_AUDIO,
|
|
76
|
+
COMMAND_RELEASE,
|
|
77
|
+
COMMAND_REVIEW,
|
|
78
|
+
COMMAND_AUDIO_REVIEW,
|
|
79
|
+
COMMAND_PUBLISH,
|
|
80
|
+
COMMAND_LINK,
|
|
81
|
+
COMMAND_UNLINK,
|
|
82
|
+
COMMAND_CLEAN
|
|
83
|
+
];
|
|
84
|
+
const DEFAULT_COMMAND = COMMAND_COMMIT;
|
|
85
|
+
// Define defaults in one place
|
|
86
|
+
const KODRDRIV_DEFAULTS = {
|
|
87
|
+
dryRun: DEFAULT_DRY_RUN,
|
|
88
|
+
verbose: DEFAULT_VERBOSE,
|
|
89
|
+
debug: DEFAULT_DEBUG,
|
|
90
|
+
overrides: DEFAULT_OVERRIDES,
|
|
91
|
+
model: DEFAULT_MODEL,
|
|
92
|
+
contextDirectories: DEFAULT_CONTEXT_DIRECTORIES,
|
|
93
|
+
commandName: DEFAULT_COMMAND,
|
|
94
|
+
configDirectory: DEFAULT_CONFIG_DIR,
|
|
95
|
+
outputDirectory: DEFAULT_OUTPUT_DIRECTORY,
|
|
96
|
+
preferencesDirectory: DEFAULT_PREFERENCES_DIRECTORY,
|
|
97
|
+
commit: {
|
|
98
|
+
add: DEFAULT_ADD,
|
|
99
|
+
cached: DEFAULT_CACHED,
|
|
100
|
+
sendit: DEFAULT_SENDIT_MODE,
|
|
101
|
+
messageLimit: DEFAULT_MESSAGE_LIMIT
|
|
102
|
+
},
|
|
103
|
+
release: {
|
|
104
|
+
from: DEFAULT_FROM_COMMIT_ALIAS,
|
|
105
|
+
to: DEFAULT_TO_COMMIT_ALIAS,
|
|
106
|
+
messageLimit: DEFAULT_MESSAGE_LIMIT
|
|
107
|
+
},
|
|
108
|
+
audioCommit: {
|
|
109
|
+
maxRecordingTime: 300,
|
|
110
|
+
audioDevice: undefined
|
|
111
|
+
},
|
|
112
|
+
review: {
|
|
113
|
+
includeCommitHistory: true,
|
|
114
|
+
includeRecentDiffs: true,
|
|
115
|
+
includeReleaseNotes: false,
|
|
116
|
+
includeGithubIssues: true,
|
|
117
|
+
commitHistoryLimit: 10,
|
|
118
|
+
diffHistoryLimit: 5,
|
|
119
|
+
releaseNotesLimit: 3,
|
|
120
|
+
githubIssuesLimit: 20,
|
|
121
|
+
sendit: DEFAULT_SENDIT_MODE
|
|
122
|
+
},
|
|
123
|
+
audioReview: {
|
|
124
|
+
includeCommitHistory: true,
|
|
125
|
+
includeRecentDiffs: true,
|
|
126
|
+
includeReleaseNotes: false,
|
|
127
|
+
includeGithubIssues: true,
|
|
128
|
+
commitHistoryLimit: 10,
|
|
129
|
+
diffHistoryLimit: 5,
|
|
130
|
+
releaseNotesLimit: 3,
|
|
131
|
+
githubIssuesLimit: 20,
|
|
132
|
+
sendit: DEFAULT_SENDIT_MODE,
|
|
133
|
+
maxRecordingTime: 300,
|
|
134
|
+
audioDevice: undefined
|
|
135
|
+
},
|
|
136
|
+
publish: {
|
|
137
|
+
mergeMethod: DEFAULT_MERGE_METHOD,
|
|
138
|
+
requiredEnvVars: [
|
|
139
|
+
'GITHUB_TOKEN',
|
|
140
|
+
'OPENAI_API_KEY'
|
|
141
|
+
],
|
|
142
|
+
linkWorkspacePackages: true,
|
|
143
|
+
unlinkWorkspacePackages: true
|
|
144
|
+
},
|
|
145
|
+
link: {
|
|
146
|
+
scopeRoots: {},
|
|
147
|
+
workspaceFile: 'pnpm-workspace.yaml',
|
|
148
|
+
dryRun: false
|
|
149
|
+
},
|
|
150
|
+
excludedPatterns: DEFAULT_EXCLUDED_PATTERNS
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
export { ALLOWED_COMMANDS, COMMAND_AUDIO_COMMIT, COMMAND_AUDIO_REVIEW, COMMAND_CHECK_CONFIG, COMMAND_CLEAN, COMMAND_COMMIT, COMMAND_INIT_CONFIG, COMMAND_LINK, COMMAND_PUBLISH, COMMAND_RELEASE, COMMAND_REVIEW, COMMAND_SELECT_AUDIO, COMMAND_UNLINK, DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS, DEFAULT_ADD, DEFAULT_CACHED, DEFAULT_COMMAND, DEFAULT_CONFIG_DIR, DEFAULT_CONTEXT_DIRECTORIES, DEFAULT_DEBUG, DEFAULT_DRY_RUN, DEFAULT_EXCLUDED_PATTERNS, DEFAULT_FROM_COMMIT_ALIAS, DEFAULT_MERGE_METHOD, DEFAULT_MESSAGE_LIMIT, DEFAULT_MODEL, DEFAULT_OUTPUT_DIRECTORY, DEFAULT_OVERRIDES, DEFAULT_PREFERENCES_DIRECTORY, DEFAULT_SENDIT_MODE, DEFAULT_TO_COMMIT_ALIAS, DEFAULT_VERBOSE, KODRDRIV_DEFAULTS, PROGRAM_NAME, VERSION };
|
|
154
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../src/constants.ts"],"sourcesContent":["import { MergeMethod } from './types';\nimport os from 'os';\nimport path from 'path';\n\nexport const VERSION = '__VERSION__ (__GIT_BRANCH__/__GIT_COMMIT__ __GIT_TAGS__ __GIT_COMMIT_DATE__) __SYSTEM_INFO__';\nexport const PROGRAM_NAME = 'kodrdriv';\nexport const DEFAULT_CHARACTER_ENCODING = 'utf-8';\nexport const DEFAULT_BINARY_TO_TEXT_ENCODING = 'base64';\nexport const DEFAULT_DIFF = true;\nexport const DEFAULT_LOG = false;\nexport const DEFAULT_OVERRIDES = false;\nexport const DATE_FORMAT_MONTH_DAY = 'MM-DD';\nexport const DATE_FORMAT_YEAR = 'YYYY';\nexport const DATE_FORMAT_YEAR_MONTH = 'YYYY-MM';\nexport const DATE_FORMAT_YEAR_MONTH_DAY = 'YYYY-MM-DD';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_SLASH = 'YYYY/MM/DD';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES = 'YYYY-MM-DD-HHmm';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS = 'YYYY-MM-DD-HHmmss';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = 'YYYY-MM-DD-HHmmss.SSS';\nexport const DATE_FORMAT_SHORT_TIMESTAMP = 'YYMMdd-HHmm';\nexport const DATE_FORMAT_MONTH = 'MM';\nexport const DATE_FORMAT_DAY = 'DD';\nexport const DATE_FORMAT_HOURS = 'HHmm';\nexport const DATE_FORMAT_MINUTES = 'mm';\nexport const DATE_FORMAT_SECONDS = 'ss';\nexport const DATE_FORMAT_MILLISECONDS = 'SSS';\nexport const DEFAULT_VERBOSE = false;\nexport const DEFAULT_DRY_RUN = false;\nexport const DEFAULT_DEBUG = false;\nexport const DEFAULT_MODEL = 'gpt-4o-mini';\nexport const DEFAULT_MODEL_STRONG = 'gpt-4o';\nexport const DEFAULT_OUTPUT_DIRECTORY = 'output/kodrdriv';\n\nexport const DEFAULT_CONTEXT_DIRECTORIES: string[] = [];\n\nexport const DEFAULT_CONFIG_DIR = '.kodrdriv';\nexport const DEFAULT_PREFERENCES_DIRECTORY = path.join(os.homedir(), '.kodrdriv');\n\nexport const DEFAULT_FROM_COMMIT_ALIAS = 'origin/HEAD';\nexport const DEFAULT_TO_COMMIT_ALIAS = 'HEAD';\n\nexport const DEFAULT_ADD = false;\nexport const DEFAULT_CACHED = false;\nexport const DEFAULT_SENDIT_MODE = false;\nexport const DEFAULT_MESSAGE_LIMIT = 50;\n\nexport const DEFAULT_MERGE_METHOD: MergeMethod = 'squash';\n\nexport const DEFAULT_EXCLUDED_PATTERNS = [\n 'node_modules', 'pnpm-lock.yaml', 'package-lock.json', 'yarn.lock', 'bun.lockb',\n 'composer.lock', 'Cargo.lock', 'Gemfile.lock',\n 'dist', 'build', 'out', '.next', '.nuxt', 'coverage',\n '.vscode', '.idea', '.DS_Store', '.git', '.gitignore',\n 'logs', 'tmp', '.cache', '*.log', '.env', '.env.*',\n '*.pem', '*.crt', '*.key', '*.sqlite', '*.db',\n '*.zip', '*.tar', '*.gz', '*.exe', '*.bin'\n];\n\nexport const COMMAND_COMMIT = 'commit';\nexport const COMMAND_AUDIO_COMMIT = 'audio-commit';\nexport const COMMAND_SELECT_AUDIO = 'select-audio';\nexport const COMMAND_RELEASE = 'release';\nexport const COMMAND_REVIEW = 'review';\nexport const COMMAND_AUDIO_REVIEW = 'audio-review';\nexport const COMMAND_PUBLISH = 'publish';\nexport const COMMAND_LINK = 'link';\nexport const COMMAND_UNLINK = 'unlink';\nexport const COMMAND_CLEAN = 'clean';\nexport const COMMAND_CHECK_CONFIG = 'check-config';\nexport const COMMAND_INIT_CONFIG = 'init-config';\n\nexport const ALLOWED_COMMANDS = [\n COMMAND_COMMIT,\n COMMAND_AUDIO_COMMIT,\n COMMAND_SELECT_AUDIO,\n COMMAND_RELEASE,\n COMMAND_REVIEW,\n COMMAND_AUDIO_REVIEW,\n COMMAND_PUBLISH,\n COMMAND_LINK,\n COMMAND_UNLINK,\n COMMAND_CLEAN\n];\n\nexport const DEFAULT_COMMAND = COMMAND_COMMIT;\n\nexport const DEFAULT_INSTRUCTIONS_DIR = `instructions`;\n\nexport const DEFAULT_PERSONA_DIR = `personas`;\n\nexport const DEFAULT_INSTRUCTIONS_COMMIT_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/commit.md`;\nexport const DEFAULT_INSTRUCTIONS_RELEASE_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/release.md`;\nexport const DEFAULT_INSTRUCTIONS_REVIEW_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/review.md`;\n\nexport const DEFAULT_PERSONA_RELEASER_FILE = `${DEFAULT_PERSONA_DIR}/releaser.md`;\nexport const DEFAULT_PERSONA_YOU_FILE = `${DEFAULT_PERSONA_DIR}/you.md`;\n\n// Default instructions for each persona\nexport const DEFAULT_INSTRUCTIONS_MAP = {\n [COMMAND_COMMIT]: DEFAULT_INSTRUCTIONS_COMMIT_FILE,\n [COMMAND_AUDIO_COMMIT]: DEFAULT_INSTRUCTIONS_COMMIT_FILE, // Reuse commit instructions\n [COMMAND_RELEASE]: DEFAULT_INSTRUCTIONS_RELEASE_FILE,\n [COMMAND_REVIEW]: DEFAULT_INSTRUCTIONS_REVIEW_FILE, // Reuse audio-review instructions for now\n [COMMAND_AUDIO_REVIEW]: DEFAULT_INSTRUCTIONS_REVIEW_FILE,\n};\n\n// Default personas for each command\nexport const DEFAULT_PERSONA_MAP = {\n [COMMAND_COMMIT]: DEFAULT_PERSONA_YOU_FILE,\n [COMMAND_AUDIO_COMMIT]: DEFAULT_PERSONA_YOU_FILE, // Use You persona\n [COMMAND_RELEASE]: DEFAULT_PERSONA_RELEASER_FILE,\n [COMMAND_REVIEW]: DEFAULT_PERSONA_YOU_FILE, // Use You persona\n [COMMAND_AUDIO_REVIEW]: DEFAULT_PERSONA_YOU_FILE,\n};\n\n// Used by child process to create paths\nexport const DEFAULT_PATH_SEPARATOR = '/';\n\n// Used by util/general for file filtering\nexport const DEFAULT_IGNORE_PATTERNS = [\n 'node_modules/**',\n '**/*.log',\n '.git/**',\n 'dist/**',\n 'build/**',\n 'coverage/**',\n '.DS_Store',\n '*.tmp',\n '*.cache',\n];\n\n// Used by util/storage for directory names\nexport const DEFAULT_DIRECTORY_PREFIX = '.kodrdriv';\n\n// Used by other commands but not exposed in CLI\nexport const INTERNAL_DEFAULT_OUTPUT_FILE = 'output.txt';\n\nexport const INTERNAL_DATETIME_FORMAT = 'YYYY-MM-DD_HH-mm-ss';\n\n// Define defaults in one place\nexport const KODRDRIV_DEFAULTS = {\n dryRun: DEFAULT_DRY_RUN,\n verbose: DEFAULT_VERBOSE,\n debug: DEFAULT_DEBUG,\n overrides: DEFAULT_OVERRIDES,\n model: DEFAULT_MODEL,\n contextDirectories: DEFAULT_CONTEXT_DIRECTORIES,\n commandName: DEFAULT_COMMAND,\n configDirectory: DEFAULT_CONFIG_DIR,\n outputDirectory: DEFAULT_OUTPUT_DIRECTORY,\n preferencesDirectory: DEFAULT_PREFERENCES_DIRECTORY,\n commit: {\n add: DEFAULT_ADD,\n cached: DEFAULT_CACHED,\n sendit: DEFAULT_SENDIT_MODE,\n messageLimit: DEFAULT_MESSAGE_LIMIT,\n },\n release: {\n from: DEFAULT_FROM_COMMIT_ALIAS,\n to: DEFAULT_TO_COMMIT_ALIAS,\n messageLimit: DEFAULT_MESSAGE_LIMIT,\n },\n audioCommit: {\n maxRecordingTime: 300, // 5 minutes default\n audioDevice: undefined, // Auto-detect by default\n },\n review: {\n includeCommitHistory: true,\n includeRecentDiffs: true,\n includeReleaseNotes: false,\n includeGithubIssues: true,\n commitHistoryLimit: 10,\n diffHistoryLimit: 5,\n releaseNotesLimit: 3,\n githubIssuesLimit: 20,\n sendit: DEFAULT_SENDIT_MODE,\n },\n audioReview: {\n includeCommitHistory: true,\n includeRecentDiffs: true,\n includeReleaseNotes: false,\n includeGithubIssues: true,\n commitHistoryLimit: 10,\n diffHistoryLimit: 5,\n releaseNotesLimit: 3,\n githubIssuesLimit: 20,\n sendit: DEFAULT_SENDIT_MODE,\n maxRecordingTime: 300, // 5 minutes default\n audioDevice: undefined, // Auto-detect by default\n },\n publish: {\n mergeMethod: DEFAULT_MERGE_METHOD,\n requiredEnvVars: ['GITHUB_TOKEN', 'OPENAI_API_KEY'],\n linkWorkspacePackages: true,\n unlinkWorkspacePackages: true,\n },\n link: {\n scopeRoots: {},\n workspaceFile: 'pnpm-workspace.yaml',\n dryRun: false,\n },\n excludedPatterns: DEFAULT_EXCLUDED_PATTERNS,\n};"],"names":["VERSION","PROGRAM_NAME","DEFAULT_OVERRIDES","DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS","DEFAULT_VERBOSE","DEFAULT_DRY_RUN","DEFAULT_DEBUG","DEFAULT_MODEL","DEFAULT_OUTPUT_DIRECTORY","DEFAULT_CONTEXT_DIRECTORIES","DEFAULT_CONFIG_DIR","DEFAULT_PREFERENCES_DIRECTORY","path","join","os","homedir","DEFAULT_FROM_COMMIT_ALIAS","DEFAULT_TO_COMMIT_ALIAS","DEFAULT_ADD","DEFAULT_CACHED","DEFAULT_SENDIT_MODE","DEFAULT_MESSAGE_LIMIT","DEFAULT_MERGE_METHOD","DEFAULT_EXCLUDED_PATTERNS","COMMAND_COMMIT","COMMAND_AUDIO_COMMIT","COMMAND_SELECT_AUDIO","COMMAND_RELEASE","COMMAND_REVIEW","COMMAND_AUDIO_REVIEW","COMMAND_PUBLISH","COMMAND_LINK","COMMAND_UNLINK","COMMAND_CLEAN","COMMAND_CHECK_CONFIG","COMMAND_INIT_CONFIG","ALLOWED_COMMANDS","DEFAULT_COMMAND","KODRDRIV_DEFAULTS","dryRun","verbose","debug","overrides","model","contextDirectories","commandName","configDirectory","outputDirectory","preferencesDirectory","commit","add","cached","sendit","messageLimit","release","from","to","audioCommit","maxRecordingTime","audioDevice","undefined","review","includeCommitHistory","includeRecentDiffs","includeReleaseNotes","includeGithubIssues","commitHistoryLimit","diffHistoryLimit","releaseNotesLimit","githubIssuesLimit","audioReview","publish","mergeMethod","requiredEnvVars","linkWorkspacePackages","unlinkWorkspacePackages","link","scopeRoots","workspaceFile","excludedPatterns"],"mappings":"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"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { ExitError } from '../error/ExitError.js';
|
|
3
|
+
import { getLogger } from '../logging.js';
|
|
4
|
+
import { run } from '../util/child.js';
|
|
5
|
+
|
|
6
|
+
// Enhanced exclusion patterns specifically for review context
|
|
7
|
+
// These focus on excluding large files, binaries, and content that doesn't help with issue analysis
|
|
8
|
+
const getReviewExcludedPatterns = (basePatterns)=>{
|
|
9
|
+
const reviewSpecificExclusions = [
|
|
10
|
+
// Lock files and dependency files (often massive)
|
|
11
|
+
"*lock*",
|
|
12
|
+
"*.lock",
|
|
13
|
+
"pnpm-lock.yaml",
|
|
14
|
+
"package-lock.json",
|
|
15
|
+
"yarn.lock",
|
|
16
|
+
"bun.lockb",
|
|
17
|
+
"composer.lock",
|
|
18
|
+
"Cargo.lock",
|
|
19
|
+
"Gemfile.lock",
|
|
20
|
+
"Pipfile.lock",
|
|
21
|
+
"poetry.lock",
|
|
22
|
+
// Image files (binary and large)
|
|
23
|
+
"*.png",
|
|
24
|
+
"*.jpg",
|
|
25
|
+
"*.jpeg",
|
|
26
|
+
"*.gif",
|
|
27
|
+
"*.bmp",
|
|
28
|
+
"*.tiff",
|
|
29
|
+
"*.webp",
|
|
30
|
+
"*.svg",
|
|
31
|
+
"*.ico",
|
|
32
|
+
"*.icns",
|
|
33
|
+
// Video and audio files
|
|
34
|
+
"*.mp4",
|
|
35
|
+
"*.avi",
|
|
36
|
+
"*.mov",
|
|
37
|
+
"*.wmv",
|
|
38
|
+
"*.flv",
|
|
39
|
+
"*.mp3",
|
|
40
|
+
"*.wav",
|
|
41
|
+
"*.flac",
|
|
42
|
+
// Archives and compressed files
|
|
43
|
+
"*.zip",
|
|
44
|
+
"*.tar",
|
|
45
|
+
"*.tar.gz",
|
|
46
|
+
"*.tgz",
|
|
47
|
+
"*.rar",
|
|
48
|
+
"*.7z",
|
|
49
|
+
"*.bz2",
|
|
50
|
+
"*.xz",
|
|
51
|
+
// Binary executables and libraries
|
|
52
|
+
"*.exe",
|
|
53
|
+
"*.dll",
|
|
54
|
+
"*.so",
|
|
55
|
+
"*.dylib",
|
|
56
|
+
"*.bin",
|
|
57
|
+
"*.app",
|
|
58
|
+
// Database files
|
|
59
|
+
"*.db",
|
|
60
|
+
"*.sqlite",
|
|
61
|
+
"*.sqlite3",
|
|
62
|
+
"*.mdb",
|
|
63
|
+
// Large generated files
|
|
64
|
+
"*.map",
|
|
65
|
+
"*.min.js",
|
|
66
|
+
"*.min.css",
|
|
67
|
+
"bundle.*",
|
|
68
|
+
"vendor.*",
|
|
69
|
+
// Documentation that's often large
|
|
70
|
+
"*.pdf",
|
|
71
|
+
"*.doc",
|
|
72
|
+
"*.docx",
|
|
73
|
+
"*.ppt",
|
|
74
|
+
"*.pptx",
|
|
75
|
+
// IDE and OS generated files
|
|
76
|
+
".DS_Store",
|
|
77
|
+
"Thumbs.db",
|
|
78
|
+
"*.swp",
|
|
79
|
+
"*.tmp",
|
|
80
|
+
// Certificate and key files
|
|
81
|
+
"*.pem",
|
|
82
|
+
"*.crt",
|
|
83
|
+
"*.key",
|
|
84
|
+
"*.p12",
|
|
85
|
+
"*.pfx",
|
|
86
|
+
// Large config/data files that are often auto-generated
|
|
87
|
+
"tsconfig.tsbuildinfo",
|
|
88
|
+
"*.cache",
|
|
89
|
+
".eslintcache"
|
|
90
|
+
];
|
|
91
|
+
// Combine base patterns with review specific exclusions, removing duplicates
|
|
92
|
+
const combinedPatterns = [
|
|
93
|
+
...new Set([
|
|
94
|
+
...basePatterns,
|
|
95
|
+
...reviewSpecificExclusions
|
|
96
|
+
])
|
|
97
|
+
];
|
|
98
|
+
return combinedPatterns;
|
|
99
|
+
};
|
|
100
|
+
// Function to truncate overly large diff content while preserving structure
|
|
101
|
+
const truncateLargeDiff = (diffContent, maxLength = 5000)=>{
|
|
102
|
+
if (diffContent.length <= maxLength) {
|
|
103
|
+
return diffContent;
|
|
104
|
+
}
|
|
105
|
+
const lines = diffContent.split('\n');
|
|
106
|
+
const truncatedLines = [];
|
|
107
|
+
let currentLength = 0;
|
|
108
|
+
let truncated = false;
|
|
109
|
+
for (const line of lines){
|
|
110
|
+
if (currentLength + line.length + 1 > maxLength) {
|
|
111
|
+
truncated = true;
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
truncatedLines.push(line);
|
|
115
|
+
currentLength += line.length + 1; // +1 for newline
|
|
116
|
+
}
|
|
117
|
+
if (truncated) {
|
|
118
|
+
truncatedLines.push('');
|
|
119
|
+
truncatedLines.push(`... [TRUNCATED: Original diff was ${diffContent.length} characters, showing first ${currentLength}] ...`);
|
|
120
|
+
}
|
|
121
|
+
return truncatedLines.join('\n');
|
|
122
|
+
};
|
|
123
|
+
const create = async (options)=>{
|
|
124
|
+
const logger = getLogger();
|
|
125
|
+
async function get() {
|
|
126
|
+
try {
|
|
127
|
+
logger.verbose('Gathering change information from Git');
|
|
128
|
+
try {
|
|
129
|
+
logger.debug('Executing git diff');
|
|
130
|
+
const excludeString = options.excludedPatterns.map((p)=>`':(exclude)${p}'`).join(' ');
|
|
131
|
+
let range = '';
|
|
132
|
+
if (options.from && options.to) {
|
|
133
|
+
range = `${options.from}..${options.to}`;
|
|
134
|
+
} else if (options.from) {
|
|
135
|
+
range = `${options.from}`;
|
|
136
|
+
} else if (options.to) {
|
|
137
|
+
range = `${options.to}`;
|
|
138
|
+
}
|
|
139
|
+
let command = '';
|
|
140
|
+
if (options.cached) {
|
|
141
|
+
command = `git diff --cached${range ? ' ' + range : ''} -- . ${excludeString}`;
|
|
142
|
+
} else {
|
|
143
|
+
command = `git diff${range ? ' ' + range : ''} -- . ${excludeString}`;
|
|
144
|
+
}
|
|
145
|
+
const { stdout, stderr } = await run(command);
|
|
146
|
+
if (stderr) {
|
|
147
|
+
logger.warn('Git log produced stderr: %s', stderr);
|
|
148
|
+
}
|
|
149
|
+
logger.debug('Git log output: %s', stdout);
|
|
150
|
+
return stdout;
|
|
151
|
+
} catch (error) {
|
|
152
|
+
logger.error('Failed to execute git log: %s', error.message);
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
} catch (error) {
|
|
156
|
+
logger.error('Error occurred during gather change phase: %s %s', error.message, error.stack);
|
|
157
|
+
throw new ExitError('Error occurred during gather change phase');
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
get
|
|
162
|
+
};
|
|
163
|
+
};
|
|
164
|
+
const hasStagedChanges = async ()=>{
|
|
165
|
+
const logger = getLogger();
|
|
166
|
+
try {
|
|
167
|
+
logger.debug('Checking for staged changes');
|
|
168
|
+
const { stderr } = await run('git diff --cached --quiet');
|
|
169
|
+
if (stderr) {
|
|
170
|
+
logger.warn('Git diff produced stderr: %s', stderr);
|
|
171
|
+
}
|
|
172
|
+
// If there are staged changes, git diff --cached --quiet will return non-zero
|
|
173
|
+
// So if we get here without an error, there are no staged changes
|
|
174
|
+
return false;
|
|
175
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
176
|
+
} catch (error) {
|
|
177
|
+
// If we get an error, it means there are staged changes
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
// High-level function to get recent diffs formatted for review context
|
|
182
|
+
const getRecentDiffsForReview = async (options)=>{
|
|
183
|
+
const logger = getLogger();
|
|
184
|
+
const diffLimit = options.limit || 5;
|
|
185
|
+
// Get enhanced exclusion patterns for review context
|
|
186
|
+
const reviewExcluded = getReviewExcludedPatterns(options.baseExcludedPatterns);
|
|
187
|
+
logger.debug('Using %d exclusion patterns for diff context (including %d review specific)', reviewExcluded.length, reviewExcluded.length - options.baseExcludedPatterns.length);
|
|
188
|
+
logger.debug('Sample exclusions: %s', reviewExcluded.slice(0, 10).join(', ') + (reviewExcluded.length > 10 ? '...' : ''));
|
|
189
|
+
const diffSections = [];
|
|
190
|
+
// Get recent commits and their diffs
|
|
191
|
+
for(let i = 0; i < diffLimit; i++){
|
|
192
|
+
try {
|
|
193
|
+
const diffRange = i === 0 ? 'HEAD~1' : `HEAD~${i + 1}..HEAD~${i}`;
|
|
194
|
+
const diff = await create({
|
|
195
|
+
from: `HEAD~${i + 1}`,
|
|
196
|
+
to: `HEAD~${i}`,
|
|
197
|
+
excludedPatterns: reviewExcluded
|
|
198
|
+
});
|
|
199
|
+
const diffContent = await diff.get();
|
|
200
|
+
if (diffContent.trim()) {
|
|
201
|
+
const truncatedDiff = truncateLargeDiff(diffContent);
|
|
202
|
+
diffSections.push(`[Recent Diff ${i + 1} (${diffRange})]\n${truncatedDiff}`);
|
|
203
|
+
if (truncatedDiff.length < diffContent.length) {
|
|
204
|
+
logger.debug('Added diff %d to context (%d characters, truncated from %d)', i + 1, truncatedDiff.length, diffContent.length);
|
|
205
|
+
} else {
|
|
206
|
+
logger.debug('Added diff %d to context (%d characters)', i + 1, diffContent.length);
|
|
207
|
+
}
|
|
208
|
+
} else {
|
|
209
|
+
logger.debug('Diff %d was empty after exclusions', i + 1);
|
|
210
|
+
}
|
|
211
|
+
} catch (error) {
|
|
212
|
+
logger.debug('Could not fetch diff %d: %s', i + 1, error.message);
|
|
213
|
+
break; // Stop if we can't fetch more diffs
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return diffSections.length > 0 ? '\n\n' + diffSections.join('\n\n') : '';
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
export { create, getRecentDiffsForReview, getReviewExcludedPatterns, hasStagedChanges, truncateLargeDiff };
|
|
220
|
+
//# sourceMappingURL=diff.js.map
|