@shakecodeslikecray/npc-cli 0.1.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/README.md +60 -0
- package/dist/adapters/claude-code.d.ts +21 -0
- package/dist/adapters/claude-code.d.ts.map +1 -0
- package/dist/adapters/claude-code.js +83 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/index.d.ts +36 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +50 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/client/api.d.ts +50 -0
- package/dist/client/api.d.ts.map +1 -0
- package/dist/client/api.js +325 -0
- package/dist/client/api.js.map +1 -0
- package/dist/client/auth.d.ts +47 -0
- package/dist/client/auth.d.ts.map +1 -0
- package/dist/client/auth.js +129 -0
- package/dist/client/auth.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +11 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1055 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp.d.ts +3 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +22 -0
- package/dist/mcp.js.map +1 -0
- package/dist/tools/execution.d.ts +3 -0
- package/dist/tools/execution.d.ts.map +1 -0
- package/dist/tools/execution.js +255 -0
- package/dist/tools/execution.js.map +1 -0
- package/dist/tools/ingestion.d.ts +3 -0
- package/dist/tools/ingestion.d.ts.map +1 -0
- package/dist/tools/ingestion.js +131 -0
- package/dist/tools/ingestion.js.map +1 -0
- package/dist/tools/references.d.ts +3 -0
- package/dist/tools/references.d.ts.map +1 -0
- package/dist/tools/references.js +101 -0
- package/dist/tools/references.js.map +1 -0
- package/dist/tools/reporting.d.ts +3 -0
- package/dist/tools/reporting.d.ts.map +1 -0
- package/dist/tools/reporting.js +285 -0
- package/dist/tools/reporting.js.map +1 -0
- package/dist/tools/telemetry.d.ts +3 -0
- package/dist/tools/telemetry.d.ts.map +1 -0
- package/dist/tools/telemetry.js +73 -0
- package/dist/tools/telemetry.js.map +1 -0
- package/dist/types.d.ts +266 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +36 -0
package/README.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# NPC CLI
|
|
2
|
+
|
|
3
|
+
MCP server + CLI for the NPC project orchestration system.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install
|
|
9
|
+
npm run build
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Usage
|
|
13
|
+
|
|
14
|
+
### CLI
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
# Auth
|
|
18
|
+
npc auth login -e user@example.com -p password
|
|
19
|
+
npc auth status
|
|
20
|
+
npc auth logout
|
|
21
|
+
|
|
22
|
+
# Projects
|
|
23
|
+
npc project create -n "My Project" -i MP
|
|
24
|
+
npc project list
|
|
25
|
+
npc project stats
|
|
26
|
+
|
|
27
|
+
# Tasks
|
|
28
|
+
npc tasks
|
|
29
|
+
npc pull
|
|
30
|
+
npc start <task-id>
|
|
31
|
+
npc complete <task-id> -s "Done"
|
|
32
|
+
npc block <task-id> -r "Waiting on API"
|
|
33
|
+
npc signal <task-id> -c quality -t tests_passed -v '{"passed":true}'
|
|
34
|
+
|
|
35
|
+
# Context
|
|
36
|
+
npc context <module-id>
|
|
37
|
+
|
|
38
|
+
# Bulk operations
|
|
39
|
+
npc items bulk-create <project-id> items.json
|
|
40
|
+
npc edge create --project <id> --from <id> --to <id>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### MCP Server
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npc mcp
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Add to Claude Code config:
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{
|
|
53
|
+
"mcpServers": {
|
|
54
|
+
"npc": {
|
|
55
|
+
"command": "node",
|
|
56
|
+
"args": ["/path/to/npc-cli/dist/mcp.js"]
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface ParsedTelemetry {
|
|
2
|
+
session_id?: string;
|
|
3
|
+
model?: string;
|
|
4
|
+
tokens_in: number;
|
|
5
|
+
tokens_out: number;
|
|
6
|
+
cache_read_tokens: number;
|
|
7
|
+
cache_creation_tokens: number;
|
|
8
|
+
cost_usd: number;
|
|
9
|
+
duration_ms: number;
|
|
10
|
+
num_turns: number;
|
|
11
|
+
tool_calls: number;
|
|
12
|
+
tool_failures: number;
|
|
13
|
+
metadata: {
|
|
14
|
+
tool_breakdown: Record<string, number>;
|
|
15
|
+
errors: string[];
|
|
16
|
+
stop_reason?: string;
|
|
17
|
+
};
|
|
18
|
+
work_item_id?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function parseClaudeCodeTranscript(transcriptPath: string): ParsedTelemetry;
|
|
21
|
+
//# sourceMappingURL=claude-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/adapters/claude-code.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE;QACR,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,yBAAyB,CAAC,cAAc,EAAE,MAAM,GAAG,eAAe,CAwFjF"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { readFileSync } from "fs";
|
|
2
|
+
export function parseClaudeCodeTranscript(transcriptPath) {
|
|
3
|
+
const content = readFileSync(transcriptPath, "utf-8");
|
|
4
|
+
const lines = content.split("\n").filter(Boolean);
|
|
5
|
+
const result = {
|
|
6
|
+
tokens_in: 0,
|
|
7
|
+
tokens_out: 0,
|
|
8
|
+
cache_read_tokens: 0,
|
|
9
|
+
cache_creation_tokens: 0,
|
|
10
|
+
cost_usd: 0,
|
|
11
|
+
duration_ms: 0,
|
|
12
|
+
num_turns: 0,
|
|
13
|
+
tool_calls: 0,
|
|
14
|
+
tool_failures: 0,
|
|
15
|
+
metadata: { tool_breakdown: {}, errors: [] },
|
|
16
|
+
};
|
|
17
|
+
let firstTimestamp;
|
|
18
|
+
let lastTimestamp;
|
|
19
|
+
for (const line of lines) {
|
|
20
|
+
try {
|
|
21
|
+
const entry = JSON.parse(line);
|
|
22
|
+
// Track timestamps for duration
|
|
23
|
+
if (entry.timestamp) {
|
|
24
|
+
const ts = new Date(entry.timestamp).getTime();
|
|
25
|
+
if (!firstTimestamp)
|
|
26
|
+
firstTimestamp = ts;
|
|
27
|
+
lastTimestamp = ts;
|
|
28
|
+
}
|
|
29
|
+
// Session ID
|
|
30
|
+
if (entry.type === "system" && entry.subtype === "init" && entry.session_id) {
|
|
31
|
+
result.session_id = entry.session_id;
|
|
32
|
+
}
|
|
33
|
+
// API request events (token usage)
|
|
34
|
+
if (entry.type === "assistant" && entry.message?.usage) {
|
|
35
|
+
const u = entry.message.usage;
|
|
36
|
+
result.tokens_in += u.input_tokens ?? 0;
|
|
37
|
+
result.tokens_out += u.output_tokens ?? 0;
|
|
38
|
+
result.cache_read_tokens += u.cache_read_input_tokens ?? 0;
|
|
39
|
+
result.cache_creation_tokens += u.cache_creation_input_tokens ?? 0;
|
|
40
|
+
result.num_turns++;
|
|
41
|
+
if (entry.message.model)
|
|
42
|
+
result.model = entry.message.model;
|
|
43
|
+
}
|
|
44
|
+
// Tool use tracking
|
|
45
|
+
if (entry.type === "assistant" && entry.message?.content) {
|
|
46
|
+
for (const block of entry.message.content) {
|
|
47
|
+
if (block.type === "tool_use") {
|
|
48
|
+
result.tool_calls++;
|
|
49
|
+
const name = block.name ?? "unknown";
|
|
50
|
+
result.metadata.tool_breakdown[name] = (result.metadata.tool_breakdown[name] ?? 0) + 1;
|
|
51
|
+
// Check for npc_pull_task or npc_start_task to find work item
|
|
52
|
+
if ((name === "npc_pull_task" || name === "npc_start_task") && block.input?.task_id) {
|
|
53
|
+
result.work_item_id = block.input.task_id;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Tool results (check for errors)
|
|
59
|
+
if (entry.type === "tool_result" && entry.is_error) {
|
|
60
|
+
result.tool_failures++;
|
|
61
|
+
if (entry.content) {
|
|
62
|
+
const errText = typeof entry.content === "string" ? entry.content : JSON.stringify(entry.content);
|
|
63
|
+
result.metadata.errors.push(errText.slice(0, 200));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Stop reason
|
|
67
|
+
if (entry.type === "result" && entry.stop_reason) {
|
|
68
|
+
result.metadata.stop_reason = entry.stop_reason;
|
|
69
|
+
if (entry.total_cost_usd)
|
|
70
|
+
result.cost_usd = entry.total_cost_usd;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Skip malformed lines
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Calculate duration from timestamps
|
|
78
|
+
if (firstTimestamp && lastTimestamp) {
|
|
79
|
+
result.duration_ms = lastTimestamp - firstTimestamp;
|
|
80
|
+
}
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/adapters/claude-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAsBlC,MAAM,UAAU,yBAAyB,CAAC,cAAsB;IAC9D,MAAM,OAAO,GAAG,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAElD,MAAM,MAAM,GAAoB;QAC9B,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,iBAAiB,EAAE,CAAC;QACpB,qBAAqB,EAAE,CAAC;QACxB,QAAQ,EAAE,CAAC;QACX,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,aAAa,EAAE,CAAC;QAChB,QAAQ,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;KAC7C,CAAC;IAEF,IAAI,cAAkC,CAAC;IACvC,IAAI,aAAiC,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAE/B,gCAAgC;YAChC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC/C,IAAI,CAAC,cAAc;oBAAE,cAAc,GAAG,EAAE,CAAC;gBACzC,aAAa,GAAG,EAAE,CAAC;YACrB,CAAC;YAED,aAAa;YACb,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBAC5E,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;YACvC,CAAC;YAED,mCAAmC;YACnC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;gBACvD,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC9B,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC;gBACxC,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC;gBAC1C,MAAM,CAAC,iBAAiB,IAAI,CAAC,CAAC,uBAAuB,IAAI,CAAC,CAAC;gBAC3D,MAAM,CAAC,qBAAqB,IAAI,CAAC,CAAC,2BAA2B,IAAI,CAAC,CAAC;gBACnE,MAAM,CAAC,SAAS,EAAE,CAAC;gBACnB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK;oBAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAC9D,CAAC;YAED,oBAAoB;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;gBACzD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;oBAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;wBAC9B,MAAM,CAAC,UAAU,EAAE,CAAC;wBACpB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,SAAS,CAAC;wBACrC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;wBAEvF,8DAA8D;wBAC9D,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,gBAAgB,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;4BACpF,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;wBAC5C,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,kCAAkC;YAClC,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnD,MAAM,CAAC,aAAa,EAAE,CAAC;gBACvB,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;oBAClB,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAClG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;YAED,cAAc;YACd,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;gBACjD,MAAM,CAAC,QAAQ,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;gBAChD,IAAI,KAAK,CAAC,cAAc;oBAAE,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC;YACnE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,IAAI,cAAc,IAAI,aAAa,EAAE,CAAC;QACpC,MAAM,CAAC,WAAW,GAAG,aAAa,GAAG,cAAc,CAAC;IACtD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool adapter registry.
|
|
3
|
+
*
|
|
4
|
+
* Each adapter knows how to:
|
|
5
|
+
* - locate the tool's MCP config file
|
|
6
|
+
* - read/write the mcpServers entry
|
|
7
|
+
* - parse session transcripts for telemetry
|
|
8
|
+
*
|
|
9
|
+
* Adding support for a new tool (e.g. Cursor, Windsurf) means adding an entry
|
|
10
|
+
* here that satisfies ToolAdapter and wiring it into TOOL_ADAPTERS.
|
|
11
|
+
*/
|
|
12
|
+
export interface McpEntry {
|
|
13
|
+
type: "stdio";
|
|
14
|
+
command: string;
|
|
15
|
+
args: string[];
|
|
16
|
+
}
|
|
17
|
+
export interface ToolAdapter {
|
|
18
|
+
/** Human-readable display name */
|
|
19
|
+
displayName: string;
|
|
20
|
+
/** Identifier used in --tool flags and agent_tool telemetry field */
|
|
21
|
+
toolId: string;
|
|
22
|
+
/** Absolute path to the JSON config file that holds mcpServers */
|
|
23
|
+
configPath: string;
|
|
24
|
+
/** Key inside the config that holds the mcpServers map */
|
|
25
|
+
mcpServersKey: string;
|
|
26
|
+
/** Short restart instruction shown after install */
|
|
27
|
+
restartHint: string;
|
|
28
|
+
}
|
|
29
|
+
export declare const TOOL_ADAPTERS: Record<string, ToolAdapter>;
|
|
30
|
+
/** Default tool ID used when --tool is not specified. */
|
|
31
|
+
export declare const DEFAULT_TOOL_ID = "claude_code";
|
|
32
|
+
/** @deprecated Use DEFAULT_TOOL_ID */
|
|
33
|
+
export declare const DEFAULT_TOOL = "claude_code";
|
|
34
|
+
export declare function getAdapter(toolId: string): ToolAdapter | undefined;
|
|
35
|
+
export declare function listSupportedTools(): string[];
|
|
36
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,aAAa,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;CACrB;AAKD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAyBrD,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAE7C,sCAAsC;AACtC,eAAO,MAAM,YAAY,gBAAkB,CAAC;AAE5C,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAElE;AAED,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool adapter registry.
|
|
3
|
+
*
|
|
4
|
+
* Each adapter knows how to:
|
|
5
|
+
* - locate the tool's MCP config file
|
|
6
|
+
* - read/write the mcpServers entry
|
|
7
|
+
* - parse session transcripts for telemetry
|
|
8
|
+
*
|
|
9
|
+
* Adding support for a new tool (e.g. Cursor, Windsurf) means adding an entry
|
|
10
|
+
* here that satisfies ToolAdapter and wiring it into TOOL_ADAPTERS.
|
|
11
|
+
*/
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import { homedir } from "node:os";
|
|
14
|
+
export const TOOL_ADAPTERS = {
|
|
15
|
+
claude_code: {
|
|
16
|
+
displayName: "Claude Code",
|
|
17
|
+
toolId: "claude_code",
|
|
18
|
+
configPath: join(homedir(), ".claude.json"),
|
|
19
|
+
mcpServersKey: "mcpServers",
|
|
20
|
+
restartHint: "Restart Claude Code to activate.",
|
|
21
|
+
},
|
|
22
|
+
// Cursor: stores MCP config in ~/.cursor/mcp.json under "mcpServers"
|
|
23
|
+
// Uncomment when Cursor MCP support ships:
|
|
24
|
+
// cursor: {
|
|
25
|
+
// displayName: "Cursor",
|
|
26
|
+
// toolId: "cursor",
|
|
27
|
+
// configPath: join(homedir(), ".cursor", "mcp.json"),
|
|
28
|
+
// mcpServersKey: "mcpServers",
|
|
29
|
+
// restartHint: "Restart Cursor to activate.",
|
|
30
|
+
// },
|
|
31
|
+
// Windsurf: stores MCP config in ~/.codeium/windsurf/mcp_config.json
|
|
32
|
+
// windsurf: {
|
|
33
|
+
// displayName: "Windsurf",
|
|
34
|
+
// toolId: "windsurf",
|
|
35
|
+
// configPath: join(homedir(), ".codeium", "windsurf", "mcp_config.json"),
|
|
36
|
+
// mcpServersKey: "mcpServers",
|
|
37
|
+
// restartHint: "Restart Windsurf to activate.",
|
|
38
|
+
// },
|
|
39
|
+
};
|
|
40
|
+
/** Default tool ID used when --tool is not specified. */
|
|
41
|
+
export const DEFAULT_TOOL_ID = "claude_code";
|
|
42
|
+
/** @deprecated Use DEFAULT_TOOL_ID */
|
|
43
|
+
export const DEFAULT_TOOL = DEFAULT_TOOL_ID;
|
|
44
|
+
export function getAdapter(toolId) {
|
|
45
|
+
return TOOL_ADAPTERS[toolId];
|
|
46
|
+
}
|
|
47
|
+
export function listSupportedTools() {
|
|
48
|
+
return Object.keys(TOOL_ADAPTERS);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAqBH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,CAAC,MAAM,aAAa,GAAgC;IACxD,WAAW,EAAE;QACX,WAAW,EAAE,aAAa;QAC1B,MAAM,EAAE,aAAa;QACrB,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC;QAC3C,aAAa,EAAE,YAAY;QAC3B,WAAW,EAAE,kCAAkC;KAChD;IACD,qEAAqE;IACrE,2CAA2C;IAC3C,YAAY;IACZ,2BAA2B;IAC3B,sBAAsB;IACtB,wDAAwD;IACxD,iCAAiC;IACjC,gDAAgD;IAChD,KAAK;IACL,qEAAqE;IACrE,cAAc;IACd,6BAA6B;IAC7B,wBAAwB;IACxB,4EAA4E;IAC5E,iCAAiC;IACjC,kDAAkD;IAClD,KAAK;CACN,CAAC;AAEF,yDAAyD;AACzD,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,CAAC;AAE7C,sCAAsC;AACtC,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC;AAE5C,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Project, Repo, CreateProjectInput, CreateRepoInput, WorkItem, WorkItemEdge, CreateEdgeInput, Signal, CreateSignalInput, BulkCreateItem, CompleteInput, BlockInput, RepoStats, ProjectStats, QueueNextResponse, WorkItemContext, SignalHealthSummary, ScheduleResult, AIModel, WorkItemReference, CreateReferenceInput, Document, TelemetryEvent, CreateTelemetryInput } from "../types.js";
|
|
2
|
+
/** Reset client (useful after login when token changes). */
|
|
3
|
+
export declare function resetClient(): void;
|
|
4
|
+
export declare function createProject(data: CreateProjectInput): Promise<Project>;
|
|
5
|
+
export declare function getProject(id: string): Promise<Project>;
|
|
6
|
+
export declare function listProjects(): Promise<Project[]>;
|
|
7
|
+
export declare function getProjectStats(): Promise<Record<string, ProjectStats>>;
|
|
8
|
+
export declare function getProjectRepos(projectId: string): Promise<Repo[]>;
|
|
9
|
+
export declare function getProjectDashboard(projectId: string): Promise<unknown>;
|
|
10
|
+
export declare function createRepo(data: CreateRepoInput): Promise<Repo>;
|
|
11
|
+
export declare function getRepo(id: string): Promise<Repo>;
|
|
12
|
+
export declare function listRepos(): Promise<Repo[]>;
|
|
13
|
+
export declare function getRepoStats(): Promise<Record<string, RepoStats>>;
|
|
14
|
+
export declare function getWorkItems(repoId: string, params?: Record<string, string>): Promise<WorkItem[]>;
|
|
15
|
+
export declare function getWorkItem(repoId: string, itemId: string): Promise<WorkItem>;
|
|
16
|
+
export declare function bulkCreateWorkItems(repoId: string, items: BulkCreateItem[]): Promise<WorkItem[]>;
|
|
17
|
+
export declare function getWorkItemDescendants(repoId: string, itemId: string): Promise<WorkItem[]>;
|
|
18
|
+
export declare function getWorkItemChildren(repoId: string, itemId: string): Promise<WorkItem[]>;
|
|
19
|
+
export declare function transitionWorkItem(itemId: string, state: string): Promise<WorkItem>;
|
|
20
|
+
export declare function startWorkItem(itemId: string): Promise<WorkItem>;
|
|
21
|
+
export declare function completeWorkItem(itemId: string, data: CompleteInput): Promise<WorkItem>;
|
|
22
|
+
export declare function blockWorkItem(itemId: string, data: BlockInput): Promise<WorkItem>;
|
|
23
|
+
export declare function getMyTasks(): Promise<WorkItem[]>;
|
|
24
|
+
export declare function getWorkItemContext(itemId: string): Promise<WorkItemContext>;
|
|
25
|
+
export declare function queueNext(repoId?: string): Promise<QueueNextResponse>;
|
|
26
|
+
export declare function myTasksNext(repoId?: string): Promise<QueueNextResponse>;
|
|
27
|
+
export declare function createEdge(repoId: string, data: CreateEdgeInput): Promise<WorkItemEdge>;
|
|
28
|
+
export declare function listEdges(repoId: string): Promise<WorkItemEdge[]>;
|
|
29
|
+
export declare function scheduleProject(projectId: string, startDate: string): Promise<ScheduleResult>;
|
|
30
|
+
export declare function createSignal(workItemId: string, signal: CreateSignalInput): Promise<Signal>;
|
|
31
|
+
export declare function listSignals(workItemId: string): Promise<Signal[]>;
|
|
32
|
+
export declare function getSignalHealth(workItemId: string): Promise<SignalHealthSummary>;
|
|
33
|
+
export declare function listAIModels(): Promise<AIModel[]>;
|
|
34
|
+
export declare function listAvailableModels(): Promise<AIModel[]>;
|
|
35
|
+
export declare function listModelsByTier(tier: number): Promise<AIModel[]>;
|
|
36
|
+
export declare function getMyModels(): Promise<AIModel[]>;
|
|
37
|
+
export declare function setMyModels(modelIds: string[]): Promise<void>;
|
|
38
|
+
export declare function listUsers(role?: string): Promise<unknown[]>;
|
|
39
|
+
export declare function listReferences(workItemId: string, inherited?: boolean): Promise<WorkItemReference[]>;
|
|
40
|
+
export declare function createReference(workItemId: string, data: CreateReferenceInput): Promise<WorkItemReference>;
|
|
41
|
+
export declare function deleteReference(workItemId: string, refId: string): Promise<void>;
|
|
42
|
+
export declare function listDocuments(repoId: string): Promise<Document[]>;
|
|
43
|
+
export declare function uploadDocument(repoId: string, filename: string, content: Buffer, contentType?: string): Promise<Document>;
|
|
44
|
+
export declare function getDocument(repoId: string, docId: string): Promise<Document>;
|
|
45
|
+
export declare function getDocumentContent(repoId: string, docId: string): Promise<string>;
|
|
46
|
+
export declare function deleteDocument(repoId: string, docId: string): Promise<void>;
|
|
47
|
+
export declare function createTelemetry(workItemId: string, input: CreateTelemetryInput): Promise<TelemetryEvent>;
|
|
48
|
+
export declare const reportTelemetry: typeof createTelemetry;
|
|
49
|
+
export declare function listTelemetry(workItemId: string): Promise<TelemetryEvent[]>;
|
|
50
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/client/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import FormData from "form-data";
|
|
3
|
+
import { getToken, getApiUrl, getApiKey, isTokenExpired, refreshToken } from "./auth.js";
|
|
4
|
+
let _refreshing = null;
|
|
5
|
+
function createClient() {
|
|
6
|
+
const client = axios.create({
|
|
7
|
+
baseURL: getApiUrl(),
|
|
8
|
+
timeout: 30_000,
|
|
9
|
+
headers: { "Content-Type": "application/json" },
|
|
10
|
+
});
|
|
11
|
+
// Pre-flight: if token is expired, try refresh before sending the request
|
|
12
|
+
client.interceptors.request.use(async (config) => {
|
|
13
|
+
try {
|
|
14
|
+
if (isTokenExpired()) {
|
|
15
|
+
if (!_refreshing)
|
|
16
|
+
_refreshing = refreshToken();
|
|
17
|
+
const newToken = await _refreshing;
|
|
18
|
+
_refreshing = null;
|
|
19
|
+
if (newToken) {
|
|
20
|
+
config.headers.Authorization = `Bearer ${newToken}`;
|
|
21
|
+
return config;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const token = getToken();
|
|
25
|
+
config.headers.Authorization = `Bearer ${token}`;
|
|
26
|
+
// Only send agent key for queue and agent-exclusive work-item endpoints.
|
|
27
|
+
// Signal, comment, transition, and other role-based endpoints must NOT receive
|
|
28
|
+
// the agent key — it bypasses user role checks.
|
|
29
|
+
const agentSuffixes = ["/start", "/complete", "/block", "/heartbeat", "/escalate"];
|
|
30
|
+
const url = config.url ?? "";
|
|
31
|
+
const isQueueEndpoint = url.includes("/api/v1/queue/");
|
|
32
|
+
const isAgentWorkItem = url.includes("/api/v1/work-items/") &&
|
|
33
|
+
agentSuffixes.some((s) => url.endsWith(s));
|
|
34
|
+
const apiKey = getApiKey();
|
|
35
|
+
if (apiKey && (isQueueEndpoint || isAgentWorkItem))
|
|
36
|
+
config.headers["x-api-key"] = apiKey;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Allow unauthenticated requests (login, etc.)
|
|
40
|
+
}
|
|
41
|
+
return config;
|
|
42
|
+
});
|
|
43
|
+
// Retry on 401: attempt refresh once, then replay the failed request
|
|
44
|
+
client.interceptors.response.use((res) => res, async (err) => {
|
|
45
|
+
const originalRequest = err.config;
|
|
46
|
+
if (err.response?.status === 401 &&
|
|
47
|
+
originalRequest &&
|
|
48
|
+
!originalRequest._retried) {
|
|
49
|
+
originalRequest._retried = true;
|
|
50
|
+
if (!_refreshing)
|
|
51
|
+
_refreshing = refreshToken();
|
|
52
|
+
let newToken = null;
|
|
53
|
+
try {
|
|
54
|
+
newToken = await _refreshing;
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
_refreshing = null;
|
|
58
|
+
}
|
|
59
|
+
if (newToken) {
|
|
60
|
+
originalRequest.headers.Authorization = `Bearer ${newToken}`;
|
|
61
|
+
return client(originalRequest);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const msg = err.response?.data?.error ?? err.message;
|
|
65
|
+
const status = err.response?.status ?? 0;
|
|
66
|
+
throw new Error(`API error (${status}): ${msg}`);
|
|
67
|
+
});
|
|
68
|
+
return client;
|
|
69
|
+
}
|
|
70
|
+
// Lazy singleton
|
|
71
|
+
let _client = null;
|
|
72
|
+
function client() {
|
|
73
|
+
if (!_client)
|
|
74
|
+
_client = createClient();
|
|
75
|
+
return _client;
|
|
76
|
+
}
|
|
77
|
+
/** Reset client (useful after login when token changes). */
|
|
78
|
+
export function resetClient() {
|
|
79
|
+
_client = null;
|
|
80
|
+
}
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
// Projects (group-level)
|
|
83
|
+
// ---------------------------------------------------------------------------
|
|
84
|
+
export async function createProject(data) {
|
|
85
|
+
const res = await client().post("/api/v1/projects/", data);
|
|
86
|
+
return res.data;
|
|
87
|
+
}
|
|
88
|
+
export async function getProject(id) {
|
|
89
|
+
const res = await client().get(`/api/v1/projects/${id}`);
|
|
90
|
+
return res.data;
|
|
91
|
+
}
|
|
92
|
+
export async function listProjects() {
|
|
93
|
+
const res = await client().get("/api/v1/projects/");
|
|
94
|
+
return res.data;
|
|
95
|
+
}
|
|
96
|
+
export async function getProjectStats() {
|
|
97
|
+
const res = await client().get("/api/v1/projects/stats");
|
|
98
|
+
return res.data;
|
|
99
|
+
}
|
|
100
|
+
export async function getProjectRepos(projectId) {
|
|
101
|
+
const res = await client().get(`/api/v1/projects/${projectId}/repos`);
|
|
102
|
+
return res.data;
|
|
103
|
+
}
|
|
104
|
+
export async function getProjectDashboard(projectId) {
|
|
105
|
+
const res = await client().get(`/api/v1/projects/${projectId}/dashboard`);
|
|
106
|
+
return res.data;
|
|
107
|
+
}
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
// Repos (individual codebases, formerly "projects")
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
export async function createRepo(data) {
|
|
112
|
+
const res = await client().post("/api/v1/repos/", data);
|
|
113
|
+
return res.data;
|
|
114
|
+
}
|
|
115
|
+
export async function getRepo(id) {
|
|
116
|
+
const res = await client().get(`/api/v1/repos/${id}`);
|
|
117
|
+
return res.data;
|
|
118
|
+
}
|
|
119
|
+
export async function listRepos() {
|
|
120
|
+
const res = await client().get("/api/v1/repos/");
|
|
121
|
+
return res.data;
|
|
122
|
+
}
|
|
123
|
+
export async function getRepoStats() {
|
|
124
|
+
const res = await client().get("/api/v1/repos/stats");
|
|
125
|
+
return res.data;
|
|
126
|
+
}
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
// Work Items
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
export async function getWorkItems(repoId, params) {
|
|
131
|
+
const res = await client().get(`/api/v1/repos/${repoId}/work-items/`, { params });
|
|
132
|
+
return res.data;
|
|
133
|
+
}
|
|
134
|
+
export async function getWorkItem(repoId, itemId) {
|
|
135
|
+
const res = await client().get(`/api/v1/repos/${repoId}/work-items/${itemId}`);
|
|
136
|
+
return res.data;
|
|
137
|
+
}
|
|
138
|
+
export async function bulkCreateWorkItems(repoId, items) {
|
|
139
|
+
const res = await client().post(`/api/v1/repos/${repoId}/work-items/bulk`, items);
|
|
140
|
+
return res.data;
|
|
141
|
+
}
|
|
142
|
+
export async function getWorkItemDescendants(repoId, itemId) {
|
|
143
|
+
const res = await client().get(`/api/v1/repos/${repoId}/work-items/${itemId}/descendants`);
|
|
144
|
+
return res.data;
|
|
145
|
+
}
|
|
146
|
+
export async function getWorkItemChildren(repoId, itemId) {
|
|
147
|
+
const res = await client().get(`/api/v1/repos/${repoId}/work-items/${itemId}/children`);
|
|
148
|
+
return res.data;
|
|
149
|
+
}
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
// Work Item Transitions (cross-repo endpoints at /api/v1/work-items/...)
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
export async function transitionWorkItem(itemId, state) {
|
|
154
|
+
const res = await client().post(`/api/v1/work-items/${itemId}/transition`, { state });
|
|
155
|
+
return res.data;
|
|
156
|
+
}
|
|
157
|
+
export async function startWorkItem(itemId) {
|
|
158
|
+
const res = await client().post(`/api/v1/work-items/${itemId}/start`);
|
|
159
|
+
return res.data;
|
|
160
|
+
}
|
|
161
|
+
export async function completeWorkItem(itemId, data) {
|
|
162
|
+
const res = await client().post(`/api/v1/work-items/${itemId}/complete`, data);
|
|
163
|
+
return res.data;
|
|
164
|
+
}
|
|
165
|
+
export async function blockWorkItem(itemId, data) {
|
|
166
|
+
const res = await client().post(`/api/v1/work-items/${itemId}/block`, data);
|
|
167
|
+
return res.data;
|
|
168
|
+
}
|
|
169
|
+
// ---------------------------------------------------------------------------
|
|
170
|
+
// My Tasks
|
|
171
|
+
// ---------------------------------------------------------------------------
|
|
172
|
+
export async function getMyTasks() {
|
|
173
|
+
const res = await client().get("/api/v1/work-items/mine");
|
|
174
|
+
return res.data;
|
|
175
|
+
}
|
|
176
|
+
// ---------------------------------------------------------------------------
|
|
177
|
+
// Work Item Context
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
export async function getWorkItemContext(itemId) {
|
|
180
|
+
const res = await client().get(`/api/v1/work-items/${itemId}/context`);
|
|
181
|
+
return res.data;
|
|
182
|
+
}
|
|
183
|
+
// ---------------------------------------------------------------------------
|
|
184
|
+
// Queue
|
|
185
|
+
// ---------------------------------------------------------------------------
|
|
186
|
+
export async function queueNext(repoId) {
|
|
187
|
+
const params = {};
|
|
188
|
+
if (repoId)
|
|
189
|
+
params.repo_id = repoId;
|
|
190
|
+
const res = await client().get("/api/v1/queue/next", { params });
|
|
191
|
+
return res.data;
|
|
192
|
+
}
|
|
193
|
+
export async function myTasksNext(repoId) {
|
|
194
|
+
const params = {};
|
|
195
|
+
if (repoId)
|
|
196
|
+
params.repo_id = repoId;
|
|
197
|
+
const res = await client().get("/api/v1/my-tasks/next", { params });
|
|
198
|
+
return res.data;
|
|
199
|
+
}
|
|
200
|
+
// ---------------------------------------------------------------------------
|
|
201
|
+
// Edges
|
|
202
|
+
// ---------------------------------------------------------------------------
|
|
203
|
+
export async function createEdge(repoId, data) {
|
|
204
|
+
const res = await client().post(`/api/v1/repos/${repoId}/work-item-edges/`, data);
|
|
205
|
+
return res.data;
|
|
206
|
+
}
|
|
207
|
+
export async function listEdges(repoId) {
|
|
208
|
+
const res = await client().get(`/api/v1/repos/${repoId}/work-item-edges/`);
|
|
209
|
+
return res.data;
|
|
210
|
+
}
|
|
211
|
+
// ---------------------------------------------------------------------------
|
|
212
|
+
// Schedule
|
|
213
|
+
// ---------------------------------------------------------------------------
|
|
214
|
+
export async function scheduleProject(projectId, startDate) {
|
|
215
|
+
const res = await client().post(`/api/v1/projects/${projectId}/schedule`, { start_date: startDate });
|
|
216
|
+
return res.data;
|
|
217
|
+
}
|
|
218
|
+
// ---------------------------------------------------------------------------
|
|
219
|
+
// Signals
|
|
220
|
+
// ---------------------------------------------------------------------------
|
|
221
|
+
export async function createSignal(workItemId, signal) {
|
|
222
|
+
const res = await client().post(`/api/v1/work-items/${workItemId}/signals`, signal);
|
|
223
|
+
return res.data;
|
|
224
|
+
}
|
|
225
|
+
export async function listSignals(workItemId) {
|
|
226
|
+
const res = await client().get(`/api/v1/work-items/${workItemId}/signals`);
|
|
227
|
+
return res.data;
|
|
228
|
+
}
|
|
229
|
+
export async function getSignalHealth(workItemId) {
|
|
230
|
+
const res = await client().get(`/api/v1/work-items/${workItemId}/signals/health`);
|
|
231
|
+
return res.data;
|
|
232
|
+
}
|
|
233
|
+
// ---------------------------------------------------------------------------
|
|
234
|
+
// Users
|
|
235
|
+
// ---------------------------------------------------------------------------
|
|
236
|
+
// ---------------------------------------------------------------------------
|
|
237
|
+
// AI Models
|
|
238
|
+
// ---------------------------------------------------------------------------
|
|
239
|
+
export async function listAIModels() {
|
|
240
|
+
const res = await client().get("/api/v1/ai-models");
|
|
241
|
+
return res.data;
|
|
242
|
+
}
|
|
243
|
+
export async function listAvailableModels() {
|
|
244
|
+
const res = await client().get("/api/v1/ai-models/available");
|
|
245
|
+
return res.data;
|
|
246
|
+
}
|
|
247
|
+
export async function listModelsByTier(tier) {
|
|
248
|
+
const res = await client().get(`/api/v1/ai-models/available/tier/${tier}`);
|
|
249
|
+
return res.data;
|
|
250
|
+
}
|
|
251
|
+
export async function getMyModels() {
|
|
252
|
+
const res = await client().get("/api/v1/users/me/ai-models");
|
|
253
|
+
return res.data;
|
|
254
|
+
}
|
|
255
|
+
export async function setMyModels(modelIds) {
|
|
256
|
+
await client().put("/api/v1/users/me/ai-models", { model_ids: modelIds });
|
|
257
|
+
}
|
|
258
|
+
// ---------------------------------------------------------------------------
|
|
259
|
+
// Users
|
|
260
|
+
// ---------------------------------------------------------------------------
|
|
261
|
+
export async function listUsers(role) {
|
|
262
|
+
const params = {};
|
|
263
|
+
if (role)
|
|
264
|
+
params.role = role;
|
|
265
|
+
const res = await client().get("/api/v1/users/", { params });
|
|
266
|
+
return res.data;
|
|
267
|
+
}
|
|
268
|
+
// ---------------------------------------------------------------------------
|
|
269
|
+
// References
|
|
270
|
+
// ---------------------------------------------------------------------------
|
|
271
|
+
export async function listReferences(workItemId, inherited) {
|
|
272
|
+
const path = inherited
|
|
273
|
+
? `/api/v1/work-items/${workItemId}/references/inherited`
|
|
274
|
+
: `/api/v1/work-items/${workItemId}/references`;
|
|
275
|
+
const res = await client().get(path);
|
|
276
|
+
return res.data;
|
|
277
|
+
}
|
|
278
|
+
export async function createReference(workItemId, data) {
|
|
279
|
+
const res = await client().post(`/api/v1/work-items/${workItemId}/references`, data);
|
|
280
|
+
return res.data;
|
|
281
|
+
}
|
|
282
|
+
export async function deleteReference(workItemId, refId) {
|
|
283
|
+
await client().delete(`/api/v1/work-items/${workItemId}/references/${refId}`);
|
|
284
|
+
}
|
|
285
|
+
// ---------------------------------------------------------------------------
|
|
286
|
+
// Documents
|
|
287
|
+
// ---------------------------------------------------------------------------
|
|
288
|
+
export async function listDocuments(repoId) {
|
|
289
|
+
const res = await client().get(`/api/v1/repos/${repoId}/documents/`);
|
|
290
|
+
return res.data;
|
|
291
|
+
}
|
|
292
|
+
export async function uploadDocument(repoId, filename, content, contentType) {
|
|
293
|
+
const form = new FormData();
|
|
294
|
+
form.append("file", content, { filename, contentType: contentType ?? "text/markdown" });
|
|
295
|
+
const res = await client().post(`/api/v1/repos/${repoId}/documents/`, form, {
|
|
296
|
+
headers: form.getHeaders(),
|
|
297
|
+
});
|
|
298
|
+
return res.data;
|
|
299
|
+
}
|
|
300
|
+
export async function getDocument(repoId, docId) {
|
|
301
|
+
const res = await client().get(`/api/v1/repos/${repoId}/documents/${docId}`);
|
|
302
|
+
return res.data;
|
|
303
|
+
}
|
|
304
|
+
export async function getDocumentContent(repoId, docId) {
|
|
305
|
+
const res = await client().get(`/api/v1/repos/${repoId}/documents/${docId}/content`, {
|
|
306
|
+
responseType: "text",
|
|
307
|
+
});
|
|
308
|
+
return res.data;
|
|
309
|
+
}
|
|
310
|
+
export async function deleteDocument(repoId, docId) {
|
|
311
|
+
await client().delete(`/api/v1/repos/${repoId}/documents/${docId}`);
|
|
312
|
+
}
|
|
313
|
+
// ---------------------------------------------------------------------------
|
|
314
|
+
// Telemetry
|
|
315
|
+
// ---------------------------------------------------------------------------
|
|
316
|
+
export async function createTelemetry(workItemId, input) {
|
|
317
|
+
const res = await client().post(`/api/v1/work-items/${workItemId}/telemetry`, input);
|
|
318
|
+
return res.data;
|
|
319
|
+
}
|
|
320
|
+
export const reportTelemetry = createTelemetry;
|
|
321
|
+
export async function listTelemetry(workItemId) {
|
|
322
|
+
const res = await client().get(`/api/v1/work-items/${workItemId}/telemetry`);
|
|
323
|
+
return res.data;
|
|
324
|
+
}
|
|
325
|
+
//# sourceMappingURL=api.js.map
|