@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.
- package/dist/commands/export.d.ts +9 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +49 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/import.d.ts +21 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +237 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/init.d.ts +22 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +225 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/issue.d.ts +8 -0
- package/dist/commands/issue.d.ts.map +1 -0
- package/dist/commands/issue.js +42 -0
- package/dist/commands/issue.js.map +1 -0
- package/dist/commands/keys.d.ts +23 -0
- package/dist/commands/keys.d.ts.map +1 -0
- package/dist/commands/keys.js +133 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/list.d.ts +20 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +163 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/login.d.ts +9 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +91 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logs.d.ts +22 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +172 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/start.d.ts +9 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +88 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +22 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +179 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/test-mcp.d.ts +7 -0
- package/dist/commands/test-mcp.d.ts.map +1 -0
- package/dist/commands/test-mcp.js +115 -0
- package/dist/commands/test-mcp.js.map +1 -0
- package/dist/commands/update.d.ts +9 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +124 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +8 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +30 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/auth.d.ts +20 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +16 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/config.d.ts +16 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +29 -0
- package/dist/lib/config.js.map +1 -0
- 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"}
|