@devcortex/cli 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/commands/export.d.ts +9 -0
  2. package/dist/commands/export.d.ts.map +1 -0
  3. package/dist/commands/export.js +49 -0
  4. package/dist/commands/export.js.map +1 -0
  5. package/dist/commands/import.d.ts +21 -0
  6. package/dist/commands/import.d.ts.map +1 -0
  7. package/dist/commands/import.js +237 -0
  8. package/dist/commands/import.js.map +1 -0
  9. package/dist/commands/init.d.ts +22 -0
  10. package/dist/commands/init.d.ts.map +1 -0
  11. package/dist/commands/init.js +225 -0
  12. package/dist/commands/init.js.map +1 -0
  13. package/dist/commands/issue.d.ts +8 -0
  14. package/dist/commands/issue.d.ts.map +1 -0
  15. package/dist/commands/issue.js +42 -0
  16. package/dist/commands/issue.js.map +1 -0
  17. package/dist/commands/keys.d.ts +23 -0
  18. package/dist/commands/keys.d.ts.map +1 -0
  19. package/dist/commands/keys.js +133 -0
  20. package/dist/commands/keys.js.map +1 -0
  21. package/dist/commands/list.d.ts +20 -0
  22. package/dist/commands/list.d.ts.map +1 -0
  23. package/dist/commands/list.js +163 -0
  24. package/dist/commands/list.js.map +1 -0
  25. package/dist/commands/login.d.ts +9 -0
  26. package/dist/commands/login.d.ts.map +1 -0
  27. package/dist/commands/login.js +91 -0
  28. package/dist/commands/login.js.map +1 -0
  29. package/dist/commands/logs.d.ts +22 -0
  30. package/dist/commands/logs.d.ts.map +1 -0
  31. package/dist/commands/logs.js +172 -0
  32. package/dist/commands/logs.js.map +1 -0
  33. package/dist/commands/start.d.ts +9 -0
  34. package/dist/commands/start.d.ts.map +1 -0
  35. package/dist/commands/start.js +88 -0
  36. package/dist/commands/start.js.map +1 -0
  37. package/dist/commands/status.d.ts +22 -0
  38. package/dist/commands/status.d.ts.map +1 -0
  39. package/dist/commands/status.js +179 -0
  40. package/dist/commands/status.js.map +1 -0
  41. package/dist/commands/test-mcp.d.ts +7 -0
  42. package/dist/commands/test-mcp.d.ts.map +1 -0
  43. package/dist/commands/test-mcp.js +115 -0
  44. package/dist/commands/test-mcp.js.map +1 -0
  45. package/dist/commands/update.d.ts +9 -0
  46. package/dist/commands/update.d.ts.map +1 -0
  47. package/dist/commands/update.js +124 -0
  48. package/dist/commands/update.js.map +1 -0
  49. package/dist/index.d.ts +4 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +48 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/lib/api.d.ts +8 -0
  54. package/dist/lib/api.d.ts.map +1 -0
  55. package/dist/lib/api.js +30 -0
  56. package/dist/lib/api.js.map +1 -0
  57. package/dist/lib/auth.d.ts +20 -0
  58. package/dist/lib/auth.d.ts.map +1 -0
  59. package/dist/lib/auth.js +16 -0
  60. package/dist/lib/auth.js.map +1 -0
  61. package/dist/lib/config.d.ts +16 -0
  62. package/dist/lib/config.d.ts.map +1 -0
  63. package/dist/lib/config.js +29 -0
  64. package/dist/lib/config.js.map +1 -0
  65. package/package.json +41 -0
@@ -0,0 +1,42 @@
1
+ import { readLinkFile } from './init.js';
2
+ import { apiJson } from '../lib/api.js';
3
+ import { getToken } from '../lib/config.js';
4
+ export async function runIssueClose(issueId, opts, cwd = process.cwd()) {
5
+ const link = readLinkFile(cwd);
6
+ if (!link) {
7
+ console.error('✗ No project linked. Run dcx init first.');
8
+ process.exit(1);
9
+ }
10
+ const apiUrl = opts.apiUrl ?? link.apiUrl;
11
+ // Look up the issue by issueId string to get its DB id
12
+ const listRes = await apiJson(`/organisations/${link.orgSlug}/projects/${link.projectId}/issues`, {}, apiUrl);
13
+ const issue = listRes.data.find((i) => i.issueId === issueId);
14
+ if (!issue) {
15
+ console.error(`✗ Issue ${issueId} not found in project ${link.projectName}`);
16
+ process.exit(1);
17
+ }
18
+ const result = await apiJson(`/organisations/${link.orgSlug}/projects/${link.projectId}/issues/${issue.id}/close`, { method: 'PATCH', body: JSON.stringify({ reason: opts.reason }) }, apiUrl);
19
+ console.log(`\n✓ Issue ${result.issueId} closed`);
20
+ if (result.closedReason) {
21
+ console.log(` Reason: ${result.closedReason}`);
22
+ }
23
+ }
24
+ export function registerIssue(program) {
25
+ const issueCmd = program
26
+ .command('issue')
27
+ .description('Manage issues');
28
+ issueCmd
29
+ .command('close <issueId>')
30
+ .description('Close an issue by ID (use --reason to record resolution text)')
31
+ .option('--reason <text>', 'Resolution text recorded with the close')
32
+ .option('--api-url <url>', 'API URL override')
33
+ .action(async (issueId, opts) => {
34
+ const token = getToken();
35
+ if (!token) {
36
+ console.error('✗ Not logged in — run dcx login first');
37
+ process.exit(1);
38
+ }
39
+ await runIssueClose(issueId, opts);
40
+ });
41
+ }
42
+ //# sourceMappingURL=issue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue.js","sourceRoot":"","sources":["../../src/commands/issue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAe5C,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAe,EACf,IAAuB,EACvB,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAEnB,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IAE1F,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;IAE1C,uDAAuD;IACvD,MAAM,OAAO,GAAG,MAAM,OAAO,CAC3B,kBAAkB,IAAI,CAAC,OAAO,aAAa,IAAI,CAAC,SAAS,SAAS,EAClE,EAAE,EACF,MAAM,CACP,CAAC;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IAC9D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,yBAAyB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,kBAAkB,IAAI,CAAC,OAAO,aAAa,IAAI,CAAC,SAAS,WAAW,KAAK,CAAC,EAAE,QAAQ,EACpF,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAClE,MAAM,CACP,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,OAAO,SAAS,CAAC,CAAC;IAClD,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,MAAM,QAAQ,GAAG,OAAO;SACrB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,eAAe,CAAC,CAAC;IAEhC,QAAQ;SACL,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,+DAA+D,CAAC;SAC5E,MAAM,CAAC,iBAAiB,EAAE,yCAAyC,CAAC;SACpE,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;SAC7C,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,IAAuB,EAAE,EAAE;QACzD,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QACxF,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { Command } from 'commander';
2
+ export interface KeysCreateOptions {
3
+ name?: string;
4
+ apiUrl?: string;
5
+ }
6
+ export interface KeysRevokeOptions {
7
+ apiUrl?: string;
8
+ }
9
+ export interface ApiKeyRecord {
10
+ id: string;
11
+ name: string;
12
+ keyPrefix: string;
13
+ createdAt: string;
14
+ lastUsedAt: string | null;
15
+ revokedAt: string | null;
16
+ }
17
+ export declare function runKeysList(opts: {
18
+ apiUrl?: string;
19
+ }): Promise<void>;
20
+ export declare function runKeysCreate(opts: KeysCreateOptions): Promise<void>;
21
+ export declare function runKeysRevoke(keyId: string, opts: KeysRevokeOptions): Promise<void>;
22
+ export declare function registerKeys(program: Command): void;
23
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/commands/keys.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAuBD,wBAAsB,WAAW,CAAC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B1E;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyC1E;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BzF;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6BnD"}
@@ -0,0 +1,133 @@
1
+ import * as clack from '@clack/prompts';
2
+ import { readLinkFile } from './init.js';
3
+ import { apiJson, apiRequest } from '../lib/api.js';
4
+ import { getToken } from '../lib/config.js';
5
+ function requireLink() {
6
+ const link = readLinkFile();
7
+ if (!link) {
8
+ console.error('✗ No project linked. Run dcx init first.');
9
+ process.exit(1);
10
+ }
11
+ return link;
12
+ }
13
+ export async function runKeysList(opts) {
14
+ const token = getToken();
15
+ if (!token) {
16
+ console.error('✗ Not logged in — run dcx login first');
17
+ process.exit(1);
18
+ }
19
+ const link = requireLink();
20
+ const res = await apiJson(`/organisations/${link.orgSlug}/projects/${link.projectId}/api-keys`, {}, opts.apiUrl ?? link.apiUrl);
21
+ // AC-1: Formatted table
22
+ const header = `DevCortex — ${link.projectName}`;
23
+ const sep = '─'.repeat(60);
24
+ console.log(`\n${header}`);
25
+ console.log(sep);
26
+ console.log(`${'ID'.padEnd(28)} ${'NAME'.padEnd(22)} ${'CREATED'}`);
27
+ console.log(sep);
28
+ for (const k of res.data) {
29
+ if (k.revokedAt)
30
+ continue;
31
+ const d = new Date(k.createdAt).toISOString().slice(0, 10);
32
+ console.log(`${k.id.slice(0, 26).padEnd(28)} ${k.name.slice(0, 20).padEnd(22)} ${d}`);
33
+ }
34
+ console.log(sep);
35
+ const active = res.data.filter((k) => !k.revokedAt).length;
36
+ console.log(`${active} active keys (max 10)`);
37
+ }
38
+ export async function runKeysCreate(opts) {
39
+ const token = getToken();
40
+ if (!token) {
41
+ console.error('✗ Not logged in — run dcx login first');
42
+ process.exit(1);
43
+ }
44
+ const link = requireLink();
45
+ // AC-2: Prompt for name if not provided
46
+ let name = opts.name;
47
+ if (!name) {
48
+ const val = await clack.text({ message: 'Key name', placeholder: 'my-key' });
49
+ if (clack.isCancel(val)) {
50
+ clack.cancel('Cancelled');
51
+ process.exit(0);
52
+ }
53
+ name = val;
54
+ }
55
+ const s = clack.spinner();
56
+ s.start('Creating key...');
57
+ let data;
58
+ try {
59
+ data = await apiJson(`/organisations/${link.orgSlug}/projects/${link.projectId}/api-keys`, { method: 'POST', body: JSON.stringify({ name }) }, opts.apiUrl ?? link.apiUrl);
60
+ }
61
+ catch (err) {
62
+ s.stop('');
63
+ const status = err.status;
64
+ if (status === 422) {
65
+ console.error('✗ Cannot create key — project has reached the maximum of 10 active keys.');
66
+ console.error(' Run: dcx keys list to see existing keys');
67
+ console.error(' Run: dcx keys revoke <id> to free a slot');
68
+ }
69
+ else {
70
+ console.error('✗ Failed to create key:', err.message);
71
+ }
72
+ process.exit(1);
73
+ }
74
+ s.stop('');
75
+ // AC-2: Show key once with warning
76
+ console.log(`\n✔ Key created: ${data.name}`);
77
+ console.log(` ${data.key}`);
78
+ console.log("\n⚠ Save this key now — it won't be shown again.");
79
+ }
80
+ export async function runKeysRevoke(keyId, opts) {
81
+ const token = getToken();
82
+ if (!token) {
83
+ console.error('✗ Not logged in — run dcx login first');
84
+ process.exit(1);
85
+ }
86
+ const link = requireLink();
87
+ // AC-4: Confirm
88
+ const confirm = await clack.confirm({ message: `Revoke key ${keyId}?` });
89
+ if (clack.isCancel(confirm) || !confirm) {
90
+ clack.cancel('Cancelled');
91
+ process.exit(0);
92
+ }
93
+ const res = await apiRequest(`/organisations/${link.orgSlug}/projects/${link.projectId}/api-keys/${keyId}`, { method: 'DELETE' }, opts.apiUrl ?? link.apiUrl);
94
+ if (res.status === 404) {
95
+ // AC-5: Not found
96
+ console.error(`✗ Key not found: ${keyId}`);
97
+ console.error(' Run dcx keys list to see key IDs');
98
+ process.exit(1);
99
+ }
100
+ if (!res.ok) {
101
+ console.error(`✗ Failed to revoke key: HTTP ${res.status}`);
102
+ process.exit(1);
103
+ }
104
+ console.log('✔ Key revoked');
105
+ }
106
+ export function registerKeys(program) {
107
+ const keys = program
108
+ .command('keys')
109
+ .description('Manage project API keys');
110
+ keys
111
+ .command('list')
112
+ .description('List all API keys for the current project')
113
+ .option('--api-url <url>', 'API URL override')
114
+ .action(async (opts) => {
115
+ await runKeysList(opts);
116
+ });
117
+ keys
118
+ .command('create')
119
+ .description('Generate a new API key')
120
+ .option('--name <name>', 'Key name')
121
+ .option('--api-url <url>', 'API URL override')
122
+ .action(async (opts) => {
123
+ await runKeysCreate(opts);
124
+ });
125
+ keys
126
+ .command('revoke <keyId>')
127
+ .description('Revoke an API key by ID (get ID from dcx keys list)')
128
+ .option('--api-url <url>', 'API URL override')
129
+ .action(async (keyId, opts) => {
130
+ await runKeysRevoke(keyId, opts);
131
+ });
132
+ }
133
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/commands/keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Command } from 'commander';
2
+ export interface ListBacklogOptions {
3
+ all?: boolean;
4
+ priority?: string;
5
+ status?: string;
6
+ apiUrl?: string;
7
+ }
8
+ export interface ListIssuesOptions {
9
+ req?: string;
10
+ severity?: string;
11
+ apiUrl?: string;
12
+ }
13
+ export interface ListSpecOptions {
14
+ apiUrl?: string;
15
+ }
16
+ export declare function runListBacklog(opts: ListBacklogOptions, cwd?: string): Promise<void>;
17
+ export declare function runListIssues(opts: ListIssuesOptions, cwd?: string): Promise<void>;
18
+ export declare function runListSpec(opts: ListSpecOptions, cwd?: string): Promise<void>;
19
+ export declare function registerList(program: Command): void;
20
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA2CD,wBAAsB,cAAc,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,SAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+CjG;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,SAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2C/F;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,SAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoC3F;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuCnD"}
@@ -0,0 +1,163 @@
1
+ import { readLinkFile } from './init.js';
2
+ import { apiJson } from '../lib/api.js';
3
+ import { getToken } from '../lib/config.js';
4
+ const ACTIVE_STATUSES = ['DRAFT', 'APPROVED', 'IN_PROGRESS'];
5
+ export async function runListBacklog(opts, cwd = process.cwd()) {
6
+ const link = readLinkFile(cwd);
7
+ if (!link) {
8
+ console.error('✗ No project linked. Run dcx init first.');
9
+ process.exit(1);
10
+ }
11
+ const apiUrl = opts.apiUrl ?? link.apiUrl;
12
+ const res = await apiJson(`/organisations/${link.orgSlug}/projects/${link.projectId}/requirements`, {}, apiUrl);
13
+ let items = res.data;
14
+ // AC-3: --all includes verified/deferred
15
+ if (!opts.all) {
16
+ items = items.filter((r) => ACTIVE_STATUSES.includes(r.status));
17
+ }
18
+ // AC-4: --priority filter
19
+ if (opts.priority) {
20
+ items = items.filter((r) => r.priority === opts.priority);
21
+ }
22
+ // AC-5: --status filter
23
+ if (opts.status) {
24
+ items = items.filter((r) => r.status === opts.status);
25
+ }
26
+ const sep = '─'.repeat(61);
27
+ console.log(`\nDevCortex — ${link.projectName} (${link.orgSlug})`);
28
+ console.log(sep);
29
+ // AC-1: Group by priority
30
+ const priorities = ['MUST', 'SHOULD', 'COULD', 'WONT'];
31
+ for (const p of priorities) {
32
+ const group = items.filter((r) => r.priority === p);
33
+ if (group.length === 0)
34
+ continue;
35
+ console.log(`\n${p}`);
36
+ for (const r of group) {
37
+ const iss = r.openIssueCount > 0 ? `${r.openIssueCount} iss` : '0 iss';
38
+ console.log(`${r.reqId.padEnd(10)} ${r.title.slice(0, 38).padEnd(40)} ${r.status.padEnd(14)} ${iss}`);
39
+ }
40
+ }
41
+ console.log(`\n${sep}`);
42
+ // AC-2: Summary footer
43
+ const verified = res.data.filter((r) => r.status === 'VERIFIED').length;
44
+ const openIssues = res.data.reduce((s, r) => s + r.openIssueCount, 0);
45
+ console.log(`${items.length} requirements · ${openIssues} open issues · ${verified} verified`);
46
+ }
47
+ export async function runListIssues(opts, cwd = process.cwd()) {
48
+ const link = readLinkFile(cwd);
49
+ if (!link) {
50
+ console.error('✗ No project linked. Run dcx init first.');
51
+ process.exit(1);
52
+ }
53
+ const apiUrl = opts.apiUrl ?? link.apiUrl;
54
+ const params = new URLSearchParams();
55
+ if (opts.severity)
56
+ params.set('severity', opts.severity);
57
+ // AC-6: list issues
58
+ const res = await apiJson(`/organisations/${link.orgSlug}/projects/${link.projectId}/issues?${params}`, {}, apiUrl);
59
+ let issues = res.data ?? res.issues ?? [];
60
+ // AC-7: --req filter
61
+ if (opts.req) {
62
+ issues = issues.filter((i) => i.linkedRequirement?.reqId === opts.req);
63
+ }
64
+ // AC-8: --severity filter (client-side fallback)
65
+ if (opts.severity) {
66
+ issues = issues.filter((i) => i.severity === opts.severity);
67
+ }
68
+ const sep = '─'.repeat(61);
69
+ console.log(`\nDevCortex — ${link.projectName} (${link.orgSlug})`);
70
+ console.log(sep);
71
+ const severities = ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW'];
72
+ for (const sev of severities) {
73
+ const group = issues.filter((i) => i.severity === sev);
74
+ if (group.length === 0)
75
+ continue;
76
+ console.log(`\n${sev}`);
77
+ for (const i of group) {
78
+ const req = i.linkedRequirement?.reqId ?? ' ';
79
+ console.log(`${i.issueId.padEnd(10)} ${i.title.slice(0, 42).padEnd(44)} ${req.padEnd(9)} ${i.status}`);
80
+ }
81
+ }
82
+ console.log(`\n${sep}`);
83
+ console.log(`${issues.length} open issues`);
84
+ }
85
+ export async function runListSpec(opts, cwd = process.cwd()) {
86
+ const link = readLinkFile(cwd);
87
+ if (!link) {
88
+ console.error('✗ No project linked. Run dcx init first.');
89
+ process.exit(1);
90
+ }
91
+ const apiUrl = opts.apiUrl ?? link.apiUrl;
92
+ const res = await apiJson(`/organisations/${link.orgSlug}/projects/${link.projectId}/spec-versions`, {}, apiUrl);
93
+ let spec = res.data?.find((v) => v.status === 'RELEASED') ?? res.data?.[0];
94
+ // AC-1 (REQ-072): if content missing from list response, fetch full spec version detail
95
+ if (spec && !spec.content && spec.id) {
96
+ try {
97
+ const detail = await apiJson(`/organisations/${link.orgSlug}/projects/${link.projectId}/spec-versions/${spec.id}`, {}, apiUrl);
98
+ if (detail.content)
99
+ spec = { ...spec, content: detail.content };
100
+ }
101
+ catch {
102
+ // ignore — token count will remain calculated from whatever content we have
103
+ }
104
+ }
105
+ // AC-9: display version, status, title, token count
106
+ const tokenStr = spec?.content ? `~${Math.round(spec.content.length / 4)}` : '~unknown';
107
+ const releasedDate = spec?.releasedAt ? new Date(spec.releasedAt).toISOString().slice(0, 10) : 'N/A';
108
+ const sep = '─'.repeat(61);
109
+ console.log(`\nDevCortex — ${link.projectName}`);
110
+ console.log(sep);
111
+ console.log(`Version v${spec?.version ?? 'none'} ${spec?.status ?? 'NONE'} (${releasedDate})`);
112
+ if (spec?.title)
113
+ console.log(`Title ${spec.title}`);
114
+ console.log(`Tokens ${tokenStr}`);
115
+ console.log(sep);
116
+ }
117
+ export function registerList(program) {
118
+ const list = program
119
+ .command('list')
120
+ .description('Query and display project data');
121
+ list
122
+ .command('backlog')
123
+ .description('Show requirements backlog')
124
+ .option('--all', 'Include VERIFIED and DEFERRED requirements')
125
+ .option('--priority <p>', 'Filter by priority (MUST|SHOULD|COULD|WONT)')
126
+ .option('--status <s>', 'Filter by status')
127
+ .option('--api-url <url>', 'API URL override')
128
+ .action(async (opts) => {
129
+ const token = getToken();
130
+ if (!token) {
131
+ console.error('✗ Not logged in — run dcx login first');
132
+ process.exit(1);
133
+ }
134
+ await runListBacklog(opts);
135
+ });
136
+ list
137
+ .command('issues')
138
+ .description('Show open issues')
139
+ .option('--req <reqId>', 'Filter to one requirement')
140
+ .option('--severity <s>', 'Filter by severity (CRITICAL|HIGH|MEDIUM|LOW)')
141
+ .option('--api-url <url>', 'API URL override')
142
+ .action(async (opts) => {
143
+ const token = getToken();
144
+ if (!token) {
145
+ console.error('✗ Not logged in — run dcx login first');
146
+ process.exit(1);
147
+ }
148
+ await runListIssues(opts);
149
+ });
150
+ list
151
+ .command('spec')
152
+ .description('Show spec version and summary')
153
+ .option('--api-url <url>', 'API URL override')
154
+ .action(async (opts) => {
155
+ const token = getToken();
156
+ if (!token) {
157
+ console.error('✗ Not logged in — run dcx login first');
158
+ process.exit(1);
159
+ }
160
+ await runListSpec(opts);
161
+ });
162
+ }
163
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Command } from 'commander';
2
+ export interface LoginOptions {
3
+ email?: string;
4
+ password?: string;
5
+ apiUrl?: string;
6
+ }
7
+ export declare function runLogin(opts: LoginOptions): Promise<void>;
8
+ export declare function registerLogin(program: Command): void;
9
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAMD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA+EhE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAWpD"}
@@ -0,0 +1,91 @@
1
+ import * as clack from '@clack/prompts';
2
+ import { config, getApiUrl } from '../lib/config.js';
3
+ import { storeToken } from '../lib/auth.js';
4
+ import { apiJson } from '../lib/api.js';
5
+ export async function runLogin(opts) {
6
+ // AC-1: Interactive prompts if flags not provided
7
+ let email = opts.email;
8
+ let password = opts.password;
9
+ if (!email) {
10
+ const val = await clack.text({
11
+ message: 'Email',
12
+ validate: (v) => (v.includes('@') ? undefined : 'Invalid email'),
13
+ });
14
+ if (clack.isCancel(val)) {
15
+ clack.cancel('Cancelled');
16
+ process.exit(0);
17
+ }
18
+ email = val;
19
+ }
20
+ if (!password) {
21
+ const val = await clack.password({
22
+ message: 'Password',
23
+ validate: (v) => (v.length > 0 ? undefined : 'Required'),
24
+ });
25
+ if (clack.isCancel(val)) {
26
+ clack.cancel('Cancelled');
27
+ process.exit(0);
28
+ }
29
+ password = val;
30
+ }
31
+ const s = clack.spinner();
32
+ s.start('Authenticating...');
33
+ try {
34
+ const data = await apiJson('/auth/login', { method: 'POST', body: JSON.stringify({ email, password }) }, opts.apiUrl);
35
+ storeToken(data);
36
+ // Save apiUrl so init/other commands can reach the API without --api-url flag
37
+ const resolvedApiUrl = getApiUrl(opts.apiUrl);
38
+ config.set('apiUrl', resolvedApiUrl);
39
+ // AC-6: Fetch projects list and store defaults
40
+ const orgSlug = data.user.orgMemberships?.[0]?.orgSlug;
41
+ if (orgSlug)
42
+ config.set('defaultOrgSlug', orgSlug);
43
+ let defaultProject = 'unknown';
44
+ try {
45
+ if (orgSlug) {
46
+ const projects = await apiJson(`/organisations/${orgSlug}/projects`, {}, opts.apiUrl);
47
+ const first = projects.data[0];
48
+ if (first) {
49
+ config.set('defaultProjectId', first.id);
50
+ config.set('defaultProjectName', first.name);
51
+ defaultProject = first.name;
52
+ }
53
+ }
54
+ }
55
+ catch {
56
+ // non-fatal — defaults not critical
57
+ }
58
+ s.stop(`✔ Logged in as ${data.user.name}`);
59
+ clack.note(`Default project: ${defaultProject}\nRun dcx init in your project directory to get started`);
60
+ }
61
+ catch (err) {
62
+ s.stop('');
63
+ const status = err.status;
64
+ if (status === 401 || status === 400) {
65
+ // AC-4
66
+ console.error('✗ Invalid email or password');
67
+ }
68
+ else if (err.code === 'ECONNREFUSED' || status === undefined) {
69
+ // AC-5
70
+ const apiUrl = getApiUrl(opts.apiUrl);
71
+ console.error(`✗ Cannot reach DevCortex API at ${apiUrl} — is pnpm dev running?`);
72
+ }
73
+ else {
74
+ console.error(`✗ ${err.message}`);
75
+ }
76
+ process.exit(1);
77
+ }
78
+ }
79
+ export function registerLogin(program) {
80
+ program
81
+ .command('login')
82
+ .description('Authenticate with DevCortex and store token locally')
83
+ .option('--email <email>', 'Email address')
84
+ .option('--password <pass>', 'Password')
85
+ .option('--api-url <url>', 'API URL override')
86
+ .action(async (opts) => {
87
+ clack.intro('DevCortex Login');
88
+ await runLogin(opts);
89
+ });
90
+ }
91
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { Command } from 'commander';
2
+ export interface LogsOptions {
3
+ req?: string;
4
+ since?: string;
5
+ follow?: boolean;
6
+ noFollow?: boolean;
7
+ apiUrl?: string;
8
+ }
9
+ interface AuditEvent {
10
+ id: string;
11
+ eventType: string;
12
+ entityId?: string;
13
+ requirementId?: string;
14
+ actorType?: string;
15
+ payload?: Record<string, unknown>;
16
+ createdAt: string;
17
+ }
18
+ export declare function formatEvent(event: AuditEvent): string;
19
+ export declare function runLogs(opts: LogsOptions, cwd?: string): Promise<void>;
20
+ export declare function registerLogs(program: Command): void;
21
+ export {};
22
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAmBD,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAgBrD;AAoED,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,SAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6EnF;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAcnD"}