@magnusekdahl/parallix 1.2.0 → 1.3.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/index.js +190 -185
- package/lib/agents/agents.js +737 -838
- package/lib/agents/agents.ts +930 -0
- package/lib/agents/claude-telemetry.js +149 -154
- package/lib/agents/claude-telemetry.ts +233 -0
- package/lib/agents/claude.js +121 -131
- package/lib/agents/claude.ts +156 -0
- package/lib/agents/codex-telemetry.js +176 -164
- package/lib/agents/codex-telemetry.ts +205 -0
- package/lib/agents/codex.js +168 -201
- package/lib/agents/codex.ts +236 -0
- package/lib/agents/limit-hit.js +216 -226
- package/lib/agents/limit-hit.ts +262 -0
- package/lib/agents/mistral-telemetry.js +7 -10
- package/lib/agents/mistral-telemetry.ts +44 -0
- package/lib/agents/mistral.js +40 -58
- package/lib/agents/mistral.ts +84 -0
- package/lib/agents/opencode-export.js +126 -127
- package/lib/agents/opencode-export.ts +160 -0
- package/lib/agents/opencode-telemetry.js +282 -261
- package/lib/agents/opencode-telemetry.ts +350 -0
- package/lib/agents/opencode.js +263 -305
- package/lib/agents/opencode.ts +370 -0
- package/lib/agents/stage-telemetry.js +23 -24
- package/lib/agents/stage-telemetry.ts +47 -0
- package/lib/commands/active.js +502 -579
- package/lib/commands/active.ts +665 -0
- package/lib/commands/checkpoint.js +98 -74
- package/lib/commands/checkpoint.ts +79 -0
- package/lib/commands/config.js +61 -31
- package/lib/commands/config.ts +47 -0
- package/lib/commands/coverage-gate.js +271 -246
- package/lib/commands/coverage-gate.ts +362 -0
- package/lib/commands/diff.js +140 -119
- package/lib/commands/diff.ts +125 -0
- package/lib/commands/draft.js +770 -923
- package/lib/commands/draft.ts +1021 -0
- package/lib/commands/handoff.js +588 -608
- package/lib/commands/handoff.ts +694 -0
- package/lib/commands/integrate.js +1332 -1463
- package/lib/commands/integrate.ts +1688 -0
- package/lib/commands/mission-start.js +279 -237
- package/lib/commands/mission-start.ts +263 -0
- package/lib/commands/rebase.js +606 -582
- package/lib/commands/rebase.ts +635 -0
- package/lib/commands/repair-handoff.js +181 -179
- package/lib/commands/repair-handoff.ts +228 -0
- package/lib/commands/resolve-conflict.js +121 -102
- package/lib/commands/resolve-conflict.ts +112 -0
- package/lib/commands/review.js +3 -4
- package/lib/commands/review.ts +14 -0
- package/lib/commands/setup-review.js +4 -5
- package/lib/commands/setup-review.ts +14 -0
- package/lib/commands/setup.js +3 -3
- package/lib/commands/setup.ts +2 -0
- package/lib/commands/stats-backfill.js +394 -359
- package/lib/commands/stats-backfill.ts +418 -0
- package/lib/commands/stats.js +1424 -1665
- package/lib/commands/stats.ts +2186 -0
- package/lib/commands/status.js +219 -200
- package/lib/commands/status.ts +219 -0
- package/lib/commands/verify.js +3 -1
- package/lib/commands/verify.ts +2 -0
- package/lib/core/fmt.js +140 -211
- package/lib/core/fmt.ts +189 -0
- package/lib/core/git.js +121 -102
- package/lib/core/git.ts +146 -0
- package/lib/core/gitignore.js +59 -106
- package/lib/core/gitignore.ts +103 -0
- package/lib/core/mission-utils.js +833 -875
- package/lib/core/mission-utils.ts +998 -0
- package/lib/core/nels.js +112 -127
- package/lib/core/nels.ts +189 -0
- package/lib/core/persistent-data-migration.js +247 -205
- package/lib/core/persistent-data-migration.ts +255 -0
- package/lib/core/product-config.js +400 -476
- package/lib/core/product-config.ts +518 -0
- package/lib/core/runtime-matrix.js +41 -87
- package/lib/core/runtime-matrix.ts +84 -0
- package/lib/core/spawn-tee.js +152 -192
- package/lib/core/spawn-tee.ts +202 -0
- package/lib/core/state-map.js +92 -92
- package/lib/core/state-map.ts +115 -0
- package/lib/core/storage.js +101 -129
- package/lib/core/storage.ts +182 -0
- package/lib/core/subagent-limit.js +15 -16
- package/lib/core/subagent-limit.ts +25 -0
- package/lib/core/verification.js +148 -138
- package/lib/core/verification.ts +200 -0
- package/lib/index.js +142 -59
- package/lib/index.ts +134 -0
- package/lib/review/rebase.js +142 -145
- package/lib/review/rebase.ts +188 -0
- package/lib/review/review-adapter.js +99 -87
- package/lib/review/review-adapter.ts +198 -0
- package/lib/review/review-artifacts.js +486 -629
- package/lib/review/review-artifacts.ts +622 -0
- package/lib/review/review-commands.js +1220 -1373
- package/lib/review/review-commands.ts +1579 -0
- package/lib/review/review-events.js +544 -886
- package/lib/review/review-events.ts +954 -0
- package/lib/review/review-loop.js +945 -1020
- package/lib/review/review-loop.ts +1174 -0
- package/lib/review/review-polling.js +86 -115
- package/lib/review/review-polling.ts +194 -0
- package/lib/review/review-prompts.js +154 -189
- package/lib/review/review-prompts.ts +182 -0
- package/lib/review/review-state.js +246 -225
- package/lib/review/review-state.ts +353 -0
- package/lib/review/review.js +63 -84
- package/lib/review/review.ts +138 -0
- package/lib/tools/backlog.js +694 -680
- package/lib/tools/backlog.ts +835 -0
- package/lib/tools/forgejo.js +1270 -1405
- package/lib/tools/forgejo.ts +1793 -0
- package/lib/tools/gatekeeper.js +106 -96
- package/lib/tools/gatekeeper.ts +124 -0
- package/lib/tools/redgreen.js +200 -181
- package/lib/tools/redgreen.ts +221 -0
- package/lib/tools/sessions.js +58 -52
- package/lib/tools/sessions.ts +81 -0
- package/lib/tools/setup-review.js +902 -975
- package/lib/tools/setup-review.ts +1152 -0
- package/package.json +7 -5
- package/prompts/draft.md +1 -0
- package/prompts/portfolio.md +1 -1
- package/px.js +226 -210
|
@@ -1,112 +1,131 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
const integrate_js_1 = __importDefault(require("./integrate.js"));
|
|
39
|
+
const mission_utils_js_1 = require("../core/mission-utils.js");
|
|
40
|
+
const agents_js_1 = require("../agents/agents.js");
|
|
41
|
+
const fmt = __importStar(require("../core/fmt.js"));
|
|
42
|
+
const verification_js_1 = require("../core/verification.js");
|
|
7
43
|
/** @param {string} value */
|
|
8
44
|
function shellQuote(value) {
|
|
9
|
-
|
|
45
|
+
return `"${String(value).replace(/(["\\$`])/g, '\\$1')}"`;
|
|
10
46
|
}
|
|
11
|
-
|
|
12
47
|
/** @param {{slug: string, area: string, worktreePath: string, missionSpecificFiles: string[]}} opts */
|
|
13
48
|
function buildAgentResolutionPrompt({ slug, area, worktreePath, missionSpecificFiles }) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
].join('\n');
|
|
49
|
+
const fileCommands = missionSpecificFiles
|
|
50
|
+
.map(f => ` git checkout --theirs "${f}" && git add "${f}"`)
|
|
51
|
+
.join('\n');
|
|
52
|
+
const quotedWorktreePath = shellQuote(worktreePath);
|
|
53
|
+
return [
|
|
54
|
+
'Mode: conflict-resolution.',
|
|
55
|
+
'',
|
|
56
|
+
`Mission: ${slug}`,
|
|
57
|
+
`Mission worktree: ${worktreePath}`,
|
|
58
|
+
'',
|
|
59
|
+
`Conflicts detected between the mission branch and ${(0, mission_utils_js_1.getPrimaryBranch)()}.`,
|
|
60
|
+
'All conflicts are in mission-specific files that can be resolved by keeping',
|
|
61
|
+
'the mission branch version (--theirs). Execute these steps in order:',
|
|
62
|
+
'',
|
|
63
|
+
` cd ${quotedWorktreePath}`,
|
|
64
|
+
` git rebase ${(0, mission_utils_js_1.getPrimaryBranch)()}`,
|
|
65
|
+
' # When the rebase pauses on conflicts, run for each file:',
|
|
66
|
+
fileCommands,
|
|
67
|
+
' git rebase --continue',
|
|
68
|
+
` ${(0, verification_js_1.formatVerificationCommand)(area, worktreePath)}`,
|
|
69
|
+
` px integrate ${slug} --dry-run`,
|
|
70
|
+
'',
|
|
71
|
+
'Rules:',
|
|
72
|
+
'- Take --theirs for every file listed above. Do not inspect or edit conflict content.',
|
|
73
|
+
'- If the rebase pauses on a file NOT in the list above, stop immediately and',
|
|
74
|
+
' report the unexpected file. Do not guess the resolution.',
|
|
75
|
+
'- If any command fails, stop immediately and report the failure.',
|
|
76
|
+
' Do not continue to the next step.',
|
|
77
|
+
].join('\n');
|
|
44
78
|
}
|
|
45
|
-
|
|
46
79
|
/** @param {string[]} args @param {{resolveConflictsFn?: Function, startAgentFn?: Function, exitFn?: Function}} opts */
|
|
47
|
-
async function resolveConflict(args, {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
80
|
+
async function resolveConflict(args, { resolveConflictsFn = /** @type {import('./integrate.js').IntegrateFn} */ (integrate_js_1.default).resolveConflictsForMission, startAgentFn = agents_js_1.startAgent, exitFn = ((code) => process.exit(code)), } = {}) {
|
|
81
|
+
const explicitSlug = args[0];
|
|
82
|
+
const slug = (0, mission_utils_js_1.inferSlug)(explicitSlug);
|
|
83
|
+
if (!slug) {
|
|
84
|
+
fmt.log.fail('Usage: px resolve-conflict [<slug>]');
|
|
85
|
+
exitFn(1);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const missionDir = (0, mission_utils_js_1.findMissionDir)(slug);
|
|
89
|
+
const area = missionDir ? (0, mission_utils_js_1.findMissionArea)(missionDir) : 'docs';
|
|
90
|
+
const result = resolveConflictsFn(slug, area);
|
|
91
|
+
// No conflicts — nothing to resolve.
|
|
92
|
+
if (result.ok && result.conflictFiles.length === 0) {
|
|
93
|
+
exitFn(0);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// Shared-file conflicts: the agent cannot guess the correct resolution.
|
|
97
|
+
// Stop and require human intervention.
|
|
98
|
+
if (!result.ok && result.error === 'shared-file-conflicts') {
|
|
99
|
+
fmt.log.fail('Shared-file conflicts require human resolution. Agent cannot guess the correct merge outcome.');
|
|
100
|
+
fmt.log.info(`Shared files: ${result.sharedFiles.map((f) => fmt.path(f)).join(', ')}`);
|
|
101
|
+
fmt.log.info(`Resolve manually, then re-run: ${fmt.command(`px integrate ${slug} --dry-run`)}`);
|
|
102
|
+
exitFn(1);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
// Other errors (worktree missing, merge-failed, etc.) — already logged by resolveConflictsFn.
|
|
106
|
+
if (!result.ok) {
|
|
107
|
+
exitFn(1);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// All conflicts are mission-specific: launch an agent to execute the --theirs rebase.
|
|
111
|
+
const prompt = buildAgentResolutionPrompt({
|
|
112
|
+
slug,
|
|
113
|
+
area,
|
|
114
|
+
worktreePath: result.worktreePath,
|
|
115
|
+
missionSpecificFiles: result.missionSpecificFiles,
|
|
116
|
+
});
|
|
117
|
+
fmt.log.info('Launching agent to execute mission-specific conflict resolution...');
|
|
118
|
+
const { agent, result: agentResult } = await startAgentFn('conflict-resolution', {
|
|
119
|
+
prompt,
|
|
120
|
+
worktree: result.worktreePath,
|
|
121
|
+
});
|
|
122
|
+
if (agentResult.status !== 0) {
|
|
123
|
+
fmt.log.fail(`Agent (${fmt.agent(agent)}) exited with status ${agentResult.status}.`);
|
|
124
|
+
exitFn(agentResult.status || 1);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
fmt.log.pass(`Agent (${fmt.agent(agent)}) completed conflict resolution.`);
|
|
67
128
|
exitFn(0);
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Shared-file conflicts: the agent cannot guess the correct resolution.
|
|
72
|
-
// Stop and require human intervention.
|
|
73
|
-
if (!result.ok && result.error === 'shared-file-conflicts') {
|
|
74
|
-
fmt.log.fail('Shared-file conflicts require human resolution. Agent cannot guess the correct merge outcome.');
|
|
75
|
-
fmt.log.info(`Shared files: ${result.sharedFiles.map(/** @param {string} f */ (f) => fmt.path(f)).join(', ')}`);
|
|
76
|
-
fmt.log.info(`Resolve manually, then re-run: ${fmt.command(`px integrate ${slug} --dry-run`)}`);
|
|
77
|
-
exitFn(1);
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Other errors (worktree missing, merge-failed, etc.) — already logged by resolveConflictsFn.
|
|
82
|
-
if (!result.ok) {
|
|
83
|
-
exitFn(1);
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// All conflicts are mission-specific: launch an agent to execute the --theirs rebase.
|
|
88
|
-
const prompt = buildAgentResolutionPrompt({
|
|
89
|
-
slug,
|
|
90
|
-
area,
|
|
91
|
-
worktreePath: result.worktreePath,
|
|
92
|
-
missionSpecificFiles: result.missionSpecificFiles,
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
fmt.log.info('Launching agent to execute mission-specific conflict resolution...');
|
|
96
|
-
const { agent, result: agentResult } = await startAgentFn('conflict-resolution', {
|
|
97
|
-
prompt,
|
|
98
|
-
worktree: result.worktreePath,
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
if (agentResult.status !== 0) {
|
|
102
|
-
fmt.log.fail(`Agent (${fmt.agent(agent)}) exited with status ${agentResult.status}.`);
|
|
103
|
-
exitFn(agentResult.status || 1);
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
fmt.log.pass(`Agent (${fmt.agent(agent)}) completed conflict resolution.`);
|
|
108
|
-
exitFn(0);
|
|
109
129
|
}
|
|
110
|
-
|
|
130
|
+
resolveConflict.buildAgentResolutionPrompt = buildAgentResolutionPrompt;
|
|
111
131
|
module.exports = resolveConflict;
|
|
112
|
-
module.exports.buildAgentResolutionPrompt = buildAgentResolutionPrompt;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import integrate from './integrate.js';
|
|
2
|
+
import { findMissionDir, findMissionArea, inferSlug, getPrimaryBranch } from '../core/mission-utils.js';
|
|
3
|
+
import { startAgent } from '../agents/agents.js';
|
|
4
|
+
import * as fmt from '../core/fmt.js';
|
|
5
|
+
import { formatVerificationCommand } from '../core/verification.js';
|
|
6
|
+
|
|
7
|
+
/** @param {string} value */
|
|
8
|
+
function shellQuote(value: string) {
|
|
9
|
+
return `"${String(value).replace(/(["\\$`])/g, '\\$1')}"`;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** @param {{slug: string, area: string, worktreePath: string, missionSpecificFiles: string[]}} opts */
|
|
13
|
+
function buildAgentResolutionPrompt({ slug, area, worktreePath, missionSpecificFiles }: {slug: string, area: string, worktreePath: string, missionSpecificFiles: string[]}) {
|
|
14
|
+
const fileCommands = missionSpecificFiles
|
|
15
|
+
.map(f => ` git checkout --theirs "${f}" && git add "${f}"`)
|
|
16
|
+
.join('\n');
|
|
17
|
+
const quotedWorktreePath = shellQuote(worktreePath);
|
|
18
|
+
|
|
19
|
+
return [
|
|
20
|
+
'Mode: conflict-resolution.',
|
|
21
|
+
'',
|
|
22
|
+
`Mission: ${slug}`,
|
|
23
|
+
`Mission worktree: ${worktreePath}`,
|
|
24
|
+
'',
|
|
25
|
+
`Conflicts detected between the mission branch and ${getPrimaryBranch()}.`,
|
|
26
|
+
'All conflicts are in mission-specific files that can be resolved by keeping',
|
|
27
|
+
'the mission branch version (--theirs). Execute these steps in order:',
|
|
28
|
+
'',
|
|
29
|
+
` cd ${quotedWorktreePath}`,
|
|
30
|
+
` git rebase ${getPrimaryBranch()}`,
|
|
31
|
+
' # When the rebase pauses on conflicts, run for each file:',
|
|
32
|
+
fileCommands,
|
|
33
|
+
' git rebase --continue',
|
|
34
|
+
` ${formatVerificationCommand(area, worktreePath)}`,
|
|
35
|
+
` px integrate ${slug} --dry-run`,
|
|
36
|
+
'',
|
|
37
|
+
'Rules:',
|
|
38
|
+
'- Take --theirs for every file listed above. Do not inspect or edit conflict content.',
|
|
39
|
+
'- If the rebase pauses on a file NOT in the list above, stop immediately and',
|
|
40
|
+
' report the unexpected file. Do not guess the resolution.',
|
|
41
|
+
'- If any command fails, stop immediately and report the failure.',
|
|
42
|
+
' Do not continue to the next step.',
|
|
43
|
+
].join('\n');
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** @param {string[]} args @param {{resolveConflictsFn?: Function, startAgentFn?: Function, exitFn?: Function}} opts */
|
|
47
|
+
async function resolveConflict(args: string[], {
|
|
48
|
+
resolveConflictsFn = /** @type {import('./integrate.js').IntegrateFn} */ (integrate).resolveConflictsForMission,
|
|
49
|
+
startAgentFn = startAgent,
|
|
50
|
+
exitFn = ((code: number) => process.exit(code)) as (code: number) => void,
|
|
51
|
+
}: {resolveConflictsFn?: Function, startAgentFn?: Function, exitFn?: (code: number) => void} = {}) {
|
|
52
|
+
const explicitSlug = args[0];
|
|
53
|
+
const slug = inferSlug(explicitSlug);
|
|
54
|
+
if (!slug) {
|
|
55
|
+
fmt.log.fail('Usage: px resolve-conflict [<slug>]');
|
|
56
|
+
exitFn(1);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const missionDir = findMissionDir(slug);
|
|
61
|
+
const area = missionDir ? findMissionArea(missionDir) : 'docs';
|
|
62
|
+
|
|
63
|
+
const result = resolveConflictsFn(slug, area);
|
|
64
|
+
|
|
65
|
+
// No conflicts — nothing to resolve.
|
|
66
|
+
if (result.ok && result.conflictFiles.length === 0) {
|
|
67
|
+
exitFn(0);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Shared-file conflicts: the agent cannot guess the correct resolution.
|
|
72
|
+
// Stop and require human intervention.
|
|
73
|
+
if (!result.ok && result.error === 'shared-file-conflicts') {
|
|
74
|
+
fmt.log.fail('Shared-file conflicts require human resolution. Agent cannot guess the correct merge outcome.');
|
|
75
|
+
fmt.log.info(`Shared files: ${result.sharedFiles.map((f: string) => fmt.path(f)).join(', ')}`);
|
|
76
|
+
fmt.log.info(`Resolve manually, then re-run: ${fmt.command(`px integrate ${slug} --dry-run`)}`);
|
|
77
|
+
exitFn(1);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Other errors (worktree missing, merge-failed, etc.) — already logged by resolveConflictsFn.
|
|
82
|
+
if (!result.ok) {
|
|
83
|
+
exitFn(1);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// All conflicts are mission-specific: launch an agent to execute the --theirs rebase.
|
|
88
|
+
const prompt = buildAgentResolutionPrompt({
|
|
89
|
+
slug,
|
|
90
|
+
area,
|
|
91
|
+
worktreePath: result.worktreePath,
|
|
92
|
+
missionSpecificFiles: result.missionSpecificFiles,
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
fmt.log.info('Launching agent to execute mission-specific conflict resolution...');
|
|
96
|
+
const { agent, result: agentResult } = await startAgentFn('conflict-resolution', {
|
|
97
|
+
prompt,
|
|
98
|
+
worktree: result.worktreePath,
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
if (agentResult.status !== 0) {
|
|
102
|
+
fmt.log.fail(`Agent (${fmt.agent(agent)}) exited with status ${agentResult.status}.`);
|
|
103
|
+
exitFn(agentResult.status || 1);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
fmt.log.pass(`Agent (${fmt.agent(agent)}) completed conflict resolution.`);
|
|
108
|
+
exitFn(0);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
(resolveConflict as any).buildAgentResolutionPrompt = buildAgentResolutionPrompt;
|
|
112
|
+
export = resolveConflict;
|
package/lib/commands/review.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
const review_commands_js_1 = require("../review/review-commands.js");
|
|
3
3
|
/**
|
|
4
4
|
* Workflow command entry point for `review`.
|
|
5
5
|
* Delegates to the review subsystem (review-commands.js).
|
|
@@ -8,7 +8,6 @@ const review = require('../review/review-commands').review;
|
|
|
8
8
|
*/
|
|
9
9
|
/** @param {string[]} args */
|
|
10
10
|
async function reviewCommand(args) {
|
|
11
|
-
|
|
11
|
+
await (0, review_commands_js_1.review)(args);
|
|
12
12
|
}
|
|
13
|
-
|
|
14
13
|
module.exports = reviewCommand;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { review } from '../review/review-commands.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Workflow command entry point for `review`.
|
|
5
|
+
* Delegates to the review subsystem (review-commands.js).
|
|
6
|
+
*
|
|
7
|
+
* Usage: node parallix review [<slug>] [--verify] [--submit] [--push] ...
|
|
8
|
+
*/
|
|
9
|
+
/** @param {string[]} args */
|
|
10
|
+
async function reviewCommand(args: string[]) {
|
|
11
|
+
await review(args);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export = reviewCommand;
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
const setupReviewModule = require("../tools/setup-review.js");
|
|
3
3
|
/**
|
|
4
4
|
* Workflow command entry point for `setup-review`.
|
|
5
5
|
* Delegates to the Forgejo bootstrap tool (tools/setup-review.js).
|
|
6
6
|
*
|
|
7
7
|
* Usage: node parallix setup-review
|
|
8
8
|
*/
|
|
9
|
-
/** @param {string[]} args @param {
|
|
9
|
+
/** @param {string[]} args @param {{[key: string]: any}} [options] */
|
|
10
10
|
async function setupReviewCommand(args, options) {
|
|
11
|
-
|
|
11
|
+
await setupReviewModule.setupReview(args, options);
|
|
12
12
|
}
|
|
13
|
-
|
|
14
13
|
module.exports = setupReviewCommand;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import setupReviewModule = require('../tools/setup-review.js');
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Workflow command entry point for `setup-review`.
|
|
5
|
+
* Delegates to the Forgejo bootstrap tool (tools/setup-review.js).
|
|
6
|
+
*
|
|
7
|
+
* Usage: node parallix setup-review
|
|
8
|
+
*/
|
|
9
|
+
/** @param {string[]} args @param {{[key: string]: any}} [options] */
|
|
10
|
+
async function setupReviewCommand(args: string[], options?: {[key: string]: any}) {
|
|
11
|
+
await setupReviewModule.setupReview(args, options);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export = setupReviewCommand;
|
package/lib/commands/setup.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
module.exports = setupWizard;
|
|
1
|
+
"use strict";
|
|
2
|
+
const setupReview = require("../tools/setup-review.js");
|
|
3
|
+
module.exports = setupReview.setupWizard;
|