@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,34 +1,58 @@
1
1
  import chalk from 'chalk';
2
- import { input, password, confirm } from '@inquirer/prompts';
2
+ import { password, confirm } from '@inquirer/prompts';
3
3
  import ora from 'ora';
4
+ import { buildGlobalMetrics, getDockerRuntimeStatus, renderDashboard } from '../utils/dashboard.js';
5
+ import { ensureModelConfigured, findModelOption, resolveConfiguredModel } from '../utils/models.js';
4
6
  import { loadConfig, saveConfig } from '../utils/config.js';
7
+ import { getCliVersionLabel, getUserAgent } from '../utils/version.js';
5
8
  import { cmd, fail, info, kv, muted, ok, section, title } from '../utils/ui.js';
9
+ const CLI_VERSION = getCliVersionLabel();
10
+ function renderLoginScreen(titleText, lines, config = loadConfig()) {
11
+ console.log(renderDashboard({
12
+ title: titleText,
13
+ subtitle: 'authenticate and prepare the CLI workspace',
14
+ metrics: buildGlobalMetrics({
15
+ workspace: config.workspace,
16
+ loggedIn: Boolean(config.token),
17
+ model: resolveConfiguredModel(config),
18
+ cliVersion: CLI_VERSION,
19
+ dockerStatus: getDockerRuntimeStatus(),
20
+ }),
21
+ panels: [
22
+ {
23
+ title: 'session',
24
+ lines,
25
+ },
26
+ ],
27
+ }));
28
+ }
6
29
  function normalizeToken(rawToken) {
7
30
  return rawToken.trim().replace(/^Bearer\s+/i, '');
8
31
  }
9
32
  async function validateToken(host, token) {
10
- try {
11
- const response = await fetch(`${host}/cli-tokens`, {
12
- headers: {
13
- Authorization: `Bearer ${token}`,
14
- 'User-Agent': 'fiftth-cli/0.1.0',
15
- },
16
- });
17
- if (!response.ok) {
18
- return false;
19
- }
20
- const body = (await response.json().catch(() => null));
21
- return body?.valid === true;
22
- }
23
- catch {
33
+ const response = await fetch(`${host}/cli-tokens`, {
34
+ headers: {
35
+ Authorization: `Bearer ${token}`,
36
+ 'User-Agent': getUserAgent(),
37
+ },
38
+ });
39
+ if (response.status === 401 || response.status === 403) {
24
40
  return false;
25
41
  }
42
+ if (!response.ok) {
43
+ throw new Error(`Token validation failed with ${response.status} ${response.statusText}.`);
44
+ }
45
+ const body = (await response.json().catch(() => null));
46
+ return body?.valid === true;
26
47
  }
27
48
  export async function loginCommand(options) {
28
49
  const config = loadConfig();
29
50
  const host = options.host ?? config.host;
30
- console.log(`\n${title('Welcome to Fiftth')}\n`);
31
- console.log(muted('Orchestrate tasks, repos and agent workflows from your terminal.\n'));
51
+ renderLoginScreen('fiftth login', [
52
+ title('Welcome to Fiftth'),
53
+ muted('Orchestrate tasks, repos and agent workflows from your terminal.'),
54
+ muted(`Host ${cmd(host)}`),
55
+ ], config);
32
56
  if (config.token && !options.token) {
33
57
  const alreadyLoggedIn = await confirm({
34
58
  message: chalk.yellow('You are already logged in. Validate login again?'),
@@ -56,18 +80,31 @@ export async function loginCommand(options) {
56
80
  token = normalizeToken(token);
57
81
  }
58
82
  const spinner = ora('Validating credentials...').start();
59
- const valid = await validateToken(host, token);
83
+ let valid = false;
84
+ try {
85
+ valid = await validateToken(host, token);
86
+ }
87
+ catch (error) {
88
+ spinner.fail(fail('Could not validate credentials.'));
89
+ console.error(`\n${muted(error instanceof Error ? error.message : String(error))}\n`);
90
+ process.exit(1);
91
+ }
60
92
  if (!valid) {
61
93
  spinner.fail(fail('Authentication failed.'));
62
94
  console.error(`\n${muted('Make sure your token is correct and has not expired.')}\n`);
63
95
  process.exit(1);
64
96
  }
65
97
  spinner.succeed(ok('Authentication validated.'));
66
- saveConfig({ ...config, token, host });
67
- console.log(`\n${section('Session ready')}`);
68
- console.log(kv('Host', cmd(host)));
69
- console.log(kv('Next', `run ${cmd('fiftth use <workspace>')}`));
70
- console.log();
98
+ const updatedConfig = { ...config, token, host };
99
+ saveConfig(updatedConfig);
100
+ const selectedModel = await ensureModelConfigured(updatedConfig);
101
+ const modelLabel = findModelOption(selectedModel)?.label ?? selectedModel;
102
+ renderLoginScreen('session ready', [
103
+ section('Session ready'),
104
+ kv('Host', cmd(host)),
105
+ kv('Model', modelLabel),
106
+ kv('Next', `run ${cmd('fiftth use <workspace>')}`),
107
+ ], loadConfig());
71
108
  }
72
109
  export async function logoutCommand() {
73
110
  const config = loadConfig();
@@ -85,7 +122,7 @@ export async function logoutCommand() {
85
122
  }
86
123
  const { token: _token, ...rest } = config;
87
124
  saveConfig(rest);
88
- console.log(`\n${ok('Logged out successfully.')}\n`);
125
+ renderLoginScreen('fiftth logout', [ok('Logged out successfully.')], loadConfig());
89
126
  }
90
127
  export async function loginStatusCommand() {
91
128
  const config = loadConfig();
@@ -95,20 +132,34 @@ export async function loginStatusCommand() {
95
132
  return;
96
133
  }
97
134
  const spinner = ora('Checking authentication status...').start();
98
- const valid = await validateToken(config.host, config.token);
135
+ let valid = false;
136
+ try {
137
+ valid = await validateToken(config.host, config.token);
138
+ }
139
+ catch (error) {
140
+ spinner.fail(fail('Could not verify authentication status.'));
141
+ renderLoginScreen('login status', [
142
+ fail(error instanceof Error ? error.message : String(error)),
143
+ muted(`Run ${cmd('fiftth login')} after the API is reachable.`),
144
+ ], config);
145
+ return;
146
+ }
99
147
  if (valid) {
100
148
  spinner.succeed(ok('Authenticated'));
101
- console.log(`\n${kv('Host', cmd(config.host))}`);
102
- if (config.workspace) {
103
- console.log(kv('Workspace', cmd(config.workspace)));
104
- }
105
- console.log();
149
+ renderLoginScreen('login status', [
150
+ kv('Host', cmd(config.host)),
151
+ config.workspace ? kv('Workspace', cmd(config.workspace)) : muted('Workspace not selected'),
152
+ kv('Token', 'valid'),
153
+ kv('Model', findModelOption(resolveConfiguredModel(config))?.label ?? resolveConfiguredModel(config)),
154
+ ], config);
106
155
  }
107
156
  else {
108
157
  spinner.fail(fail('Token is invalid or expired.'));
109
- console.log(`\n${muted(`Run ${cmd('fiftth login')} to authenticate again.`)}\n`);
158
+ renderLoginScreen('login status', [
159
+ fail('Token is invalid or expired.'),
160
+ muted(`Run ${cmd('fiftth login')} to authenticate again.`),
161
+ ], config);
110
162
  }
111
163
  }
112
- export { input };
113
164
  export { normalizeToken };
114
165
  //# sourceMappingURL=login.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function modelCommand(model?: string): Promise<void>;
2
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/commands/model.ts"],"names":[],"mappings":"AAQA,wBAAsB,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBhE"}
@@ -0,0 +1,32 @@
1
+ import { buildGlobalMetrics, getDockerRuntimeStatus, renderDashboard } from '../utils/dashboard.js';
2
+ import { loadConfig } from '../utils/config.js';
3
+ import { findModelOption, setPreferredModel, resolveConfiguredModel } from '../utils/models.js';
4
+ import { getCliVersionLabel } from '../utils/version.js';
5
+ import { ok } from '../utils/ui.js';
6
+ const CLI_VERSION = getCliVersionLabel();
7
+ export async function modelCommand(model) {
8
+ const selectedModel = await setPreferredModel(model);
9
+ const config = loadConfig();
10
+ const matched = findModelOption(selectedModel);
11
+ console.log(renderDashboard({
12
+ title: 'fiftth model',
13
+ subtitle: 'default model persisted for checkout and nexus',
14
+ metrics: buildGlobalMetrics({
15
+ workspace: config.workspace,
16
+ loggedIn: Boolean(config.token),
17
+ model: resolveConfiguredModel({ model: selectedModel }),
18
+ cliVersion: CLI_VERSION,
19
+ dockerStatus: getDockerRuntimeStatus(),
20
+ }),
21
+ panels: [
22
+ {
23
+ title: 'selection saved',
24
+ lines: [
25
+ ok(`Default model set to ${matched?.label ?? selectedModel}`),
26
+ matched?.hint ?? 'The selected model will be used by checkout and nexus.',
27
+ ],
28
+ },
29
+ ],
30
+ }));
31
+ }
32
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/commands/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACnG,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAC/F,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAA;AAEnC,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAA;AAExC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAc;IAC/C,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAA;IACpD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,OAAO,GAAG,eAAe,CAAC,aAAa,CAAC,CAAA;IAE9C,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAC1B,KAAK,EAAE,cAAc;QACrB,QAAQ,EAAE,gDAAgD;QAC1D,OAAO,EAAE,kBAAkB,CAAC;YAC1B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;YAC/B,KAAK,EAAE,sBAAsB,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;YACvD,UAAU,EAAE,WAAW;YACvB,YAAY,EAAE,sBAAsB,EAAE;SACvC,CAAC;QACF,MAAM,EAAE;YACN;gBACE,KAAK,EAAE,iBAAiB;gBACxB,KAAK,EAAE;oBACL,EAAE,CAAC,wBAAwB,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,CAAC;oBAC7D,OAAO,EAAE,IAAI,IAAI,wDAAwD;iBAC1E;aACF;SACF;KACF,CAAC,CAAC,CAAA;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ interface PlanningContextOptions {
2
+ json?: boolean;
3
+ }
4
+ export declare function planningContextCommand(taskId?: string, options?: PlanningContextOptions): Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=planningContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planningContext.d.ts","sourceRoot":"","sources":["../../src/commands/planningContext.ts"],"names":[],"mappings":"AA0BA,UAAU,sBAAsB;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AA4BD,wBAAsB,sBAAsB,CAC1C,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,IAAI,CAAC,CAkDf"}
@@ -0,0 +1,91 @@
1
+ import { execSync } from 'child_process';
2
+ import { resolveSelectedTask } from '../services/taskSelection.js';
3
+ import { buildGlobalMetrics, getDockerRuntimeStatus, renderDashboard } from '../utils/dashboard.js';
4
+ import { loadConfig } from '../utils/config.js';
5
+ import { resolveConfiguredModel } from '../utils/models.js';
6
+ import { getCliVersionLabel } from '../utils/version.js';
7
+ import { fail, info, kv, muted, ok, section } from '../utils/ui.js';
8
+ const CLI_VERSION = getCliVersionLabel();
9
+ function renderPlanningScreen(lines) {
10
+ const config = loadConfig();
11
+ console.log(renderDashboard({
12
+ title: 'planning context',
13
+ subtitle: 'validate repository ownership before creating PRDs',
14
+ metrics: buildGlobalMetrics({
15
+ workspace: config.workspace,
16
+ loggedIn: Boolean(config.token),
17
+ model: resolveConfiguredModel(config),
18
+ cliVersion: CLI_VERSION,
19
+ dockerStatus: getDockerRuntimeStatus(),
20
+ }),
21
+ panels: [{ title: 'task validation', lines }],
22
+ }));
23
+ }
24
+ function parseGitHubRepoFullName(remoteUrl) {
25
+ const normalized = remoteUrl.trim();
26
+ const match = normalized.match(/github\.com[:/]([^/]+\/[^/.]+?)(?:\.git)?$/i);
27
+ return match?.[1] ?? null;
28
+ }
29
+ function resolveCurrentRepositoryFullName() {
30
+ let remoteUrl = '';
31
+ try {
32
+ remoteUrl = execSync('git remote get-url origin', {
33
+ encoding: 'utf-8',
34
+ stdio: ['pipe', 'pipe', 'pipe'],
35
+ }).trim();
36
+ }
37
+ catch {
38
+ throw new Error('Current directory does not have a readable git origin remote.');
39
+ }
40
+ const repositoryFullName = parseGitHubRepoFullName(remoteUrl);
41
+ if (!repositoryFullName) {
42
+ throw new Error(`Could not infer a GitHub repository from origin remote: ${remoteUrl}`);
43
+ }
44
+ return repositoryFullName;
45
+ }
46
+ export async function planningContextCommand(taskId, options = {}) {
47
+ const selectedTask = await resolveSelectedTask(taskId);
48
+ const currentRepository = resolveCurrentRepositoryFullName();
49
+ const taskRepositories = selectedTask.repositories.map((repository) => ({
50
+ id: repository.id,
51
+ fullName: repository.fullName,
52
+ isCurrent: repository.fullName === currentRepository,
53
+ }));
54
+ const repositoryMatch = taskRepositories.some((repository) => repository.isCurrent);
55
+ if (options.json) {
56
+ console.log(JSON.stringify({
57
+ task: {
58
+ id: selectedTask.id,
59
+ title: selectedTask.title,
60
+ column: selectedTask.column,
61
+ },
62
+ currentRepository,
63
+ repositoryMatch,
64
+ repositories: taskRepositories,
65
+ }, null, 2));
66
+ if (!repositoryMatch) {
67
+ process.exit(1);
68
+ }
69
+ return;
70
+ }
71
+ const lines = [
72
+ section('Planning context'),
73
+ kv('Task', `${selectedTask.title} (${selectedTask.id})`),
74
+ kv('Current repository', currentRepository),
75
+ kv('Task repositories', String(taskRepositories.length)),
76
+ ...taskRepositories.map((repository) => ` ${repository.isCurrent ? ok(repository.fullName) : muted(repository.fullName)}`),
77
+ ];
78
+ if (!repositoryMatch) {
79
+ renderPlanningScreen([
80
+ ...lines,
81
+ fail('The current repository is not linked to the selected task.'),
82
+ info('Do not create a PRD in this repository for that task.'),
83
+ ]);
84
+ process.exit(1);
85
+ }
86
+ renderPlanningScreen([
87
+ ...lines,
88
+ ok('The current repository is linked to the selected task.'),
89
+ ]);
90
+ }
91
+ //# sourceMappingURL=planningContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planningContext.js","sourceRoot":"","sources":["../../src/commands/planningContext.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../src/commands/repo.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA2FnC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiB3D"}
1
+ {"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../src/commands/repo.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAoHnC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiB3D"}
@@ -2,8 +2,28 @@ import fs from 'fs';
2
2
  import os from 'os';
3
3
  import path from 'path';
4
4
  import chalk from 'chalk';
5
+ import { buildGlobalMetrics, getDockerRuntimeStatus, renderDashboard } from '../utils/dashboard.js';
5
6
  import { addRepository, getRepositories, removeRepository, } from '../config/configService.js';
7
+ import { loadConfig } from '../utils/config.js';
8
+ import { resolveConfiguredModel } from '../utils/models.js';
9
+ import { getCliVersionLabel } from '../utils/version.js';
6
10
  import { cmd, fail, info, kv, muted, ok, section } from '../utils/ui.js';
11
+ const CLI_VERSION = getCliVersionLabel();
12
+ function renderRepoScreen(title, lines) {
13
+ const config = loadConfig();
14
+ console.log(renderDashboard({
15
+ title,
16
+ subtitle: 'repository registry for multi-repo task checkout',
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: 'repositories', lines }],
25
+ }));
26
+ }
7
27
  function expandHomeDirectory(inputPath) {
8
28
  if (inputPath === '~') {
9
29
  return os.homedir();
@@ -36,27 +56,29 @@ function addRepoCommand(repoName, repoPathInput) {
36
56
  validateRepositoryPath(absolutePath);
37
57
  const { overwritten } = addRepository(repoName, absolutePath);
38
58
  if (overwritten) {
39
- console.log(chalk.yellow(`${info('Repository already exists. Overwriting mapping.')}`));
59
+ renderRepoScreen('fiftth repo add', [chalk.yellow(info('Repository already exists. Overwriting mapping.'))]);
40
60
  }
41
- console.log(`\n${ok('Repository registered')}\n`);
42
- console.log(kv('Repo', repoName));
43
- console.log(kv('Path', cmd(absolutePath)));
44
- console.log();
61
+ renderRepoScreen('fiftth repo add', [
62
+ ok('Repository registered'),
63
+ kv('Repo', repoName),
64
+ kv('Path', cmd(absolutePath)),
65
+ ]);
45
66
  }
46
67
  function listRepoCommand() {
47
68
  const repositories = getRepositories();
48
69
  const entries = Object.entries(repositories);
49
70
  if (entries.length === 0) {
50
- console.log(`\n${info('No repositories configured yet.')}\n`);
51
- console.log(`${muted(`Use ${cmd('fiftth repo add <repoName> <path>')}`)}\n`);
71
+ renderRepoScreen('fiftth repo list', [
72
+ info('No repositories configured yet.'),
73
+ muted(`Use ${cmd('fiftth repo add <repoName> <path>')}`),
74
+ ]);
52
75
  return;
53
76
  }
54
77
  const longestNameLength = Math.max(...entries.map(([name]) => name.length));
55
- console.log(`\n${section('Configured repositories')}\n`);
56
- for (const [repoName, repoPath] of entries) {
57
- console.log(`${repoName.padEnd(longestNameLength, ' ')} ${muted('->')} ${cmd(repoPath)}`);
58
- }
59
- console.log();
78
+ renderRepoScreen('fiftth repo list', [
79
+ section(`Configured repositories (${entries.length})`),
80
+ ...entries.map(([repoName, repoPath]) => `${repoName.padEnd(longestNameLength, ' ')} ${muted('->')} ${cmd(repoPath)}`),
81
+ ]);
60
82
  }
61
83
  function removeRepoCommand(repoName) {
62
84
  const removed = removeRepository(repoName);
@@ -64,9 +86,10 @@ function removeRepoCommand(repoName) {
64
86
  console.error(`\n${fail(`Repository '${repoName}' is not configured.`)}\n`);
65
87
  process.exit(1);
66
88
  }
67
- console.log(`\n${ok('Repository removed')}\n`);
68
- console.log(kv('Repo', repoName));
69
- console.log();
89
+ renderRepoScreen('fiftth repo remove', [
90
+ ok('Repository removed'),
91
+ kv('Repo', repoName),
92
+ ]);
70
93
  }
71
94
  export function registerRepoCommands(program) {
72
95
  const repoCmd = program.command('repo').description('Manage local repository mappings');
@@ -1 +1 @@
1
- {"version":3,"file":"repo.js","sourceRoot":"","sources":["../../src/commands/repo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repo.js","sourceRoot":"","sources":["../../src/commands/repo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function skillsCommand(agent?: string): Promise<void>;
2
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAqHA,wBAAsB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CjE"}
@@ -0,0 +1,123 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { confirm, select } from '@inquirer/prompts';
4
+ import { fileURLToPath } from 'url';
5
+ import { buildGlobalMetrics, getDockerRuntimeStatus, renderDashboard } from '../utils/dashboard.js';
6
+ import { loadConfig } from '../utils/config.js';
7
+ import { resolveConfiguredModel } from '../utils/models.js';
8
+ import { getCliVersionLabel } from '../utils/version.js';
9
+ import { cmd, info, kv, muted, ok, section } from '../utils/ui.js';
10
+ const CLI_VERSION = getCliVersionLabel();
11
+ const PACKAGE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
12
+ const BUNDLED_SKILLS_DIR = path.join(PACKAGE_ROOT, '.fiftthnexus', 'skills');
13
+ const BUNDLED_SKILLS = ['grill-me.md', 'prd-to-issues.md', 'write-prd.md'];
14
+ function getSkillsTargets() {
15
+ const workingDirectory = process.cwd();
16
+ return [
17
+ {
18
+ id: 'copilot',
19
+ label: 'GitHub Copilot',
20
+ hint: 'Install into ./.github/agents',
21
+ destinationPath: path.join(workingDirectory, '.github', 'agents'),
22
+ },
23
+ {
24
+ id: 'claude-code',
25
+ label: 'Claude Code',
26
+ hint: 'Install into ./claude/skills',
27
+ destinationPath: path.join(workingDirectory, 'claude', 'skills'),
28
+ },
29
+ ];
30
+ }
31
+ function normalizeTarget(input) {
32
+ const normalized = input.trim().toLowerCase();
33
+ if (normalized === 'copilot' || normalized === 'github-copilot') {
34
+ return 'copilot';
35
+ }
36
+ if (normalized === 'claude' || normalized === 'claude-code') {
37
+ return 'claude-code';
38
+ }
39
+ return undefined;
40
+ }
41
+ function renderSkillsScreen(title, lines) {
42
+ const config = loadConfig();
43
+ console.log(renderDashboard({
44
+ title,
45
+ subtitle: 'install bundled planning skills for your preferred agent runtime',
46
+ metrics: buildGlobalMetrics({
47
+ workspace: config.workspace,
48
+ loggedIn: Boolean(config.token),
49
+ model: resolveConfiguredModel(config),
50
+ cliVersion: CLI_VERSION,
51
+ dockerStatus: getDockerRuntimeStatus(),
52
+ }),
53
+ events: lines,
54
+ }));
55
+ }
56
+ function getTargetById(targetId) {
57
+ const matchedTarget = getSkillsTargets().find((target) => target.id === targetId);
58
+ if (!matchedTarget) {
59
+ throw new Error(`Unsupported agent '${targetId}'. Choose 'copilot' or 'claude-code'.`);
60
+ }
61
+ return matchedTarget;
62
+ }
63
+ async function promptForTargetSelection() {
64
+ const selectedTarget = await select({
65
+ message: 'Choose where to install the bundled skills',
66
+ choices: getSkillsTargets().map((target) => ({
67
+ value: target.id,
68
+ name: `${target.label} ${target.hint}`,
69
+ })),
70
+ });
71
+ return getTargetById(selectedTarget);
72
+ }
73
+ function getMissingBundledSkills() {
74
+ return BUNDLED_SKILLS.filter((fileName) => !fs.existsSync(path.join(BUNDLED_SKILLS_DIR, fileName)));
75
+ }
76
+ function getExistingDestinationSkills(destinationPath) {
77
+ return BUNDLED_SKILLS.filter((fileName) => fs.existsSync(path.join(destinationPath, fileName)));
78
+ }
79
+ function installSkills(target) {
80
+ fs.mkdirSync(target.destinationPath, { recursive: true });
81
+ for (const fileName of BUNDLED_SKILLS) {
82
+ fs.copyFileSync(path.join(BUNDLED_SKILLS_DIR, fileName), path.join(target.destinationPath, fileName));
83
+ }
84
+ return BUNDLED_SKILLS.map((fileName) => path.join(target.destinationPath, fileName));
85
+ }
86
+ export async function skillsCommand(agent) {
87
+ const missingBundledSkills = getMissingBundledSkills();
88
+ if (missingBundledSkills.length > 0) {
89
+ throw new Error(`Bundled skills not found: ${missingBundledSkills.join(', ')}`);
90
+ }
91
+ let target;
92
+ if (agent) {
93
+ const normalizedTarget = normalizeTarget(agent);
94
+ if (!normalizedTarget) {
95
+ throw new Error(`Unsupported agent '${agent}'. Choose 'copilot' or 'claude-code'.`);
96
+ }
97
+ target = getTargetById(normalizedTarget);
98
+ }
99
+ else {
100
+ target = await promptForTargetSelection();
101
+ }
102
+ const existingSkills = getExistingDestinationSkills(target.destinationPath);
103
+ if (existingSkills.length > 0) {
104
+ const confirmed = await confirm({
105
+ message: `Overwrite ${existingSkills.length} existing skill file(s) in ${target.destinationPath}?`,
106
+ default: true,
107
+ });
108
+ if (!confirmed) {
109
+ renderSkillsScreen('fiftth skills', [info('Installation cancelled.')]);
110
+ return;
111
+ }
112
+ }
113
+ const installedFiles = installSkills(target);
114
+ renderSkillsScreen('fiftth skills', [
115
+ section('Skills installed'),
116
+ kv('Agent', target.label),
117
+ kv('Destination', cmd(target.destinationPath)),
118
+ kv('Files', BUNDLED_SKILLS.join(', ')),
119
+ ...installedFiles.map((filePath) => ok(filePath)),
120
+ muted('These skills are bundled with the CLI and were copied from .fiftthnexus/skills.'),
121
+ ]);
122
+ }
123
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,2 @@
1
- interface UseOptions {
2
- list?: boolean;
3
- }
4
- export declare function useCommand(workspace: string | undefined, options: UseOptions): Promise<void>;
5
- export {};
1
+ export declare function useCommand(workspace: string | undefined): Promise<void>;
6
2
  //# sourceMappingURL=use.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use.d.ts","sourceRoot":"","sources":["../../src/commands/use.ts"],"names":[],"mappings":"AAOA,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,IAAI,CAAC,CAsBf"}
1
+ {"version":3,"file":"use.d.ts","sourceRoot":"","sources":["../../src/commands/use.ts"],"names":[],"mappings":"AA6BA,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,OAAO,CAAC,IAAI,CAAC,CAiBf"}