corydora 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/CHANGELOG.md +11 -0
- package/LICENSE +21 -0
- package/README.md +165 -0
- package/dist/agents/builtin-agents.d.ts +2 -0
- package/dist/agents/builtin-agents.js +75 -0
- package/dist/agents/builtin-agents.js.map +1 -0
- package/dist/agents/catalog.d.ts +4 -0
- package/dist/agents/catalog.js +49 -0
- package/dist/agents/catalog.js.map +1 -0
- package/dist/agents/frontmatter.d.ts +5 -0
- package/dist/agents/frontmatter.js +30 -0
- package/dist/agents/frontmatter.js.map +1 -0
- package/dist/commands/agents-import.d.ts +2 -0
- package/dist/commands/agents-import.js +12 -0
- package/dist/commands/agents-import.js.map +1 -0
- package/dist/commands/agents-list.d.ts +2 -0
- package/dist/commands/agents-list.js +26 -0
- package/dist/commands/agents-list.js.map +1 -0
- package/dist/commands/attach.d.ts +1 -0
- package/dist/commands/attach.js +16 -0
- package/dist/commands/attach.js.map +1 -0
- package/dist/commands/config-validate.d.ts +2 -0
- package/dist/commands/config-validate.js +10 -0
- package/dist/commands/config-validate.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.js +32 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/helpers.d.ts +4 -0
- package/dist/commands/helpers.js +21 -0
- package/dist/commands/helpers.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.js +117 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/run.d.ts +11 -0
- package/dist/commands/run.js +90 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.js +40 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +2 -0
- package/dist/commands/stop.js +25 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/config/env.d.ts +2 -0
- package/dist/config/env.js +68 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/files.d.ts +6 -0
- package/dist/config/files.js +74 -0
- package/dist/config/files.js.map +1 -0
- package/dist/config/schema.d.ts +93 -0
- package/dist/config/schema.js +113 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/constants.d.ts +16 -0
- package/dist/constants.js +79 -0
- package/dist/constants.js.map +1 -0
- package/dist/filesystem/discovery.d.ts +6 -0
- package/dist/filesystem/discovery.js +74 -0
- package/dist/filesystem/discovery.js.map +1 -0
- package/dist/filesystem/gitignore.d.ts +1 -0
- package/dist/filesystem/gitignore.js +37 -0
- package/dist/filesystem/gitignore.js.map +1 -0
- package/dist/filesystem/project.d.ts +3 -0
- package/dist/filesystem/project.js +103 -0
- package/dist/filesystem/project.js.map +1 -0
- package/dist/git/isolation.d.ts +15 -0
- package/dist/git/isolation.js +64 -0
- package/dist/git/isolation.js.map +1 -0
- package/dist/git/repository.d.ts +5 -0
- package/dist/git/repository.js +28 -0
- package/dist/git/repository.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +114 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/api.d.ts +2 -0
- package/dist/providers/api.js +438 -0
- package/dist/providers/api.js.map +1 -0
- package/dist/providers/cli.d.ts +2 -0
- package/dist/providers/cli.js +326 -0
- package/dist/providers/cli.js.map +1 -0
- package/dist/providers/fake.d.ts +11 -0
- package/dist/providers/fake.js +61 -0
- package/dist/providers/fake.js.map +1 -0
- package/dist/providers/index.d.ts +4 -0
- package/dist/providers/index.js +27 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/utils.d.ts +40 -0
- package/dist/providers/utils.js +228 -0
- package/dist/providers/utils.js.map +1 -0
- package/dist/queue/render.d.ts +2 -0
- package/dist/queue/render.js +52 -0
- package/dist/queue/render.js.map +1 -0
- package/dist/queue/state.d.ts +12 -0
- package/dist/queue/state.js +117 -0
- package/dist/queue/state.js.map +1 -0
- package/dist/runtime/prompts.d.ts +17 -0
- package/dist/runtime/prompts.js +102 -0
- package/dist/runtime/prompts.js.map +1 -0
- package/dist/runtime/run-session.d.ts +11 -0
- package/dist/runtime/run-session.js +292 -0
- package/dist/runtime/run-session.js.map +1 -0
- package/dist/runtime/scheduler.d.ts +4 -0
- package/dist/runtime/scheduler.js +63 -0
- package/dist/runtime/scheduler.js.map +1 -0
- package/dist/runtime/tmux.d.ts +8 -0
- package/dist/runtime/tmux.js +58 -0
- package/dist/runtime/tmux.js.map +1 -0
- package/dist/types/domain.d.ts +206 -0
- package/dist/types/domain.js +2 -0
- package/dist/types/domain.js.map +1 -0
- package/dist/ui/menu.d.ts +1 -0
- package/dist/ui/menu.js +18 -0
- package/dist/ui/menu.js.map +1 -0
- package/dist/ui/output.d.ts +8 -0
- package/dist/ui/output.js +32 -0
- package/dist/ui/output.js.map +1 -0
- package/logo.webp +0 -0
- package/package.json +89 -0
- package/schemas/corydora.schema.json +194 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { DEFAULT_BRANCH_PREFIX, DEFAULT_EXCLUDE_DIRECTORIES, DEFAULT_INCLUDE_EXTENSIONS, DEFAULT_MODELS, RUNTIME_PROVIDER_IDS, CORYDORA_DIR_NAME, } from '../constants.js';
|
|
3
|
+
const categorySchema = z.enum(['bugs', 'performance', 'tests', 'todo', 'features']);
|
|
4
|
+
const providerSchema = z.enum(RUNTIME_PROVIDER_IDS);
|
|
5
|
+
const isolationModeSchema = z.enum(['worktree', 'branch', 'current-branch']);
|
|
6
|
+
export const corydoraConfigSchema = z.object({
|
|
7
|
+
version: z.literal(1),
|
|
8
|
+
git: z.object({
|
|
9
|
+
isolationMode: isolationModeSchema,
|
|
10
|
+
branchPrefix: z.string().min(1),
|
|
11
|
+
trackMarkdownQueues: z.boolean(),
|
|
12
|
+
worktreeRoot: z.string().min(1).optional(),
|
|
13
|
+
}),
|
|
14
|
+
runtime: z.object({
|
|
15
|
+
provider: providerSchema,
|
|
16
|
+
model: z.string().min(1),
|
|
17
|
+
fallbackProvider: providerSchema.optional(),
|
|
18
|
+
maxOutputTokens: z.number().int().positive(),
|
|
19
|
+
requestTimeoutMs: z.number().int().positive(),
|
|
20
|
+
maxRetries: z.number().int().min(0),
|
|
21
|
+
}),
|
|
22
|
+
agents: z.object({
|
|
23
|
+
enabledCategories: z.array(categorySchema).min(1),
|
|
24
|
+
selectedBuiltinAgents: z.array(z.string().min(1)).min(1),
|
|
25
|
+
importedAgentDirectory: z.string().min(1).optional(),
|
|
26
|
+
}),
|
|
27
|
+
scan: z.object({
|
|
28
|
+
batchSize: z.number().int().positive(),
|
|
29
|
+
maxConcurrentScans: z.number().int().positive(),
|
|
30
|
+
allowBroadRisk: z.boolean(),
|
|
31
|
+
includeExtensions: z.array(z.string().min(1)).min(1),
|
|
32
|
+
excludeDirectories: z.array(z.string().min(1)),
|
|
33
|
+
}),
|
|
34
|
+
execution: z.object({
|
|
35
|
+
backgroundByDefault: z.boolean(),
|
|
36
|
+
preventIdleSleep: z.boolean(),
|
|
37
|
+
maxFixesPerRun: z.number().int().positive(),
|
|
38
|
+
maxRuntimeMinutes: z.number().int().positive(),
|
|
39
|
+
backlogTarget: z.number().int().positive(),
|
|
40
|
+
validateAfterFix: z.boolean(),
|
|
41
|
+
}),
|
|
42
|
+
todo: z.object({
|
|
43
|
+
trackMarkdownFiles: z.boolean(),
|
|
44
|
+
renderCompletedTasks: z.boolean(),
|
|
45
|
+
}),
|
|
46
|
+
paths: z.object({
|
|
47
|
+
corydoraDir: z.string().min(1),
|
|
48
|
+
stateDir: z.string().min(1),
|
|
49
|
+
logsDir: z.string().min(1),
|
|
50
|
+
runsDir: z.string().min(1),
|
|
51
|
+
agentsDir: z.string().min(1),
|
|
52
|
+
envFile: z.string().min(1),
|
|
53
|
+
}),
|
|
54
|
+
});
|
|
55
|
+
export function parseCorydoraConfig(raw) {
|
|
56
|
+
return corydoraConfigSchema.parse(raw);
|
|
57
|
+
}
|
|
58
|
+
export function getDefaultModel(provider) {
|
|
59
|
+
return DEFAULT_MODELS[provider] ?? 'sonnet';
|
|
60
|
+
}
|
|
61
|
+
export function getDefaultConfig(options) {
|
|
62
|
+
const corydoraDir = CORYDORA_DIR_NAME;
|
|
63
|
+
return {
|
|
64
|
+
version: 1,
|
|
65
|
+
git: {
|
|
66
|
+
isolationMode: options.isolationMode ?? 'worktree',
|
|
67
|
+
branchPrefix: DEFAULT_BRANCH_PREFIX,
|
|
68
|
+
trackMarkdownQueues: options.trackMarkdownQueues ?? false,
|
|
69
|
+
},
|
|
70
|
+
runtime: {
|
|
71
|
+
provider: options.provider,
|
|
72
|
+
model: options.model ?? getDefaultModel(options.provider),
|
|
73
|
+
maxOutputTokens: 8192,
|
|
74
|
+
requestTimeoutMs: 900_000,
|
|
75
|
+
maxRetries: 3,
|
|
76
|
+
},
|
|
77
|
+
agents: {
|
|
78
|
+
enabledCategories: ['bugs', 'performance', 'tests', 'todo', 'features'],
|
|
79
|
+
selectedBuiltinAgents: options.selectedBuiltinAgents,
|
|
80
|
+
},
|
|
81
|
+
scan: {
|
|
82
|
+
batchSize: 6,
|
|
83
|
+
maxConcurrentScans: 3,
|
|
84
|
+
allowBroadRisk: false,
|
|
85
|
+
includeExtensions: [...DEFAULT_INCLUDE_EXTENSIONS],
|
|
86
|
+
excludeDirectories: [...DEFAULT_EXCLUDE_DIRECTORIES],
|
|
87
|
+
},
|
|
88
|
+
execution: {
|
|
89
|
+
backgroundByDefault: options.backgroundByDefault ?? false,
|
|
90
|
+
preventIdleSleep: true,
|
|
91
|
+
maxFixesPerRun: 20,
|
|
92
|
+
maxRuntimeMinutes: 480,
|
|
93
|
+
backlogTarget: 8,
|
|
94
|
+
validateAfterFix: true,
|
|
95
|
+
},
|
|
96
|
+
todo: {
|
|
97
|
+
trackMarkdownFiles: false,
|
|
98
|
+
renderCompletedTasks: true,
|
|
99
|
+
},
|
|
100
|
+
paths: {
|
|
101
|
+
corydoraDir,
|
|
102
|
+
stateDir: `${corydoraDir}/state`,
|
|
103
|
+
logsDir: `${corydoraDir}/logs`,
|
|
104
|
+
runsDir: `${corydoraDir}/runs`,
|
|
105
|
+
agentsDir: `${corydoraDir}/agents`,
|
|
106
|
+
envFile: `${corydoraDir}/.env.local`,
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
export function selectTechLensesForConfig(projectTechLenses) {
|
|
111
|
+
return projectTechLenses.length > 0 ? projectTechLenses : ['typescript', 'refactoring'];
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const CONFIG_FILE_NAME = ".corydora.json";
|
|
2
|
+
export declare const CORYDORA_DIR_NAME = ".corydora";
|
|
3
|
+
export declare const BUILTIN_TASK_CATEGORIES: readonly ["bugs", "performance", "tests", "todo", "features"];
|
|
4
|
+
export declare const TECH_LENSES: readonly ["typescript", "react", "nextjs", "node-cli", "electron", "security", "database", "refactoring"];
|
|
5
|
+
export declare const RUNTIME_PROVIDER_IDS: readonly ["claude-cli", "codex-cli", "gemini-cli", "anthropic-api", "openai-api", "google-api", "bedrock", "ollama", "fake"];
|
|
6
|
+
export declare const TASK_CATEGORY_FILES: {
|
|
7
|
+
readonly bugs: "bugs.md";
|
|
8
|
+
readonly performance: "performance.md";
|
|
9
|
+
readonly tests: "tests.md";
|
|
10
|
+
readonly todo: "todo.md";
|
|
11
|
+
readonly features: "features.md";
|
|
12
|
+
};
|
|
13
|
+
export declare const DEFAULT_INCLUDE_EXTENSIONS: readonly [".ts", ".tsx", ".js", ".jsx", ".mts", ".cts", ".mjs", ".cjs", ".json"];
|
|
14
|
+
export declare const DEFAULT_EXCLUDE_DIRECTORIES: readonly [".git", ".next", ".corydora", ".turbo", "build", "coverage", "dist", "docs", "documentation", "generated", "logs", "node_modules", "out", "public", "storybook-static", "tmp"];
|
|
15
|
+
export declare const DEFAULT_MODELS: Record<string, string>;
|
|
16
|
+
export declare const DEFAULT_BRANCH_PREFIX = "corydora";
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export const CONFIG_FILE_NAME = '.corydora.json';
|
|
2
|
+
export const CORYDORA_DIR_NAME = '.corydora';
|
|
3
|
+
export const BUILTIN_TASK_CATEGORIES = [
|
|
4
|
+
'bugs',
|
|
5
|
+
'performance',
|
|
6
|
+
'tests',
|
|
7
|
+
'todo',
|
|
8
|
+
'features',
|
|
9
|
+
];
|
|
10
|
+
export const TECH_LENSES = [
|
|
11
|
+
'typescript',
|
|
12
|
+
'react',
|
|
13
|
+
'nextjs',
|
|
14
|
+
'node-cli',
|
|
15
|
+
'electron',
|
|
16
|
+
'security',
|
|
17
|
+
'database',
|
|
18
|
+
'refactoring',
|
|
19
|
+
];
|
|
20
|
+
export const RUNTIME_PROVIDER_IDS = [
|
|
21
|
+
'claude-cli',
|
|
22
|
+
'codex-cli',
|
|
23
|
+
'gemini-cli',
|
|
24
|
+
'anthropic-api',
|
|
25
|
+
'openai-api',
|
|
26
|
+
'google-api',
|
|
27
|
+
'bedrock',
|
|
28
|
+
'ollama',
|
|
29
|
+
'fake',
|
|
30
|
+
];
|
|
31
|
+
export const TASK_CATEGORY_FILES = {
|
|
32
|
+
bugs: 'bugs.md',
|
|
33
|
+
performance: 'performance.md',
|
|
34
|
+
tests: 'tests.md',
|
|
35
|
+
todo: 'todo.md',
|
|
36
|
+
features: 'features.md',
|
|
37
|
+
};
|
|
38
|
+
export const DEFAULT_INCLUDE_EXTENSIONS = [
|
|
39
|
+
'.ts',
|
|
40
|
+
'.tsx',
|
|
41
|
+
'.js',
|
|
42
|
+
'.jsx',
|
|
43
|
+
'.mts',
|
|
44
|
+
'.cts',
|
|
45
|
+
'.mjs',
|
|
46
|
+
'.cjs',
|
|
47
|
+
'.json',
|
|
48
|
+
];
|
|
49
|
+
export const DEFAULT_EXCLUDE_DIRECTORIES = [
|
|
50
|
+
'.git',
|
|
51
|
+
'.next',
|
|
52
|
+
'.corydora',
|
|
53
|
+
'.turbo',
|
|
54
|
+
'build',
|
|
55
|
+
'coverage',
|
|
56
|
+
'dist',
|
|
57
|
+
'docs',
|
|
58
|
+
'documentation',
|
|
59
|
+
'generated',
|
|
60
|
+
'logs',
|
|
61
|
+
'node_modules',
|
|
62
|
+
'out',
|
|
63
|
+
'public',
|
|
64
|
+
'storybook-static',
|
|
65
|
+
'tmp',
|
|
66
|
+
];
|
|
67
|
+
export const DEFAULT_MODELS = {
|
|
68
|
+
'claude-cli': 'sonnet',
|
|
69
|
+
'codex-cli': 'gpt-5-codex',
|
|
70
|
+
'gemini-cli': 'gemini-2.5-pro',
|
|
71
|
+
'anthropic-api': 'claude-sonnet-4-5',
|
|
72
|
+
'openai-api': 'gpt-5',
|
|
73
|
+
'google-api': 'gemini-2.5-pro',
|
|
74
|
+
bedrock: 'anthropic.claude-3-7-sonnet-20250219-v1:0',
|
|
75
|
+
ollama: 'qwen2.5-coder:7b',
|
|
76
|
+
fake: 'fake-corydora-model',
|
|
77
|
+
};
|
|
78
|
+
export const DEFAULT_BRANCH_PREFIX = 'corydora';
|
|
79
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AACjD,MAAM,CAAC,MAAM,iBAAiB,GAAG,WAAW,CAAC;AAE7C,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,MAAM;IACN,aAAa;IACb,OAAO;IACP,MAAM;IACN,UAAU;CACF,CAAC;AAEX,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,YAAY;IACZ,OAAO;IACP,QAAQ;IACR,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,aAAa;CACL,CAAC;AAEX,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,eAAe;IACf,YAAY;IACZ,YAAY;IACZ,SAAS;IACT,QAAQ;IACR,MAAM;CACE,CAAC;AAEX,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,gBAAgB;IAC7B,KAAK,EAAE,UAAU;IACjB,IAAI,EAAE,SAAS;IACf,QAAQ,EAAE,aAAa;CACf,CAAC;AAEX,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;CACC,CAAC;AAEX,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,MAAM;IACN,OAAO;IACP,WAAW;IACX,QAAQ;IACR,OAAO;IACP,UAAU;IACV,MAAM;IACN,MAAM;IACN,eAAe;IACf,WAAW;IACX,MAAM;IACN,cAAc;IACd,KAAK;IACL,QAAQ;IACR,kBAAkB;IAClB,KAAK;CACG,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAA2B;IACpD,YAAY,EAAE,QAAQ;IACtB,WAAW,EAAE,aAAa;IAC1B,YAAY,EAAE,gBAAgB;IAC9B,eAAe,EAAE,mBAAmB;IACpC,YAAY,EAAE,OAAO;IACrB,YAAY,EAAE,gBAAgB;IAC9B,OAAO,EAAE,2CAA2C;IACpD,MAAM,EAAE,kBAAkB;IAC1B,IAAI,EAAE,qBAAqB;CAC5B,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,UAAU,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export interface DiscoveryOptions {
|
|
2
|
+
includeExtensions: string[];
|
|
3
|
+
excludeDirectories: string[];
|
|
4
|
+
}
|
|
5
|
+
export declare function discoverCandidateFiles(projectRoot: string, options: DiscoveryOptions): string[];
|
|
6
|
+
export declare function groupFilesForScheduling(files: string[]): Record<string, string[]>;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { readdirSync } from 'node:fs';
|
|
2
|
+
import { extname, join, relative, resolve } from 'node:path';
|
|
3
|
+
function isTestLikePath(filePath) {
|
|
4
|
+
return (filePath.includes('/__tests__/') ||
|
|
5
|
+
filePath.includes('/tests/') ||
|
|
6
|
+
filePath.includes('/test/') ||
|
|
7
|
+
filePath.includes('/fixtures/') ||
|
|
8
|
+
filePath.includes('/__fixtures__/') ||
|
|
9
|
+
filePath.includes('/mocks/') ||
|
|
10
|
+
filePath.includes('.spec.') ||
|
|
11
|
+
filePath.includes('.test.'));
|
|
12
|
+
}
|
|
13
|
+
function filePriority(filePath) {
|
|
14
|
+
if (filePath.includes('/src/') && !isTestLikePath(filePath)) {
|
|
15
|
+
return 0;
|
|
16
|
+
}
|
|
17
|
+
if (!isTestLikePath(filePath)) {
|
|
18
|
+
return 1;
|
|
19
|
+
}
|
|
20
|
+
return 2;
|
|
21
|
+
}
|
|
22
|
+
function shouldIncludeFile(filePath, options) {
|
|
23
|
+
const extension = extname(filePath);
|
|
24
|
+
if (!options.includeExtensions.includes(extension)) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
if (filePath.endsWith('.d.ts')) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
function walk(directory, projectRoot, options, files) {
|
|
33
|
+
for (const entry of readdirSync(directory, { withFileTypes: true })) {
|
|
34
|
+
if (entry.isDirectory()) {
|
|
35
|
+
if (options.excludeDirectories.includes(entry.name)) {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
walk(join(directory, entry.name), projectRoot, options, files);
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (!entry.isFile()) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const absolutePath = join(directory, entry.name);
|
|
45
|
+
const relativePath = relative(projectRoot, absolutePath).replace(/\\/g, '/');
|
|
46
|
+
if (shouldIncludeFile(relativePath, options)) {
|
|
47
|
+
files.push(relativePath);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function discoverCandidateFiles(projectRoot, options) {
|
|
52
|
+
const files = [];
|
|
53
|
+
walk(resolve(projectRoot), projectRoot, options, files);
|
|
54
|
+
return files.sort((left, right) => {
|
|
55
|
+
const leftPriority = filePriority(left);
|
|
56
|
+
const rightPriority = filePriority(right);
|
|
57
|
+
if (leftPriority !== rightPriority) {
|
|
58
|
+
return leftPriority - rightPriority;
|
|
59
|
+
}
|
|
60
|
+
return left.localeCompare(right);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
export function groupFilesForScheduling(files) {
|
|
64
|
+
return files.reduce((acc, file) => {
|
|
65
|
+
const segments = file.split('/');
|
|
66
|
+
const group = ['apps', 'packages', 'clients', 'analyzers'].includes(segments[0] ?? '') && segments[1]
|
|
67
|
+
? `${segments[0]}/${segments[1]}`
|
|
68
|
+
: (segments[0] ?? '.');
|
|
69
|
+
acc[group] ??= [];
|
|
70
|
+
acc[group].push(file);
|
|
71
|
+
return acc;
|
|
72
|
+
}, {});
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/filesystem/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAO7D,SAAS,cAAc,CAAC,QAAgB;IACtC,OAAO,CACL,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC;QAChC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC5B,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC3B,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC/B,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QACnC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC5B,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC3B,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAC5B,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB,EAAE,OAAyB;IACpE,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACnD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,IAAI,CACX,SAAiB,EACjB,WAAmB,EACnB,OAAyB,EACzB,KAAe;IAEf,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACpE,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,OAAO,CAAC,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpD,SAAS;YACX,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YAC/D,SAAS;QACX,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACpB,SAAS;QACX,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC7E,IAAI,iBAAiB,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,WAAmB,EAAE,OAAyB;IACnF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACxD,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAChC,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAE1C,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;YACnC,OAAO,YAAY,GAAG,aAAa,CAAC;QACtC,CAAC;QAED,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAe;IACrD,OAAO,KAAK,CAAC,MAAM,CAA2B,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,KAAK,GACT,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;YACrF,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE;YACjC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QAE3B,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAClB,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function ensureGitignoreEntries(projectRoot: string, trackMarkdownQueues: boolean): Promise<void>;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { resolve } from 'node:path';
|
|
4
|
+
const CORYDORA_IGNORE_ENTRIES = [
|
|
5
|
+
'.corydora/logs/',
|
|
6
|
+
'.corydora/runs/',
|
|
7
|
+
'.corydora/state/',
|
|
8
|
+
'.corydora/.env.local',
|
|
9
|
+
];
|
|
10
|
+
const MARKDOWN_IGNORE_ENTRIES = [
|
|
11
|
+
'.corydora/todo.md',
|
|
12
|
+
'.corydora/features.md',
|
|
13
|
+
'.corydora/bugs.md',
|
|
14
|
+
'.corydora/performance.md',
|
|
15
|
+
'.corydora/tests.md',
|
|
16
|
+
];
|
|
17
|
+
export async function ensureGitignoreEntries(projectRoot, trackMarkdownQueues) {
|
|
18
|
+
const gitignorePath = resolve(projectRoot, '.gitignore');
|
|
19
|
+
const existing = existsSync(gitignorePath) ? await readFile(gitignorePath, 'utf8') : '';
|
|
20
|
+
const lines = new Set(existing
|
|
21
|
+
.split('\n')
|
|
22
|
+
.map((line) => line.trim())
|
|
23
|
+
.filter(Boolean));
|
|
24
|
+
for (const entry of CORYDORA_IGNORE_ENTRIES) {
|
|
25
|
+
lines.add(entry);
|
|
26
|
+
}
|
|
27
|
+
if (!trackMarkdownQueues) {
|
|
28
|
+
for (const entry of MARKDOWN_IGNORE_ENTRIES) {
|
|
29
|
+
lines.add(entry);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const nextContent = `${Array.from(lines)
|
|
33
|
+
.sort((left, right) => left.localeCompare(right))
|
|
34
|
+
.join('\n')}\n`;
|
|
35
|
+
await writeFile(gitignorePath, nextContent, 'utf8');
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=gitignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../src/filesystem/gitignore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,uBAAuB,GAAG;IAC9B,iBAAiB;IACjB,iBAAiB;IACjB,kBAAkB;IAClB,sBAAsB;CACvB,CAAC;AAEF,MAAM,uBAAuB,GAAG;IAC9B,mBAAmB;IACnB,uBAAuB;IACvB,mBAAmB;IACnB,0BAA0B;IAC1B,oBAAoB;CACrB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,WAAmB,EACnB,mBAA4B;IAE5B,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxF,MAAM,KAAK,GAAG,IAAI,GAAG,CACnB,QAAQ;SACL,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,uBAAuB,EAAE,CAAC;QAC5C,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,KAAK,MAAM,KAAK,IAAI,uBAAuB,EAAE,CAAC;YAC5C,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;SACrC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SAChD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IAClB,MAAM,SAAS,CAAC,aAAa,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
3
|
+
import { dirname, resolve } from 'node:path';
|
|
4
|
+
function walkUp(startDir, predicate) {
|
|
5
|
+
let current = resolve(startDir);
|
|
6
|
+
for (let index = 0; index < 25; index++) {
|
|
7
|
+
if (predicate(current)) {
|
|
8
|
+
return current;
|
|
9
|
+
}
|
|
10
|
+
const parent = dirname(current);
|
|
11
|
+
if (parent === current) {
|
|
12
|
+
break;
|
|
13
|
+
}
|
|
14
|
+
current = parent;
|
|
15
|
+
}
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
export function findGitRoot(startDir) {
|
|
19
|
+
try {
|
|
20
|
+
return execFileSync('git', ['rev-parse', '--show-toplevel'], {
|
|
21
|
+
cwd: startDir,
|
|
22
|
+
encoding: 'utf8',
|
|
23
|
+
}).trim();
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return (walkUp(startDir, (directory) => existsSync(resolve(directory, '.git'))) ?? resolve(startDir));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function detectPackageManager(projectRoot) {
|
|
30
|
+
if (existsSync(resolve(projectRoot, 'pnpm-lock.yaml'))) {
|
|
31
|
+
return 'pnpm';
|
|
32
|
+
}
|
|
33
|
+
if (existsSync(resolve(projectRoot, 'package-lock.json'))) {
|
|
34
|
+
return 'npm';
|
|
35
|
+
}
|
|
36
|
+
if (existsSync(resolve(projectRoot, 'yarn.lock'))) {
|
|
37
|
+
return 'yarn';
|
|
38
|
+
}
|
|
39
|
+
if (existsSync(resolve(projectRoot, 'bun.lockb')) ||
|
|
40
|
+
existsSync(resolve(projectRoot, 'bun.lock'))) {
|
|
41
|
+
return 'bun';
|
|
42
|
+
}
|
|
43
|
+
return 'unknown';
|
|
44
|
+
}
|
|
45
|
+
export function detectProjectFingerprint(projectRoot) {
|
|
46
|
+
const frameworks = new Set();
|
|
47
|
+
const techLenses = new Set(['typescript']);
|
|
48
|
+
const topLevelDirectories = readdirSync(projectRoot, { withFileTypes: true })
|
|
49
|
+
.filter((entry) => entry.isDirectory())
|
|
50
|
+
.map((entry) => entry.name)
|
|
51
|
+
.sort((left, right) => left.localeCompare(right));
|
|
52
|
+
if (existsSync(resolve(projectRoot, 'package.json'))) {
|
|
53
|
+
frameworks.add('node');
|
|
54
|
+
techLenses.add('node-cli');
|
|
55
|
+
}
|
|
56
|
+
if (existsSync(resolve(projectRoot, 'next.config.js')) ||
|
|
57
|
+
existsSync(resolve(projectRoot, 'next.config.mjs')) ||
|
|
58
|
+
existsSync(resolve(projectRoot, 'app')) ||
|
|
59
|
+
existsSync(resolve(projectRoot, 'pages'))) {
|
|
60
|
+
frameworks.add('nextjs');
|
|
61
|
+
techLenses.add('nextjs');
|
|
62
|
+
techLenses.add('react');
|
|
63
|
+
}
|
|
64
|
+
if (existsSync(resolve(projectRoot, 'src')) || existsSync(resolve(projectRoot, 'components'))) {
|
|
65
|
+
frameworks.add('typescript');
|
|
66
|
+
}
|
|
67
|
+
if (existsSync(resolve(projectRoot, 'electron-builder.yml')) ||
|
|
68
|
+
existsSync(resolve(projectRoot, 'electron.vite.config.ts')) ||
|
|
69
|
+
existsSync(resolve(projectRoot, 'electron.vite.config.js'))) {
|
|
70
|
+
frameworks.add('electron');
|
|
71
|
+
techLenses.add('electron');
|
|
72
|
+
}
|
|
73
|
+
if (existsSync(resolve(projectRoot, 'prisma')) || existsSync(resolve(projectRoot, 'drizzle'))) {
|
|
74
|
+
techLenses.add('database');
|
|
75
|
+
}
|
|
76
|
+
if (existsSync(resolve(projectRoot, 'app')) || existsSync(resolve(projectRoot, 'components'))) {
|
|
77
|
+
techLenses.add('react');
|
|
78
|
+
}
|
|
79
|
+
if (existsSync(resolve(projectRoot, 'tsconfig.json'))) {
|
|
80
|
+
techLenses.add('typescript');
|
|
81
|
+
}
|
|
82
|
+
techLenses.add('refactoring');
|
|
83
|
+
const packageRoots = ['packages', 'apps', 'clients']
|
|
84
|
+
.map((segment) => resolve(projectRoot, segment))
|
|
85
|
+
.filter((directory) => existsSync(directory));
|
|
86
|
+
const packageCount = packageRoots.length === 0
|
|
87
|
+
? existsSync(resolve(projectRoot, 'package.json'))
|
|
88
|
+
? 1
|
|
89
|
+
: 0
|
|
90
|
+
: packageRoots.reduce((count, directory) => {
|
|
91
|
+
return (count +
|
|
92
|
+
readdirSync(directory, { withFileTypes: true }).filter((entry) => entry.isDirectory())
|
|
93
|
+
.length);
|
|
94
|
+
}, 0);
|
|
95
|
+
return {
|
|
96
|
+
packageManager: detectPackageManager(projectRoot),
|
|
97
|
+
frameworks: Array.from(frameworks).sort((left, right) => left.localeCompare(right)),
|
|
98
|
+
techLenses: Array.from(techLenses).sort((left, right) => left.localeCompare(right)),
|
|
99
|
+
packageCount,
|
|
100
|
+
topLevelDirectories,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/filesystem/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { GitIsolationMode, CorydoraConfig } from '../types/domain.js';
|
|
2
|
+
export interface IsolationContext {
|
|
3
|
+
mode: GitIsolationMode;
|
|
4
|
+
workRoot: string;
|
|
5
|
+
branchName?: string;
|
|
6
|
+
baseBranch: string;
|
|
7
|
+
worktreePath?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function resolveWorktreeRoot(config: CorydoraConfig): string;
|
|
10
|
+
export declare function prepareIsolationContext(options: {
|
|
11
|
+
projectRoot: string;
|
|
12
|
+
config: CorydoraConfig;
|
|
13
|
+
runId: string;
|
|
14
|
+
dryRun: boolean;
|
|
15
|
+
}): IsolationContext;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { homedir, platform } from 'node:os';
|
|
4
|
+
import { join, resolve } from 'node:path';
|
|
5
|
+
import { ensureCleanWorktree, currentBranch } from './repository.js';
|
|
6
|
+
function defaultWorktreeRoot() {
|
|
7
|
+
if (platform() === 'darwin') {
|
|
8
|
+
return resolve(homedir(), 'Library', 'Caches', 'corydora', 'worktrees');
|
|
9
|
+
}
|
|
10
|
+
return resolve(homedir(), '.cache', 'corydora', 'worktrees');
|
|
11
|
+
}
|
|
12
|
+
function sanitizedSlug(input) {
|
|
13
|
+
return input.replace(/[^a-zA-Z0-9._-]+/g, '-').replace(/-+/g, '-');
|
|
14
|
+
}
|
|
15
|
+
export function resolveWorktreeRoot(config) {
|
|
16
|
+
return config.git.worktreeRoot ? resolve(config.git.worktreeRoot) : defaultWorktreeRoot();
|
|
17
|
+
}
|
|
18
|
+
export function prepareIsolationContext(options) {
|
|
19
|
+
const baseBranch = currentBranch(options.projectRoot);
|
|
20
|
+
const branchName = `${options.config.git.branchPrefix}/${new Date().toISOString().slice(0, 10)}-${options.runId}`;
|
|
21
|
+
if (options.config.git.isolationMode === 'current-branch' || options.dryRun) {
|
|
22
|
+
return {
|
|
23
|
+
mode: options.config.git.isolationMode,
|
|
24
|
+
workRoot: options.projectRoot,
|
|
25
|
+
baseBranch,
|
|
26
|
+
...(options.config.git.isolationMode !== 'current-branch' ? { branchName } : {}),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
ensureCleanWorktree(options.projectRoot);
|
|
30
|
+
if (options.config.git.isolationMode === 'branch') {
|
|
31
|
+
execFileSync('git', ['checkout', '-B', branchName, baseBranch], {
|
|
32
|
+
cwd: options.projectRoot,
|
|
33
|
+
stdio: 'ignore',
|
|
34
|
+
});
|
|
35
|
+
return {
|
|
36
|
+
mode: 'branch',
|
|
37
|
+
workRoot: options.projectRoot,
|
|
38
|
+
branchName,
|
|
39
|
+
baseBranch,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const rootDirectory = resolveWorktreeRoot(options.config);
|
|
43
|
+
const repositoryName = sanitizedSlug(options.projectRoot.split('/').filter(Boolean).at(-1) ?? 'repo');
|
|
44
|
+
const worktreePath = join(rootDirectory, `${repositoryName}-${options.runId}`);
|
|
45
|
+
if (existsSync(worktreePath)) {
|
|
46
|
+
execFileSync('git', ['worktree', 'remove', '--force', worktreePath], {
|
|
47
|
+
cwd: options.projectRoot,
|
|
48
|
+
stdio: 'ignore',
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
execFileSync('mkdir', ['-p', rootDirectory], { stdio: 'ignore' });
|
|
52
|
+
execFileSync('git', ['worktree', 'add', '-B', branchName, worktreePath, baseBranch], {
|
|
53
|
+
cwd: options.projectRoot,
|
|
54
|
+
stdio: 'ignore',
|
|
55
|
+
});
|
|
56
|
+
return {
|
|
57
|
+
mode: 'worktree',
|
|
58
|
+
workRoot: worktreePath,
|
|
59
|
+
branchName,
|
|
60
|
+
baseBranch,
|
|
61
|
+
worktreePath,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=isolation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isolation.js","sourceRoot":"","sources":["../../src/git/isolation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function runGit(args: string[], cwd: string): string;
|
|
2
|
+
export declare function hasDirtyWorktree(cwd: string): boolean;
|
|
3
|
+
export declare function currentBranch(cwd: string): string;
|
|
4
|
+
export declare function ensureCleanWorktree(cwd: string): void;
|
|
5
|
+
export declare function commitAllChanges(cwd: string, message: string): boolean;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { execFileSync, spawnSync } from 'node:child_process';
|
|
2
|
+
export function runGit(args, cwd) {
|
|
3
|
+
return execFileSync('git', args, { cwd, encoding: 'utf8' }).trim();
|
|
4
|
+
}
|
|
5
|
+
export function hasDirtyWorktree(cwd) {
|
|
6
|
+
return runGit(['status', '--porcelain'], cwd).length > 0;
|
|
7
|
+
}
|
|
8
|
+
export function currentBranch(cwd) {
|
|
9
|
+
return runGit(['branch', '--show-current'], cwd);
|
|
10
|
+
}
|
|
11
|
+
export function ensureCleanWorktree(cwd) {
|
|
12
|
+
if (hasDirtyWorktree(cwd)) {
|
|
13
|
+
throw new Error('Working tree is dirty. Commit or stash changes before running Corydora.');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function commitAllChanges(cwd, message) {
|
|
17
|
+
if (!hasDirtyWorktree(cwd)) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
execFileSync('git', ['add', '-A'], { cwd, stdio: 'ignore' });
|
|
21
|
+
const result = spawnSync('git', ['diff', '--cached', '--quiet'], { cwd, stdio: 'ignore' });
|
|
22
|
+
if (result.status === 0) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
execFileSync('git', ['commit', '-m', message], { cwd, stdio: 'ignore' });
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/git/repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,UAAU,MAAM,CAAC,IAAc,EAAE,GAAW;IAChD,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,OAAO,MAAM,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,MAAM,CAAC,CAAC,QAAQ,EAAE,gBAAgB,CAAC,EAAE,GAAG,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,OAAe;IAC3D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,YAAY,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC3F,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,YAAY,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzE,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/index.d.ts
ADDED