corydora 0.3.2 → 1.0.3
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 +69 -0
- package/README.md +27 -4
- package/dist/commands/doctor.js +37 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.js +114 -14
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/run.d.ts +3 -0
- package/dist/commands/run.js +51 -20
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/status.js +37 -6
- package/dist/commands/status.js.map +1 -1
- package/dist/config/files.js +23 -1
- package/dist/config/files.js.map +1 -1
- package/dist/config/schema.d.ts +0 -80
- package/dist/config/schema.js +162 -52
- package/dist/config/schema.js.map +1 -1
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +9 -0
- package/dist/constants.js.map +1 -1
- package/dist/filesystem/discovery.d.ts +2 -0
- package/dist/filesystem/discovery.js +2 -2
- package/dist/filesystem/discovery.js.map +1 -1
- package/dist/filesystem/gitignore.d.ts +3 -0
- package/dist/filesystem/gitignore.js +37 -7
- package/dist/filesystem/gitignore.js.map +1 -1
- package/dist/git/isolation.d.ts +1 -0
- package/dist/git/isolation.js +5 -4
- package/dist/git/isolation.js.map +1 -1
- package/dist/git/repository.d.ts +2 -1
- package/dist/git/repository.js +21 -11
- package/dist/git/repository.js.map +1 -1
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -1
- package/dist/providers/fake.js +16 -0
- package/dist/providers/fake.js.map +1 -1
- package/dist/providers/utils.js +24 -0
- package/dist/providers/utils.js.map +1 -1
- package/dist/queue/render.js +10 -3
- package/dist/queue/render.js.map +1 -1
- package/dist/queue/state.d.ts +53 -4
- package/dist/queue/state.js +301 -29
- package/dist/queue/state.js.map +1 -1
- package/dist/runtime/modes.d.ts +29 -0
- package/dist/runtime/modes.js +423 -0
- package/dist/runtime/modes.js.map +1 -0
- package/dist/runtime/prompts.d.ts +8 -3
- package/dist/runtime/prompts.js +58 -12
- package/dist/runtime/prompts.js.map +1 -1
- package/dist/runtime/routes.d.ts +28 -0
- package/dist/runtime/routes.js +87 -0
- package/dist/runtime/routes.js.map +1 -0
- package/dist/runtime/run-session.d.ts +3 -2
- package/dist/runtime/run-session.js +521 -206
- package/dist/runtime/run-session.js.map +1 -1
- package/dist/runtime/tooling.d.ts +2 -0
- package/dist/runtime/tooling.js +79 -0
- package/dist/runtime/tooling.js.map +1 -0
- package/dist/runtime/validation.d.ts +7 -0
- package/dist/runtime/validation.js +115 -0
- package/dist/runtime/validation.js.map +1 -0
- package/dist/types/domain.d.ts +139 -16
- package/package.json +4 -3
- package/schemas/corydora.schema.json +165 -4
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,75 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to Corydora are documented in this file.
|
|
4
4
|
|
|
5
|
+
## [1.0.3](https://github.com/glorioustephan/corydora/compare/corydora-v1.0.2...corydora-v1.0.3) (2026-04-14)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
* republish after npm trusted publishing setup ([853b8a2](https://github.com/glorioustephan/corydora/commit/853b8a250d5a02c5839861b27ca9ac781e27f356))
|
|
11
|
+
|
|
12
|
+
## [1.0.2](https://github.com/glorioustephan/corydora/compare/corydora-v1.0.1...corydora-v1.0.2) (2026-04-14)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### Bug Fixes
|
|
16
|
+
|
|
17
|
+
* **publish.yml:** the workflow ran pnpm install --frozen-lockfile before any actions/checkout ([#19](https://github.com/glorioustephan/corydora/issues/19)) ([dd6b461](https://github.com/glorioustephan/corydora/commit/dd6b461c2d5609b291168cf41e0657bb6ff54898))
|
|
18
|
+
|
|
19
|
+
## [1.0.1](https://github.com/glorioustephan/corydora/compare/corydora-v1.0.0...corydora-v1.0.1) (2026-04-14)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
### Bug Fixes
|
|
23
|
+
|
|
24
|
+
* release PR [#17](https://github.com/glorioustephan/corydora/issues/17) changes ([2ded546](https://github.com/glorioustephan/corydora/commit/2ded546cb50365c49dff4e67ceb65396b6f7371d))
|
|
25
|
+
|
|
26
|
+
## [1.0.0](https://github.com/glorioustephan/corydora/compare/corydora-v0.4.0...corydora-v1.0.0) (2026-04-13)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
### ⚠ BREAKING CHANGES
|
|
30
|
+
|
|
31
|
+
* corydora status --json changed shape and status vocabulary.
|
|
32
|
+
|
|
33
|
+
### Features
|
|
34
|
+
|
|
35
|
+
* adding modes and introducing a background daemon with vNext ([#14](https://github.com/glorioustephan/corydora/issues/14)) ([66db5fc](https://github.com/glorioustephan/corydora/commit/66db5fc94805e68e6a364bbc4440d6d0d96aa540))
|
|
36
|
+
|
|
37
|
+
## [0.4.0](https://github.com/glorioustephan/corydora/compare/corydora-v0.3.4...corydora-v0.4.0) (2026-03-31)
|
|
38
|
+
|
|
39
|
+
### Features
|
|
40
|
+
|
|
41
|
+
- add initial release package and update README with new logo format ([dd696d1](https://github.com/glorioustephan/corydora/commit/dd696d14b8dd5ee2e29d585ac5b288398e7aaecb))
|
|
42
|
+
- **adding caffeine support on macos:** preventing machine from sleeping when preferred ([7838627](https://github.com/glorioustephan/corydora/commit/7838627225526ecb22af6ec744a3fa8e7e405a3e))
|
|
43
|
+
- **cli:** add --no-verify option to skip git commit hooks ([cd9efc3](https://github.com/glorioustephan/corydora/commit/cd9efc3cb7ce7c2168680c495e2638266cdb0a39))
|
|
44
|
+
- **cli:** add --no-verify option to skip git commit hooks ([6fcb797](https://github.com/glorioustephan/corydora/commit/6fcb7977cd2ee2c35728d16ef4b93d7b269f46fc))
|
|
45
|
+
- **cli:** add --no-verify option to skip git commit hooks ([8d27d31](https://github.com/glorioustephan/corydora/commit/8d27d31ec8f6e4639b4a5183912238741e34a51b))
|
|
46
|
+
- **docs and ci:** updating docs infrastructure to work with github actions, adding release-please ([c71da43](https://github.com/glorioustephan/corydora/commit/c71da43b98dcac4f4585e6785492518699018e32))
|
|
47
|
+
- enhance runtime configuration and documentation- Added configurable parameters for request ([7838627](https://github.com/glorioustephan/corydora/commit/7838627225526ecb22af6ec744a3fa8e7e405a3e))
|
|
48
|
+
|
|
49
|
+
### Bug Fixes
|
|
50
|
+
|
|
51
|
+
- **cli:** enhancing --version and --help flags ([2b65e59](https://github.com/glorioustephan/corydora/commit/2b65e59c97f656325e2e6cd5434d6556082161dd))
|
|
52
|
+
- **cli:** enhancing --version and --help flags ([1832127](https://github.com/glorioustephan/corydora/commit/1832127f79a75c2f3efc7cb21f27f3c9148ab3c8))
|
|
53
|
+
- **publish.yml:** updating publish.yml and release for CI to format changes ([#9](https://github.com/glorioustephan/corydora/issues/9)) ([332a605](https://github.com/glorioustephan/corydora/commit/332a6057dcfb6b27d3a8c9d887d9ca7282e22e2e))
|
|
54
|
+
- **release-please:** updating process for release-please and use of token ([ba9c804](https://github.com/glorioustephan/corydora/commit/ba9c804ecab3be139a0a31ad79ae4adaf33514e9))
|
|
55
|
+
- **release-please:** updating process for release-please and use of token ([#11](https://github.com/glorioustephan/corydora/issues/11)) ([f994a9a](https://github.com/glorioustephan/corydora/commit/f994a9a49ea5722270e859ffd265bbd8196ec55e))
|
|
56
|
+
- **repository.ts:** adding pre-commit formatting ([1c91029](https://github.com/glorioustephan/corydora/commit/1c91029eadbb699786c7202bc8665b010e90ecc4))
|
|
57
|
+
- **repository.ts:** adding pre-commit formatting ([031e1ce](https://github.com/glorioustephan/corydora/commit/031e1ceec47f7c026efa9857ffa2e62a420574bd))
|
|
58
|
+
- **runtime:** avoid undefined optional flags in rebase conflict resolution ([97bf3e2](https://github.com/glorioustephan/corydora/commit/97bf3e26ff8e236d45cd8ef0a12a0dc4b8b967ba))
|
|
59
|
+
- **utils:** making the todo.md file the catch-all for unknown catgories ([87c89db](https://github.com/glorioustephan/corydora/commit/87c89dbf8b8276f27a993edb173676f15ba14176))
|
|
60
|
+
- **utils:** making the todo.md file the catch-all for unknown catgories ([c304926](https://github.com/glorioustephan/corydora/commit/c30492667217bbec9e460fb50e45f931005cc638))
|
|
61
|
+
|
|
62
|
+
## [0.3.4](https://github.com/glorioustephan/corydora/compare/corydora-v0.3.3...corydora-v0.3.4) (2026-03-31)
|
|
63
|
+
|
|
64
|
+
### Bug Fixes
|
|
65
|
+
|
|
66
|
+
- **release-please:** updating process for release-please and use of token ([#11](https://github.com/glorioustephan/corydora/issues/11)) ([f994a9a](https://github.com/glorioustephan/corydora/commit/f994a9a49ea5722270e859ffd265bbd8196ec55e))
|
|
67
|
+
|
|
68
|
+
## [0.3.3](https://github.com/glorioustephan/corydora/compare/corydora-v0.3.2...corydora-v0.3.3) (2026-03-31)
|
|
69
|
+
|
|
70
|
+
### Bug Fixes
|
|
71
|
+
|
|
72
|
+
- **publish.yml:** updating publish.yml and release for CI to format changes ([#9](https://github.com/glorioustephan/corydora/issues/9)) ([332a605](https://github.com/glorioustephan/corydora/commit/332a6057dcfb6b27d3a8c9d887d9ca7282e22e2e))
|
|
73
|
+
|
|
5
74
|
## [0.3.2](https://github.com/glorioustephan/corydora/compare/corydora-v0.3.1...corydora-v0.3.2) (2026-03-31)
|
|
6
75
|
|
|
7
76
|
### Bug Fixes
|
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
[](https://www.npmjs.com/package/corydora)
|
|
7
7
|
[](./LICENSE)
|
|
8
8
|
[](https://glorioustephan.github.io/corydora/)
|
|
9
|
-
|
|
9
|
+
[](https://badge.socket.dev/npm/package/corydora/0.4.0)
|
|
10
10
|
<p align="center">
|
|
11
11
|
<img src="./logo.webp" alt="Corydora" width="320px" />
|
|
12
12
|
</p>
|
|
@@ -106,6 +106,21 @@ pnpm check
|
|
|
106
106
|
|
|
107
107
|
After feature/fix PRs merge into `main`, generate or refresh the release pull request:
|
|
108
108
|
|
|
109
|
+
Set one of these tokens before running release planning:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
export RELEASE_PLEASE_TOKEN=ghp_xxx
|
|
113
|
+
# or:
|
|
114
|
+
# export GITHUB_TOKEN=ghp_xxx
|
|
115
|
+
# export GH_TOKEN=ghp_xxx
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Optionally pin the repo explicitly:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
export RELEASE_PLEASE_REPO_URL=https://github.com/glorioustephan/corydora
|
|
122
|
+
```
|
|
123
|
+
|
|
109
124
|
```bash
|
|
110
125
|
pnpm release:plan
|
|
111
126
|
```
|
|
@@ -116,6 +131,14 @@ This uses release-please to:
|
|
|
116
131
|
- bump `package.json` version
|
|
117
132
|
- update `CHANGELOG.md`
|
|
118
133
|
|
|
134
|
+
`release:plan` also formats `CHANGELOG.md` after generation.
|
|
135
|
+
|
|
136
|
+
If formatting or checks fail later, rerun:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
pnpm release:check
|
|
140
|
+
```
|
|
141
|
+
|
|
119
142
|
Merge the release PR when ready.
|
|
120
143
|
|
|
121
144
|
#### 3) Publish
|
|
@@ -190,8 +213,8 @@ Before the first public release, configure npm trusted publishing for this repos
|
|
|
190
213
|
package page and settings exist.
|
|
191
214
|
4. In npm package settings for `corydora`, add a trusted publisher for GitHub Actions with workflow
|
|
192
215
|
filename `publish.yml`.
|
|
193
|
-
5.
|
|
194
|
-
|
|
216
|
+
5. Add `RELEASE_PLEASE_TOKEN` as a GitHub secret for `glorioustephan/corydora`; release planning and
|
|
217
|
+
local PR generation use this token and fall back to `GITHUB_TOKEN`/`GH_TOKEN`.
|
|
195
218
|
6. Optionally protect the `npm` GitHub environment before enabling publish.
|
|
196
219
|
7. After trusted publishing is configured, publish future releases by merging the release PR that
|
|
197
220
|
release-please opens against `main`.
|
|
@@ -203,7 +226,7 @@ calls `npm publish`.
|
|
|
203
226
|
## Notes
|
|
204
227
|
|
|
205
228
|
- Secrets never belong in `.corydora.json`.
|
|
206
|
-
- `.corydora/.env.local`
|
|
229
|
+
- Add `.corydora/.env.local` to `.gitignore`, or let interactive `corydora init` append Corydora's recommended ignore block.
|
|
207
230
|
- Markdown queue files are projections of machine state in `.corydora/state/`.
|
|
208
231
|
- The root `CHANGELOG.md` is the canonical release history and is maintained by release-please.
|
|
209
232
|
- The npm publish workflow assumes GitHub-hosted runners, which is also what npm trusted publishing
|
package/dist/commands/doctor.js
CHANGED
|
@@ -1,21 +1,51 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
1
3
|
import { detectProjectFingerprint } from '../filesystem/project.js';
|
|
2
4
|
import { probeAvailableRuntimes, getRuntimeAdapters } from '../providers/index.js';
|
|
3
5
|
import { supportsBackgroundKeepAwake, supportsTmux } from '../runtime/tmux.js';
|
|
6
|
+
import { chooseValidationScript } from '../runtime/validation.js';
|
|
7
|
+
import { preflightIsolationMode, resolveStageRoute } from '../runtime/routes.js';
|
|
8
|
+
import { configExists, loadRequiredConfig } from './helpers.js';
|
|
4
9
|
export async function runDoctorCommand(projectRoot, json, ui) {
|
|
5
|
-
const
|
|
10
|
+
const hasConfig = configExists(projectRoot);
|
|
11
|
+
const [fingerprint, probes, config] = await Promise.all([
|
|
6
12
|
Promise.resolve(detectProjectFingerprint(projectRoot)),
|
|
7
13
|
probeAvailableRuntimes(projectRoot),
|
|
14
|
+
hasConfig ? loadRequiredConfig(projectRoot) : Promise.resolve(null),
|
|
8
15
|
]);
|
|
9
16
|
const runtimeChecks = await Promise.all(getRuntimeAdapters().map(async (adapter) => ({
|
|
10
17
|
provider: adapter.id,
|
|
11
18
|
checks: await adapter.doctor(projectRoot),
|
|
12
19
|
})));
|
|
20
|
+
const fixRoute = config ? resolveStageRoute(config, 'fix') : null;
|
|
21
|
+
const validation = config
|
|
22
|
+
? chooseValidationScript(projectRoot, config.modes.default, config.execution.validateAfterFix)
|
|
23
|
+
: null;
|
|
24
|
+
const isolationCheck = config && fixRoute
|
|
25
|
+
? preflightIsolationMode({
|
|
26
|
+
projectRoot,
|
|
27
|
+
config,
|
|
28
|
+
fixRoute,
|
|
29
|
+
mode: config.modes.default,
|
|
30
|
+
})
|
|
31
|
+
: null;
|
|
13
32
|
const payload = {
|
|
14
33
|
fingerprint,
|
|
15
34
|
tmuxAvailable: supportsTmux(),
|
|
16
35
|
backgroundKeepAwakeAvailable: supportsBackgroundKeepAwake(),
|
|
17
36
|
runtimes: probes,
|
|
18
37
|
checks: runtimeChecks,
|
|
38
|
+
config: config
|
|
39
|
+
? {
|
|
40
|
+
mode: config.modes.default,
|
|
41
|
+
fixProvider: fixRoute?.provider,
|
|
42
|
+
effectiveIsolationMode: isolationCheck?.effectiveIsolationMode,
|
|
43
|
+
validationCommand: validation ? [validation.command, ...validation.args].join(' ') : null,
|
|
44
|
+
lintPrerequisite: config.modes.default === 'linting'
|
|
45
|
+
? existsSync(resolve(projectRoot, 'package.json'))
|
|
46
|
+
: null,
|
|
47
|
+
}
|
|
48
|
+
: null,
|
|
19
49
|
};
|
|
20
50
|
if (json) {
|
|
21
51
|
ui.printJson(payload);
|
|
@@ -28,5 +58,11 @@ export async function runDoctorCommand(projectRoot, json, ui) {
|
|
|
28
58
|
for (const probe of probes) {
|
|
29
59
|
ui.info(`${probe.provider}: installed=${probe.installed} auth=${probe.auth.status} (${probe.auth.message})`);
|
|
30
60
|
}
|
|
61
|
+
if (config && fixRoute && isolationCheck) {
|
|
62
|
+
ui.info(`Configured mode: ${config.modes.default}`);
|
|
63
|
+
ui.info(`Fix route: ${fixRoute.provider} (${fixRoute.model})`);
|
|
64
|
+
ui.info(`Isolation compatibility: ${config.git.isolationMode} -> ${isolationCheck.effectiveIsolationMode}`);
|
|
65
|
+
ui.info(`Validation command: ${validation ? [validation.command, ...validation.args].join(' ') : 'none available'}`);
|
|
66
|
+
}
|
|
31
67
|
}
|
|
32
68
|
//# sourceMappingURL=doctor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,2BAA2B,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,21 +1,78 @@
|
|
|
1
|
-
import { confirm, intro, isCancel, outro, select, spinner, text } from '@clack/prompts';
|
|
1
|
+
import { confirm, intro, isCancel, multiselect, outro, select, spinner, text, } from '@clack/prompts';
|
|
2
2
|
import { BUILTIN_AGENTS } from '../agents/builtin-agents.js';
|
|
3
|
-
import { saveConfig, ensureCorydoraStructure } from '../config/files.js';
|
|
3
|
+
import { loadConfig, saveConfig, ensureCorydoraStructure } from '../config/files.js';
|
|
4
4
|
import { getDefaultConfig } from '../config/schema.js';
|
|
5
|
-
import { CONFIG_FILE_NAME } from '../constants.js';
|
|
6
|
-
import {
|
|
5
|
+
import { BUILTIN_TASK_CATEGORIES, CONFIG_FILE_NAME } from '../constants.js';
|
|
6
|
+
import { appendGitignoreEntries, findMissingGitignoreEntries } from '../filesystem/gitignore.js';
|
|
7
7
|
import { detectProjectFingerprint } from '../filesystem/project.js';
|
|
8
8
|
import { probeAvailableRuntimes } from '../providers/index.js';
|
|
9
|
+
import { configExists } from './helpers.js';
|
|
9
10
|
function selectBuiltinAgents(projectTechLenses) {
|
|
10
11
|
const matching = BUILTIN_AGENTS.filter((agent) => agent.techLenses.some((lens) => projectTechLenses.includes(lens)));
|
|
11
12
|
return (matching.length > 0 ? matching : BUILTIN_AGENTS).map((agent) => agent.id);
|
|
12
13
|
}
|
|
14
|
+
function categoriesForBuiltinAgents(selectedBuiltinAgents) {
|
|
15
|
+
const categories = new Set();
|
|
16
|
+
for (const agent of BUILTIN_AGENTS) {
|
|
17
|
+
if (!selectedBuiltinAgents.includes(agent.id)) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
for (const category of agent.categories) {
|
|
21
|
+
categories.add(category);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const ordered = BUILTIN_TASK_CATEGORIES.filter((category) => categories.has(category));
|
|
25
|
+
return ordered.length > 0 ? [...ordered] : ['bugs'];
|
|
26
|
+
}
|
|
27
|
+
function mergeInitConfig(options) {
|
|
28
|
+
const baseConfig = options.existingConfig ??
|
|
29
|
+
getDefaultConfig({
|
|
30
|
+
provider: options.provider,
|
|
31
|
+
model: options.model,
|
|
32
|
+
isolationMode: options.isolationMode,
|
|
33
|
+
selectedBuiltinAgents: options.selectedBuiltinAgents,
|
|
34
|
+
trackMarkdownQueues: options.trackMarkdownQueues,
|
|
35
|
+
backgroundByDefault: options.backgroundByDefault,
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
...baseConfig,
|
|
39
|
+
git: {
|
|
40
|
+
...baseConfig.git,
|
|
41
|
+
isolationMode: options.isolationMode,
|
|
42
|
+
trackMarkdownQueues: options.trackMarkdownQueues,
|
|
43
|
+
},
|
|
44
|
+
runtime: {
|
|
45
|
+
...baseConfig.runtime,
|
|
46
|
+
provider: options.provider,
|
|
47
|
+
model: options.model,
|
|
48
|
+
},
|
|
49
|
+
agents: {
|
|
50
|
+
...baseConfig.agents,
|
|
51
|
+
selectedBuiltinAgents: options.selectedBuiltinAgents,
|
|
52
|
+
enabledCategories: options.enabledCategories,
|
|
53
|
+
},
|
|
54
|
+
execution: {
|
|
55
|
+
...baseConfig.execution,
|
|
56
|
+
backgroundByDefault: options.backgroundByDefault,
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function formatGitignoreGuidance(entries) {
|
|
61
|
+
return [
|
|
62
|
+
'Corydora did not modify `.gitignore`.',
|
|
63
|
+
'Add these entries yourself if you want generated files ignored:',
|
|
64
|
+
...entries.map((entry) => `- ${entry}`),
|
|
65
|
+
].join('\n');
|
|
66
|
+
}
|
|
13
67
|
export async function runInitCommand(options, ui) {
|
|
68
|
+
const hasExistingConfig = configExists(options.projectRoot);
|
|
69
|
+
const existingConfig = hasExistingConfig ? await loadConfig(options.projectRoot) : null;
|
|
14
70
|
const fingerprint = detectProjectFingerprint(options.projectRoot);
|
|
15
71
|
const runtimeProbes = (await probeAvailableRuntimes(options.projectRoot)).filter((probe) => probe.provider !== 'fake');
|
|
16
72
|
const recommendedRuntime = runtimeProbes.find((probe) => probe.recommended)?.provider ??
|
|
17
73
|
runtimeProbes.find((probe) => probe.installed)?.provider ??
|
|
18
74
|
'claude-cli';
|
|
75
|
+
const detectedBuiltinAgents = selectBuiltinAgents(fingerprint.techLenses);
|
|
19
76
|
const interactive = !options.yes && !options.json && process.stdout.isTTY;
|
|
20
77
|
if (interactive) {
|
|
21
78
|
intro('Corydora init');
|
|
@@ -25,15 +82,18 @@ export async function runInitCommand(options, ui) {
|
|
|
25
82
|
loading.start('Detecting runtimes and project shape');
|
|
26
83
|
loading.stop(`Detected ${runtimeProbes.length} runtimes and ${fingerprint.frameworks.length} framework(s).`);
|
|
27
84
|
}
|
|
28
|
-
let provider = recommendedRuntime;
|
|
29
|
-
let model =
|
|
85
|
+
let provider = existingConfig?.runtime.provider ?? recommendedRuntime;
|
|
86
|
+
let model = existingConfig?.runtime.model ??
|
|
87
|
+
runtimeProbes.find((probe) => probe.provider === provider)?.models[0] ??
|
|
30
88
|
getDefaultConfig({
|
|
31
89
|
provider,
|
|
32
90
|
selectedBuiltinAgents: ['bug-investigator'],
|
|
33
91
|
}).runtime.model;
|
|
34
|
-
let isolationMode = 'worktree';
|
|
35
|
-
let trackMarkdownQueues = false;
|
|
36
|
-
let backgroundByDefault = false;
|
|
92
|
+
let isolationMode = existingConfig?.git.isolationMode ?? 'worktree';
|
|
93
|
+
let trackMarkdownQueues = existingConfig?.git.trackMarkdownQueues ?? false;
|
|
94
|
+
let backgroundByDefault = existingConfig?.execution.backgroundByDefault ?? false;
|
|
95
|
+
const selectedBuiltinAgents = existingConfig?.agents.selectedBuiltinAgents ?? detectedBuiltinAgents;
|
|
96
|
+
let enabledCategories = existingConfig?.agents.enabledCategories ?? categoriesForBuiltinAgents(selectedBuiltinAgents);
|
|
37
97
|
if (interactive) {
|
|
38
98
|
const providerSelection = await select({
|
|
39
99
|
message: 'Choose the default runtime',
|
|
@@ -70,9 +130,22 @@ export async function runInitCommand(options, ui) {
|
|
|
70
130
|
throw new Error('Init cancelled.');
|
|
71
131
|
}
|
|
72
132
|
isolationMode = isolationSelection;
|
|
133
|
+
const categorySelection = await multiselect({
|
|
134
|
+
message: 'Choose which task categories Corydora may scan for',
|
|
135
|
+
options: BUILTIN_TASK_CATEGORIES.map((category) => ({
|
|
136
|
+
value: category,
|
|
137
|
+
label: category.charAt(0).toUpperCase() + category.slice(1),
|
|
138
|
+
})),
|
|
139
|
+
initialValues: enabledCategories,
|
|
140
|
+
required: true,
|
|
141
|
+
});
|
|
142
|
+
if (isCancel(categorySelection)) {
|
|
143
|
+
throw new Error('Init cancelled.');
|
|
144
|
+
}
|
|
145
|
+
enabledCategories = [...categorySelection];
|
|
73
146
|
const trackQueuesAnswer = await confirm({
|
|
74
147
|
message: 'Track markdown queue files in git?',
|
|
75
|
-
initialValue:
|
|
148
|
+
initialValue: trackMarkdownQueues,
|
|
76
149
|
});
|
|
77
150
|
if (isCancel(trackQueuesAnswer)) {
|
|
78
151
|
throw new Error('Init cancelled.');
|
|
@@ -80,30 +153,50 @@ export async function runInitCommand(options, ui) {
|
|
|
80
153
|
trackMarkdownQueues = Boolean(trackQueuesAnswer);
|
|
81
154
|
const backgroundAnswer = await confirm({
|
|
82
155
|
message: 'Launch long runs in the background by default?',
|
|
83
|
-
initialValue:
|
|
156
|
+
initialValue: backgroundByDefault,
|
|
84
157
|
});
|
|
85
158
|
if (isCancel(backgroundAnswer)) {
|
|
86
159
|
throw new Error('Init cancelled.');
|
|
87
160
|
}
|
|
88
161
|
backgroundByDefault = Boolean(backgroundAnswer);
|
|
89
162
|
}
|
|
90
|
-
const config =
|
|
163
|
+
const config = mergeInitConfig({
|
|
164
|
+
existingConfig,
|
|
91
165
|
provider,
|
|
92
166
|
model,
|
|
93
167
|
isolationMode,
|
|
94
|
-
selectedBuiltinAgents: selectBuiltinAgents(fingerprint.techLenses),
|
|
95
168
|
trackMarkdownQueues,
|
|
96
169
|
backgroundByDefault,
|
|
170
|
+
selectedBuiltinAgents,
|
|
171
|
+
enabledCategories,
|
|
97
172
|
});
|
|
98
173
|
await saveConfig(options.projectRoot, config);
|
|
99
174
|
await ensureCorydoraStructure(options.projectRoot, config);
|
|
100
|
-
await
|
|
175
|
+
const missingGitignoreEntries = await findMissingGitignoreEntries(options.projectRoot, config.git.trackMarkdownQueues);
|
|
176
|
+
let gitignoreUpdated = false;
|
|
177
|
+
if (interactive && missingGitignoreEntries.length > 0) {
|
|
178
|
+
const updateGitignoreAnswer = await confirm({
|
|
179
|
+
message: 'Append recommended Corydora entries to `.gitignore`?',
|
|
180
|
+
initialValue: false,
|
|
181
|
+
});
|
|
182
|
+
if (isCancel(updateGitignoreAnswer)) {
|
|
183
|
+
throw new Error('Init cancelled.');
|
|
184
|
+
}
|
|
185
|
+
if (updateGitignoreAnswer) {
|
|
186
|
+
gitignoreUpdated = await appendGitignoreEntries(options.projectRoot, missingGitignoreEntries);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
101
189
|
const payload = {
|
|
102
190
|
projectRoot: options.projectRoot,
|
|
103
191
|
provider,
|
|
104
192
|
model,
|
|
105
193
|
isolationMode,
|
|
194
|
+
enabledCategories,
|
|
106
195
|
fingerprint,
|
|
196
|
+
gitignore: {
|
|
197
|
+
modified: gitignoreUpdated,
|
|
198
|
+
missingEntries: gitignoreUpdated ? [] : missingGitignoreEntries,
|
|
199
|
+
},
|
|
107
200
|
};
|
|
108
201
|
if (options.json) {
|
|
109
202
|
ui.printJson(payload);
|
|
@@ -112,6 +205,13 @@ export async function runInitCommand(options, ui) {
|
|
|
112
205
|
ui.success(`Created ${CONFIG_FILE_NAME} and .corydora/ in ${options.projectRoot}`);
|
|
113
206
|
ui.info(`Default runtime: ${provider} (${model})`);
|
|
114
207
|
ui.info(`Isolation mode: ${isolationMode}`);
|
|
208
|
+
ui.info(`Categories: ${enabledCategories.join(', ')}`);
|
|
209
|
+
if (gitignoreUpdated) {
|
|
210
|
+
ui.info('Appended a Corydora block to `.gitignore`.');
|
|
211
|
+
}
|
|
212
|
+
else if (missingGitignoreEntries.length > 0) {
|
|
213
|
+
ui.warn(formatGitignoreGuidance(missingGitignoreEntries));
|
|
214
|
+
}
|
|
115
215
|
outro('Corydora init complete.');
|
|
116
216
|
}
|
|
117
217
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/run.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CorydoraMode } from '../types/domain.js';
|
|
1
2
|
import type { Ui } from '../ui/output.js';
|
|
2
3
|
export interface RunCommandOptions {
|
|
3
4
|
projectRoot: string;
|
|
@@ -8,5 +9,7 @@ export interface RunCommandOptions {
|
|
|
8
9
|
resume?: boolean;
|
|
9
10
|
sessionName?: string;
|
|
10
11
|
skipCommitHooks?: boolean;
|
|
12
|
+
mode?: CorydoraMode;
|
|
13
|
+
agentIds?: string[];
|
|
11
14
|
}
|
|
12
15
|
export declare function runRunCommand(options: RunCommandOptions, ui: Ui): Promise<void>;
|
package/dist/commands/run.js
CHANGED
|
@@ -1,39 +1,64 @@
|
|
|
1
1
|
import { basename } from 'node:path';
|
|
2
2
|
import { listAgents } from '../agents/catalog.js';
|
|
3
3
|
import { loadRequiredConfig } from './helpers.js';
|
|
4
|
-
import {
|
|
5
|
-
import { loadRunState, loadTaskStore } from '../queue/state.js';
|
|
4
|
+
import { loadFileStore, loadTaskStore, reconcileFileStore } from '../queue/state.js';
|
|
6
5
|
import { launchBackgroundRun, supportsTmux } from '../runtime/tmux.js';
|
|
7
6
|
import { runCorydoraSession } from '../runtime/run-session.js';
|
|
8
|
-
import {
|
|
7
|
+
import { buildFileQueue, resolveSelectedAgents } from '../runtime/modes.js';
|
|
8
|
+
import { detectProjectFingerprint } from '../filesystem/project.js';
|
|
9
|
+
function nextRunnableTaskTitle(taskStore) {
|
|
10
|
+
const task = taskStore.tasks.find((candidate) => ['queued', 'deferred'].includes(candidate.status));
|
|
11
|
+
return task?.title ?? null;
|
|
12
|
+
}
|
|
9
13
|
export async function runRunCommand(options, ui) {
|
|
10
14
|
const config = await loadRequiredConfig(options.projectRoot);
|
|
15
|
+
const mode = options.mode ?? config.modes.default;
|
|
16
|
+
const allAgents = await listAgents(options.projectRoot, config);
|
|
17
|
+
const fingerprint = detectProjectFingerprint(options.projectRoot);
|
|
18
|
+
const selectedAgents = resolveSelectedAgents({
|
|
19
|
+
allAgents,
|
|
20
|
+
config,
|
|
21
|
+
mode,
|
|
22
|
+
projectFingerprint: fingerprint,
|
|
23
|
+
...(options.agentIds ? { overrideAgentIds: options.agentIds } : {}),
|
|
24
|
+
});
|
|
25
|
+
const selectedAgentIds = selectedAgents.map((agent) => agent.id);
|
|
11
26
|
if (options.dryRun) {
|
|
12
|
-
const [
|
|
27
|
+
const [taskStore, existingFileStore] = await Promise.all([
|
|
13
28
|
loadTaskStore(options.projectRoot, config),
|
|
14
|
-
|
|
29
|
+
loadFileStore(options.projectRoot, config),
|
|
15
30
|
]);
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
31
|
+
const fileStore = reconcileFileStore(existingFileStore, buildFileQueue({
|
|
32
|
+
projectRoot: options.projectRoot,
|
|
33
|
+
workRoot: options.projectRoot,
|
|
34
|
+
config,
|
|
35
|
+
mode,
|
|
36
|
+
taskStore,
|
|
37
|
+
}));
|
|
38
|
+
const nextFiles = fileStore.files
|
|
39
|
+
.filter((file) => ['queued', 'deferred'].includes(file.status))
|
|
40
|
+
.sort((left, right) => right.score.total - left.score.total)
|
|
41
|
+
.slice(0, Math.max(1, config.execution.maxAnalyzeWorkers))
|
|
42
|
+
.map((file) => file.path);
|
|
23
43
|
const preview = {
|
|
24
44
|
dryRun: true,
|
|
25
45
|
provider: config.runtime.provider,
|
|
26
46
|
model: config.runtime.model,
|
|
27
|
-
|
|
28
|
-
|
|
47
|
+
mode,
|
|
48
|
+
selectedAgents: selectedAgentIds,
|
|
49
|
+
nextScanBatch: nextFiles,
|
|
50
|
+
nextAnalysisBatch: nextFiles,
|
|
51
|
+
nextTask: nextRunnableTaskTitle(taskStore),
|
|
29
52
|
};
|
|
30
53
|
if (options.json) {
|
|
31
54
|
ui.printJson(preview);
|
|
32
55
|
return;
|
|
33
56
|
}
|
|
34
57
|
ui.info(`Dry run preview for ${config.runtime.provider} (${config.runtime.model})`);
|
|
35
|
-
ui.info(`
|
|
36
|
-
ui.info(`
|
|
58
|
+
ui.info(`Mode: ${mode}`);
|
|
59
|
+
ui.info(`Agents: ${selectedAgentIds.join(', ') || 'none selected'}`);
|
|
60
|
+
ui.info(`Next analysis batch: ${nextFiles.length > 0 ? nextFiles.join(', ') : 'none'}`);
|
|
61
|
+
ui.info(`Next task: ${preview.nextTask ?? 'none queued'}`);
|
|
37
62
|
return;
|
|
38
63
|
}
|
|
39
64
|
const shouldBackground = !options.foreground && (Boolean(options.background) || config.execution.backgroundByDefault);
|
|
@@ -50,8 +75,10 @@ export async function runRunCommand(options, ui) {
|
|
|
50
75
|
'--foreground',
|
|
51
76
|
'--session-name',
|
|
52
77
|
sessionName,
|
|
78
|
+
'--mode',
|
|
79
|
+
mode,
|
|
80
|
+
...(selectedAgentIds.length > 0 ? ['--agent', selectedAgentIds.join(',')] : []),
|
|
53
81
|
...(options.resume ? ['--resume'] : []),
|
|
54
|
-
...(options.dryRun ? ['--dry-run'] : []),
|
|
55
82
|
...(options.skipCommitHooks ? ['--no-verify'] : []),
|
|
56
83
|
];
|
|
57
84
|
const backgroundLaunch = launchBackgroundRun(sessionName, args, options.projectRoot, config.execution.preventIdleSleep);
|
|
@@ -65,13 +92,14 @@ export async function runRunCommand(options, ui) {
|
|
|
65
92
|
}
|
|
66
93
|
return;
|
|
67
94
|
}
|
|
68
|
-
const agents = await listAgents(options.projectRoot, config);
|
|
69
95
|
const state = await runCorydoraSession({
|
|
70
96
|
projectRoot: options.projectRoot,
|
|
71
97
|
config,
|
|
72
|
-
agents,
|
|
98
|
+
agents: selectedAgents,
|
|
73
99
|
dryRun: Boolean(options.dryRun),
|
|
74
100
|
resume: Boolean(options.resume),
|
|
101
|
+
mode,
|
|
102
|
+
selectedAgentIds,
|
|
75
103
|
logToConsole: !options.json,
|
|
76
104
|
skipCommitHooks: Boolean(options.skipCommitHooks),
|
|
77
105
|
...(options.sessionName ? { sessionName: options.sessionName } : {}),
|
|
@@ -82,7 +110,10 @@ export async function runRunCommand(options, ui) {
|
|
|
82
110
|
}
|
|
83
111
|
ui.success(`Run ${state.runId} finished with status "${state.status}".`);
|
|
84
112
|
ui.info(`Provider: ${state.provider}`);
|
|
85
|
-
ui.info(`
|
|
113
|
+
ui.info(`Configured isolation: ${state.isolationMode}`);
|
|
114
|
+
ui.info(`Effective isolation: ${state.effectiveIsolationMode}`);
|
|
115
|
+
ui.info(`Mode: ${state.mode}`);
|
|
116
|
+
ui.info(`Agents: ${state.selectedAgentIds.join(', ') || 'none selected'}`);
|
|
86
117
|
if (state.branchName) {
|
|
87
118
|
ui.info(`Branch: ${state.branchName}`);
|
|
88
119
|
}
|
package/dist/commands/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
|