@somewhere-tech/cli 0.27.6 → 0.28.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 +20 -0
- package/dist/commands/advisor.js +2 -67
- package/dist/commands/advisor.js.map +1 -1
- package/dist/commands/call.js +62 -0
- package/dist/commands/call.js.map +1 -0
- package/dist/commands/deploy.js +65 -18
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/feedback.js +75 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/git.js +265 -0
- package/dist/commands/git.js.map +1 -0
- package/dist/commands/grep.js +55 -0
- package/dist/commands/grep.js.map +1 -0
- package/dist/commands/mcp.js +10 -41
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/status.js +36 -0
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/tasks.js +195 -0
- package/dist/commands/tasks.js.map +1 -0
- package/dist/commands/usage.js +46 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/platform-command.js +32 -0
- package/dist/lib/platform-command.js.map +1 -0
- package/dist/lib/platform-tools.js +163 -0
- package/dist/lib/platform-tools.js.map +1 -0
- package/npm-shrinkwrap.json +2 -2
- package/package.json +2 -2
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { callPlatformTool } from '../lib/platform-tools.js';
|
|
2
|
+
import { compactRecord, isRecord, parseCommaList, resolveProjectRef, truncateText, unwrapPlatformData, } from '../lib/platform-command.js';
|
|
3
|
+
import { dim, error, printJson, table, teal, timeAgo } from '../lib/output.js';
|
|
4
|
+
function numberOption(value) {
|
|
5
|
+
if (value === undefined)
|
|
6
|
+
return undefined;
|
|
7
|
+
const parsed = Number(value);
|
|
8
|
+
if (!Number.isFinite(parsed))
|
|
9
|
+
throw new Error(`Expected a number, received "${value}".`);
|
|
10
|
+
return parsed;
|
|
11
|
+
}
|
|
12
|
+
function taskRows(value) {
|
|
13
|
+
const data = unwrapPlatformData(value);
|
|
14
|
+
if (!Array.isArray(data))
|
|
15
|
+
throw new Error('tasks_list returned an unexpected response.');
|
|
16
|
+
return data.map((task) => {
|
|
17
|
+
if (!isRecord(task))
|
|
18
|
+
return ['—', '—', '—', '—', '—'];
|
|
19
|
+
const updated = typeof task.updated_at === 'number'
|
|
20
|
+
? timeAgo(new Date(task.updated_at).toISOString())
|
|
21
|
+
: '—';
|
|
22
|
+
return [
|
|
23
|
+
typeof task.id === 'string' ? task.id : '—',
|
|
24
|
+
truncateText(task.title, 56),
|
|
25
|
+
typeof task.status === 'string' ? task.status : '—',
|
|
26
|
+
typeof task.priority === 'string' ? task.priority : '—',
|
|
27
|
+
updated,
|
|
28
|
+
];
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function printTaskMutation(value) {
|
|
32
|
+
const data = unwrapPlatformData(value);
|
|
33
|
+
if (!isRecord(data)) {
|
|
34
|
+
printJson(value);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const id = typeof data.id === 'string' ? data.id : null;
|
|
38
|
+
const title = typeof data.title === 'string' ? data.title : null;
|
|
39
|
+
const status = typeof data.status === 'string' ? data.status : null;
|
|
40
|
+
console.log(`${teal(id ?? 'Task updated')}${title ? ` ${title}` : ''}${status ? ` ${dim(status)}` : ''}`);
|
|
41
|
+
if (id)
|
|
42
|
+
console.log(dim(`Next: somewhere tasks get ${id}`));
|
|
43
|
+
}
|
|
44
|
+
async function runTaskTool(name, args, json, printer) {
|
|
45
|
+
try {
|
|
46
|
+
const value = await callPlatformTool(name, args, { allTools: true });
|
|
47
|
+
if (json)
|
|
48
|
+
printJson(value);
|
|
49
|
+
else
|
|
50
|
+
printer(value);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
error(err instanceof Error ? err.message : String(err));
|
|
54
|
+
process.exitCode = 1;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export function registerTasks(program) {
|
|
58
|
+
const tasks = program
|
|
59
|
+
.command('tasks')
|
|
60
|
+
.description('List, read, create, and update platform tasks');
|
|
61
|
+
tasks
|
|
62
|
+
.command('list')
|
|
63
|
+
.description('List tasks')
|
|
64
|
+
.option('-p, --project <project>', 'Project slug or ID; defaults to the linked project')
|
|
65
|
+
.option('--status <status>', 'Filter by status')
|
|
66
|
+
.option('--assignee <assignee>', 'Filter by assignee')
|
|
67
|
+
.option('--area <area>', 'Filter by area')
|
|
68
|
+
.option('--parent <task-id>', 'Filter by parent task; use "null" for top-level tasks')
|
|
69
|
+
.option('-q, --query <text>', 'Search task titles and descriptions')
|
|
70
|
+
.option('--active', 'Only open and in-progress tasks')
|
|
71
|
+
.option('--stale', 'Only stale in-progress tasks')
|
|
72
|
+
.option('--stale-days <days>', 'Staleness threshold')
|
|
73
|
+
.option('--sort <sort>', 'Sort by priority, updated, or created')
|
|
74
|
+
.option('--full', 'Return complete descriptions')
|
|
75
|
+
.option('--limit <n>', 'Maximum rows')
|
|
76
|
+
.option('--offset <n>', 'Rows to skip')
|
|
77
|
+
.option('--json', 'Print the complete response as JSON')
|
|
78
|
+
.action(async (opts) => {
|
|
79
|
+
const args = compactRecord([
|
|
80
|
+
['project_id', resolveProjectRef(opts.project)],
|
|
81
|
+
['status', opts.status],
|
|
82
|
+
['assignee', opts.assignee],
|
|
83
|
+
['area', opts.area],
|
|
84
|
+
['parent_id', opts.parent],
|
|
85
|
+
['q', opts.query],
|
|
86
|
+
['active', opts.active],
|
|
87
|
+
['stale', opts.stale],
|
|
88
|
+
['stale_days', numberOption(opts.staleDays)],
|
|
89
|
+
['sort', opts.sort],
|
|
90
|
+
['detail', opts.full ? 'full' : undefined],
|
|
91
|
+
['limit', numberOption(opts.limit)],
|
|
92
|
+
['offset', numberOption(opts.offset)],
|
|
93
|
+
]);
|
|
94
|
+
await runTaskTool('tasks_list', args, opts.json, (value) => {
|
|
95
|
+
const rows = taskRows(value);
|
|
96
|
+
if (rows.length === 0)
|
|
97
|
+
console.log(dim('No matching tasks.'));
|
|
98
|
+
else
|
|
99
|
+
table(['ID', 'Title', 'Status', 'Priority', 'Updated'], rows);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
tasks
|
|
103
|
+
.command('get <task-id>')
|
|
104
|
+
.description('Get one task with comments, activity, and relationships')
|
|
105
|
+
.option('-p, --project <project>', 'Project slug or ID; defaults to the linked project')
|
|
106
|
+
.option('--json', 'Print the complete response as JSON')
|
|
107
|
+
.action(async (taskId, opts) => {
|
|
108
|
+
await runTaskTool('tasks_get', {
|
|
109
|
+
project_id: resolveProjectRef(opts.project),
|
|
110
|
+
task_id: taskId,
|
|
111
|
+
}, opts.json, (value) => printJson(unwrapPlatformData(value)));
|
|
112
|
+
});
|
|
113
|
+
tasks
|
|
114
|
+
.command('create <title>')
|
|
115
|
+
.description('Create a task without opening an editor')
|
|
116
|
+
.option('-p, --project <project>', 'Project slug or ID; defaults to the linked project')
|
|
117
|
+
.option('-d, --description <text>', 'Long-form task description')
|
|
118
|
+
.option('--status <status>', 'Initial status')
|
|
119
|
+
.option('--priority <priority>', 'low, normal, high, or urgent')
|
|
120
|
+
.option('--type <type>', 'Task type')
|
|
121
|
+
.option('--assignee <assignee>', 'Assignee')
|
|
122
|
+
.option('--labels <labels>', 'Comma-separated labels')
|
|
123
|
+
.option('--area <area>', 'Subsystem area')
|
|
124
|
+
.option('--parent <task-id>', 'Parent task ID')
|
|
125
|
+
.option('--due-at <unix-ms>', 'Due time as a Unix timestamp in milliseconds')
|
|
126
|
+
.option('--json', 'Print the complete response as JSON')
|
|
127
|
+
.action(async (title, opts) => {
|
|
128
|
+
const args = compactRecord([
|
|
129
|
+
['project_id', resolveProjectRef(opts.project)],
|
|
130
|
+
['title', title],
|
|
131
|
+
['description', opts.description],
|
|
132
|
+
['status', opts.status],
|
|
133
|
+
['priority', opts.priority],
|
|
134
|
+
['type', opts.type],
|
|
135
|
+
['assignee', opts.assignee],
|
|
136
|
+
['labels', parseCommaList(opts.labels)],
|
|
137
|
+
['area', opts.area],
|
|
138
|
+
['parent_id', opts.parent],
|
|
139
|
+
['due_at', numberOption(opts.dueAt)],
|
|
140
|
+
]);
|
|
141
|
+
await runTaskTool('tasks_create', args, opts.json, printTaskMutation);
|
|
142
|
+
});
|
|
143
|
+
tasks
|
|
144
|
+
.command('update <task-id>')
|
|
145
|
+
.description('Update task fields or add a comment')
|
|
146
|
+
.option('-p, --project <project>', 'Project slug or ID; defaults to the linked project')
|
|
147
|
+
.option('--title <title>', 'New title')
|
|
148
|
+
.option('-d, --description <text>', 'New description')
|
|
149
|
+
.option('--status <status>', 'New status')
|
|
150
|
+
.option('--priority <priority>', 'New priority')
|
|
151
|
+
.option('--type <type>', 'New type')
|
|
152
|
+
.option('--assignee <assignee>', 'New assignee')
|
|
153
|
+
.option('--labels <labels>', 'Replacement comma-separated labels')
|
|
154
|
+
.option('--area <area>', 'New area; pass an empty string to clear')
|
|
155
|
+
.option('--parent <task-id>', 'New parent; pass an empty string to detach')
|
|
156
|
+
.option('--due-at <unix-ms>', 'Due time as a Unix timestamp in milliseconds')
|
|
157
|
+
.option('--status-note <text>', 'Overwrite the current status note')
|
|
158
|
+
.option('--health <health>', 'on_track, at_risk, or off_track')
|
|
159
|
+
.option('--comment <text>', 'Append an evidence comment')
|
|
160
|
+
.option('--resolution-note <text>', 'Resolution note when closing the task')
|
|
161
|
+
.option('--shipped-in <version>', 'Release/version tag this task shipped in')
|
|
162
|
+
.option('--deployment-project <project>', 'Project owning --deployment-version')
|
|
163
|
+
.option('--deployment-version <version>', 'Verified production version to link')
|
|
164
|
+
.option('--json', 'Print the complete response as JSON')
|
|
165
|
+
.action(async (taskId, opts) => {
|
|
166
|
+
const args = compactRecord([
|
|
167
|
+
['project_id', resolveProjectRef(opts.project)],
|
|
168
|
+
['task_id', taskId],
|
|
169
|
+
['title', opts.title],
|
|
170
|
+
['description', opts.description],
|
|
171
|
+
['status', opts.status],
|
|
172
|
+
['priority', opts.priority],
|
|
173
|
+
['type', opts.type],
|
|
174
|
+
['assignee', opts.assignee],
|
|
175
|
+
['labels', parseCommaList(opts.labels)],
|
|
176
|
+
['area', opts.area],
|
|
177
|
+
['parent_id', opts.parent],
|
|
178
|
+
['due_at', numberOption(opts.dueAt)],
|
|
179
|
+
['status_note', opts.statusNote],
|
|
180
|
+
['health', opts.health],
|
|
181
|
+
['comment', opts.comment],
|
|
182
|
+
['resolution_note', opts.resolutionNote],
|
|
183
|
+
['shipped_in', opts.shippedIn],
|
|
184
|
+
['deployment_project_id', opts.deploymentProject],
|
|
185
|
+
['deployment_version', numberOption(opts.deploymentVersion)],
|
|
186
|
+
]);
|
|
187
|
+
if (Object.keys(args).length === 2) {
|
|
188
|
+
error('No update supplied. Pass a field such as --status, --status-note, or --comment.');
|
|
189
|
+
process.exitCode = 1;
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
await runTaskTool('tasks_update', args, opts.json, printTaskMutation);
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/commands/tasks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EACL,aAAa,EACb,QAAQ,EACR,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,GACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAyC/E,SAAS,YAAY,CAAC,KAAyB;IAC7C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,IAAI,CAAC,CAAC;IACzF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACzF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ;YACjD,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;YAClD,CAAC,CAAC,GAAG,CAAC;QACR,OAAO;YACL,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG;YAC3C,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG;YACnD,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG;YACvD,OAAO;SACR,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO;IACT,CAAC;IACD,MAAM,EAAE,GAAG,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,IAAI,cAAc,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5G,IAAI,EAAE;QAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,IAAY,EACZ,IAA6B,EAC7B,IAAyB,EACzB,OAAiC;IAEjC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,IAAI,IAAI;YAAE,SAAS,CAAC,KAAK,CAAC,CAAC;;YACtB,OAAO,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,+CAA+C,CAAC,CAAC;IAEhE,KAAK;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,YAAY,CAAC;SACzB,MAAM,CAAC,yBAAyB,EAAE,oDAAoD,CAAC;SACvF,MAAM,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;SAC/C,MAAM,CAAC,uBAAuB,EAAE,oBAAoB,CAAC;SACrD,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;SACzC,MAAM,CAAC,oBAAoB,EAAE,uDAAuD,CAAC;SACrF,MAAM,CAAC,oBAAoB,EAAE,qCAAqC,CAAC;SACnE,MAAM,CAAC,UAAU,EAAE,iCAAiC,CAAC;SACrD,MAAM,CAAC,SAAS,EAAE,8BAA8B,CAAC;SACjD,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;SACpD,MAAM,CAAC,eAAe,EAAE,uCAAuC,CAAC;SAChE,MAAM,CAAC,QAAQ,EAAE,8BAA8B,CAAC;SAChD,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC;SACrC,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC;SACtC,MAAM,CAAC,QAAQ,EAAE,qCAAqC,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,IAAqB,EAAE,EAAE;QACtC,MAAM,IAAI,GAAG,aAAa,CAAC;YACzB,CAAC,YAAY,EAAE,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/C,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC;YACvB,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC;YAC3B,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;YACnB,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC;YAC1B,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC;YACjB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC;YACvB,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;YACrB,CAAC,YAAY,EAAE,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC5C,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;YACnB,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YAC1C,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SACtC,CAAC,CAAC;QACH,MAAM,WAAW,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;YACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;;gBACzD,KAAK,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC,yBAAyB,EAAE,oDAAoD,CAAC;SACvF,MAAM,CAAC,QAAQ,EAAE,qCAAqC,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAoB,EAAE,EAAE;QACrD,MAAM,WAAW,CAAC,WAAW,EAAE;YAC7B,UAAU,EAAE,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;YAC3C,OAAO,EAAE,MAAM;SAChB,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,yCAAyC,CAAC;SACtD,MAAM,CAAC,yBAAyB,EAAE,oDAAoD,CAAC;SACvF,MAAM,CAAC,0BAA0B,EAAE,4BAA4B,CAAC;SAChE,MAAM,CAAC,mBAAmB,EAAE,gBAAgB,CAAC;SAC7C,MAAM,CAAC,uBAAuB,EAAE,8BAA8B,CAAC;SAC/D,MAAM,CAAC,eAAe,EAAE,WAAW,CAAC;SACpC,MAAM,CAAC,uBAAuB,EAAE,UAAU,CAAC;SAC3C,MAAM,CAAC,mBAAmB,EAAE,wBAAwB,CAAC;SACrD,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;SACzC,MAAM,CAAC,oBAAoB,EAAE,gBAAgB,CAAC;SAC9C,MAAM,CAAC,oBAAoB,EAAE,8CAA8C,CAAC;SAC5E,MAAM,CAAC,QAAQ,EAAE,qCAAqC,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,IAAsB,EAAE,EAAE;QACtD,MAAM,IAAI,GAAG,aAAa,CAAC;YACzB,CAAC,YAAY,EAAE,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/C,CAAC,OAAO,EAAE,KAAK,CAAC;YAChB,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC;YACjC,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC;YACvB,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC;YAC3B,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;YACnB,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC;YAC3B,CAAC,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;YACnB,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC;YAC1B,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACrC,CAAC,CAAC;QACH,MAAM,WAAW,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,yBAAyB,EAAE,oDAAoD,CAAC;SACvF,MAAM,CAAC,iBAAiB,EAAE,WAAW,CAAC;SACtC,MAAM,CAAC,0BAA0B,EAAE,iBAAiB,CAAC;SACrD,MAAM,CAAC,mBAAmB,EAAE,YAAY,CAAC;SACzC,MAAM,CAAC,uBAAuB,EAAE,cAAc,CAAC;SAC/C,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC;SACnC,MAAM,CAAC,uBAAuB,EAAE,cAAc,CAAC;SAC/C,MAAM,CAAC,mBAAmB,EAAE,oCAAoC,CAAC;SACjE,MAAM,CAAC,eAAe,EAAE,yCAAyC,CAAC;SAClE,MAAM,CAAC,oBAAoB,EAAE,4CAA4C,CAAC;SAC1E,MAAM,CAAC,oBAAoB,EAAE,8CAA8C,CAAC;SAC5E,MAAM,CAAC,sBAAsB,EAAE,mCAAmC,CAAC;SACnE,MAAM,CAAC,mBAAmB,EAAE,iCAAiC,CAAC;SAC9D,MAAM,CAAC,kBAAkB,EAAE,4BAA4B,CAAC;SACxD,MAAM,CAAC,0BAA0B,EAAE,uCAAuC,CAAC;SAC3E,MAAM,CAAC,wBAAwB,EAAE,0CAA0C,CAAC;SAC5E,MAAM,CAAC,gCAAgC,EAAE,qCAAqC,CAAC;SAC/E,MAAM,CAAC,gCAAgC,EAAE,qCAAqC,CAAC;SAC/E,MAAM,CAAC,QAAQ,EAAE,qCAAqC,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAA2C,EAAE,EAAE;QAC5E,MAAM,IAAI,GAAG,aAAa,CAAC;YACzB,CAAC,YAAY,EAAE,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/C,CAAC,SAAS,EAAE,MAAM,CAAC;YACnB,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;YACrB,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC;YACjC,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC;YACvB,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC;YAC3B,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;YACnB,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC;YAC3B,CAAC,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;YACnB,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC;YAC1B,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC;YAChC,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC;YACvB,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;YACzB,CAAC,iBAAiB,EAAE,IAAI,CAAC,cAAc,CAAC;YACxC,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC;YAC9B,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,CAAC;YACjD,CAAC,oBAAoB,EAAE,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;SAC7D,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,KAAK,CAAC,iFAAiF,CAAC,CAAC;YACzF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,WAAW,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { callPlatformTool } from '../lib/platform-tools.js';
|
|
2
|
+
import { compactRecord, isRecord, unwrapPlatformData, } from '../lib/platform-command.js';
|
|
3
|
+
import { error, printJson, table } from '../lib/output.js';
|
|
4
|
+
function displayCost(cents) {
|
|
5
|
+
return typeof cents === 'number' ? `$${(cents / 100).toFixed(2)}` : '—';
|
|
6
|
+
}
|
|
7
|
+
export function registerUsage(program) {
|
|
8
|
+
program
|
|
9
|
+
.command('usage [project]')
|
|
10
|
+
.description('Show deploy, AI, proxy, and email usage for one project or the account')
|
|
11
|
+
.option('--period <period>', 'Time period such as 7d or 30d', '30d')
|
|
12
|
+
.option('--json', 'Print the complete response as JSON')
|
|
13
|
+
.action(async (project, opts) => {
|
|
14
|
+
try {
|
|
15
|
+
const value = await callPlatformTool('usage_summary', compactRecord([
|
|
16
|
+
['project_id', project],
|
|
17
|
+
['period', opts.period],
|
|
18
|
+
]), { allTools: true });
|
|
19
|
+
if (opts.json) {
|
|
20
|
+
printJson(value);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const data = unwrapPlatformData(value);
|
|
24
|
+
const dataRecord = isRecord(data) ? data : null;
|
|
25
|
+
const totals = dataRecord && isRecord(dataRecord.totals) ? dataRecord.totals : null;
|
|
26
|
+
if (!totals)
|
|
27
|
+
throw new Error('usage_summary returned an unexpected response.');
|
|
28
|
+
const period = dataRecord && typeof dataRecord.period === 'string'
|
|
29
|
+
? dataRecord.period
|
|
30
|
+
: opts.period ?? '30d';
|
|
31
|
+
table(['Metric', 'Value'], [
|
|
32
|
+
['Period', period],
|
|
33
|
+
['Deploys', String(totals.deploys ?? 0)],
|
|
34
|
+
['AI calls', String(totals.ai_calls ?? 0)],
|
|
35
|
+
['AI cost', displayCost(totals.ai_cost_cents)],
|
|
36
|
+
['API proxy cost', displayCost(totals.api_proxy_cost_cents)],
|
|
37
|
+
['Emails sent', String(totals.emails_sent ?? 0)],
|
|
38
|
+
]);
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
error(err instanceof Error ? err.message : String(err));
|
|
42
|
+
process.exitCode = 1;
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/commands/usage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EACL,aAAa,EACb,QAAQ,EACR,kBAAkB,GACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAO3D,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO;SACJ,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,wEAAwE,CAAC;SACrF,MAAM,CAAC,mBAAmB,EAAE,+BAA+B,EAAE,KAAK,CAAC;SACnE,MAAM,CAAC,QAAQ,EAAE,qCAAqC,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,OAA2B,EAAE,IAAkB,EAAE,EAAE;QAChE,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,eAAe,EAAE,aAAa,CAAC;gBAClE,CAAC,YAAY,EAAE,OAAO,CAAC;gBACvB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC;aACxB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACxB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,SAAS,CAAC,KAAK,CAAC,CAAC;gBACjB,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACvC,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAChD,MAAM,MAAM,GAAG,UAAU,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YACpF,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;YAC/E,MAAM,MAAM,GAAG,UAAU,IAAI,OAAO,UAAU,CAAC,MAAM,KAAK,QAAQ;gBAChE,CAAC,CAAC,UAAU,CAAC,MAAM;gBACnB,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;YACzB,KAAK,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE;gBACzB,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAClB,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;gBACxC,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;gBAC1C,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;gBAC9C,CAAC,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;gBAC5D,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;aACjD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -30,8 +30,14 @@ import { registerFs } from './commands/fs.js';
|
|
|
30
30
|
import { registerMcp } from './commands/mcp.js';
|
|
31
31
|
import { registerSwpx } from './commands/swpx.js';
|
|
32
32
|
import { registerUpdate } from './commands/update.js';
|
|
33
|
+
import { registerCall } from './commands/call.js';
|
|
34
|
+
import { registerTasks } from './commands/tasks.js';
|
|
35
|
+
import { registerFeedback } from './commands/feedback.js';
|
|
36
|
+
import { registerGrep } from './commands/grep.js';
|
|
37
|
+
import { registerUsage } from './commands/usage.js';
|
|
38
|
+
import { registerGit } from './commands/git.js';
|
|
33
39
|
import { collectNotices } from './lib/notify/index.js';
|
|
34
|
-
import { printJsonError, setJsonOutputMode, stripAnsi } from './lib/output.js';
|
|
40
|
+
import { error, printJsonError, setJsonOutputMode, stripAnsi } from './lib/output.js';
|
|
35
41
|
const pkg = JSON.parse(readFileSync(join(dirname(fileURLToPath(import.meta.url)), '..', 'package.json'), 'utf8'));
|
|
36
42
|
const program = new Command()
|
|
37
43
|
.name('somewhere')
|
|
@@ -76,6 +82,12 @@ registerFs(program);
|
|
|
76
82
|
registerMcp(program);
|
|
77
83
|
registerSwpx(program);
|
|
78
84
|
registerUpdate(program);
|
|
85
|
+
registerCall(program);
|
|
86
|
+
registerTasks(program);
|
|
87
|
+
registerFeedback(program);
|
|
88
|
+
registerGrep(program);
|
|
89
|
+
registerUsage(program);
|
|
90
|
+
registerGit(program);
|
|
79
91
|
// User-notification pipeline (update-available, advisories, announcements…).
|
|
80
92
|
// Centrally gated to interactive, non-CI, non-pass-through commands and emitted to
|
|
81
93
|
// STDERR as a parting line AFTER the command — never stdout, agent, or swpx/swpm
|
|
@@ -101,6 +113,10 @@ catch (err) {
|
|
|
101
113
|
process.exitCode = err.exitCode || 1;
|
|
102
114
|
}
|
|
103
115
|
}
|
|
116
|
+
else if (err instanceof Error) {
|
|
117
|
+
error(err.message);
|
|
118
|
+
process.exitCode = 1;
|
|
119
|
+
}
|
|
104
120
|
else {
|
|
105
121
|
throw err;
|
|
106
122
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { loadProjectConfig } from './config.js';
|
|
2
|
+
export function resolveProjectRef(explicit) {
|
|
3
|
+
if (explicit)
|
|
4
|
+
return explicit;
|
|
5
|
+
const config = loadProjectConfig();
|
|
6
|
+
if (config?.project_id)
|
|
7
|
+
return config.project_id;
|
|
8
|
+
throw new Error('No project. Pass --project <slug-or-id> or run from a linked directory.');
|
|
9
|
+
}
|
|
10
|
+
export function isRecord(value) {
|
|
11
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
12
|
+
}
|
|
13
|
+
export function unwrapPlatformData(value) {
|
|
14
|
+
if (isRecord(value) && value.ok === true && 'data' in value)
|
|
15
|
+
return value.data;
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
export function compactRecord(entries) {
|
|
19
|
+
return Object.fromEntries(entries.filter(([, value]) => value !== undefined));
|
|
20
|
+
}
|
|
21
|
+
export function parseCommaList(value) {
|
|
22
|
+
if (value === undefined)
|
|
23
|
+
return undefined;
|
|
24
|
+
return value.split(',').map((item) => item.trim()).filter(Boolean);
|
|
25
|
+
}
|
|
26
|
+
export function truncateText(value, max = 72) {
|
|
27
|
+
if (typeof value !== 'string' || value.length === 0)
|
|
28
|
+
return '—';
|
|
29
|
+
const flat = value.replace(/\s+/g, ' ').trim();
|
|
30
|
+
return flat.length > max ? `${flat.slice(0, max - 1)}…` : flat;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=platform-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-command.js","sourceRoot":"","sources":["../../src/lib/platform-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,UAAU,iBAAiB,CAAC,QAA4B;IAC5D,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,IAAI,MAAM,EAAE,UAAU;QAAE,OAAO,MAAM,CAAC,UAAU,CAAC;IACjD,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IAC/E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,OAAiC;IAEjC,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAyB;IACtD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc,EAAE,GAAG,GAAG,EAAE;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAChE,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { ApiClient } from './client.js';
|
|
2
|
+
import { getToken, loadConfig } from './config.js';
|
|
3
|
+
const MCP_BASE_URL = process.env.SOMEWHERE_MCP_URL?.replace(/\/$/, '') || 'https://mcp.somewhere.tech/mcp';
|
|
4
|
+
let isSdkAuthError = () => false;
|
|
5
|
+
export class PlatformToolError extends Error {
|
|
6
|
+
tool;
|
|
7
|
+
constructor(tool, message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.tool = tool;
|
|
10
|
+
this.name = 'PlatformToolError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function mcpUrl(allTools) {
|
|
14
|
+
const url = new URL(MCP_BASE_URL);
|
|
15
|
+
if (allTools)
|
|
16
|
+
url.searchParams.set('groups', 'all');
|
|
17
|
+
return url;
|
|
18
|
+
}
|
|
19
|
+
export function mcpAccessExpiresSoon() {
|
|
20
|
+
const config = loadConfig();
|
|
21
|
+
if (!config?.refresh_token || !config.access_expires_at)
|
|
22
|
+
return false;
|
|
23
|
+
const expiresAt = Date.parse(config.access_expires_at);
|
|
24
|
+
return Number.isFinite(expiresAt) && expiresAt <= Date.now() + 60_000;
|
|
25
|
+
}
|
|
26
|
+
/** Reuse ApiClient's canonical cli-pair rotation and persistence path. */
|
|
27
|
+
export async function refreshMcpAccessToken(preemptive) {
|
|
28
|
+
const token = getToken();
|
|
29
|
+
const client = new ApiClient(token);
|
|
30
|
+
if (preemptive) {
|
|
31
|
+
const refreshed = await client.refreshAccessKey(10_000);
|
|
32
|
+
if (!refreshed) {
|
|
33
|
+
throw new Error('Session renewal returned an incomplete credential pair.');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
await client.call('GET', '/auth/whoami', undefined, undefined, { timeoutMs: 10_000 });
|
|
38
|
+
}
|
|
39
|
+
return getToken();
|
|
40
|
+
}
|
|
41
|
+
export function isMcpAuthRejection(err) {
|
|
42
|
+
if (isSdkAuthError(err))
|
|
43
|
+
return true;
|
|
44
|
+
if (!(err instanceof Error))
|
|
45
|
+
return false;
|
|
46
|
+
const candidate = err;
|
|
47
|
+
return candidate.code === 401;
|
|
48
|
+
}
|
|
49
|
+
export async function createPlatformMcpTransport(token, options = {}) {
|
|
50
|
+
const [{ StreamableHTTPClientTransport, StreamableHTTPError }, { UnauthorizedError }] = await Promise.all([
|
|
51
|
+
import('@modelcontextprotocol/sdk/client/streamableHttp.js'),
|
|
52
|
+
import('@modelcontextprotocol/sdk/client/auth.js'),
|
|
53
|
+
]);
|
|
54
|
+
isSdkAuthError = (err) => err instanceof UnauthorizedError
|
|
55
|
+
|| (err instanceof StreamableHTTPError && err.code === 401);
|
|
56
|
+
return new StreamableHTTPClientTransport(mcpUrl(options.allTools === true), {
|
|
57
|
+
requestInit: {
|
|
58
|
+
headers: {
|
|
59
|
+
Authorization: `Bearer ${token}`,
|
|
60
|
+
...(options.userAgent ? { 'User-Agent': options.userAgent } : {}),
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
async function connectClient(token, options) {
|
|
66
|
+
const { Client } = await import('@modelcontextprotocol/sdk/client/index.js');
|
|
67
|
+
const client = new Client({ name: 'somewhere-cli', version: 'unknown' });
|
|
68
|
+
const transport = await createPlatformMcpTransport(token, {
|
|
69
|
+
...options,
|
|
70
|
+
userAgent: 'somewhere-cli',
|
|
71
|
+
});
|
|
72
|
+
await client.connect(transport);
|
|
73
|
+
return {
|
|
74
|
+
client,
|
|
75
|
+
close: async () => {
|
|
76
|
+
await client.close().catch(() => { });
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
async function withPlatformClient(options, operation) {
|
|
81
|
+
let token = getToken();
|
|
82
|
+
if (mcpAccessExpiresSoon())
|
|
83
|
+
token = await refreshMcpAccessToken(true);
|
|
84
|
+
const attempt = async (accessToken) => {
|
|
85
|
+
const connection = await connectClient(accessToken, options);
|
|
86
|
+
try {
|
|
87
|
+
return await operation(connection.client);
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
await connection.close();
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
try {
|
|
94
|
+
return await attempt(token);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
if (!isMcpAuthRejection(err))
|
|
98
|
+
throw err;
|
|
99
|
+
}
|
|
100
|
+
token = await refreshMcpAccessToken(false);
|
|
101
|
+
return attempt(token);
|
|
102
|
+
}
|
|
103
|
+
export async function listPlatformTools(options = {}) {
|
|
104
|
+
return withPlatformClient(options, async (client) => {
|
|
105
|
+
const result = await client.listTools();
|
|
106
|
+
return result.tools;
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
function textFromResult(result) {
|
|
110
|
+
return result.content
|
|
111
|
+
.filter((block) => block.type === 'text')
|
|
112
|
+
.map((block) => block.text)
|
|
113
|
+
.join('\n');
|
|
114
|
+
}
|
|
115
|
+
function toolErrorMessage(text) {
|
|
116
|
+
try {
|
|
117
|
+
const parsed = JSON.parse(text);
|
|
118
|
+
const message = typeof parsed.message === 'string' ? parsed.message : text;
|
|
119
|
+
const code = typeof parsed.error === 'string' ? `${parsed.error}: ` : '';
|
|
120
|
+
const next = typeof parsed.next_step === 'string'
|
|
121
|
+
? parsed.next_step
|
|
122
|
+
: typeof parsed.hint === 'string'
|
|
123
|
+
? parsed.hint
|
|
124
|
+
: null;
|
|
125
|
+
return `${code}${message}${next ? ` Next: ${next}` : ''}`;
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return text;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
export async function callPlatformToolRaw(name, args, options = {}) {
|
|
132
|
+
const result = await withPlatformClient(options, (client) => client.callTool({ name, arguments: args }));
|
|
133
|
+
const typed = result;
|
|
134
|
+
if (typed.isError) {
|
|
135
|
+
throw new PlatformToolError(name, toolErrorMessage(textFromResult(typed)));
|
|
136
|
+
}
|
|
137
|
+
return typed;
|
|
138
|
+
}
|
|
139
|
+
export function platformToolResultValue(result) {
|
|
140
|
+
if (result.structuredContent !== undefined)
|
|
141
|
+
return result.structuredContent;
|
|
142
|
+
const text = textFromResult(result);
|
|
143
|
+
if (text) {
|
|
144
|
+
try {
|
|
145
|
+
return JSON.parse(text);
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return text;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return result.content;
|
|
152
|
+
}
|
|
153
|
+
export async function callPlatformTool(name, args, options = {}) {
|
|
154
|
+
return platformToolResultValue(await callPlatformToolRaw(name, args, options));
|
|
155
|
+
}
|
|
156
|
+
export async function callPlatformHelpTool(name, args) {
|
|
157
|
+
const result = await callPlatformToolRaw(name, args);
|
|
158
|
+
const text = textFromResult(result);
|
|
159
|
+
if (!text)
|
|
160
|
+
throw new PlatformToolError(name, `${name} returned an empty response.`);
|
|
161
|
+
return text;
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=platform-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-tools.js","sourceRoot":"","sources":["../../src/lib/platform-tools.ts"],"names":[],"mappings":"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"}
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@somewhere-tech/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.28.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@somewhere-tech/cli",
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.28.0",
|
|
10
10
|
"bundleDependencies": [
|
|
11
11
|
"@modelcontextprotocol/sdk",
|
|
12
12
|
"chokidar",
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@somewhere-tech/cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "CLI for somewhere.tech
|
|
3
|
+
"version": "0.28.0",
|
|
4
|
+
"description": "CLI for somewhere.tech — auth, projects, deploy, pull, promote, db, logs, env, MCP bridge.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"somewhere",
|
|
7
7
|
"somewhere.tech",
|