@goliapkg/sentori-cli 1.6.0 → 1.8.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/lib/web.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"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"}
package/lib/workflow.d.ts CHANGED
@@ -3,6 +3,7 @@ export type UploadConfig = {
3
3
  version: 1;
4
4
  apiUrl: string;
5
5
  tokenEnv: string;
6
+ projectId?: string;
6
7
  release?: string;
7
8
  artifacts: {
8
9
  sourcemap?: string[];
@@ -21,6 +22,7 @@ export type UploadPlan = {
21
22
  release: string;
22
23
  apiUrl: string;
23
24
  tokenEnv: string;
25
+ projectId?: string;
24
26
  files: {
25
27
  kind: UploadOpts['kind'];
26
28
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"AASA,OAAO,EAAwC,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AAGnF,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,CAAC,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;IACxE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACnF,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AACD,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE;QAAE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC9F,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC5D,CAAA;AAMD,eAAO,MAAM,aAAa,qwCAiBzB,CAAA;AAMD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAuB3D;AAeD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,UAAU,CAkDxI;AACD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAWzF;AACD,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAkEhI;AACD,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAepE"}
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"AAUA,OAAO,EAAwC,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AAGnF,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,CAAC,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;IACxE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACnF,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AACD,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE;QAAE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC9F,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC5D,CAAA;AAMD,eAAO,MAAM,aAAa,qwCAiBzB,CAAA;AAMD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAwB3D;AAeD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,UAAU,CAkDxI;AACD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAWzF;AACD,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAoEhI;AACD,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAepE"}
package/lib/workflow.js CHANGED
@@ -3,6 +3,7 @@ import { existsSync, lstatSync, mkdirSync, readFileSync, writeFileSync } from 'n
3
3
  import { basename, dirname, resolve } from 'node:path';
4
4
  import { gunzipSync } from 'node:zlib';
5
5
  import { parseArgs } from 'node:util';
6
+ import { showProject } from './apps.js';
6
7
  import { fetchArtifacts } from './artifacts.js';
7
8
  import { checkCompatibility } from './compatibility.js';
8
9
  import { dwarfBinariesIn } from './native-artifacts.js';
@@ -44,7 +45,7 @@ export function loadUploadConfig(path) {
44
45
  throw new Error('config requires version: 1, apiUrl, and artifacts; run sentori init');
45
46
  if (Object.hasOwn(value, 'token'))
46
47
  throw new Error('store the API token in the environment and set tokenEnv, not token in the config');
47
- const allowed = new Set(['version', 'apiUrl', 'tokenEnv', 'release', 'artifacts', 'sources', 'sourceArchive']);
48
+ const allowed = new Set(['version', 'apiUrl', 'tokenEnv', 'projectId', 'release', 'artifacts', 'sources', 'sourceArchive']);
48
49
  for (const key of Object.keys(value))
49
50
  if (!allowed.has(key))
50
51
  throw new Error(`unknown config field: ${key}`);
@@ -53,6 +54,8 @@ export function loadUploadConfig(path) {
53
54
  throw new Error(`unknown artifact kind ${kind}; use sourcemap, dsym, or mapping`);
54
55
  strings(paths, `artifacts.${kind}`);
55
56
  }
57
+ if (value.projectId !== undefined && (typeof value.projectId !== 'string' || !/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value.projectId)))
58
+ throw new Error('projectId must be the expected Project UUID');
56
59
  if (value.release !== undefined && (typeof value.release !== 'string' || !value.release.trim()))
57
60
  throw new Error('release must be a non-empty string');
58
61
  if (value.sourceArchive !== undefined && typeof value.sourceArchive !== 'string')
@@ -102,7 +105,7 @@ export function prepareUploadPlan(configPath, overrides = {}) {
102
105
  const release = overrides.release ?? process.env.SENTORI_RELEASE ?? config.release;
103
106
  if (!release?.trim())
104
107
  throw new Error('set --release, SENTORI_RELEASE, or config.release to the exact SDK release');
105
- const plan = { release, apiUrl: apiUrl(overrides.apiUrl ?? process.env.SENTORI_API_URL ?? config.apiUrl), tokenEnv: config.tokenEnv, files: [] };
108
+ const plan = { release, apiUrl: apiUrl(overrides.apiUrl ?? process.env.SENTORI_API_URL ?? config.apiUrl), tokenEnv: config.tokenEnv, ...(config.projectId ? { projectId: config.projectId } : {}), files: [] };
106
109
  const add = (kind, path, name = basename(path)) => {
107
110
  let bytes = readFileSync(path);
108
111
  if (bytes[0] === 0x1f && bytes[1] === 0x8b) {
@@ -210,6 +213,7 @@ export async function runWorkflow(command, argv) {
210
213
  const token = process.env[config.tokenEnv];
211
214
  if (!token)
212
215
  throw new Error(`set ${config.tokenEnv} to an API-scope token`);
216
+ await verifyProject({ apiUrl: apiUrl(parsed.values['api-url'] ?? process.env.SENTORI_API_URL ?? config.apiUrl), projectId: config.projectId }, token);
213
217
  const result = await fetchArtifacts({
214
218
  apiUrl: apiUrl(parsed.values['api-url'] ?? process.env.SENTORI_API_URL ?? config.apiUrl), token,
215
219
  release: parsed.values.release ?? process.env.SENTORI_RELEASE ?? config.release ?? '__sentori_compatibility_check__',
@@ -227,6 +231,7 @@ export async function runWorkflow(command, argv) {
227
231
  const token = process.env[plan.tokenEnv];
228
232
  if (!token)
229
233
  throw new Error(`set ${plan.tokenEnv} to an API-scope token`);
234
+ await verifyProject(plan, token);
230
235
  // Check credentials before the first write. An unknown release is allowed.
231
236
  console.log(checkCompatibility(await fetchArtifacts({ ...plan, token }), plan.files.some(file => file.kind === 'srcbundle')));
232
237
  const failures = [];
@@ -286,4 +291,13 @@ export async function runSourcesPack(argv) {
286
291
  return 1;
287
292
  }
288
293
  }
294
+ async function verifyProject(config, token) {
295
+ if (!config.projectId)
296
+ return;
297
+ const { project } = await showProject({ apiUrl: config.apiUrl, token });
298
+ if (project.id.toLowerCase() !== config.projectId.toLowerCase()) {
299
+ throw new Error(`Project mismatch: expected ${config.projectId}, token belongs to ${project.id}. No files uploaded.`);
300
+ }
301
+ console.log(`Project verified: ${project.name} (${project.id})`);
302
+ }
289
303
  //# sourceMappingURL=workflow.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goliapkg/sentori-cli",
3
- "version": "1.6.0",
3
+ "version": "1.8.0",
4
4
  "description": "Sentori CLI \u2014 configure, upload and verify release debug files and source archives.",
5
5
  "license": "Apache-2.0 OR MIT",
6
6
  "author": "GOLIA K.K. <takagi@golia.jp> (https://golia.jp)",
@@ -0,0 +1,48 @@
1
+ import { expect, test } from 'bun:test'
2
+ import { listApps, showProject } from '../apps.js'
3
+
4
+ test('project and app discovery use the token scope and surface API failures', async () => {
5
+ const requests: string[] = []
6
+ const server = Bun.serve({
7
+ port: 0,
8
+ fetch(request) {
9
+ expect(request.headers.get('Authorization')).toBe('Bearer test-api-token')
10
+ const path = new URL(request.url).pathname
11
+ requests.push(path)
12
+ if (path === '/api/project') return Response.json({ project: { id: 'project-a', name: 'insight-dev-server' } })
13
+ return Response.json({ error: 'unavailable' }, { status: 503 })
14
+ },
15
+ })
16
+ try {
17
+ const config = { apiUrl: server.url.toString(), token: 'test-api-token' }
18
+ expect((await showProject(config)).project.name).toBe('insight-dev-server')
19
+ await expect(listApps(config)).rejects.toThrow('503')
20
+ expect(requests).toEqual(['/api/project', '/api/apps'])
21
+ } finally { await server.stop(true) }
22
+ })
23
+
24
+ test('discovery does not follow redirects to another service', async () => {
25
+ let targetRequests = 0
26
+ const target = Bun.serve({ port: 0, fetch() { targetRequests++; return Response.json({ apps: [] }) } })
27
+ const server = Bun.serve({ port: 0, fetch() { return Response.redirect(target.url.toString()) } })
28
+ try {
29
+ await expect(listApps({ apiUrl: server.url.toString(), token: 'private-token' })).rejects.toThrow()
30
+ expect(targetRequests).toBe(0)
31
+ } finally { await server.stop(true); await target.stop(true) }
32
+ })
33
+
34
+ test('CLI app list uses SENTORI_API_TOKEN and preserves JSON app identity', async () => {
35
+ const body = { projectId: 'project-a', apps: [{ id: 'api-app', kind: 'webapi', platform: 'javascript', identifier: 'api' }] }
36
+ const server = Bun.serve({ port: 0, fetch(request) {
37
+ if (request.headers.get('Authorization') !== 'Bearer scoped-token') return new Response('', { status: 401 })
38
+ return Response.json(body)
39
+ } })
40
+ try {
41
+ const child = Bun.spawn([process.execPath, new URL('../index.ts', import.meta.url).pathname, 'app', 'list', '--json', '--api-url', server.url.toString()], {
42
+ env: { ...process.env, SENTORI_API_TOKEN: 'scoped-token' }, stdout: 'pipe', stderr: 'pipe',
43
+ })
44
+ const output = await new Response(child.stdout).text()
45
+ expect(await child.exited).toBe(0)
46
+ expect(JSON.parse(output)).toEqual(body)
47
+ } finally { await server.stop(true) }
48
+ })
@@ -0,0 +1,48 @@
1
+ import { afterEach, expect, test } from 'bun:test'
2
+ import { runWeb } from '../web.js'
3
+ const original = globalThis.fetch
4
+ const args = ['--token','fixture','--api-url','https://monitor.test']
5
+ const reply = (body: unknown, status=200) => new Response(JSON.stringify(body), {status,headers:{'Content-Type':'application/json'}})
6
+ afterEach(()=>{globalThis.fetch=original})
7
+ test('performance filters are encoded and token is scoped', async()=>{
8
+ globalThis.fetch=(async(url,init)=>{
9
+ const u=new URL(String(url)); expect(u.pathname).toBe('/api/web/performance')
10
+ expect(u.searchParams.get('route')).toBe('/orders/:id');expect(u.searchParams.get('device')).toBe('mobile')
11
+ expect((init?.headers as Record<string,string>).Authorization).toBe('Bearer fixture')
12
+ return reply({visits:0})
13
+ }) as typeof fetch
14
+ expect(await runWeb(['performance',...args,'--app','app','--route','/orders/:id','--device','mobile'])).toBe(0)
15
+ })
16
+ test('project mismatch prevents a mutation',async()=>{
17
+ let calls=0
18
+ globalThis.fetch=(async()=>{calls++;return reply({project:{id:'other'}})}) as typeof fetch
19
+ expect(await runWeb(['run',...args,'--id','check','--project','expected'])).toBe(2)
20
+ expect(calls).toBe(1)
21
+ })
22
+ test('manual retries retain command ID and deployment trigger',async()=>{
23
+ const bodies: unknown[]=[]
24
+ globalThis.fetch=(async(_url,init)=>{bodies.push(JSON.parse(String(init?.body)));return reply({id:'run'})}) as typeof fetch
25
+ for(let i=0;i<2;i++) expect(await runWeb(['run',...args,'--id','check','--command-id','same-command','--trigger','deployment'])).toBe(0)
26
+ expect(bodies).toEqual(Array(2).fill({action:'run',commandId:'same-command',id:'check',trigger:'deployment'}))
27
+ })
28
+ test('strict distinguishes site failure, monitoring failure and successful runs',async()=>{
29
+ for(const [status,code] of [['passed',0],['failed',1],['error',2],['cancelled',2],['running',2]] as const){
30
+ globalThis.fetch=(async()=>reply({runs:[{id:'run',status}]})) as typeof fetch
31
+ expect(await runWeb(['runs',...args,'--app','app','--id','run','--strict'])).toBe(code)
32
+ expect(await runWeb(['runs',...args,'--app','app','--id','run'])).toBe(0)
33
+ }
34
+ })
35
+ test('wait reads the exact run and returns strict failure',async()=>{
36
+ globalThis.fetch=(async(url,init)=>{
37
+ if(init?.method==='POST')return reply({id:'exact-run'})
38
+ expect(new URL(String(url)).searchParams.get('id')).toBe('exact-run')
39
+ return reply({runs:[{id:'exact-run',status:'failed'}]})
40
+ }) as typeof fetch
41
+ expect(await runWeb(['run',...args,'--app','app','--id','check','--wait','--strict'])).toBe(1)
42
+ })
43
+ test('invalid mutation version and unscoped strict mode never reach transport',async()=>{
44
+ let calls=0;globalThis.fetch=(async()=>{calls++;return reply({})}) as typeof fetch
45
+ expect(await runWeb(['delete',...args,'--id','check','--version','NaN'])).toBe(2)
46
+ expect(await runWeb(['run',...args,'--id','check','--strict'])).toBe(2)
47
+ expect(calls).toBe(0)
48
+ })
@@ -1,6 +1,6 @@
1
1
  import { afterEach, beforeEach, describe, expect, test } from 'bun:test'
2
2
  import { createHash } from 'node:crypto'
3
- import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs'
3
+ import { mkdtempSync, mkdirSync, rmSync, readFileSync, writeFileSync } from 'node:fs'
4
4
  import { tmpdir } from 'node:os'
5
5
  import { join } from 'node:path'
6
6
  import { gunzipSync } from 'node:zlib'
@@ -100,3 +100,38 @@ describe('unified release upload', () => {
100
100
  })
101
101
 
102
102
  })
103
+
104
+ test('expected project prevents doctor, upload and verification from accepting another project token', async () => {
105
+ writeFileSync(join(root, 'mapping.txt'), 'A -> a:\n')
106
+ const path = config({ mapping: ['mapping.txt'] })
107
+ const projectId = '31a8f496-faf3-4448-af1d-0118b7b5c8cd'
108
+ writeFileSync(path, JSON.stringify({ ...JSON.parse(readFileSync(path, 'utf8')), projectId }))
109
+ const calls: string[] = []
110
+ globalThis.fetch = (async (url) => {
111
+ calls.push(String(url))
112
+ return reply({ project: { id: '019fb8cd-8eed-7fa3-8611-7851e3b1f9ea', name: 'wrong' } })
113
+ }) as typeof fetch
114
+ for (const command of ['doctor', 'upload', 'verify'] as const) {
115
+ expect(await runWorkflow(command, ['--config', path, '--strict'])).toBe(1)
116
+ }
117
+ expect(calls).toEqual(Array(3).fill('https://upload.test/api/project'))
118
+ calls.length = 0
119
+ expect(await runWorkflow('upload', ['--config', path, '--dry-run'])).toBe(0)
120
+ expect(calls).toEqual([])
121
+ })
122
+
123
+ test('matching project is verified before artifact compatibility and upload', async () => {
124
+ const path = config()
125
+ const projectId = '31a8f496-faf3-4448-af1d-0118b7b5c8cd'
126
+ writeFileSync(path, JSON.stringify({ ...JSON.parse(readFileSync(path, 'utf8')), projectId }))
127
+ const calls: string[] = []
128
+ globalThis.fetch = (async (url) => {
129
+ calls.push(String(url))
130
+ return String(url).endsWith('/api/project')
131
+ ? reply({ project: { id: projectId, name: 'home' } })
132
+ : reply({ release: 'app@1+7', known: false, artifacts: [], compatibility: { serverVersion: '5.1.17', artifactProtocol: 1, sourceBundleFormats: ['zip'], verification: ['sha256', 'format'] } })
133
+ }) as typeof fetch
134
+ expect(await runWorkflow('doctor', ['--config', path])).toBe(0)
135
+ expect(calls[0]).toBe('https://upload.test/api/project')
136
+ expect(calls).toHaveLength(2)
137
+ })
package/src/apps.ts ADDED
@@ -0,0 +1,31 @@
1
+ import type { ApiConfig } from './issue.js'
2
+
3
+ export type AppSummary = {
4
+ id: string
5
+ projectId: string
6
+ name: string | null
7
+ identifier: string
8
+ platform: string
9
+ kind: string
10
+ events24h: number
11
+ errors24h: number
12
+ releaseCount: number
13
+ }
14
+
15
+ async function read<T>(config: ApiConfig, path: string): Promise<T> {
16
+ const response = await fetch(`${config.apiUrl.replace(/\/+$/, '')}${path}`, {
17
+ headers: { Authorization: `Bearer ${config.token}` },
18
+ redirect: 'error',
19
+ signal: AbortSignal.timeout(30_000),
20
+ })
21
+ if (!response.ok) throw new Error(`Sentori API returned ${response.status}`)
22
+ return await response.json() as T
23
+ }
24
+
25
+ export function listApps(config: ApiConfig): Promise<{ projectId: string; apps: AppSummary[] }> {
26
+ return read(config, '/api/apps')
27
+ }
28
+
29
+ export function showProject(config: ApiConfig): Promise<{ project: { id: string; name: string; createdAt: string } }> {
30
+ return read(config, '/api/project')
31
+ }
package/src/index.ts CHANGED
@@ -1,7 +1,9 @@
1
1
  #!/usr/bin/env node
2
+ import { runWeb, WEB_HELP } from './web.js'
2
3
  import { parseArgs } from 'node:util'
3
4
  import { runWorkflow, runSourcesPack, WORKFLOW_HELP } from './workflow.js'
4
5
  import { checkCompatibility, CLI_VERSION } from './compatibility.js'
6
+ import { listApps, showProject } from './apps.js'
5
7
 
6
8
  import {
7
9
  fetchBundle,
@@ -26,7 +28,7 @@ import { reactNativeUpload } from './react-native.js'
26
28
  import { fetchArtifacts } from './artifacts.js'
27
29
  import { expandSourcemapPaths, uploadArtifact } from './upload.js'
28
30
 
29
- const HELP = `${WORKFLOW_HELP}\n\nsentori — Sentori command-line interface
31
+ const HELP = `${WEB_HELP}\n${WORKFLOW_HELP}\n\nsentori — Sentori command-line interface
30
32
 
31
33
  Symbolication artifacts (api-scope token; failures NEVER block your
32
34
  build — exit 0 with a friendly note unless --strict):
@@ -53,7 +55,10 @@ Regression tripwires (design: probes):
53
55
  registers them, so a silent probe is visibly alive.
54
56
 
55
57
  CI triage (the same /api surface an AI agent uses):
56
- sentori issue list [--status open] [--kind error]
58
+ sentori project show [--json] project selected by the API token
59
+ sentori app list [--json] apps within that project
60
+ sentori issue list [--status open] [--kind error] [--app <uuid>]
61
+ [--platform <platform>] [--environment <env>] [--release <release>] [--json]
57
62
  sentori issue resolve <issue-id> [--in-release <r>]
58
63
  sentori issue note <issue-id> --body "fixed in abc123"
59
64
  sentori issue bundle <issue-id>
@@ -66,7 +71,7 @@ Push (carried):
66
71
 
67
72
  Common options:
68
73
  --version installed CLI package version
69
- --token api-scope token (or $SENTORI_TOKEN)
74
+ --token api-scope token (or $SENTORI_API_TOKEN; legacy $SENTORI_TOKEN)
70
75
  --api-url instance URL (or $SENTORI_API_URL; default https://sentori.golia.jp)
71
76
  --strict upload commands: exit non-zero on failure
72
77
  `
@@ -80,7 +85,7 @@ function parseCommon(values: Record<string, unknown>): Common | null {
80
85
  return null
81
86
  }
82
87
  const token =
83
- (typeof values.token === 'string' ? values.token : undefined) ?? process.env.SENTORI_TOKEN
88
+ (typeof values.token === 'string' ? values.token : undefined) ?? process.env.SENTORI_API_TOKEN ?? process.env.SENTORI_TOKEN
84
89
  if (!token) {
85
90
  console.error('error: --token (or $SENTORI_TOKEN) is required')
86
91
  return null
@@ -98,6 +103,7 @@ type ApiOnly = { apiUrl: string; token: string }
98
103
  function parseApiCfg(values: Record<string, unknown>): ApiOnly | null {
99
104
  const token =
100
105
  (typeof values.token === 'string' ? values.token : undefined) ??
106
+ process.env.SENTORI_API_TOKEN ??
101
107
  process.env.SENTORI_ADMIN_TOKEN ??
102
108
  process.env.SENTORI_TOKEN
103
109
  if (!token) {
@@ -430,12 +436,37 @@ const ISSUE_OPTS = {
430
436
  token: { type: 'string' },
431
437
  } as const
432
438
 
439
+ async function cmdProjectApps(argv: string[], apps: boolean): Promise<number> {
440
+ try {
441
+ const { values } = parseArgs({ args: argv, options: { ...ISSUE_OPTS, json: { type: 'boolean' } } })
442
+ if (values.help) { console.log(HELP); return 0 }
443
+ const config = parseApiCfg(values)
444
+ if (!config) return 2
445
+ if (apps) {
446
+ const body = await listApps(config)
447
+ if (values.json) console.log(JSON.stringify(body, null, 2))
448
+ else {
449
+ console.log(`Project: ${body.projectId}`)
450
+ for (const app of body.apps) console.log(`${app.id} ${app.kind} ${(app.name ?? app.identifier) || '(unidentified)'} platform=${app.platform} identifier=${app.identifier || '(unknown)'}`)
451
+ if (!body.apps.length) console.log('(no apps)')
452
+ }
453
+ } else {
454
+ const body = await showProject(config)
455
+ console.log(values.json ? JSON.stringify(body, null, 2) : `${body.project.id} ${body.project.name}`)
456
+ }
457
+ return 0
458
+ } catch (error) {
459
+ console.error(`${apps ? 'app list' : 'project show'} failed: ${(error as Error).message}`)
460
+ return 1
461
+ }
462
+ }
463
+
433
464
  async function cmdIssueList(argv: string[]): Promise<number> {
434
465
  let parsed
435
466
  try {
436
467
  parsed = parseArgs({
437
468
  args: argv,
438
- options: { ...ISSUE_OPTS, kind: { type: 'string' }, status: { type: 'string' } },
469
+ options: { ...ISSUE_OPTS, kind: { type: 'string' }, status: { type: 'string' }, app: { type: 'string' }, platform: { type: 'string' }, environment: { type: 'string' }, release: { type: 'string' }, json: { type: 'boolean' } },
439
470
  })
440
471
  } catch (e) {
441
472
  console.error(`error: ${(e as Error).message}\n${HELP}`)
@@ -451,7 +482,12 @@ async function cmdIssueList(argv: string[]): Promise<number> {
451
482
  const rows = await listIssues(cfg, {
452
483
  kind: parsed.values.kind as string | undefined,
453
484
  status: (parsed.values.status as string | undefined) ?? 'open',
485
+ app: parsed.values.app,
486
+ platform: parsed.values.platform,
487
+ environment: parsed.values.environment,
488
+ release: parsed.values.release,
454
489
  })
490
+ if (parsed.values.json) { console.log(JSON.stringify({ issues: rows }, null, 2)); return 0 }
455
491
  if (rows.length === 0) {
456
492
  console.log('(no matching issues)')
457
493
  return 0
@@ -686,6 +722,9 @@ async function main(argv: string[]): Promise<number> {
686
722
  return 0
687
723
  }
688
724
  const [a, b, ...rest] = argv
725
+ if (a === 'web') return runWeb(argv.slice(1))
726
+ if (a === 'project' && b === 'show') return cmdProjectApps(rest, false)
727
+ if (a === 'app' && b === 'list') return cmdProjectApps(rest, true)
689
728
  if (a === 'init') return runWorkflow('init', argv.slice(1))
690
729
  if (a === 'doctor') return runWorkflow('doctor', argv.slice(1))
691
730
  if (a === 'verify') return runWorkflow('verify', argv.slice(1))
package/src/issue.ts CHANGED
@@ -39,11 +39,15 @@ async function apiFetch<T>(c: ApiConfig, path: string, init?: RequestInit): Prom
39
39
 
40
40
  export async function listIssues(
41
41
  c: ApiConfig,
42
- opts: { status?: string; kind?: string } = {},
42
+ opts: { status?: string; kind?: string; app?: string; platform?: string; environment?: string; release?: string } = {},
43
43
  ): Promise<Issue[]> {
44
44
  const q = new URLSearchParams()
45
45
  if (opts.status) q.set('status', opts.status)
46
46
  if (opts.kind) q.set('kind', opts.kind)
47
+ if (opts.app) q.set('app_id', opts.app)
48
+ if (opts.platform) q.set('platform', opts.platform)
49
+ if (opts.environment) q.set('environment', opts.environment)
50
+ if (opts.release) q.set('release', opts.release)
47
51
  const qs = q.toString()
48
52
  const body = await apiFetch<{ issues: Issue[] }>(c, `/api/issues${qs ? `?${qs}` : ''}`)
49
53
  return body.issues
package/src/web.ts ADDED
@@ -0,0 +1,88 @@
1
+ import { parseArgs } from 'node:util'
2
+ import { readFileSync } from 'node:fs'
3
+ import { randomUUID } from 'node:crypto'
4
+ import { showProject } from './apps.js'
5
+
6
+ export const WEB_HELP = `Web App monitoring (API token; all output is JSON):
7
+ sentori web performance --app <uuid> [--hours 24] [--route /template] [--device mobile|desktop]
8
+ [--release <r>] [--environment <env>]
9
+ sentori web checks --app <uuid>
10
+ sentori web create --config <check.json>
11
+ sentori web update --id <uuid> --version <n> --config <check.json>
12
+ sentori web delete --id <uuid> --version <n>
13
+ sentori web run --id <check-uuid> [--trigger manual|deployment] [--app <uuid> --wait --strict]
14
+ sentori web runs --app <uuid> [--id <run-uuid>] [--strict]
15
+ Mutations accept --command-id <uuid> for safe retries. --project <uuid> verifies the token's project.
16
+ Without --strict, findings do not change exit 0. Strict: 1=site failed, 2=monitor/API/timeout error.
17
+ Synthetic measurements are laboratory results; they are never real-user percentiles or INP.
18
+ `
19
+ type ObjectValue = Record<string, any>
20
+ export async function runWeb(argv: string[]): Promise<number> {
21
+ try {
22
+ const [command, ...args] = argv
23
+ if (command === '--help' || command === '-h') { console.log(WEB_HELP); return 0 }
24
+ const { values: v } = parseArgs({ args, options: {
25
+ help:{type:'boolean',short:'h'},json:{type:'boolean'},'api-url':{type:'string'},token:{type:'string'},app:{type:'string'},
26
+ hours:{type:'string'},route:{type:'string'},device:{type:'string'},release:{type:'string'},environment:{type:'string'},
27
+ id:{type:'string'},version:{type:'string'},config:{type:'string'},trigger:{type:'string'},wait:{type:'boolean'},strict:{type:'boolean'},
28
+ 'command-id':{type:'string'},project:{type:'string'},
29
+ } })
30
+ if (!command || v.help) { console.log(WEB_HELP); return 0 }
31
+ const token = v.token ?? process.env.SENTORI_API_TOKEN ?? process.env.SENTORI_TOKEN
32
+ const apiUrl = v['api-url'] ?? process.env.SENTORI_API_URL ?? 'https://sentori.golia.jp'
33
+ if (!token) throw new Error('Set SENTORI_API_TOKEN to the project API token')
34
+ if (v.project) {
35
+ const { project } = await showProject({apiUrl,token})
36
+ if (project.id !== v.project) throw new Error(`Project mismatch: expected ${v.project}, received ${project.id}`)
37
+ }
38
+ async function request(path: string, body?: unknown): Promise<ObjectValue> {
39
+ const response = await fetch(apiUrl.replace(/\/+$/, '') + path, { method:body ? 'POST':'GET',
40
+ headers:{Authorization:`Bearer ${token}`,'Content-Type':'application/json'},body:body?JSON.stringify(body):undefined,
41
+ redirect:'error',signal:AbortSignal.timeout(30_000) })
42
+ if (!response.ok) throw new Error(`Web monitoring API returned HTTP ${response.status}`)
43
+ return await response.json() as ObjectValue
44
+ }
45
+ const required = (key: 'app'|'id'|'version'|'config') => { if (!v[key]) throw new Error(`--${key} is required`); return v[key]! }
46
+ let result: ObjectValue
47
+ if (command === 'performance') {
48
+ const q = new URLSearchParams({app:required('app')})
49
+ for (const key of ['hours','route','device','release','environment'] as const) if(v[key]) q.set(key,v[key])
50
+ result = await request('/api/web/performance?' + q)
51
+ } else if (command === 'checks' || command === 'runs') {
52
+ const q = new URLSearchParams({app:required('app')}); if(v.id) q.set('id',v.id)
53
+ if (v.strict && (command !== 'runs' || !v.id)) throw new Error('--strict requires runs --id or run --wait')
54
+ result = await request(`/api/web/${command}?${q}`)
55
+ } else if (['create','update','delete','run'].includes(command)) {
56
+ if (v.strict && (command !== 'run' || !v.wait)) throw new Error('--strict requires run --wait')
57
+ if (v.wait) required('app')
58
+ const body: ObjectValue = {action:command,commandId:v['command-id'] ?? randomUUID()}
59
+ if(command !== 'create') body.id=required('id')
60
+ if(command === 'create' || command === 'update') body.configuration=JSON.parse(readFileSync(required('config'),'utf8'))
61
+ if(command === 'update' || command === 'delete') {
62
+ body.expectedVersion=Number(required('version'))
63
+ if (!Number.isSafeInteger(body.expectedVersion) || body.expectedVersion<1) throw new Error('--version must be a positive integer')
64
+ }
65
+ if(command === 'run') body.trigger=v.trigger ?? 'manual'
66
+ // Preserve this ID before sending: a transport failure may happen after the server commits.
67
+ console.error(`commandId=${body.commandId}`)
68
+ result = await request('/api/web/checks',body)
69
+ if(command === 'run' && v.wait) {
70
+ const end=Date.now()+330_000
71
+ while(Date.now()<end) {
72
+ const runs=await request('/api/web/runs?'+new URLSearchParams({app:v.app!,id:result.id}))
73
+ const run=runs.runs?.[0]
74
+ if(run && !['queued','running'].includes(run.status)) { result=runs; break }
75
+ await new Promise(resolve=>setTimeout(resolve,2000))
76
+ }
77
+ if(!result.runs) throw new Error(`Run ${result.id} did not finish before the wait timeout; inspect it with web runs`)
78
+ }
79
+ } else throw new Error('Unknown web command; use sentori web --help')
80
+ console.log(JSON.stringify(result,null,2))
81
+ if(v.strict) {
82
+ const run=result.runs?.[0]
83
+ if(!run || ['error','cancelled','queued','running'].includes(run.status)) return 2
84
+ return run.status==='failed'?1:0
85
+ }
86
+ return 0
87
+ } catch(error) { console.error((error as Error).message); return 2 }
88
+ }