erdos-problems 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +103 -13
- package/docs/ERDOS_PROBLEMS_PROBLEM_SCHEMA.md +65 -60
- package/docs/ERDOS_PROBLEMS_REPO_SPEC.md +97 -214
- package/docs/RESEARCH_LOOP.md +47 -0
- package/package.json +1 -1
- package/packs/sunflower/README.md +6 -4
- package/packs/sunflower/compute/20/u3_uniform_transfer_window_v0.yaml +16 -0
- package/packs/sunflower/problems/20/CONTEXT.md +14 -0
- package/packs/sunflower/problems/20/context.yaml +31 -0
- package/packs/sunflower/problems/536/CONTEXT.md +9 -0
- package/packs/sunflower/problems/536/context.yaml +17 -0
- package/packs/sunflower/problems/856/CONTEXT.md +9 -0
- package/packs/sunflower/problems/856/context.yaml +17 -0
- package/packs/sunflower/problems/857/CONTEXT.md +14 -0
- package/packs/sunflower/problems/857/context.yaml +32 -0
- package/problems/20/problem.yaml +8 -2
- package/problems/536/problem.yaml +9 -3
- package/problems/856/problem.yaml +9 -3
- package/src/cli/index.js +24 -0
- package/src/commands/bootstrap.js +7 -0
- package/src/commands/checkpoints.js +36 -0
- package/src/commands/continuation.js +60 -0
- package/src/commands/maintainer.js +182 -0
- package/src/commands/preflight.js +44 -0
- package/src/commands/problem.js +10 -0
- package/src/commands/pull.js +192 -41
- package/src/commands/state.js +57 -0
- package/src/commands/sunflower.js +12 -0
- package/src/commands/workspace.js +22 -0
- package/src/runtime/checkpoints.js +208 -0
- package/src/runtime/config.js +37 -0
- package/src/runtime/continuation.js +65 -0
- package/src/runtime/git.js +52 -0
- package/src/runtime/maintainer-seed.js +294 -0
- package/src/runtime/paths.js +75 -27
- package/src/runtime/preflight.js +106 -0
- package/src/runtime/problem-artifacts.js +63 -1
- package/src/runtime/state.js +269 -0
- package/src/runtime/sunflower.js +126 -6
- package/src/runtime/workspace.js +42 -22
|
@@ -12,7 +12,7 @@ upstream:
|
|
|
12
12
|
status:
|
|
13
13
|
site_status: open
|
|
14
14
|
site_badge: OPEN
|
|
15
|
-
repo_status:
|
|
15
|
+
repo_status: active
|
|
16
16
|
upstream_status: open
|
|
17
17
|
upstream_last_update: 2025-08-31
|
|
18
18
|
cluster: sunflower
|
|
@@ -20,14 +20,15 @@ prize:
|
|
|
20
20
|
display: no
|
|
21
21
|
related_problems:
|
|
22
22
|
- "857"
|
|
23
|
+
- "856"
|
|
24
|
+
- "20"
|
|
23
25
|
family_tags:
|
|
24
26
|
- sunflower-analogue
|
|
25
27
|
- number-theory
|
|
26
28
|
harness:
|
|
27
29
|
depth: dossier
|
|
28
30
|
statement:
|
|
29
|
-
short: Number-theoretic analogue of the sunflower problem framed through least
|
|
30
|
-
common multiples.
|
|
31
|
+
short: Number-theoretic analogue of the sunflower problem framed through least common multiples and natural-density structure.
|
|
31
32
|
normalized_md_path: STATEMENT.md
|
|
32
33
|
references_path: REFERENCES.md
|
|
33
34
|
evidence_path: EVIDENCE.md
|
|
@@ -36,3 +37,8 @@ formalization:
|
|
|
36
37
|
status: planned
|
|
37
38
|
upstream_state: yes
|
|
38
39
|
upstream_last_update: 2025-11-12
|
|
40
|
+
research_state:
|
|
41
|
+
open_problem: true
|
|
42
|
+
active_route: natural_density_lcm_bridge
|
|
43
|
+
route_breakthrough: false
|
|
44
|
+
problem_solved: false
|
|
@@ -12,7 +12,7 @@ upstream:
|
|
|
12
12
|
status:
|
|
13
13
|
site_status: open
|
|
14
14
|
site_badge: OPEN
|
|
15
|
-
repo_status:
|
|
15
|
+
repo_status: active
|
|
16
16
|
upstream_status: open
|
|
17
17
|
upstream_last_update: 2025-08-31
|
|
18
18
|
cluster: sunflower
|
|
@@ -20,14 +20,15 @@ prize:
|
|
|
20
20
|
display: no
|
|
21
21
|
related_problems:
|
|
22
22
|
- "857"
|
|
23
|
+
- "536"
|
|
24
|
+
- "20"
|
|
23
25
|
family_tags:
|
|
24
26
|
- sunflower-analogue
|
|
25
27
|
- number-theory
|
|
26
28
|
harness:
|
|
27
29
|
depth: dossier
|
|
28
30
|
statement:
|
|
29
|
-
short: A harmonic or density-shaped LCM analogue whose
|
|
30
|
-
linked to progress on the weak sunflower problem.
|
|
31
|
+
short: A harmonic or density-shaped LCM analogue whose exponent behavior is explicitly linked to progress on the weak sunflower problem.
|
|
31
32
|
normalized_md_path: STATEMENT.md
|
|
32
33
|
references_path: REFERENCES.md
|
|
33
34
|
evidence_path: EVIDENCE.md
|
|
@@ -36,3 +37,8 @@ formalization:
|
|
|
36
37
|
status: planned
|
|
37
38
|
upstream_state: no
|
|
38
39
|
upstream_last_update: 2025-08-31
|
|
40
|
+
research_state:
|
|
41
|
+
open_problem: true
|
|
42
|
+
active_route: harmonic_density_lcm_bridge
|
|
43
|
+
route_breakthrough: false
|
|
44
|
+
problem_solved: false
|
package/src/cli/index.js
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { runBootstrapCommand } from '../commands/bootstrap.js';
|
|
2
|
+
import { runCheckpointsCommand } from '../commands/checkpoints.js';
|
|
2
3
|
import { runClusterCommand } from '../commands/cluster.js';
|
|
4
|
+
import { runContinuationCommand } from '../commands/continuation.js';
|
|
3
5
|
import { runDossierCommand } from '../commands/dossier.js';
|
|
6
|
+
import { runMaintainerCommand } from '../commands/maintainer.js';
|
|
7
|
+
import { runPreflightCommand } from '../commands/preflight.js';
|
|
4
8
|
import { runProblemCommand } from '../commands/problem.js';
|
|
5
9
|
import { runPullCommand } from '../commands/pull.js';
|
|
6
10
|
import { runScaffoldCommand } from '../commands/scaffold.js';
|
|
11
|
+
import { runStateCommand } from '../commands/state.js';
|
|
7
12
|
import { runSunflowerCommand } from '../commands/sunflower.js';
|
|
8
13
|
import { runUpstreamCommand } from '../commands/upstream.js';
|
|
9
14
|
import { runWorkspaceCommand } from '../commands/workspace.js';
|
|
@@ -20,6 +25,12 @@ function printUsage() {
|
|
|
20
25
|
console.log(' erdos cluster list');
|
|
21
26
|
console.log(' erdos cluster show <name>');
|
|
22
27
|
console.log(' erdos workspace show');
|
|
28
|
+
console.log(' erdos state sync [--json]');
|
|
29
|
+
console.log(' erdos state show [--json]');
|
|
30
|
+
console.log(' erdos continuation show [--json]');
|
|
31
|
+
console.log(' erdos continuation use <atom|route|phase|milestone> [--json]');
|
|
32
|
+
console.log(' erdos preflight [--allow-dirty] [--json]');
|
|
33
|
+
console.log(' erdos checkpoints sync [--json]');
|
|
23
34
|
console.log(' erdos sunflower status [<id>] [--json]');
|
|
24
35
|
console.log(' erdos dossier show <id>');
|
|
25
36
|
console.log(' erdos upstream show');
|
|
@@ -28,6 +39,9 @@ function printUsage() {
|
|
|
28
39
|
console.log(' erdos scaffold problem <id> [--dest <path>]');
|
|
29
40
|
console.log(' erdos bootstrap problem <id> [--dest <path>] [--sync-upstream]');
|
|
30
41
|
console.log(' erdos pull problem <id> [--dest <path>] [--include-site] [--refresh-upstream]');
|
|
42
|
+
console.log(' erdos pull artifacts <id> [--dest <path>] [--refresh-upstream]');
|
|
43
|
+
console.log(' erdos pull literature <id> [--dest <path>] [--include-site] [--refresh-upstream]');
|
|
44
|
+
console.log(' erdos maintainer seed problem <id> [--from-pull <path>] [--dest-root <path>] [--cluster <name>]');
|
|
31
45
|
}
|
|
32
46
|
|
|
33
47
|
const args = process.argv.slice(2);
|
|
@@ -43,6 +57,14 @@ if (!command || command === 'help' || command === '--help') {
|
|
|
43
57
|
exitCode = runClusterCommand(rest);
|
|
44
58
|
} else if (command === 'workspace') {
|
|
45
59
|
exitCode = runWorkspaceCommand(rest);
|
|
60
|
+
} else if (command === 'state') {
|
|
61
|
+
exitCode = runStateCommand(rest);
|
|
62
|
+
} else if (command === 'continuation') {
|
|
63
|
+
exitCode = runContinuationCommand(rest);
|
|
64
|
+
} else if (command === 'preflight') {
|
|
65
|
+
exitCode = runPreflightCommand(rest);
|
|
66
|
+
} else if (command === 'checkpoints') {
|
|
67
|
+
exitCode = runCheckpointsCommand(rest);
|
|
46
68
|
} else if (command === 'sunflower') {
|
|
47
69
|
exitCode = runSunflowerCommand(rest);
|
|
48
70
|
} else if (command === 'dossier') {
|
|
@@ -55,6 +77,8 @@ if (!command || command === 'help' || command === '--help') {
|
|
|
55
77
|
exitCode = await runBootstrapCommand(rest);
|
|
56
78
|
} else if (command === 'pull') {
|
|
57
79
|
exitCode = await runPullCommand(rest);
|
|
80
|
+
} else if (command === 'maintainer') {
|
|
81
|
+
exitCode = runMaintainerCommand(rest);
|
|
58
82
|
} else {
|
|
59
83
|
console.error(`Unknown command: ${command}`);
|
|
60
84
|
printUsage();
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { getProblem } from '../atlas/catalog.js';
|
|
3
|
+
import { syncCheckpoints } from '../runtime/checkpoints.js';
|
|
3
4
|
import { scaffoldProblem } from '../runtime/problem-artifacts.js';
|
|
4
5
|
import { getWorkspaceProblemScaffoldDir } from '../runtime/paths.js';
|
|
6
|
+
import { syncState } from '../runtime/state.js';
|
|
5
7
|
import { setCurrentProblem } from '../runtime/workspace.js';
|
|
6
8
|
import { syncUpstream } from '../upstream/sync.js';
|
|
7
9
|
|
|
@@ -71,11 +73,16 @@ export async function runBootstrapCommand(args) {
|
|
|
71
73
|
? path.resolve(parsed.destination)
|
|
72
74
|
: getWorkspaceProblemScaffoldDir(problem.problemId);
|
|
73
75
|
const result = scaffoldProblem(problem, destination);
|
|
76
|
+
const state = syncState();
|
|
77
|
+
const checkpoints = syncCheckpoints();
|
|
74
78
|
|
|
75
79
|
console.log(`Bootstrapped problem ${problem.problemId} (${problem.title})`);
|
|
76
80
|
console.log(`Active problem: ${problem.problemId}`);
|
|
81
|
+
console.log(`Active route: ${state.activeRoute ?? '(none)'}`);
|
|
77
82
|
console.log(`Scaffold dir: ${result.destination}`);
|
|
78
83
|
console.log(`Artifacts copied: ${result.copiedArtifacts.length}`);
|
|
79
84
|
console.log(`Upstream record included: ${result.inventory.upstreamRecordIncluded ? 'yes' : 'no'}`);
|
|
85
|
+
console.log(`Checkpoint shelf: ${checkpoints.indexPath}`);
|
|
86
|
+
console.log(`Next honest move: ${state.nextHonestMove}`);
|
|
80
87
|
return 0;
|
|
81
88
|
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { syncCheckpoints } from '../runtime/checkpoints.js';
|
|
2
|
+
|
|
3
|
+
export function runCheckpointsCommand(args) {
|
|
4
|
+
const [subcommand, ...rest] = args;
|
|
5
|
+
const asJson = rest.includes('--json');
|
|
6
|
+
const unknown = rest.filter((arg) => arg !== '--json');
|
|
7
|
+
|
|
8
|
+
if (!subcommand || subcommand === 'help' || subcommand === '--help') {
|
|
9
|
+
console.log('Usage:');
|
|
10
|
+
console.log(' erdos checkpoints sync [--json]');
|
|
11
|
+
return 0;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
if (subcommand !== 'sync') {
|
|
15
|
+
console.error(`Unknown checkpoints subcommand: ${subcommand}`);
|
|
16
|
+
return 1;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (unknown.length > 0) {
|
|
20
|
+
console.error(`Unknown checkpoints option: ${unknown[0]}`);
|
|
21
|
+
return 1;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const result = syncCheckpoints();
|
|
25
|
+
if (asJson) {
|
|
26
|
+
console.log(JSON.stringify(result, null, 2));
|
|
27
|
+
return 0;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
console.log('Checkpoint shelf synced');
|
|
31
|
+
console.log(`Index path: ${result.indexPath}`);
|
|
32
|
+
console.log(`Checkpoint JSON: ${result.checkpointJsonPath}`);
|
|
33
|
+
console.log(`Checkpoint count: ${result.checkpoints.length}`);
|
|
34
|
+
console.log(`Last checkpoint sync: ${result.state.lastCheckpointSyncAt}`);
|
|
35
|
+
return 0;
|
|
36
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { ensureConfig, loadConfig, saveConfig } from '../runtime/config.js';
|
|
2
|
+
import { continuationDisplay, continuationModes, resolveContinuation } from '../runtime/continuation.js';
|
|
3
|
+
import { syncState } from '../runtime/state.js';
|
|
4
|
+
|
|
5
|
+
function printContinuation(payload) {
|
|
6
|
+
console.log('Continuation mode');
|
|
7
|
+
console.log(`Requested: ${payload.requestedMode}`);
|
|
8
|
+
console.log(`Resolved: ${continuationDisplay(payload)}`);
|
|
9
|
+
console.log(`Review cadence: ${payload.reviewCadence}`);
|
|
10
|
+
console.log(`Max unattended minutes: ${payload.maxUnattendedMinutes}`);
|
|
11
|
+
console.log(`Checkpoint after load-bearing result: ${payload.checkpointAfterLoadBearingResult ? 'yes' : 'no'}`);
|
|
12
|
+
console.log(`Stop rule: ${payload.stopRule}`);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function runContinuationCommand(args) {
|
|
16
|
+
const [subcommand, value, ...rest] = args;
|
|
17
|
+
const asJson = rest.includes('--json');
|
|
18
|
+
|
|
19
|
+
if (!subcommand || subcommand === 'help' || subcommand === '--help') {
|
|
20
|
+
console.log('Usage:');
|
|
21
|
+
console.log(' erdos continuation show [--json]');
|
|
22
|
+
console.log(` erdos continuation use <${continuationModes().join('|')}> [--json]`);
|
|
23
|
+
return 0;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (subcommand === 'show') {
|
|
27
|
+
const config = ensureConfig();
|
|
28
|
+
const continuation = resolveContinuation({ requestedMode: config.continuation });
|
|
29
|
+
if (asJson) {
|
|
30
|
+
console.log(JSON.stringify(continuation, null, 2));
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
printContinuation(continuation);
|
|
34
|
+
return 0;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (subcommand === 'use') {
|
|
38
|
+
if (!value) {
|
|
39
|
+
console.error('Missing continuation mode.');
|
|
40
|
+
return 1;
|
|
41
|
+
}
|
|
42
|
+
if (!continuationModes().includes(value)) {
|
|
43
|
+
console.error(`Unknown continuation mode: ${value}`);
|
|
44
|
+
return 1;
|
|
45
|
+
}
|
|
46
|
+
const config = loadConfig();
|
|
47
|
+
saveConfig({ ...config, continuation: value });
|
|
48
|
+
const state = syncState();
|
|
49
|
+
if (asJson) {
|
|
50
|
+
console.log(JSON.stringify(state.continuation, null, 2));
|
|
51
|
+
return 0;
|
|
52
|
+
}
|
|
53
|
+
console.log(`Continuation mode set to ${continuationDisplay(state.continuation)}`);
|
|
54
|
+
printContinuation(state.continuation);
|
|
55
|
+
return 0;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
console.error(`Unknown continuation subcommand: ${subcommand}`);
|
|
59
|
+
return 1;
|
|
60
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { seedProblemFromPullBundle } from '../runtime/maintainer-seed.js';
|
|
3
|
+
|
|
4
|
+
function parseMaintainerSeedArgs(args) {
|
|
5
|
+
const [kind, problemToken, ...rest] = args;
|
|
6
|
+
if (kind !== 'problem') {
|
|
7
|
+
return { error: 'Only `erdos maintainer seed problem <id>` is supported right now.' };
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const parsed = {
|
|
11
|
+
problemId: problemToken,
|
|
12
|
+
fromPullDir: null,
|
|
13
|
+
destRoot: null,
|
|
14
|
+
cluster: null,
|
|
15
|
+
repoStatus: null,
|
|
16
|
+
harnessDepth: null,
|
|
17
|
+
title: null,
|
|
18
|
+
familyTags: [],
|
|
19
|
+
relatedProblems: [],
|
|
20
|
+
formalizationStatus: null,
|
|
21
|
+
activeRoute: null,
|
|
22
|
+
routeBreakthrough: false,
|
|
23
|
+
problemSolved: false,
|
|
24
|
+
force: false,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
for (let index = 0; index < rest.length; index += 1) {
|
|
28
|
+
const token = rest[index];
|
|
29
|
+
if (token === '--from-pull') {
|
|
30
|
+
parsed.fromPullDir = rest[index + 1];
|
|
31
|
+
if (!parsed.fromPullDir) {
|
|
32
|
+
return { error: 'Missing path after --from-pull.' };
|
|
33
|
+
}
|
|
34
|
+
index += 1;
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (token === '--dest-root') {
|
|
38
|
+
parsed.destRoot = rest[index + 1];
|
|
39
|
+
if (!parsed.destRoot) {
|
|
40
|
+
return { error: 'Missing path after --dest-root.' };
|
|
41
|
+
}
|
|
42
|
+
index += 1;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (token === '--cluster') {
|
|
46
|
+
parsed.cluster = rest[index + 1];
|
|
47
|
+
if (!parsed.cluster) {
|
|
48
|
+
return { error: 'Missing cluster value after --cluster.' };
|
|
49
|
+
}
|
|
50
|
+
index += 1;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (token === '--repo-status') {
|
|
54
|
+
parsed.repoStatus = rest[index + 1];
|
|
55
|
+
if (!parsed.repoStatus) {
|
|
56
|
+
return { error: 'Missing repo status after --repo-status.' };
|
|
57
|
+
}
|
|
58
|
+
index += 1;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (token === '--harness-depth') {
|
|
62
|
+
parsed.harnessDepth = rest[index + 1];
|
|
63
|
+
if (!parsed.harnessDepth) {
|
|
64
|
+
return { error: 'Missing harness depth after --harness-depth.' };
|
|
65
|
+
}
|
|
66
|
+
index += 1;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (token === '--title') {
|
|
70
|
+
parsed.title = rest[index + 1];
|
|
71
|
+
if (!parsed.title) {
|
|
72
|
+
return { error: 'Missing title after --title.' };
|
|
73
|
+
}
|
|
74
|
+
index += 1;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (token === '--family-tag') {
|
|
78
|
+
const tag = rest[index + 1];
|
|
79
|
+
if (!tag) {
|
|
80
|
+
return { error: 'Missing tag after --family-tag.' };
|
|
81
|
+
}
|
|
82
|
+
parsed.familyTags.push(tag);
|
|
83
|
+
index += 1;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (token === '--related') {
|
|
87
|
+
const related = rest[index + 1];
|
|
88
|
+
if (!related) {
|
|
89
|
+
return { error: 'Missing problem id after --related.' };
|
|
90
|
+
}
|
|
91
|
+
parsed.relatedProblems.push(related);
|
|
92
|
+
index += 1;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (token === '--formalization-status') {
|
|
96
|
+
parsed.formalizationStatus = rest[index + 1];
|
|
97
|
+
if (!parsed.formalizationStatus) {
|
|
98
|
+
return { error: 'Missing value after --formalization-status.' };
|
|
99
|
+
}
|
|
100
|
+
index += 1;
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (token === '--active-route') {
|
|
104
|
+
parsed.activeRoute = rest[index + 1];
|
|
105
|
+
if (!parsed.activeRoute) {
|
|
106
|
+
return { error: 'Missing value after --active-route.' };
|
|
107
|
+
}
|
|
108
|
+
index += 1;
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (token === '--route-breakthrough') {
|
|
112
|
+
parsed.routeBreakthrough = true;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (token === '--problem-solved') {
|
|
116
|
+
parsed.problemSolved = true;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (token === '--force') {
|
|
120
|
+
parsed.force = true;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
return { error: `Unknown maintainer seed option: ${token}` };
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return parsed;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export function runMaintainerCommand(args) {
|
|
130
|
+
const [subcommand, ...rest] = args;
|
|
131
|
+
|
|
132
|
+
if (!subcommand || subcommand === 'help' || subcommand === '--help') {
|
|
133
|
+
console.log('Usage:');
|
|
134
|
+
console.log(' erdos maintainer seed problem <id> [--from-pull <path>] [--dest-root <path>] [--cluster <name>] [--repo-status <status>] [--harness-depth <depth>] [--title <title>] [--family-tag <tag>] [--related <id>] [--formalization-status <status>] [--active-route <route>] [--route-breakthrough] [--problem-solved] [--force]');
|
|
135
|
+
return 0;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (subcommand !== 'seed') {
|
|
139
|
+
console.error(`Unknown maintainer subcommand: ${subcommand}`);
|
|
140
|
+
return 1;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const parsed = parseMaintainerSeedArgs(rest);
|
|
144
|
+
if (parsed.error) {
|
|
145
|
+
console.error(parsed.error);
|
|
146
|
+
return 1;
|
|
147
|
+
}
|
|
148
|
+
if (!parsed.problemId) {
|
|
149
|
+
console.error('Missing problem id.');
|
|
150
|
+
return 1;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
try {
|
|
154
|
+
const result = seedProblemFromPullBundle(parsed.problemId, {
|
|
155
|
+
fromPullDir: parsed.fromPullDir ? path.resolve(parsed.fromPullDir) : null,
|
|
156
|
+
destRoot: parsed.destRoot ? path.resolve(parsed.destRoot) : null,
|
|
157
|
+
cluster: parsed.cluster,
|
|
158
|
+
repoStatus: parsed.repoStatus,
|
|
159
|
+
harnessDepth: parsed.harnessDepth,
|
|
160
|
+
title: parsed.title,
|
|
161
|
+
familyTags: parsed.familyTags,
|
|
162
|
+
relatedProblems: parsed.relatedProblems,
|
|
163
|
+
formalizationStatus: parsed.formalizationStatus,
|
|
164
|
+
activeRoute: parsed.activeRoute,
|
|
165
|
+
routeBreakthrough: parsed.routeBreakthrough,
|
|
166
|
+
problemSolved: parsed.problemSolved,
|
|
167
|
+
force: parsed.force,
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
console.log(`Seeded dossier for problem ${parsed.problemId}`);
|
|
171
|
+
console.log(`Destination: ${result.destinationDir}`);
|
|
172
|
+
console.log(`Title: ${result.record.title}`);
|
|
173
|
+
console.log(`Cluster: ${result.record.cluster}`);
|
|
174
|
+
console.log(`Harness depth: ${result.record.harness.depth}`);
|
|
175
|
+
console.log(`Upstream record used: ${result.usedUpstreamRecord ? 'yes' : 'no'}`);
|
|
176
|
+
console.log(`Site snapshot used: ${result.usedSiteSnapshot ? 'yes' : 'no'}`);
|
|
177
|
+
return 0;
|
|
178
|
+
} catch (error) {
|
|
179
|
+
console.error(String(error.message ?? error));
|
|
180
|
+
return 1;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { buildPreflightReport } from '../runtime/preflight.js';
|
|
2
|
+
|
|
3
|
+
function printChecks(checks) {
|
|
4
|
+
for (const [label, payload] of Object.entries(checks)) {
|
|
5
|
+
console.log(`- ${label}: ${payload.ok ? 'ok' : 'attention'} (${payload.detail})`);
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function runPreflightCommand(args) {
|
|
10
|
+
const asJson = args.includes('--json');
|
|
11
|
+
const allowDirty = args.includes('--allow-dirty');
|
|
12
|
+
const unknown = args.filter((arg) => arg !== '--json' && arg !== '--allow-dirty');
|
|
13
|
+
|
|
14
|
+
if (args.length > 0 && (args[0] === 'help' || args[0] === '--help')) {
|
|
15
|
+
console.log('Usage:');
|
|
16
|
+
console.log(' erdos preflight [--allow-dirty] [--json]');
|
|
17
|
+
return 0;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (unknown.length > 0) {
|
|
21
|
+
console.error(`Unknown preflight option: ${unknown[0]}`);
|
|
22
|
+
return 1;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const report = buildPreflightReport({ allowDirty });
|
|
26
|
+
if (asJson) {
|
|
27
|
+
console.log(JSON.stringify(report, null, 2));
|
|
28
|
+
return report.verdict === 'blocked' ? 2 : 0;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
console.log('Research preflight');
|
|
32
|
+
console.log(`- Workspace root: ${report.workspaceRoot}`);
|
|
33
|
+
console.log(`- Open problem: ${report.activeProblem ?? '(none)'}`);
|
|
34
|
+
console.log(`- Active route: ${report.activeRoute ?? '(none)'}`);
|
|
35
|
+
console.log(`- Route breakthrough: ${report.routeBreakthrough ? 'yes' : 'no'}`);
|
|
36
|
+
console.log(`- Problem solved: ${report.problemSolved ? 'yes' : 'no'}`);
|
|
37
|
+
console.log(`- Continuation policy: ${report.continuationDisplay}`);
|
|
38
|
+
console.log(`- Current frontier: ${report.currentFrontier.kind} / ${report.currentFrontier.detail}`);
|
|
39
|
+
console.log(`- Next honest move: ${report.nextHonestMove}`);
|
|
40
|
+
console.log('Checks:');
|
|
41
|
+
printChecks(report.checks);
|
|
42
|
+
console.log(`Verdict: ${report.verdict}`);
|
|
43
|
+
return report.verdict === 'blocked' ? 2 : 0;
|
|
44
|
+
}
|
package/src/commands/problem.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getProblem, listProblems } from '../atlas/catalog.js';
|
|
2
2
|
import { getProblemArtifactInventory } from '../runtime/problem-artifacts.js';
|
|
3
|
+
import { syncState } from '../runtime/state.js';
|
|
3
4
|
import { readCurrentProblem, setCurrentProblem } from '../runtime/workspace.js';
|
|
4
5
|
|
|
5
6
|
function parseListFilters(args) {
|
|
@@ -129,6 +130,12 @@ function printArtifactInventory(problem, inventory, asJson) {
|
|
|
129
130
|
if (inventory.packContext) {
|
|
130
131
|
console.log(`- ${inventory.packContext.label}: ${inventory.packContext.exists ? 'present' : 'missing'} (${inventory.packContext.path})`);
|
|
131
132
|
}
|
|
133
|
+
if (inventory.packProblemArtifacts.length > 0) {
|
|
134
|
+
console.log('Pack problem artifacts:');
|
|
135
|
+
for (const artifact of inventory.packProblemArtifacts) {
|
|
136
|
+
console.log(`- ${artifact.label}: ${artifact.exists ? 'present' : 'missing'} (${artifact.path})`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
132
139
|
if (inventory.computePackets.length > 0) {
|
|
133
140
|
console.log('Compute packets:');
|
|
134
141
|
for (const packet of inventory.computePackets) {
|
|
@@ -194,7 +201,10 @@ export function runProblemCommand(args) {
|
|
|
194
201
|
return 1;
|
|
195
202
|
}
|
|
196
203
|
setCurrentProblem(problem.problemId);
|
|
204
|
+
const state = syncState();
|
|
197
205
|
console.log(`Active problem set to ${problem.problemId} (${problem.title})`);
|
|
206
|
+
console.log(`Active route: ${state.activeRoute ?? '(none)'}`);
|
|
207
|
+
console.log(`Next honest move: ${state.nextHonestMove}`);
|
|
198
208
|
return 0;
|
|
199
209
|
}
|
|
200
210
|
|