@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.
Files changed (116) hide show
  1. package/.fiftthnexus/.github/workflows/copilot-orchestrator.yml +78 -0
  2. package/.fiftthnexus/actions/Dockerfile +34 -0
  3. package/.fiftthnexus/actions/copilot-agent.mjs +269 -0
  4. package/.fiftthnexus/actions/package.json +8 -0
  5. package/.fiftthnexus/orchestrator.ts +2304 -0
  6. package/.fiftthnexus/skills/env-implement-prompt.md +65 -0
  7. package/.fiftthnexus/skills/env-plan-prompt.md +33 -0
  8. package/.fiftthnexus/skills/env-review-prompt.md +61 -0
  9. package/.fiftthnexus/skills/grill-me.md +9 -0
  10. package/.fiftthnexus/skills/prd-to-issues.md +150 -0
  11. package/.fiftthnexus/skills/write-prd.md +70 -0
  12. package/README.md +216 -25
  13. package/dist/api/client.d.ts +6 -0
  14. package/dist/api/client.d.ts.map +1 -1
  15. package/dist/api/client.js +13 -2
  16. package/dist/api/client.js.map +1 -1
  17. package/dist/commands/checkout.d.ts +6 -1
  18. package/dist/commands/checkout.d.ts.map +1 -1
  19. package/dist/commands/checkout.js +415 -44
  20. package/dist/commands/checkout.js.map +1 -1
  21. package/dist/commands/login.d.ts +0 -2
  22. package/dist/commands/login.d.ts.map +1 -1
  23. package/dist/commands/login.js +83 -32
  24. package/dist/commands/login.js.map +1 -1
  25. package/dist/commands/model.d.ts +2 -0
  26. package/dist/commands/model.d.ts.map +1 -0
  27. package/dist/commands/model.js +32 -0
  28. package/dist/commands/model.js.map +1 -0
  29. package/dist/commands/planningContext.d.ts +6 -0
  30. package/dist/commands/planningContext.d.ts.map +1 -0
  31. package/dist/commands/planningContext.js +91 -0
  32. package/dist/commands/planningContext.js.map +1 -0
  33. package/dist/commands/repo.d.ts.map +1 -1
  34. package/dist/commands/repo.js +38 -15
  35. package/dist/commands/repo.js.map +1 -1
  36. package/dist/commands/skills.d.ts +2 -0
  37. package/dist/commands/skills.d.ts.map +1 -0
  38. package/dist/commands/skills.js +123 -0
  39. package/dist/commands/skills.js.map +1 -0
  40. package/dist/commands/use.d.ts +1 -5
  41. package/dist/commands/use.d.ts.map +1 -1
  42. package/dist/commands/use.js +63 -48
  43. package/dist/commands/use.js.map +1 -1
  44. package/dist/index.js +86 -27
  45. package/dist/index.js.map +1 -1
  46. package/dist/services/nexusService.d.ts +30 -0
  47. package/dist/services/nexusService.d.ts.map +1 -0
  48. package/dist/services/nexusService.js +188 -0
  49. package/dist/services/nexusService.js.map +1 -0
  50. package/dist/services/prdService.d.ts +12 -0
  51. package/dist/services/prdService.d.ts.map +1 -0
  52. package/dist/services/prdService.js +103 -0
  53. package/dist/services/prdService.js.map +1 -0
  54. package/dist/services/taskSelection.d.ts +10 -0
  55. package/dist/services/taskSelection.d.ts.map +1 -0
  56. package/dist/services/taskSelection.js +112 -0
  57. package/dist/services/taskSelection.js.map +1 -0
  58. package/dist/services/taskService.d.ts +23 -1
  59. package/dist/services/taskService.d.ts.map +1 -1
  60. package/dist/services/taskService.js +118 -12
  61. package/dist/services/taskService.js.map +1 -1
  62. package/dist/utils/config.d.ts +2 -0
  63. package/dist/utils/config.d.ts.map +1 -1
  64. package/dist/utils/config.js +20 -3
  65. package/dist/utils/config.js.map +1 -1
  66. package/dist/utils/dashboard.d.ts +65 -0
  67. package/dist/utils/dashboard.d.ts.map +1 -0
  68. package/dist/utils/dashboard.js +205 -0
  69. package/dist/utils/dashboard.js.map +1 -0
  70. package/dist/utils/models.d.ts +14 -0
  71. package/dist/utils/models.d.ts.map +1 -0
  72. package/dist/utils/models.js +89 -0
  73. package/dist/utils/models.js.map +1 -0
  74. package/dist/utils/ui.d.ts +6 -0
  75. package/dist/utils/ui.d.ts.map +1 -1
  76. package/dist/utils/ui.js +22 -1
  77. package/dist/utils/ui.js.map +1 -1
  78. package/dist/utils/version.d.ts +4 -0
  79. package/dist/utils/version.d.ts.map +1 -0
  80. package/dist/utils/version.js +26 -0
  81. package/dist/utils/version.js.map +1 -0
  82. package/package.json +9 -4
  83. package/.github/workflows/publish-npm.yml +0 -62
  84. package/dist/commands/tasks.d.ts +0 -2
  85. package/dist/commands/tasks.d.ts.map +0 -1
  86. package/dist/commands/tasks.js +0 -69
  87. package/dist/commands/tasks.js.map +0 -1
  88. package/dist/context/runtimeContext.d.ts +0 -14
  89. package/dist/context/runtimeContext.d.ts.map +0 -1
  90. package/dist/context/runtimeContext.js +0 -21
  91. package/dist/context/runtimeContext.js.map +0 -1
  92. package/dist/services/taskContext.d.ts +0 -14
  93. package/dist/services/taskContext.d.ts.map +0 -1
  94. package/dist/services/taskContext.js +0 -15
  95. package/dist/services/taskContext.js.map +0 -1
  96. package/dist/utils/api.d.ts +0 -10
  97. package/dist/utils/api.d.ts.map +0 -1
  98. package/dist/utils/api.js +0 -25
  99. package/dist/utils/api.js.map +0 -1
  100. package/src/api/client.ts +0 -31
  101. package/src/commands/checkout.ts +0 -101
  102. package/src/commands/login.ts +0 -145
  103. package/src/commands/repo.ts +0 -113
  104. package/src/commands/tasks.ts +0 -86
  105. package/src/commands/use.ts +0 -149
  106. package/src/config/configService.ts +0 -56
  107. package/src/context/runtimeContext.ts +0 -42
  108. package/src/git/gitService.ts +0 -29
  109. package/src/index.ts +0 -133
  110. package/src/services/taskContext.ts +0 -32
  111. package/src/services/taskService.ts +0 -53
  112. package/src/utils/api.ts +0 -41
  113. package/src/utils/config.ts +0 -48
  114. package/src/utils/ui.ts +0 -46
  115. package/tsconfig.json +0 -18
  116. package/vitest.config.ts +0 -8
@@ -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 { createApiClient } from '../utils/api.js';
6
- import { cmd, fail, info, kv, muted, ok, section } from '../utils/ui.js';
7
- export async function useCommand(workspace, options) {
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 --list')} to see available workspaces.`)}\n`);
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
- console.log(`\n${ok(`Now using workspace ${chalk.bold(match.name)} ${muted(`(${match.slug})`)}`)}`);
75
- console.log(`${kv('Workspace ID', match.id)}\n`);
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 chosen = await select({
94
- message: 'Select a workspace',
95
- choices: workspaces.map((ws) => ({
96
- value: ws.slug,
97
- name: `${ws.name} ${chalk.dim(ws.slug)}`,
98
- })),
99
- default: config.workspace,
100
- });
101
- const match = workspaces.find((ws) => ws.slug === chosen);
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: chosen,
116
+ workspace: selectedWorkspace,
105
117
  workspaceId: match.id,
106
118
  });
107
- console.log(`\n${ok(`Now using workspace ${chalk.bold(match.name)} ${muted(`(${match.slug})`)}`)}\n`);
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
@@ -1 +1 @@
1
- {"version":3,"file":"use.js","sourceRoot":"","sources":["../../src/commands/use.ts"],"names":[],"mappings":"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"}
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 { loadConfig, getConfigPath } from './utils/config.js';
10
- import { cmd, fail, kv, muted, ok, section, title } from './utils/ui.js';
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('0.1.0', '-v, --version', 'Output the current 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 tasks')} Select an active task and inspect repos
27
- ${cmd('$ fiftth checkout <taskId>')} Checkout task branches in all linked repositories
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>', 'API host (defaults to https://api.fiftth.io)')
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, options) => {
68
- await useCommand(workspace, options).catch(handleError);
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
- console.log(`\n${section('CLI configuration')}\n`);
77
- console.log(kv('Config file', cmd(getConfigPath())));
78
- console.log(kv('Host', cmd(config.host)));
79
- console.log(kv('Workspace', config.workspace ? cmd(config.workspace) : muted('(none)')));
80
- console.log(kv('Logged in', config.token ? ok('yes') : fail('no')));
81
- console.log();
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 tasks ──────────────────────────────────────────────────────────
128
+ // ─── fiftth planning-context ──────────────────────────────────────────────
86
129
  program
87
- .command('tasks')
88
- .description('List and select active tasks')
89
- .action(async () => {
90
- await tasksCommand().catch(handleError);
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 <taskId>')
95
- .description('Checkout the selected task branches for all linked repositories')
96
- .action(async (taskId) => {
97
- await checkoutCommand(taskId).catch(handleError);
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":"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"}
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"}