@fiftth/fiftth-cli 1.0.1 → 1.1.1
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/.fiftthnexus/.github/workflows/copilot-orchestrator.yml +78 -0
- package/.fiftthnexus/actions/Dockerfile +34 -0
- package/.fiftthnexus/actions/copilot-agent.mjs +269 -0
- package/.fiftthnexus/actions/package.json +8 -0
- package/.fiftthnexus/orchestrator.ts +2304 -0
- package/.fiftthnexus/skills/env-implement-prompt.md +65 -0
- package/.fiftthnexus/skills/env-plan-prompt.md +33 -0
- package/.fiftthnexus/skills/env-review-prompt.md +61 -0
- package/.fiftthnexus/skills/grill-me.md +9 -0
- package/.fiftthnexus/skills/prd-to-issues.md +150 -0
- package/.fiftthnexus/skills/write-prd.md +70 -0
- package/README.md +216 -25
- package/dist/api/client.d.ts +6 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +13 -2
- package/dist/api/client.js.map +1 -1
- package/dist/commands/checkout.d.ts +6 -1
- package/dist/commands/checkout.d.ts.map +1 -1
- package/dist/commands/checkout.js +415 -44
- package/dist/commands/checkout.js.map +1 -1
- package/dist/commands/login.d.ts +0 -2
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +83 -32
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/model.d.ts +2 -0
- package/dist/commands/model.d.ts.map +1 -0
- package/dist/commands/model.js +32 -0
- package/dist/commands/model.js.map +1 -0
- package/dist/commands/planningContext.d.ts +6 -0
- package/dist/commands/planningContext.d.ts.map +1 -0
- package/dist/commands/planningContext.js +91 -0
- package/dist/commands/planningContext.js.map +1 -0
- package/dist/commands/repo.d.ts.map +1 -1
- package/dist/commands/repo.js +38 -15
- package/dist/commands/repo.js.map +1 -1
- package/dist/commands/skills.d.ts +2 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +123 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/use.d.ts +1 -5
- package/dist/commands/use.d.ts.map +1 -1
- package/dist/commands/use.js +63 -48
- package/dist/commands/use.js.map +1 -1
- package/dist/index.js +86 -27
- package/dist/index.js.map +1 -1
- package/dist/services/nexusService.d.ts +30 -0
- package/dist/services/nexusService.d.ts.map +1 -0
- package/dist/services/nexusService.js +188 -0
- package/dist/services/nexusService.js.map +1 -0
- package/dist/services/prdService.d.ts +12 -0
- package/dist/services/prdService.d.ts.map +1 -0
- package/dist/services/prdService.js +103 -0
- package/dist/services/prdService.js.map +1 -0
- package/dist/services/taskSelection.d.ts +10 -0
- package/dist/services/taskSelection.d.ts.map +1 -0
- package/dist/services/taskSelection.js +112 -0
- package/dist/services/taskSelection.js.map +1 -0
- package/dist/services/taskService.d.ts +23 -1
- package/dist/services/taskService.d.ts.map +1 -1
- package/dist/services/taskService.js +118 -12
- package/dist/services/taskService.js.map +1 -1
- package/dist/utils/config.d.ts +2 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +20 -3
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/dashboard.d.ts +65 -0
- package/dist/utils/dashboard.d.ts.map +1 -0
- package/dist/utils/dashboard.js +205 -0
- package/dist/utils/dashboard.js.map +1 -0
- package/dist/utils/models.d.ts +14 -0
- package/dist/utils/models.d.ts.map +1 -0
- package/dist/utils/models.js +89 -0
- package/dist/utils/models.js.map +1 -0
- package/dist/utils/ui.d.ts +6 -0
- package/dist/utils/ui.d.ts.map +1 -1
- package/dist/utils/ui.js +22 -1
- package/dist/utils/ui.js.map +1 -1
- package/dist/utils/version.d.ts +4 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +26 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +9 -4
- package/.github/workflows/publish-npm.yml +0 -62
- package/dist/commands/tasks.d.ts +0 -2
- package/dist/commands/tasks.d.ts.map +0 -1
- package/dist/commands/tasks.js +0 -69
- package/dist/commands/tasks.js.map +0 -1
- package/dist/context/runtimeContext.d.ts +0 -14
- package/dist/context/runtimeContext.d.ts.map +0 -1
- package/dist/context/runtimeContext.js +0 -21
- package/dist/context/runtimeContext.js.map +0 -1
- package/dist/services/taskContext.d.ts +0 -14
- package/dist/services/taskContext.d.ts.map +0 -1
- package/dist/services/taskContext.js +0 -15
- package/dist/services/taskContext.js.map +0 -1
- package/dist/utils/api.d.ts +0 -10
- package/dist/utils/api.d.ts.map +0 -1
- package/dist/utils/api.js +0 -25
- package/dist/utils/api.js.map +0 -1
- package/src/api/client.ts +0 -31
- package/src/commands/checkout.ts +0 -101
- package/src/commands/login.ts +0 -145
- package/src/commands/repo.ts +0 -113
- package/src/commands/tasks.ts +0 -86
- package/src/commands/use.ts +0 -149
- package/src/config/configService.ts +0 -56
- package/src/context/runtimeContext.ts +0 -42
- package/src/git/gitService.ts +0 -29
- package/src/index.ts +0 -133
- package/src/services/taskContext.ts +0 -32
- package/src/services/taskService.ts +0 -53
- package/src/utils/api.ts +0 -41
- package/src/utils/config.ts +0 -48
- package/src/utils/ui.ts +0 -46
- package/tsconfig.json +0 -18
- package/vitest.config.ts +0 -8
package/dist/commands/use.js
CHANGED
|
@@ -1,20 +1,36 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
1
2
|
import chalk from 'chalk';
|
|
2
|
-
import { select } from '@inquirer/prompts';
|
|
3
3
|
import ora from 'ora';
|
|
4
|
+
import { buildGlobalMetrics, getDockerRuntimeStatus, renderDashboard } from '../utils/dashboard.js';
|
|
4
5
|
import { loadConfig, saveConfig } from '../utils/config.js';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
6
|
+
import { resolveConfiguredModel } from '../utils/models.js';
|
|
7
|
+
import { getCliVersionLabel } from '../utils/version.js';
|
|
8
|
+
import { createApiClient } from '../api/client.js';
|
|
9
|
+
import { cmd, fail, info, kv, muted, ok } from '../utils/ui.js';
|
|
10
|
+
const CLI_VERSION = getCliVersionLabel();
|
|
11
|
+
const FIFTTH_GOLD = '#C8A96A';
|
|
12
|
+
function renderWorkspaceScreen(title, lines) {
|
|
13
|
+
const config = loadConfig();
|
|
14
|
+
console.log(renderDashboard({
|
|
15
|
+
title,
|
|
16
|
+
subtitle: 'workspace selection and shell context',
|
|
17
|
+
metrics: buildGlobalMetrics({
|
|
18
|
+
workspace: config.workspace,
|
|
19
|
+
loggedIn: Boolean(config.token),
|
|
20
|
+
model: resolveConfiguredModel(config),
|
|
21
|
+
cliVersion: CLI_VERSION,
|
|
22
|
+
dockerStatus: getDockerRuntimeStatus(),
|
|
23
|
+
}),
|
|
24
|
+
panels: [{ title: 'workspace', lines }],
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
export async function useCommand(workspace) {
|
|
8
28
|
const config = loadConfig();
|
|
9
29
|
if (!config.token) {
|
|
10
30
|
console.error(`\n${fail('Not authenticated.')} ${muted(`Run ${cmd('fiftth login')} first.`)}\n`);
|
|
11
31
|
process.exit(1);
|
|
12
32
|
}
|
|
13
33
|
const client = createApiClient();
|
|
14
|
-
if (options.list) {
|
|
15
|
-
await listWorkspaces(client);
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
34
|
if (workspace) {
|
|
19
35
|
await switchWorkspace(workspace, config, client);
|
|
20
36
|
}
|
|
@@ -22,32 +38,6 @@ export async function useCommand(workspace, options) {
|
|
|
22
38
|
await interactiveSelectWorkspace(config, client);
|
|
23
39
|
}
|
|
24
40
|
}
|
|
25
|
-
async function listWorkspaces(client) {
|
|
26
|
-
const spinner = ora('Fetching workspaces…').start();
|
|
27
|
-
let workspaces;
|
|
28
|
-
try {
|
|
29
|
-
workspaces = await client.getWorkspaces();
|
|
30
|
-
}
|
|
31
|
-
catch (err) {
|
|
32
|
-
spinner.fail(fail('Failed to fetch workspaces.'));
|
|
33
|
-
console.error(`\n${muted(err instanceof Error ? err.message : String(err))}\n`);
|
|
34
|
-
process.exit(1);
|
|
35
|
-
}
|
|
36
|
-
spinner.stop();
|
|
37
|
-
if (workspaces.length === 0) {
|
|
38
|
-
console.log(`\n${info('No workspaces found.')}\n`);
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
const config = loadConfig();
|
|
42
|
-
console.log(`\n${section('Available workspaces')}\n`);
|
|
43
|
-
for (const ws of workspaces) {
|
|
44
|
-
const active = ws.slug === config.workspace;
|
|
45
|
-
const marker = active ? chalk.green('✓') : chalk.dim('·');
|
|
46
|
-
const name = active ? chalk.bold(ws.name) : ws.name;
|
|
47
|
-
console.log(` ${marker} ${name} ${muted(ws.slug)}`);
|
|
48
|
-
}
|
|
49
|
-
console.log();
|
|
50
|
-
}
|
|
51
41
|
async function switchWorkspace(slug, config, client) {
|
|
52
42
|
const spinner = ora('Fetching workspaces...').start();
|
|
53
43
|
let workspaces;
|
|
@@ -63,7 +53,7 @@ async function switchWorkspace(slug, config, client) {
|
|
|
63
53
|
const match = workspaces.find((ws) => ws.slug === slug || ws.name === slug);
|
|
64
54
|
if (!match) {
|
|
65
55
|
console.error(`\n${fail(`Workspace ${chalk.bold(slug)} not found.`)}\n`);
|
|
66
|
-
console.log(`${muted(`Run ${cmd('fiftth use
|
|
56
|
+
console.log(`${muted(`Run ${cmd('fiftth use')} to select from available workspaces.`)}\n`);
|
|
67
57
|
process.exit(1);
|
|
68
58
|
}
|
|
69
59
|
saveConfig({
|
|
@@ -71,8 +61,10 @@ async function switchWorkspace(slug, config, client) {
|
|
|
71
61
|
workspace: match.slug,
|
|
72
62
|
workspaceId: match.id,
|
|
73
63
|
});
|
|
74
|
-
|
|
75
|
-
|
|
64
|
+
renderWorkspaceScreen('fiftth use', [
|
|
65
|
+
ok(`Now using workspace ${chalk.bold(match.name)} ${muted(`(${match.slug})`)}`),
|
|
66
|
+
kv('Workspace ID', match.id),
|
|
67
|
+
]);
|
|
76
68
|
}
|
|
77
69
|
async function interactiveSelectWorkspace(config, client) {
|
|
78
70
|
const spinner = ora('Fetching workspaces...').start();
|
|
@@ -90,20 +82,43 @@ async function interactiveSelectWorkspace(config, client) {
|
|
|
90
82
|
console.log(`\n${info('No workspaces found.')}\n`);
|
|
91
83
|
return;
|
|
92
84
|
}
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
85
|
+
const questions = [
|
|
86
|
+
{
|
|
87
|
+
type: 'list',
|
|
88
|
+
name: 'selectedWorkspace',
|
|
89
|
+
prefix: chalk.hex(FIFTTH_GOLD)('◆'),
|
|
90
|
+
message: chalk.hex(FIFTTH_GOLD)('Select a workspace'),
|
|
91
|
+
loop: false,
|
|
92
|
+
pageSize: 10,
|
|
93
|
+
default: config.workspace,
|
|
94
|
+
choices: workspaces.map((ws) => ({
|
|
95
|
+
value: ws.slug,
|
|
96
|
+
name: chalk.hex(FIFTTH_GOLD)(ws.name) + ' ' + chalk.hex('#8D8D8D')(ws.slug),
|
|
97
|
+
short: ws.name,
|
|
98
|
+
})),
|
|
99
|
+
theme: {
|
|
100
|
+
icon: {
|
|
101
|
+
cursor: chalk.hex(FIFTTH_GOLD)('◆'),
|
|
102
|
+
},
|
|
103
|
+
style: {
|
|
104
|
+
answer: (text) => chalk.hex(FIFTTH_GOLD)(text),
|
|
105
|
+
message: (text) => chalk.hex(FIFTTH_GOLD)(text),
|
|
106
|
+
highlight: (text) => chalk.hex(FIFTTH_GOLD).bold(text),
|
|
107
|
+
help: (text) => chalk.hex('#8D8D8D')(text),
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
];
|
|
112
|
+
const { selectedWorkspace } = await inquirer.prompt(questions);
|
|
113
|
+
const match = workspaces.find((ws) => ws.slug === selectedWorkspace);
|
|
102
114
|
saveConfig({
|
|
103
115
|
...config,
|
|
104
|
-
workspace:
|
|
116
|
+
workspace: selectedWorkspace,
|
|
105
117
|
workspaceId: match.id,
|
|
106
118
|
});
|
|
107
|
-
|
|
119
|
+
renderWorkspaceScreen('fiftth use', [
|
|
120
|
+
ok(`Now using workspace ${chalk.bold(match.name)} ${muted(`(${match.slug})`)}`),
|
|
121
|
+
kv('Workspace ID', match.id),
|
|
122
|
+
]);
|
|
108
123
|
}
|
|
109
124
|
//# sourceMappingURL=use.js.map
|
package/dist/commands/use.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use.js","sourceRoot":"","sources":["../../src/commands/use.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"use.js","sourceRoot":"","sources":["../../src/commands/use.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -4,15 +4,21 @@ import chalk from 'chalk';
|
|
|
4
4
|
import { loginCommand, logoutCommand, loginStatusCommand } from './commands/login.js';
|
|
5
5
|
import { useCommand } from './commands/use.js';
|
|
6
6
|
import { registerRepoCommands } from './commands/repo.js';
|
|
7
|
-
import { tasksCommand } from './commands/tasks.js';
|
|
8
7
|
import { checkoutCommand } from './commands/checkout.js';
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
8
|
+
import { planningContextCommand } from './commands/planningContext.js';
|
|
9
|
+
import { modelCommand } from './commands/model.js';
|
|
10
|
+
import { skillsCommand } from './commands/skills.js';
|
|
11
|
+
import { DEFAULT_HOST, loadConfig, getConfigPath } from './utils/config.js';
|
|
12
|
+
import { buildGlobalMetrics, getDockerRuntimeStatus, renderDashboard } from './utils/dashboard.js';
|
|
13
|
+
import { findModelOption, resolveConfiguredModel } from './utils/models.js';
|
|
14
|
+
import { getCliVersionLabel, getPackageVersion } from './utils/version.js';
|
|
15
|
+
import { cmd, fail, kv, muted, ok, title } from './utils/ui.js';
|
|
16
|
+
const CLI_VERSION = getCliVersionLabel();
|
|
11
17
|
const program = new Command();
|
|
12
18
|
program
|
|
13
19
|
.name('fiftth')
|
|
14
20
|
.description('Startup-grade CLI for autonomous software teams')
|
|
15
|
-
.version(
|
|
21
|
+
.version(getPackageVersion(), '-v, --version', 'Output the current version')
|
|
16
22
|
.addHelpText('before', `\n${title('Fiftth CLI')}\n${muted('start orchestrating your AI engineering workflows.')}\n`)
|
|
17
23
|
.addHelpText('after', `
|
|
18
24
|
${chalk.dim('Examples:')}
|
|
@@ -20,18 +26,20 @@ ${chalk.dim('Examples:')}
|
|
|
20
26
|
${cmd('$ fiftth login --token <tok>')} Authenticate using a token directly
|
|
21
27
|
${cmd('$ fiftth use my-workspace')} Switch to a workspace
|
|
22
28
|
${cmd('$ fiftth use')} Interactively select a workspace
|
|
23
|
-
${cmd('$ fiftth use --list')} List all available workspaces
|
|
24
29
|
${cmd('$ fiftth repo add api ~/dev/api')} Register a local git repository
|
|
25
30
|
${cmd('$ fiftth repo list')} List configured repositories
|
|
26
|
-
${cmd('$ fiftth
|
|
27
|
-
${cmd('$ fiftth
|
|
31
|
+
${cmd('$ fiftth skills')} Install bundled skills for Copilot or Claude Code
|
|
32
|
+
${cmd('$ fiftth planning-context')} Validate whether the current repo belongs to a selected task
|
|
33
|
+
${cmd('$ fiftth checkout')} Select a task, checkout repos, and start nexus
|
|
34
|
+
${cmd('$ fiftth checkout <taskId>')} Skip selection and run checkout for a specific task
|
|
35
|
+
${cmd('$ fiftth checkout --worktree')} Keep the main repo checkout untouched and start nexus from a worktree
|
|
28
36
|
`);
|
|
29
37
|
// ─── fiftth login ──────────────────────────────────────────────────────────
|
|
30
38
|
const loginCmd = program
|
|
31
39
|
.command('login')
|
|
32
40
|
.description('Authenticate with the Fiftth platform')
|
|
33
41
|
.option('-t, --token <token>', 'Access token (for non-interactive / CI use)')
|
|
34
|
-
.option('--host <host>',
|
|
42
|
+
.option('--host <host>', `API host (defaults to ${DEFAULT_HOST})`)
|
|
35
43
|
.addHelpText('after', `
|
|
36
44
|
${chalk.dim('Examples:')}
|
|
37
45
|
${chalk.cyan('$ fiftth login')}
|
|
@@ -57,15 +65,13 @@ loginCmd.action(async (options) => {
|
|
|
57
65
|
program
|
|
58
66
|
.command('use [workspace]')
|
|
59
67
|
.description('Select the active workspace')
|
|
60
|
-
.option('-l, --list', 'List all available workspaces')
|
|
61
68
|
.addHelpText('after', `
|
|
62
69
|
${chalk.dim('Examples:')}
|
|
63
70
|
${chalk.cyan('$ fiftth use')} Interactively select a workspace
|
|
64
71
|
${chalk.cyan('$ fiftth use my-workspace')} Switch directly to a workspace by slug or name
|
|
65
|
-
${chalk.cyan('$ fiftth use --list')} List all workspaces
|
|
66
72
|
`)
|
|
67
|
-
.action(async (workspace
|
|
68
|
-
await useCommand(workspace
|
|
73
|
+
.action(async (workspace) => {
|
|
74
|
+
await useCommand(workspace).catch(handleError);
|
|
69
75
|
});
|
|
70
76
|
// ─── fiftth config ─────────────────────────────────────────────────────────
|
|
71
77
|
program
|
|
@@ -73,28 +79,81 @@ program
|
|
|
73
79
|
.description('Show current CLI configuration')
|
|
74
80
|
.action(() => {
|
|
75
81
|
const config = loadConfig();
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
console.log(
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
+
const resolvedModel = resolveConfiguredModel(config);
|
|
83
|
+
const modelLabel = findModelOption(resolvedModel)?.label ?? resolvedModel;
|
|
84
|
+
console.log(renderDashboard({
|
|
85
|
+
title: 'fiftth config',
|
|
86
|
+
subtitle: 'current shell configuration and runtime defaults',
|
|
87
|
+
metrics: buildGlobalMetrics({
|
|
88
|
+
workspace: config.workspace,
|
|
89
|
+
loggedIn: Boolean(config.token),
|
|
90
|
+
model: modelLabel,
|
|
91
|
+
cliVersion: CLI_VERSION,
|
|
92
|
+
dockerStatus: getDockerRuntimeStatus(),
|
|
93
|
+
}),
|
|
94
|
+
panels: [
|
|
95
|
+
{
|
|
96
|
+
title: 'configuration',
|
|
97
|
+
lines: [
|
|
98
|
+
kv('Config file', cmd(getConfigPath())),
|
|
99
|
+
kv('Host', cmd(config.host)),
|
|
100
|
+
kv('Workspace', config.workspace ? cmd(config.workspace) : muted('(none)')),
|
|
101
|
+
kv('Logged in', config.token ? ok('yes') : fail('no')),
|
|
102
|
+
kv('Model', modelLabel),
|
|
103
|
+
],
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
}));
|
|
107
|
+
});
|
|
108
|
+
program
|
|
109
|
+
.command('model [name]')
|
|
110
|
+
.description('Select the default model used by checkout and nexus')
|
|
111
|
+
.action(async (name) => {
|
|
112
|
+
await modelCommand(name).catch(handleError);
|
|
113
|
+
});
|
|
114
|
+
program
|
|
115
|
+
.command('skills [agent]')
|
|
116
|
+
.description('Install bundled Fiftth planning skills for Copilot or Claude Code')
|
|
117
|
+
.addHelpText('after', `
|
|
118
|
+
${chalk.dim('Examples:')}
|
|
119
|
+
${chalk.cyan('$ fiftth skills')} Interactively choose the target agent and install the skills
|
|
120
|
+
${chalk.cyan('$ fiftth skills copilot')} Install the skills into ./.github/agents
|
|
121
|
+
${chalk.cyan('$ fiftth skills claude-code')} Install the skills into ./claude/skills
|
|
122
|
+
`)
|
|
123
|
+
.action(async (agent) => {
|
|
124
|
+
await skillsCommand(agent).catch(handleError);
|
|
82
125
|
});
|
|
83
126
|
// ─── fiftth repo ───────────────────────────────────────────────────────────
|
|
84
127
|
registerRepoCommands(program);
|
|
85
|
-
// ─── fiftth
|
|
128
|
+
// ─── fiftth planning-context ──────────────────────────────────────────────
|
|
86
129
|
program
|
|
87
|
-
.command('
|
|
88
|
-
.description('
|
|
89
|
-
.
|
|
90
|
-
|
|
130
|
+
.command('planning-context [taskId]')
|
|
131
|
+
.description('Validate whether the current repository belongs to the selected task before planning')
|
|
132
|
+
.option('--json', 'Output the planning context as JSON and exit with code 1 when the repo is not part of the task')
|
|
133
|
+
.addHelpText('after', `
|
|
134
|
+
${chalk.dim('Examples:')}
|
|
135
|
+
${chalk.cyan('$ fiftth planning-context')} Select a task and validate the current repository
|
|
136
|
+
${chalk.cyan('$ fiftth planning-context abc123')} Validate the current repository for a specific task id
|
|
137
|
+
${chalk.cyan('$ fiftth planning-context abc123 --json')} Emit machine-readable planning context for agents
|
|
138
|
+
`)
|
|
139
|
+
.action(async (taskId, options) => {
|
|
140
|
+
await planningContextCommand(taskId, options).catch(handleError);
|
|
91
141
|
});
|
|
92
142
|
// ─── fiftth checkout ───────────────────────────────────────────────────────
|
|
93
143
|
program
|
|
94
|
-
.command('checkout
|
|
95
|
-
.description('
|
|
96
|
-
.
|
|
97
|
-
|
|
144
|
+
.command('checkout [taskId]')
|
|
145
|
+
.description('Select a task, checkout linked repositories, transition the task, and start nexus')
|
|
146
|
+
.option('--worktree', 'Create orchestrator worktrees from the target branch without switching the main repository checkout')
|
|
147
|
+
.option('--verbose', 'Stream verbose Nexus logs during checkout')
|
|
148
|
+
.addHelpText('after', `
|
|
149
|
+
${chalk.dim('Examples:')}
|
|
150
|
+
${chalk.cyan('$ fiftth checkout')} Select a task and switch the main repos to their target branches
|
|
151
|
+
${chalk.cyan('$ fiftth checkout abc123')} Run checkout for a specific task id
|
|
152
|
+
${chalk.cyan('$ fiftth checkout --worktree')} Keep the main repos unchanged and create orchestrator worktrees from the target branches
|
|
153
|
+
${chalk.cyan('$ fiftth checkout --verbose')} Stream full Nexus logs during the checkout run
|
|
154
|
+
`)
|
|
155
|
+
.action(async (taskId, options) => {
|
|
156
|
+
await checkoutCommand(taskId, options).catch(handleError);
|
|
98
157
|
});
|
|
99
158
|
// ─── Error handling ────────────────────────────────────────────────────────
|
|
100
159
|
function handleError(err) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACrF,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACrF,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAC3E,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAClG,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC3E,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC1E,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAW,KAAK,EAAE,MAAM,eAAe,CAAA;AAExE,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAA;AAExC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,iDAAiD,CAAC;KAC9D,OAAO,CAAC,iBAAiB,EAAE,EAAE,eAAe,EAAE,4BAA4B,CAAC;KAC3E,WAAW,CACV,QAAQ,EACR,KAAK,KAAK,CAAC,YAAY,CAAC,KAAK,KAAK,CAAC,oDAAoD,CAAC,IAAI,CAC7F;KACA,WAAW,CACV,OAAO,EACP;EACF,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;IACpB,GAAG,CAAC,gBAAgB,CAAC;IACrB,GAAG,CAAC,8BAA8B,CAAC;IACnC,GAAG,CAAC,2BAA2B,CAAC;IAChC,GAAG,CAAC,cAAc,CAAC;IACnB,GAAG,CAAC,iCAAiC,CAAC;IACtC,GAAG,CAAC,oBAAoB,CAAC;IACzB,GAAG,CAAC,iBAAiB,CAAC;IACtB,GAAG,CAAC,2BAA2B,CAAC;IAChC,GAAG,CAAC,mBAAmB,CAAC;IACxB,GAAG,CAAC,4BAA4B,CAAC;IACjC,GAAG,CAAC,8BAA8B,CAAC;CACtC,CACE,CAAA;AAEH,8EAA8E;AAC9E,MAAM,QAAQ,GAAG,OAAO;KACrB,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,qBAAqB,EAAE,6CAA6C,CAAC;KAC5E,MAAM,CAAC,eAAe,EAAE,yBAAyB,YAAY,GAAG,CAAC;KACjE,WAAW,CACV,OAAO,EACP;EACF,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;IACpB,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC;IAC5B,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC;IACrD,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC;CACrE,CACE,CAAA;AAEH,QAAQ;KACL,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,kBAAkB,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;AAC/C,CAAC,CAAC,CAAA;AAEJ,QAAQ;KACL,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,aAAa,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;AAC1C,CAAC,CAAC,CAAA;AAEJ,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAA0C,EAAE,EAAE;IACnE,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;AAChD,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,6BAA6B,CAAC;KAC1C,WAAW,CACV,OAAO,EACP;EACF,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;IACpB,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC;IAC1B,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC;CAC1C,CACE;KACA,MAAM,CAAC,KAAK,EAAE,SAA6B,EAAE,EAAE;IAC9C,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;AAChD,CAAC,CAAC,CAAA;AAEJ,8EAA8E;AAC9E,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,GAAG,EAAE;IACX,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,aAAa,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAA;IACpD,MAAM,UAAU,GAAG,eAAe,CAAC,aAAa,CAAC,EAAE,KAAK,IAAI,aAAa,CAAA;IAEzE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAC1B,KAAK,EAAE,eAAe;QACtB,QAAQ,EAAE,kDAAkD;QAC5D,OAAO,EAAE,kBAAkB,CAAC;YAC1B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;YAC/B,KAAK,EAAE,UAAU;YACjB,UAAU,EAAE,WAAW;YACvB,YAAY,EAAE,sBAAsB,EAAE;SACvC,CAAC;QACF,MAAM,EAAE;YACN;gBACE,KAAK,EAAE,eAAe;gBACtB,KAAK,EAAE;oBACL,EAAE,CAAC,aAAa,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC;oBACvC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC5B,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAC3E,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACtD,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC;iBACxB;aACF;SACF;KACF,CAAC,CAAC,CAAA;AACL,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,qDAAqD,CAAC;KAClE,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;IACzC,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;AAC7C,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,mEAAmE,CAAC;KAChF,WAAW,CACV,OAAO,EACP;EACF,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;IACpB,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC;IAC7B,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC;IACrC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC;CAC5C,CACE;KACA,MAAM,CAAC,KAAK,EAAE,KAAyB,EAAE,EAAE;IAC1C,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;AAC/C,CAAC,CAAC,CAAA;AAEJ,8EAA8E;AAC9E,oBAAoB,CAAC,OAAO,CAAC,CAAA;AAE7B,6EAA6E;AAC7E,OAAO;KACJ,OAAO,CAAC,2BAA2B,CAAC;KACpC,WAAW,CAAC,sFAAsF,CAAC;KACnG,MAAM,CAAC,QAAQ,EAAE,gGAAgG,CAAC;KAClH,WAAW,CACV,OAAO,EACP;EACF,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;IACpB,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC;IACvC,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC;IAC9C,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC;CACxD,CACE;KACA,MAAM,CAAC,KAAK,EAAE,MAA0B,EAAE,OAA2B,EAAE,EAAE;IACxE,MAAM,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;AAClE,CAAC,CAAC,CAAA;AAEJ,8EAA8E;AAC9E,OAAO;KACJ,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,mFAAmF,CAAC;KAChG,MAAM,CAAC,YAAY,EAAE,qGAAqG,CAAC;KAC3H,MAAM,CAAC,WAAW,EAAE,2CAA2C,CAAC;KAChE,WAAW,CACV,OAAO,EACP;EACF,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;IACpB,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC;IAC/B,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC;IACtC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC;IAC1C,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC;CAC5C,CACE;KACA,MAAM,CAAC,KAAK,EAAE,MAA0B,EAAE,OAAkD,EAAE,EAAE;IAC/F,MAAM,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;AAC3D,CAAC,CAAC,CAAA;AAEJ,8EAA8E;AAC9E,SAAS,WAAW,CAAC,GAAY;IAC/B,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAA;IACvD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,CAAA;IAC/D,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,OAAO,CAAC,KAAK,EAAE,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface NexusRepositoryCandidate {
|
|
2
|
+
repoPath: string;
|
|
3
|
+
repoFullName: string;
|
|
4
|
+
prdNumber?: number;
|
|
5
|
+
taskId?: string;
|
|
6
|
+
targetBranch?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface NexusRunOptions {
|
|
9
|
+
worktree?: boolean;
|
|
10
|
+
verbose?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface NexusEventMessage {
|
|
13
|
+
icon: string;
|
|
14
|
+
message: string;
|
|
15
|
+
}
|
|
16
|
+
export interface NexusStateMessage {
|
|
17
|
+
key: string;
|
|
18
|
+
label: string;
|
|
19
|
+
state: string;
|
|
20
|
+
repoFullName?: string;
|
|
21
|
+
worktreeKey?: string;
|
|
22
|
+
issueNumber?: number;
|
|
23
|
+
}
|
|
24
|
+
export interface NexusRunHandlers {
|
|
25
|
+
onEvent?: (event: NexusEventMessage) => void;
|
|
26
|
+
onState?: (state: NexusStateMessage) => void;
|
|
27
|
+
}
|
|
28
|
+
export declare function cleanupNexusWorktrees(candidateRepositories: NexusRepositoryCandidate[]): Promise<void>;
|
|
29
|
+
export declare function runNexusOrchestrator(candidateRepositories: NexusRepositoryCandidate[], options?: NexusRunOptions, handlers?: NexusRunHandlers): Promise<void>;
|
|
30
|
+
//# sourceMappingURL=nexusService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nexusService.d.ts","sourceRoot":"","sources":["../../src/services/nexusService.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAA;IAC5C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAA;CAC7C;AAmOD,wBAAsB,qBAAqB,CACzC,qBAAqB,EAAE,wBAAwB,EAAE,GAChD,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,oBAAoB,CACxC,qBAAqB,EAAE,wBAAwB,EAAE,EACjD,OAAO,GAAE,eAAoB,EAC7B,QAAQ,GAAE,gBAAqB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAOf"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import { loadConfig } from '../utils/config.js';
|
|
6
|
+
const PACKAGE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
7
|
+
const TSX_CLI_PATH = path.join(PACKAGE_ROOT, 'node_modules', 'tsx', 'dist', 'cli.mjs');
|
|
8
|
+
const ORCHESTRATOR_ABSOLUTE_PATH = path.join(PACKAGE_ROOT, '.fiftthnexus', 'orchestrator.ts');
|
|
9
|
+
const NEXUS_EVENT_PREFIX = '__FIFTTH_NEXUS_EVENT__';
|
|
10
|
+
const NEXUS_STATE_PREFIX = '__FIFTTH_NEXUS_STATE__';
|
|
11
|
+
const NEXUS_CARRIAGE_RETURN = /\r/g;
|
|
12
|
+
const ALLOWED_NEXUS_ENV_KEYS = new Set([
|
|
13
|
+
'APPDATA',
|
|
14
|
+
'CI',
|
|
15
|
+
'COLORTERM',
|
|
16
|
+
'COMSPEC',
|
|
17
|
+
'HOME',
|
|
18
|
+
'HOMEDRIVE',
|
|
19
|
+
'HOMEPATH',
|
|
20
|
+
'LANG',
|
|
21
|
+
'LOCALAPPDATA',
|
|
22
|
+
'LOGNAME',
|
|
23
|
+
'NO_COLOR',
|
|
24
|
+
'PATH',
|
|
25
|
+
'PATHEXT',
|
|
26
|
+
'PROGRAMDATA',
|
|
27
|
+
'PROGRAMFILES',
|
|
28
|
+
'PROGRAMFILES(X86)',
|
|
29
|
+
'PROGRAMW6432',
|
|
30
|
+
'SHELL',
|
|
31
|
+
'SYSTEMDRIVE',
|
|
32
|
+
'SYSTEMROOT',
|
|
33
|
+
'TEMP',
|
|
34
|
+
'TERM',
|
|
35
|
+
'TMP',
|
|
36
|
+
'TMPDIR',
|
|
37
|
+
'USER',
|
|
38
|
+
'USERNAME',
|
|
39
|
+
'USERPROFILE',
|
|
40
|
+
]);
|
|
41
|
+
function pickNexusEnvironment() {
|
|
42
|
+
return Object.entries(process.env).reduce((environment, [key, value]) => {
|
|
43
|
+
if (value && ALLOWED_NEXUS_ENV_KEYS.has(key.toUpperCase())) {
|
|
44
|
+
environment[key] = value;
|
|
45
|
+
}
|
|
46
|
+
return environment;
|
|
47
|
+
}, {});
|
|
48
|
+
}
|
|
49
|
+
function sanitizeStreamLine(line) {
|
|
50
|
+
return line
|
|
51
|
+
.replace(/\x1b\][^\x07]*(?:\x07|\x1b\\)/g, '')
|
|
52
|
+
.replace(/\x1b\[[0-9;?]*[ -/]*[@-~]/g, '')
|
|
53
|
+
.replace(/\x1b./g, '')
|
|
54
|
+
.replace(/[\u0000-\u0008\u000B-\u001F\u007F]/g, '')
|
|
55
|
+
.trim();
|
|
56
|
+
}
|
|
57
|
+
function resolveNexusExecutionContext(candidateRepositories) {
|
|
58
|
+
const primaryCandidate = candidateRepositories[0];
|
|
59
|
+
if (primaryCandidate) {
|
|
60
|
+
return {
|
|
61
|
+
executionDirectory: path.resolve(primaryCandidate.repoPath),
|
|
62
|
+
targetRepo: primaryCandidate.repoFullName,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
executionDirectory: process.cwd(),
|
|
67
|
+
targetRepo: '',
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function ensureNexusRuntimeDependencies() {
|
|
71
|
+
if (!fs.existsSync(TSX_CLI_PATH)) {
|
|
72
|
+
throw new Error('tsx runtime not found in the CLI installation.');
|
|
73
|
+
}
|
|
74
|
+
if (!fs.existsSync(ORCHESTRATOR_ABSOLUTE_PATH)) {
|
|
75
|
+
throw new Error('Could not find the packaged nexus orchestrator.');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function buildNexusEnvironment(candidateRepositories, options) {
|
|
79
|
+
const config = loadConfig();
|
|
80
|
+
return {
|
|
81
|
+
...pickNexusEnvironment(),
|
|
82
|
+
FIFTTH_NEXUS_REPOSITORIES: JSON.stringify(candidateRepositories),
|
|
83
|
+
FIFTTH_DEFAULT_MODEL: config.model ?? 'gpt-5.4',
|
|
84
|
+
FIFTTH_WORKSPACE: config.workspace ?? '',
|
|
85
|
+
FIFTTH_LOGGED_IN: config.token ? 'true' : 'false',
|
|
86
|
+
...(options.eventStream ? { FIFTTH_NEXUS_EVENT_STREAM: 'true' } : {}),
|
|
87
|
+
FIFTTH_NEXUS_AUTO_CONFIRM: 'true',
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function handleNexusEventLine(line, handlers) {
|
|
91
|
+
try {
|
|
92
|
+
handlers.onEvent?.(JSON.parse(line.slice(NEXUS_EVENT_PREFIX.length)));
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
handlers.onEvent?.({ icon: '[nexus]', message: line });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function handleNexusStateLine(line, handlers) {
|
|
99
|
+
try {
|
|
100
|
+
handlers.onState?.(JSON.parse(line.slice(NEXUS_STATE_PREFIX.length)));
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// ignore malformed state messages
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function processNexusLine(line, options, handlers) {
|
|
107
|
+
const trimmedLine = sanitizeStreamLine(line);
|
|
108
|
+
if (!trimmedLine) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (options.eventStream && trimmedLine.startsWith(NEXUS_EVENT_PREFIX)) {
|
|
112
|
+
handleNexusEventLine(trimmedLine, handlers);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (options.eventStream && trimmedLine.startsWith(NEXUS_STATE_PREFIX)) {
|
|
116
|
+
handleNexusStateLine(trimmedLine, handlers);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function attachNexusStream(stream, options, handlers) {
|
|
120
|
+
if (!stream) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
let buffer = '';
|
|
124
|
+
stream.on('data', (chunk) => {
|
|
125
|
+
buffer += chunk.toString().replace(NEXUS_CARRIAGE_RETURN, '\n');
|
|
126
|
+
const lines = buffer.split(/\n/);
|
|
127
|
+
buffer = lines.pop() ?? '';
|
|
128
|
+
for (const line of lines) {
|
|
129
|
+
processNexusLine(line, options, handlers);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
stream.on('end', () => {
|
|
133
|
+
if (buffer.trim()) {
|
|
134
|
+
processNexusLine(buffer, options, handlers);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
function buildOrchestratorArgs(candidateRepositories, options = {}) {
|
|
139
|
+
const { targetRepo } = resolveNexusExecutionContext(candidateRepositories);
|
|
140
|
+
const orchestratorArgs = [];
|
|
141
|
+
if (targetRepo) {
|
|
142
|
+
orchestratorArgs.push('--repo', targetRepo);
|
|
143
|
+
}
|
|
144
|
+
const targetBranch = candidateRepositories[0]?.targetBranch;
|
|
145
|
+
if (targetBranch) {
|
|
146
|
+
orchestratorArgs.push('--target-branch', targetBranch);
|
|
147
|
+
}
|
|
148
|
+
if (options.worktree) {
|
|
149
|
+
orchestratorArgs.push('--worktree');
|
|
150
|
+
}
|
|
151
|
+
if (options.verbose) {
|
|
152
|
+
orchestratorArgs.push('--verbose');
|
|
153
|
+
}
|
|
154
|
+
return orchestratorArgs;
|
|
155
|
+
}
|
|
156
|
+
async function runNexusProcess(candidateRepositories, args, options = {}, handlers = {}) {
|
|
157
|
+
ensureNexusRuntimeDependencies();
|
|
158
|
+
const { executionDirectory } = resolveNexusExecutionContext(candidateRepositories);
|
|
159
|
+
const orchestratorArgs = [TSX_CLI_PATH, ORCHESTRATOR_ABSOLUTE_PATH, ...args];
|
|
160
|
+
await new Promise((resolve, reject) => {
|
|
161
|
+
const child = spawn(process.execPath, orchestratorArgs, {
|
|
162
|
+
cwd: executionDirectory,
|
|
163
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
164
|
+
env: buildNexusEnvironment(candidateRepositories, options),
|
|
165
|
+
});
|
|
166
|
+
attachNexusStream(child.stdout, options, handlers);
|
|
167
|
+
attachNexusStream(child.stderr, options, handlers);
|
|
168
|
+
child.once('error', reject);
|
|
169
|
+
child.once('exit', (code, signal) => {
|
|
170
|
+
if (signal) {
|
|
171
|
+
reject(new Error(`Nexus orchestrator exited due to signal ${signal}.`));
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (code !== 0) {
|
|
175
|
+
reject(new Error(`Nexus orchestrator exited with code ${code}.`));
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
resolve();
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
export async function cleanupNexusWorktrees(candidateRepositories) {
|
|
183
|
+
await runNexusProcess(candidateRepositories, ['--cleanup'], { eventStream: false });
|
|
184
|
+
}
|
|
185
|
+
export async function runNexusOrchestrator(candidateRepositories, options = {}, handlers = {}) {
|
|
186
|
+
await runNexusProcess(candidateRepositories, buildOrchestratorArgs(candidateRepositories, options), { eventStream: true }, handlers);
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=nexusService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nexusService.js","sourceRoot":"","sources":["../../src/services/nexusService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface RepositoryPrdMatch {
|
|
2
|
+
number: number;
|
|
3
|
+
title: string;
|
|
4
|
+
url: string;
|
|
5
|
+
}
|
|
6
|
+
export type RepositoryPrdStatus = 'found' | 'missing' | 'ambiguous';
|
|
7
|
+
export interface RepositoryPrdResolution {
|
|
8
|
+
status: RepositoryPrdStatus;
|
|
9
|
+
matches: RepositoryPrdMatch[];
|
|
10
|
+
}
|
|
11
|
+
export declare function resolveRepositoryPrd(repositoryFullName: string, taskId: string): Promise<RepositoryPrdResolution>;
|
|
12
|
+
//# sourceMappingURL=prdService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prdService.d.ts","sourceRoot":"","sources":["../../src/services/prdService.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,CAAA;AAEnE,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,mBAAmB,CAAA;IAC3B,OAAO,EAAE,kBAAkB,EAAE,CAAA;CAC9B;AA+GD,wBAAsB,oBAAoB,CACxC,kBAAkB,EAAE,MAAM,EAC1B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,uBAAuB,CAAC,CAalC"}
|