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.
Files changed (117) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +21 -0
  3. package/README.md +165 -0
  4. package/dist/agents/builtin-agents.d.ts +2 -0
  5. package/dist/agents/builtin-agents.js +75 -0
  6. package/dist/agents/builtin-agents.js.map +1 -0
  7. package/dist/agents/catalog.d.ts +4 -0
  8. package/dist/agents/catalog.js +49 -0
  9. package/dist/agents/catalog.js.map +1 -0
  10. package/dist/agents/frontmatter.d.ts +5 -0
  11. package/dist/agents/frontmatter.js +30 -0
  12. package/dist/agents/frontmatter.js.map +1 -0
  13. package/dist/commands/agents-import.d.ts +2 -0
  14. package/dist/commands/agents-import.js +12 -0
  15. package/dist/commands/agents-import.js.map +1 -0
  16. package/dist/commands/agents-list.d.ts +2 -0
  17. package/dist/commands/agents-list.js +26 -0
  18. package/dist/commands/agents-list.js.map +1 -0
  19. package/dist/commands/attach.d.ts +1 -0
  20. package/dist/commands/attach.js +16 -0
  21. package/dist/commands/attach.js.map +1 -0
  22. package/dist/commands/config-validate.d.ts +2 -0
  23. package/dist/commands/config-validate.js +10 -0
  24. package/dist/commands/config-validate.js.map +1 -0
  25. package/dist/commands/doctor.d.ts +2 -0
  26. package/dist/commands/doctor.js +32 -0
  27. package/dist/commands/doctor.js.map +1 -0
  28. package/dist/commands/helpers.d.ts +4 -0
  29. package/dist/commands/helpers.js +21 -0
  30. package/dist/commands/helpers.js.map +1 -0
  31. package/dist/commands/init.d.ts +7 -0
  32. package/dist/commands/init.js +117 -0
  33. package/dist/commands/init.js.map +1 -0
  34. package/dist/commands/run.d.ts +11 -0
  35. package/dist/commands/run.js +90 -0
  36. package/dist/commands/run.js.map +1 -0
  37. package/dist/commands/status.d.ts +2 -0
  38. package/dist/commands/status.js +40 -0
  39. package/dist/commands/status.js.map +1 -0
  40. package/dist/commands/stop.d.ts +2 -0
  41. package/dist/commands/stop.js +25 -0
  42. package/dist/commands/stop.js.map +1 -0
  43. package/dist/config/env.d.ts +2 -0
  44. package/dist/config/env.js +68 -0
  45. package/dist/config/env.js.map +1 -0
  46. package/dist/config/files.d.ts +6 -0
  47. package/dist/config/files.js +74 -0
  48. package/dist/config/files.js.map +1 -0
  49. package/dist/config/schema.d.ts +93 -0
  50. package/dist/config/schema.js +113 -0
  51. package/dist/config/schema.js.map +1 -0
  52. package/dist/constants.d.ts +16 -0
  53. package/dist/constants.js +79 -0
  54. package/dist/constants.js.map +1 -0
  55. package/dist/filesystem/discovery.d.ts +6 -0
  56. package/dist/filesystem/discovery.js +74 -0
  57. package/dist/filesystem/discovery.js.map +1 -0
  58. package/dist/filesystem/gitignore.d.ts +1 -0
  59. package/dist/filesystem/gitignore.js +37 -0
  60. package/dist/filesystem/gitignore.js.map +1 -0
  61. package/dist/filesystem/project.d.ts +3 -0
  62. package/dist/filesystem/project.js +103 -0
  63. package/dist/filesystem/project.js.map +1 -0
  64. package/dist/git/isolation.d.ts +15 -0
  65. package/dist/git/isolation.js +64 -0
  66. package/dist/git/isolation.js.map +1 -0
  67. package/dist/git/repository.d.ts +5 -0
  68. package/dist/git/repository.js +28 -0
  69. package/dist/git/repository.js.map +1 -0
  70. package/dist/index.d.ts +2 -0
  71. package/dist/index.js +114 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/providers/api.d.ts +2 -0
  74. package/dist/providers/api.js +438 -0
  75. package/dist/providers/api.js.map +1 -0
  76. package/dist/providers/cli.d.ts +2 -0
  77. package/dist/providers/cli.js +326 -0
  78. package/dist/providers/cli.js.map +1 -0
  79. package/dist/providers/fake.d.ts +11 -0
  80. package/dist/providers/fake.js +61 -0
  81. package/dist/providers/fake.js.map +1 -0
  82. package/dist/providers/index.d.ts +4 -0
  83. package/dist/providers/index.js +27 -0
  84. package/dist/providers/index.js.map +1 -0
  85. package/dist/providers/utils.d.ts +40 -0
  86. package/dist/providers/utils.js +228 -0
  87. package/dist/providers/utils.js.map +1 -0
  88. package/dist/queue/render.d.ts +2 -0
  89. package/dist/queue/render.js +52 -0
  90. package/dist/queue/render.js.map +1 -0
  91. package/dist/queue/state.d.ts +12 -0
  92. package/dist/queue/state.js +117 -0
  93. package/dist/queue/state.js.map +1 -0
  94. package/dist/runtime/prompts.d.ts +17 -0
  95. package/dist/runtime/prompts.js +102 -0
  96. package/dist/runtime/prompts.js.map +1 -0
  97. package/dist/runtime/run-session.d.ts +11 -0
  98. package/dist/runtime/run-session.js +292 -0
  99. package/dist/runtime/run-session.js.map +1 -0
  100. package/dist/runtime/scheduler.d.ts +4 -0
  101. package/dist/runtime/scheduler.js +63 -0
  102. package/dist/runtime/scheduler.js.map +1 -0
  103. package/dist/runtime/tmux.d.ts +8 -0
  104. package/dist/runtime/tmux.js +58 -0
  105. package/dist/runtime/tmux.js.map +1 -0
  106. package/dist/types/domain.d.ts +206 -0
  107. package/dist/types/domain.js +2 -0
  108. package/dist/types/domain.js.map +1 -0
  109. package/dist/ui/menu.d.ts +1 -0
  110. package/dist/ui/menu.js +18 -0
  111. package/dist/ui/menu.js.map +1 -0
  112. package/dist/ui/output.d.ts +8 -0
  113. package/dist/ui/output.js +32 -0
  114. package/dist/ui/output.js.map +1 -0
  115. package/logo.webp +0 -0
  116. package/package.json +89 -0
  117. 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":"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"}
@@ -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,3 @@
1
+ import type { ProjectFingerprint } from '../types/domain.js';
2
+ export declare function findGitRoot(startDir: string): string;
3
+ export declare function detectProjectFingerprint(projectRoot: string): ProjectFingerprint;
@@ -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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};