@sente-labs/cli 0.7.0 → 0.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/dist/commands/appGraph.js +110 -0
- package/dist/commands/appGraph.js.map +1 -0
- package/dist/commands/project.js +95 -0
- package/dist/commands/project.js.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/skill/SKILL.md +52 -5
- package/package.json +1 -1
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.registerAppGraphCommands = registerAppGraphCommands;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const client_1 = require("../client");
|
|
39
|
+
const config_1 = require("../config");
|
|
40
|
+
const output_1 = require("../output");
|
|
41
|
+
/**
|
|
42
|
+
* App-graph commands. The app graph is a source-derived route map (routes +
|
|
43
|
+
* navigation edges) that the customer's coding agent generates from the repo at
|
|
44
|
+
* onboarding; the browser agent consults it to localize ("what page am I on,
|
|
45
|
+
* what's reachable, which controls leave this page"). The agent authors the JSON
|
|
46
|
+
* by reading the repo (see the skill's "Generating the app map" recipe); these
|
|
47
|
+
* commands upload and inspect it.
|
|
48
|
+
*/
|
|
49
|
+
function registerAppGraphCommands(program, globalOpts) {
|
|
50
|
+
const appGraph = program.command('app-graph').description('App-graph: source-derived route map for the browser agent');
|
|
51
|
+
appGraph
|
|
52
|
+
.command('push')
|
|
53
|
+
.description('Upload a generated app-graph JSON for a project')
|
|
54
|
+
.requiredOption('--from <file>', 'JSON file containing the app graph')
|
|
55
|
+
.option('--project <id>', 'project id (overrides .sente/config.json)')
|
|
56
|
+
.action(async (cmdOpts) => {
|
|
57
|
+
const opts = globalOpts();
|
|
58
|
+
try {
|
|
59
|
+
const projectId = cmdOpts.project ?? (0, config_1.readLocalProjectId)();
|
|
60
|
+
if (!projectId) {
|
|
61
|
+
throw new Error('No project id found. Pass --project <id> or run `sente init` to create a .sente/config.json.');
|
|
62
|
+
}
|
|
63
|
+
let graph;
|
|
64
|
+
try {
|
|
65
|
+
graph = JSON.parse(fs.readFileSync(cmdOpts.from, 'utf8'));
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
throw new Error(`Could not read or parse JSON from ${cmdOpts.from}`);
|
|
69
|
+
}
|
|
70
|
+
const client = new client_1.GatewayClient();
|
|
71
|
+
const res = await client.request(`/api/projects/${projectId}/app-graph`, { method: 'PUT', body: graph });
|
|
72
|
+
(0, output_1.printSuccess)(res, () => process.stdout.write(`Uploaded app graph: ${res.nodeCount} route(s), ${res.edgeCount} edge(s).\n`), opts);
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
process.exit((0, output_1.printError)(err, opts));
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
appGraph
|
|
79
|
+
.command('show')
|
|
80
|
+
.description('Show the stored app-graph for a project')
|
|
81
|
+
.option('--project <id>', 'project id (overrides .sente/config.json)')
|
|
82
|
+
.action(async (cmdOpts) => {
|
|
83
|
+
const opts = globalOpts();
|
|
84
|
+
try {
|
|
85
|
+
const projectId = cmdOpts.project ?? (0, config_1.readLocalProjectId)();
|
|
86
|
+
if (!projectId) {
|
|
87
|
+
throw new Error('No project id found. Pass --project <id> or run `sente init` to create a .sente/config.json.');
|
|
88
|
+
}
|
|
89
|
+
const client = new client_1.GatewayClient();
|
|
90
|
+
const res = await client.request(`/api/projects/${projectId}/app-graph`);
|
|
91
|
+
(0, output_1.printSuccess)(res, () => {
|
|
92
|
+
const g = res.appGraph;
|
|
93
|
+
if (!g) {
|
|
94
|
+
process.stdout.write('No app graph stored for this project. Ask Claude Code to "generate the Sente app map", then `sente app-graph push`.\n');
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const nodes = g.nodes ?? [];
|
|
98
|
+
const commit = g.commitSha ? `, commit ${g.commitSha.slice(0, 7)}` : '';
|
|
99
|
+
process.stdout.write(`App graph v${g.version}${g.framework ? ` (${g.framework})` : ''} — ${nodes.length} route(s), ${(g.edges ?? []).length} edge(s)${commit}\n`);
|
|
100
|
+
for (const n of nodes) {
|
|
101
|
+
process.stdout.write(` ${n.pathPattern} → ${n.componentName ?? ''} [${n.confidence}]\n`);
|
|
102
|
+
}
|
|
103
|
+
}, opts);
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
process.exit((0, output_1.printError)(err, opts));
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=appGraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appGraph.js","sourceRoot":"","sources":["../../src/commands/appGraph.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/project.js
CHANGED
|
@@ -66,6 +66,78 @@ function readLocalProjectId() {
|
|
|
66
66
|
}
|
|
67
67
|
function registerProjectCommands(program, globalOpts) {
|
|
68
68
|
const project = program.command('project').description('Project commands');
|
|
69
|
+
project
|
|
70
|
+
.command('list')
|
|
71
|
+
.description('List all projects in the current organization')
|
|
72
|
+
.action(async () => {
|
|
73
|
+
const opts = globalOpts();
|
|
74
|
+
try {
|
|
75
|
+
const client = new client_1.GatewayClient();
|
|
76
|
+
const res = await client.request('/api/projects');
|
|
77
|
+
(0, output_1.printSuccess)(
|
|
78
|
+
// Match the sibling list commands' --json shape (strip the envelope).
|
|
79
|
+
{ projects: res.projects }, () => {
|
|
80
|
+
if (!res.projects.length) {
|
|
81
|
+
process.stdout.write('No projects.\n');
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
for (const p of res.projects) {
|
|
85
|
+
const def = p.isDefault ? ' [default]' : '';
|
|
86
|
+
const url = p.baseUrl ? ` ${p.baseUrl}` : '';
|
|
87
|
+
process.stdout.write(`${p.id} ${p.name}${def}${url}\n`);
|
|
88
|
+
}
|
|
89
|
+
}, opts);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
process.exit((0, output_1.printError)(err, opts));
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
project
|
|
96
|
+
.command('set')
|
|
97
|
+
.description('Update the project server-side (e.g. its staging base URL); also syncs .sente/config.json')
|
|
98
|
+
.option('--id <projectId>', 'Project id (overrides .sente/config.json)')
|
|
99
|
+
.option('--url <baseUrl>', 'New staging base URL — where runs AND `sente auth login` seeding navigate')
|
|
100
|
+
.option('--name <name>', 'New project name')
|
|
101
|
+
.action(async (cmdOpts) => {
|
|
102
|
+
const opts = globalOpts();
|
|
103
|
+
try {
|
|
104
|
+
const projectId = cmdOpts.id ?? readLocalProjectId();
|
|
105
|
+
if (!projectId) {
|
|
106
|
+
throw new Error('No project id found. Pass --id <projectId> or run `sente init` to create a .sente/config.json.');
|
|
107
|
+
}
|
|
108
|
+
const body = {};
|
|
109
|
+
if (cmdOpts.url)
|
|
110
|
+
body.baseUrl = cmdOpts.url;
|
|
111
|
+
if (cmdOpts.name)
|
|
112
|
+
body.name = cmdOpts.name;
|
|
113
|
+
if (Object.keys(body).length === 0) {
|
|
114
|
+
throw new Error('Nothing to update. Pass --url <baseUrl> and/or --name <name>.');
|
|
115
|
+
}
|
|
116
|
+
const client = new client_1.GatewayClient();
|
|
117
|
+
const res = await client.request(`/api/projects/${projectId}`, {
|
|
118
|
+
method: 'PUT',
|
|
119
|
+
body,
|
|
120
|
+
});
|
|
121
|
+
// Keep the local authoring config in sync so `.sente/config.json` never
|
|
122
|
+
// diverges from the server (the server value is what runs/seeding use).
|
|
123
|
+
const localPath = cmdOpts.url ? updateLocalConfigBaseUrl(cmdOpts.url) : null;
|
|
124
|
+
(0, output_1.printSuccess)(res.project, () => {
|
|
125
|
+
const p = res.project;
|
|
126
|
+
process.stdout.write(`Updated project ${p.name} (${p.id}).\n`);
|
|
127
|
+
if (p.baseUrl)
|
|
128
|
+
process.stdout.write(`Base URL: ${p.baseUrl}\n`);
|
|
129
|
+
if (localPath)
|
|
130
|
+
process.stdout.write(`Synced ${localPath}\n`);
|
|
131
|
+
if (cmdOpts.url) {
|
|
132
|
+
process.stdout.write('\nThis URL is where runs AND `sente auth login` seeding navigate. If you changed the\n' +
|
|
133
|
+
'domain, re-run `sente auth login` to re-seed auth — cookies are domain-scoped.\n');
|
|
134
|
+
}
|
|
135
|
+
}, opts);
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
process.exit((0, output_1.printError)(err, opts));
|
|
139
|
+
}
|
|
140
|
+
});
|
|
69
141
|
project
|
|
70
142
|
.command('show')
|
|
71
143
|
.description('Show the current project (from .sente/config.json or --id)')
|
|
@@ -171,6 +243,29 @@ function findSenteDir() {
|
|
|
171
243
|
dir = parent;
|
|
172
244
|
}
|
|
173
245
|
}
|
|
246
|
+
/**
|
|
247
|
+
* Update the `baseUrl` in the local .sente/config.json (if present), preserving
|
|
248
|
+
* all other fields. Keeps the local authoring config in sync with the server-side
|
|
249
|
+
* project after `sente project set --url`. Returns the file path written, or null
|
|
250
|
+
* if there is no local config (e.g. running with an explicit --id outside a repo).
|
|
251
|
+
*/
|
|
252
|
+
function updateLocalConfigBaseUrl(baseUrl) {
|
|
253
|
+
const dir = findSenteDir();
|
|
254
|
+
if (!dir)
|
|
255
|
+
return null;
|
|
256
|
+
const configPath = path.join(dir, 'config.json');
|
|
257
|
+
if (!fs.existsSync(configPath))
|
|
258
|
+
return null;
|
|
259
|
+
try {
|
|
260
|
+
const cfg = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
261
|
+
cfg.baseUrl = baseUrl;
|
|
262
|
+
fs.writeFileSync(configPath, JSON.stringify(cfg, null, 2) + '\n');
|
|
263
|
+
return configPath;
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
174
269
|
function readExistingTasksFile(p) {
|
|
175
270
|
if (!fs.existsSync(p))
|
|
176
271
|
return { projectId: '', tasks: [] };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,7 @@ const login_1 = require("./commands/login");
|
|
|
6
6
|
const whoami_1 = require("./commands/whoami");
|
|
7
7
|
const project_1 = require("./commands/project");
|
|
8
8
|
const workflow_1 = require("./commands/workflow");
|
|
9
|
+
const appGraph_1 = require("./commands/appGraph");
|
|
9
10
|
const task_1 = require("./commands/task");
|
|
10
11
|
const init_1 = require("./commands/init");
|
|
11
12
|
const secret_1 = require("./commands/secret");
|
|
@@ -24,7 +25,7 @@ const program = new commander_1.Command();
|
|
|
24
25
|
program
|
|
25
26
|
.name('sente')
|
|
26
27
|
.description('Sente CLI -- manage QA tests from the command line and Claude Code')
|
|
27
|
-
.version('0.
|
|
28
|
+
.version('0.8.0')
|
|
28
29
|
.option('--json', 'Emit machine-readable JSON instead of human output');
|
|
29
30
|
/**
|
|
30
31
|
* Global options aren't auto-propagated to subcommands by Commander, so we
|
|
@@ -39,6 +40,7 @@ const globalOpts = () => program.opts();
|
|
|
39
40
|
(0, project_1.registerProjectCommands)(program, globalOpts);
|
|
40
41
|
(0, project_1.registerSyncCommand)(program, globalOpts);
|
|
41
42
|
(0, workflow_1.registerWorkflowCommands)(program, globalOpts);
|
|
43
|
+
(0, appGraph_1.registerAppGraphCommands)(program, globalOpts);
|
|
42
44
|
(0, task_1.registerTaskCommands)(program, globalOpts);
|
|
43
45
|
(0, secret_1.registerSecretCommands)(program, globalOpts);
|
|
44
46
|
(0, schedule_1.registerScheduleCommands)(program, globalOpts);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,4CAAwD;AACxD,8CAA0D;AAC1D,gDAAkF;AAClF,kDAA+D;AAC/D,0CAAuD;AACvD,0CAAmF;AACnF,8CAA2D;AAC3D,kDAA+D;AAC/D,0CAAuD;AACvD,mDAA+E;AAG/E,6EAA6E;AAC7E,4EAA4E;AAC5E,0EAA0E;AAC1E,IAAA,mCAAsB,GAAE,CAAC;AAEzB,wEAAwE;AACxE,uEAAuE;AACvE,6DAA6D;AAC7D,KAAK,IAAA,8BAAiB,GAAE,CAAC;AAEzB,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,oEAAoE,CAAC;KACjF,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,QAAQ,EAAE,oDAAoD,CAAC,CAAC;AAE1E;;;;GAIG;AACH,MAAM,UAAU,GAAG,GAAe,EAAE,CAAC,OAAO,CAAC,IAAI,EAAc,CAAC;AAEhE,IAAA,4BAAoB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC1C,IAAA,8BAAqB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC3C,IAAA,0BAAmB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACzC,IAAA,kCAA2B,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACjD,IAAA,iCAAuB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC7C,IAAA,6BAAmB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACzC,IAAA,mCAAwB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC9C,IAAA,2BAAoB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC1C,IAAA,+BAAsB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC5C,IAAA,mCAAwB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC9C,IAAA,2BAAoB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAE1C,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,wEAAwE;IACxE,+CAA+C;IAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,OAAO,IAAI,GAAG,IAAI,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,4CAAwD;AACxD,8CAA0D;AAC1D,gDAAkF;AAClF,kDAA+D;AAC/D,kDAA+D;AAC/D,0CAAuD;AACvD,0CAAmF;AACnF,8CAA2D;AAC3D,kDAA+D;AAC/D,0CAAuD;AACvD,mDAA+E;AAG/E,6EAA6E;AAC7E,4EAA4E;AAC5E,0EAA0E;AAC1E,IAAA,mCAAsB,GAAE,CAAC;AAEzB,wEAAwE;AACxE,uEAAuE;AACvE,6DAA6D;AAC7D,KAAK,IAAA,8BAAiB,GAAE,CAAC;AAEzB,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,oEAAoE,CAAC;KACjF,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,QAAQ,EAAE,oDAAoD,CAAC,CAAC;AAE1E;;;;GAIG;AACH,MAAM,UAAU,GAAG,GAAe,EAAE,CAAC,OAAO,CAAC,IAAI,EAAc,CAAC;AAEhE,IAAA,4BAAoB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC1C,IAAA,8BAAqB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC3C,IAAA,0BAAmB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACzC,IAAA,kCAA2B,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACjD,IAAA,iCAAuB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC7C,IAAA,6BAAmB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACzC,IAAA,mCAAwB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC9C,IAAA,mCAAwB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC9C,IAAA,2BAAoB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC1C,IAAA,+BAAsB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC5C,IAAA,mCAAwB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC9C,IAAA,2BAAoB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAE1C,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,wEAAwE;IACxE,+CAA+C;IAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,OAAO,IAAI,GAAG,IAAI,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/skill/SKILL.md
CHANGED
|
@@ -22,6 +22,8 @@ Sente runs QA tests against the user's deployed staging environment via a cloud-
|
|
|
22
22
|
- Sente runs against **publicly-reachable URLs only** (cloud browser). Local dev / non-public PR previews are not supported. Always test against staging.
|
|
23
23
|
- Tests run **after the next staging deploy**, not when you create them. **Do not call `sente task run` immediately after `sente task create`** — staging probably doesn't have the new code yet. If the user wants to run now, confirm the deploy landed.
|
|
24
24
|
- Project context lives in `.sente/config.json` (`{ projectId, gatewayUrl, baseUrl }`). The task-to-paths map lives in `.sente/tasks.json`.
|
|
25
|
+
- **The staging `baseUrl` is authoritative server-side.** Runs and `sente auth login` seeding navigate to the *project's* `baseUrl`, not the local file. To change it, use **`sente project set --url <url>`** (updates the server and syncs `.sente/config.json`). **Never hand-edit `baseUrl` in `.sente/config.json`** — that only changes local authoring context, so runs and auth seeding would still hit the old URL.
|
|
26
|
+
- **Discover commands at runtime** with `sente --help` and `sente <command> --help` (e.g. `sente project --help`). The Command reference below is the canonical list — prefer it over guessing command names.
|
|
25
27
|
|
|
26
28
|
## Workflow recipes
|
|
27
29
|
|
|
@@ -61,11 +63,12 @@ If a flow needs login, first determine the auth type (check the app or its repo)
|
|
|
61
63
|
|
|
62
64
|
- **Plain email/password form**: author login as normal steps with `{{secret.email}}` / `{{secret.password}}` placeholders (see Hard rules). The agent types them at runtime; you never see the values.
|
|
63
65
|
- **SSO or 2FA** (e.g. "Continue with Google", Okta, magic link, any device/2-step prompt): do NOT author provider-login steps — automated provider logins are blocked (bot detection + 2FA device prompts). Seed the session once instead:
|
|
64
|
-
1. `sente
|
|
65
|
-
2.
|
|
66
|
-
3.
|
|
67
|
-
4.
|
|
68
|
-
5.
|
|
66
|
+
1. **First confirm the project's staging URL is correct** with `sente project show --json` — the seed browser opens the project's `baseUrl`, and auth cookies are domain-scoped, so seeding the wrong domain means runs hit a login wall. If it's wrong, fix it with `sente project set --url <correct-url>` *before* seeding.
|
|
67
|
+
2. `sente auth login --project $(jq -r .projectId .sente/config.json)` → returns a live browser URL.
|
|
68
|
+
3. Tell the user: "Open this URL and log in (complete any 2FA on your phone), then tell me when you're in." Give them the URL and wait. **Never ask for their password.**
|
|
69
|
+
4. `sente auth finish <sessionId> --project <id>` → saves the login into the project's persistent browser profile.
|
|
70
|
+
5. Author the test to **start already authenticated**: no login steps — navigate to an authenticated route and assert a logged-in-only element (top bar, account menu, etc.). The seeded profile makes runs start logged in.
|
|
71
|
+
6. If a later run fails at a login wall, the seeded session expired (or the staging domain changed) — re-run `sente auth login` / `finish` to re-seed.
|
|
69
72
|
|
|
70
73
|
**Never put a password in the chat.** Usernames/emails are fine; passwords go through `sente secret create` (hidden prompt) or the live `sente auth login` browser.
|
|
71
74
|
|
|
@@ -79,6 +82,44 @@ Runs execute against the **current staging URL**, so only run after confirming t
|
|
|
79
82
|
|
|
80
83
|
All runs are **asynchronous and fire-and-forget** — the command queues the run(s) and returns immediately with a per-task status (`running` / `queued` / `failed`) plus a session id. **Do not sit in a foreground polling loop.** To report outcomes, poll lightly with `sente task results <taskId> --json` (status flips to `passed`/`failed` only when a run finishes), or point the user at the report URL in the dashboard. Bulk runs are sequential and respect the org's concurrent-session limit (overflow shows as `queued` and starts as capacity frees). Authenticated tests work in bulk runs too — the seeded browser profile (Recipe D) is reused for every task.
|
|
81
84
|
|
|
85
|
+
### F. Generating the app map (route graph)
|
|
86
|
+
|
|
87
|
+
Sente's browser agent runs better when it knows the app's route structure — what page it's on, what's reachable, and which controls navigate away. You can generate that map **from this repo** (something only you, with repo access, can do well) and upload it once at onboarding; refresh it when routes change.
|
|
88
|
+
|
|
89
|
+
Produce a JSON file with this exact shape and `sente app-graph push --from <file>`:
|
|
90
|
+
|
|
91
|
+
```json
|
|
92
|
+
{
|
|
93
|
+
"version": 1,
|
|
94
|
+
"commitSha": "<short git HEAD sha, optional>",
|
|
95
|
+
"generatedAt": "<ISO 8601 timestamp>",
|
|
96
|
+
"framework": "next-app | react-router | vue-router | sveltekit | remix | ...",
|
|
97
|
+
"nodes": [
|
|
98
|
+
{
|
|
99
|
+
"id": "review-detail",
|
|
100
|
+
"pathPattern": "/public/review/:reviewId",
|
|
101
|
+
"pathParamNames": ["reviewId"],
|
|
102
|
+
"componentName": "ReviewDetail",
|
|
103
|
+
"componentPath": "src/pages/ReviewDetail.tsx",
|
|
104
|
+
"requiresAuth": false,
|
|
105
|
+
"isPublic": true,
|
|
106
|
+
"confidence": "high"
|
|
107
|
+
}
|
|
108
|
+
],
|
|
109
|
+
"edges": [
|
|
110
|
+
{ "from": "reviews-list", "to": "review-detail", "kind": "link", "label": "review card", "leavesRoute": true, "confidence": "high" }
|
|
111
|
+
]
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
How to build it:
|
|
116
|
+
1. **Detect the framework and find the router config**: Next.js (`app/` / `pages/`), React Router (route objects or `<Route>` trees), Vue Router, SvelteKit (`routes/`), Remix (`routes/`).
|
|
117
|
+
2. **Enumerate routes → `nodes`**: one per route. `pathPattern` uses `:param` for dynamic segments (`/review/:reviewId`); list those in `pathParamNames`. Fill `componentName` and a repo-relative `componentPath`. Set `requiresAuth`/`isPublic` only when a guard/layout makes it clear.
|
|
118
|
+
3. **Find navigation → `edges`**: from `<Link to=…>`, `navigate()`/`router.push(…)`, internal `<a href>`, and redirects. Set `leavesRoute: true` when the target's `pathPattern` differs from the source's. `kind` is `link` for markup, `programmatic` for code-driven navigation.
|
|
119
|
+
4. **Confidence, honestly**: `high` for literal, file-based routes and literal link targets; `low` for computed/indirect targets (e.g. `to={routes.review(id)}`) you had to infer. **Never invent routes** — omitting a route is fine; guessing one is not. A partial, correct map is better than a complete, wrong one.
|
|
120
|
+
5. **Upload**: write the JSON to a temp file, `sente app-graph push --from /tmp/sente-appgraph.json`, then verify with `sente app-graph show`. The gateway rejects malformed maps (unknown edge targets, bad path patterns).
|
|
121
|
+
6. **When to (re)generate**: once at onboarding, and again when you change routing — added/removed/renamed pages or navigation. A good moment is when preparing a commit/PR that touches the router.
|
|
122
|
+
|
|
82
123
|
## Test Authoring Rubric
|
|
83
124
|
|
|
84
125
|
The agent that runs your tests enforces this style. Steps that follow it pass more reliably.
|
|
@@ -122,7 +163,9 @@ The top-level `--instruction` is consulted by the agent when step text is ambigu
|
|
|
122
163
|
| Command | Purpose |
|
|
123
164
|
|---|---|
|
|
124
165
|
| `sente whoami --json` | Confirm auth and current org |
|
|
166
|
+
| `sente project list --json` | List all projects in the org (id, name, baseUrl, default) |
|
|
125
167
|
| `sente project show --json` | Show the project bound to this repo |
|
|
168
|
+
| `sente project set [--id <id>] --url <baseUrl> \| --name <name> --json` | Update the project server-side (staging URL / name) and sync `.sente/config.json`. Use this to change the staging URL — never hand-edit the config file |
|
|
126
169
|
| `sente task list --json` | List tasks (optionally `--project <id>`) |
|
|
127
170
|
| `sente task show <id> --json` | Full task details + steps |
|
|
128
171
|
| `sente task create --workflow <id> --name "..." --instruction "..." --steps-from <file> --json` | Create a new QA task |
|
|
@@ -132,6 +175,8 @@ The top-level `--instruction` is consulted by the agent when step text is ambigu
|
|
|
132
175
|
| `sente workflow list [--project <id>] --json` | List the workflows in a project (id + task count) |
|
|
133
176
|
| `sente workflow run <workflowId> --json` | Queue a run for every task in a workflow (sequential) |
|
|
134
177
|
| `sente project run [--id <projectId>] --json` | Queue a run for every task across all workflows in a project |
|
|
178
|
+
| `sente app-graph push --from <file> [--project <id>] --json` | Upload a repo-derived route map (nodes=routes, edges=navigation) so the agent can localize. See Recipe F |
|
|
179
|
+
| `sente app-graph show [--project <id>] --json` | Show the stored route map |
|
|
135
180
|
| `sente task results <id> --failed-step --json` | Focused failure payload for diagnosis |
|
|
136
181
|
| `sente task results <id> --json` | Full step-by-step results |
|
|
137
182
|
| `sente task push-recording <id> --from <file> --json` | Upload a hardened replay recording (per-step selectors + assertion predicates) for a task. Advanced — a deterministic-replay recipe, not action/assertion steps; produced by the recording pipeline, not hand-authored here. |
|
|
@@ -149,6 +194,8 @@ The top-level `--instruction` is consulted by the agent when step text is ambigu
|
|
|
149
194
|
|
|
150
195
|
Use `--json` for every CLI call — outputs are stable JSON shaped for programmatic consumption.
|
|
151
196
|
|
|
197
|
+
This table is the canonical reference, but the CLI is also self-documenting: run `sente --help` for the full command list and `sente <command> --help` (e.g. `sente project --help`, `sente auth --help`) for a command's subcommands and flags. Prefer these over guessing command names.
|
|
198
|
+
|
|
152
199
|
## Error handling
|
|
153
200
|
|
|
154
201
|
- `STEP_VALIDATION_FAILED` (HTTP 400): the `errors[]` array tells you exactly what to fix. Apply the fix to the steps file and retry.
|
package/package.json
CHANGED