@sente-labs/cli 0.7.0 → 0.8.1
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 +67 -6
- package/dist/skill/autoupdate.js +9 -1
- package/dist/skill/autoupdate.js.map +1 -1
- 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.1')
|
|
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,9 +22,18 @@ 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
|
|
|
30
|
+
### 0. Onboarding — repo not bound to Sente yet
|
|
31
|
+
|
|
32
|
+
If there's no `.sente/config.json`, this repo isn't bound to a project. Don't guess at commands — bind it with `sente init`:
|
|
33
|
+
|
|
34
|
+
- `sente init --name <repo> --staging-url https://<public-staging-url> --non-interactive` — creates the project + a default "Smoke tests" workflow, writes `.sente/config.json` + `.sente/tasks.json`, and installs/refreshes this skill. It needs a **public staging URL** (ask the user if you don't know it; `localhost`/PR previews won't work) and runs `sente login` automatically if you're not authenticated.
|
|
35
|
+
- If `.sente/` **already** exists, do NOT re-init — use `sente sync` to refresh `.sente/tasks.json`, or `sente project set --url <url>` to fix the staging URL.
|
|
36
|
+
|
|
28
37
|
### A. Creating a new test
|
|
29
38
|
|
|
30
39
|
1. Read `.sente/config.json` and `.sente/tasks.json` to confirm the project exists and to learn the staging baseUrl.
|
|
@@ -53,6 +62,9 @@ When the user pastes a failure or asks why a run failed:
|
|
|
53
62
|
2. Read `failureCategory` and `suggestedFix`:
|
|
54
63
|
- **`regression`**: the app is broken. Stop, summarize what failed in plain English, and ask whether to file a bug. Do NOT auto-edit the test.
|
|
55
64
|
- **`test_design`**: the test is wrong for the current app. Propose a fix to the steps, then update the task using recipe B.
|
|
65
|
+
- **Inconclusive** (`agent_loop_exhausted`, `stagnation_auto_fail`, `secret_not_resolved` — shown as a neutral **INCONCLUSIVE** badge, not red): the run could not complete or verify the step. This is **not** a verdict on the app or the test — do NOT call it a pass, and do NOT loosen the assertion to force one.
|
|
66
|
+
- `secret_not_resolved`: a `{{secret.*}}` placeholder had no value. Verify with `sente secret list --json` and create/link it (see Hard rules) — don't edit the step text.
|
|
67
|
+
- `agent_loop_exhausted` / `stagnation_auto_fail`: the agent ran out of room or got stuck on a step (commonly an element it couldn't find, a missing wait, or an earlier step that stalled). Confirm the deploy landed and — for authenticated flows — the seeded session is still valid, then re-run once. Only reclassify as `test_design` (the UI changed) or `regression` (a control is genuinely broken/missing) if it reproduces on the same step.
|
|
56
68
|
3. If the failure is ambiguous, fetch full details with `sente task show <id> --json` and inspect step-by-step `actual` vs `assertion`.
|
|
57
69
|
|
|
58
70
|
### D. Authenticated flows (SSO / 2FA)
|
|
@@ -61,17 +73,18 @@ If a flow needs login, first determine the auth type (check the app or its repo)
|
|
|
61
73
|
|
|
62
74
|
- **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
75
|
- **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.
|
|
76
|
+
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.
|
|
77
|
+
2. `sente auth login --project $(jq -r .projectId .sente/config.json)` → returns a live browser URL.
|
|
78
|
+
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.**
|
|
79
|
+
4. `sente auth finish <sessionId> --project <id>` → saves the login into the project's persistent browser profile.
|
|
80
|
+
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.
|
|
81
|
+
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
82
|
|
|
70
83
|
**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
84
|
|
|
72
85
|
### E. Running tests (one task, a workflow, or a whole project)
|
|
73
86
|
|
|
74
|
-
|
|
87
|
+
Run only after the deploy you want to test has landed (see Critical context).
|
|
75
88
|
|
|
76
89
|
- **One task**: `sente task run <taskId>`.
|
|
77
90
|
- **A whole workflow** (all its tasks, in order): `sente workflow run <workflowId>`. Get ids with `sente workflow list --json`.
|
|
@@ -79,6 +92,44 @@ Runs execute against the **current staging URL**, so only run after confirming t
|
|
|
79
92
|
|
|
80
93
|
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
94
|
|
|
95
|
+
### F. Generating the app map (route graph)
|
|
96
|
+
|
|
97
|
+
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.
|
|
98
|
+
|
|
99
|
+
Produce a JSON file with this exact shape and `sente app-graph push --from <file>`:
|
|
100
|
+
|
|
101
|
+
```json
|
|
102
|
+
{
|
|
103
|
+
"version": 1,
|
|
104
|
+
"commitSha": "<short git HEAD sha, optional>",
|
|
105
|
+
"generatedAt": "<ISO 8601 timestamp>",
|
|
106
|
+
"framework": "next-app | react-router | vue-router | sveltekit | remix | ...",
|
|
107
|
+
"nodes": [
|
|
108
|
+
{
|
|
109
|
+
"id": "review-detail",
|
|
110
|
+
"pathPattern": "/public/review/:reviewId",
|
|
111
|
+
"pathParamNames": ["reviewId"],
|
|
112
|
+
"componentName": "ReviewDetail",
|
|
113
|
+
"componentPath": "src/pages/ReviewDetail.tsx",
|
|
114
|
+
"requiresAuth": false,
|
|
115
|
+
"isPublic": true,
|
|
116
|
+
"confidence": "high"
|
|
117
|
+
}
|
|
118
|
+
],
|
|
119
|
+
"edges": [
|
|
120
|
+
{ "from": "reviews-list", "to": "review-detail", "kind": "link", "label": "review card", "leavesRoute": true, "confidence": "high" }
|
|
121
|
+
]
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
How to build it:
|
|
126
|
+
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/`).
|
|
127
|
+
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.
|
|
128
|
+
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.
|
|
129
|
+
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.
|
|
130
|
+
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).
|
|
131
|
+
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.
|
|
132
|
+
|
|
82
133
|
## Test Authoring Rubric
|
|
83
134
|
|
|
84
135
|
The agent that runs your tests enforces this style. Steps that follow it pass more reliably.
|
|
@@ -103,11 +154,13 @@ The agent that runs your tests enforces this style. Steps that follow it pass mo
|
|
|
103
154
|
- Bad: `Verify text "Welcome back, John!" appears` (exact wording rigid)
|
|
104
155
|
- Bad: `The save succeeds` (no observable)
|
|
105
156
|
- Counts and existence are LITERAL: `"no results"` means zero, not "22 unrelated".
|
|
157
|
+
- For a **long-running / async outcome** (export or file generation, email/notification delivery, a queued or background job), assert the **kickoff** — the immediate observable state change (e.g. a button flips to "Processing…", a badge shows "Queued") — not the eventual completion. The runtime waits only briefly after an action, so asserting the final result will time out or flake. This redirects the assertion to a reliably-observable signal; it does not mean asserting less.
|
|
106
158
|
|
|
107
159
|
### Hard rules
|
|
108
160
|
|
|
109
161
|
- **Secrets** use literal placeholder syntax: `{{secret.name_here}}`. Never embed values. List existing secrets with `sente secret list --json`. If the secret doesn't exist, create it with `sente secret create --name <key>` (prompts for value with no echo) or pipe via `echo "$VAL" | sente secret create --name <key> --value-stdin`. Link to the current project with `--project $(jq -r .projectId .sente/config.json)`.
|
|
110
162
|
- **Never invent dropdown values**, product names, or emails. If you don't know, ask the user.
|
|
163
|
+
- **State and satisfy preconditions.** If the flow only works when the account already has certain data (a linked account/entity, an existing record, a non-empty list, an enabled plan/feature), either add early steps that create it, or assert the precondition up front so a missing one fails clearly instead of derailing a later step. For authenticated flows, the seeded profile must already satisfy these (see Recipe D).
|
|
111
164
|
- **Combine related micro-actions into one step** (form fill + submit = one step).
|
|
112
165
|
- **At most 20 steps per task.** If a flow needs more, split into multiple tasks with a precondition note in the second one's instruction.
|
|
113
166
|
- **Cleanup**: if the test creates data, the last step deletes it.
|
|
@@ -122,7 +175,11 @@ The top-level `--instruction` is consulted by the agent when step text is ambigu
|
|
|
122
175
|
| Command | Purpose |
|
|
123
176
|
|---|---|
|
|
124
177
|
| `sente whoami --json` | Confirm auth and current org |
|
|
178
|
+
| `sente login [--token <pat>]` | Store/validate a Personal Access Token (from the Sente dashboard). `sente init` runs this automatically when not authenticated |
|
|
179
|
+
| `sente init --name <name> --staging-url <url> [--workflow <name>] [--non-interactive]` | Bind this repo to a new Sente project + scaffold `.sente/`. See Recipe 0 |
|
|
180
|
+
| `sente project list --json` | List all projects in the org (id, name, baseUrl, default) |
|
|
125
181
|
| `sente project show --json` | Show the project bound to this repo |
|
|
182
|
+
| `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
183
|
| `sente task list --json` | List tasks (optionally `--project <id>`) |
|
|
127
184
|
| `sente task show <id> --json` | Full task details + steps |
|
|
128
185
|
| `sente task create --workflow <id> --name "..." --instruction "..." --steps-from <file> --json` | Create a new QA task |
|
|
@@ -132,6 +189,8 @@ The top-level `--instruction` is consulted by the agent when step text is ambigu
|
|
|
132
189
|
| `sente workflow list [--project <id>] --json` | List the workflows in a project (id + task count) |
|
|
133
190
|
| `sente workflow run <workflowId> --json` | Queue a run for every task in a workflow (sequential) |
|
|
134
191
|
| `sente project run [--id <projectId>] --json` | Queue a run for every task across all workflows in a project |
|
|
192
|
+
| `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 |
|
|
193
|
+
| `sente app-graph show [--project <id>] --json` | Show the stored route map |
|
|
135
194
|
| `sente task results <id> --failed-step --json` | Focused failure payload for diagnosis |
|
|
136
195
|
| `sente task results <id> --json` | Full step-by-step results |
|
|
137
196
|
| `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 +208,8 @@ The top-level `--instruction` is consulted by the agent when step text is ambigu
|
|
|
149
208
|
|
|
150
209
|
Use `--json` for every CLI call — outputs are stable JSON shaped for programmatic consumption.
|
|
151
210
|
|
|
211
|
+
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.
|
|
212
|
+
|
|
152
213
|
## Error handling
|
|
153
214
|
|
|
154
215
|
- `STEP_VALIDATION_FAILED` (HTTP 400): the `errors[]` array tells you exactly what to fix. Apply the fix to the steps file and retry.
|
package/dist/skill/autoupdate.js
CHANGED
|
@@ -46,7 +46,8 @@ const config_1 = require("../config");
|
|
|
46
46
|
*
|
|
47
47
|
* - No marker → user-customized skill; leave it alone.
|
|
48
48
|
* - Marker matches CLI version → up to date; no-op.
|
|
49
|
-
* -
|
|
49
|
+
* - Installed marker NEWER than this CLI → don't downgrade; leave it alone.
|
|
50
|
+
* - Installed marker OLDER than this CLI → auto-upgrade. Print a stderr notice.
|
|
50
51
|
*
|
|
51
52
|
* All errors are swallowed: this is a UX nicety, not a correctness gate.
|
|
52
53
|
* Skipped when `--json` is in argv so machine consumers see clean output.
|
|
@@ -64,6 +65,13 @@ function autoUpdateSkillIfStale() {
|
|
|
64
65
|
return; // user-customized; respect it
|
|
65
66
|
if (installedVersion === template_1.CLI_VERSION)
|
|
66
67
|
return; // already current
|
|
68
|
+
// Downgrade floor: never clobber a NEWER installed skill with this (older)
|
|
69
|
+
// CLI's bundled copy. Without this, a stale global CLI (e.g. not yet
|
|
70
|
+
// `npm i -g`'d to latest) thrashes a newer skill back down on every
|
|
71
|
+
// invocation — silently stripping commands/guidance the newer skill added.
|
|
72
|
+
// Upgrades (installed older than CLI) still proceed below.
|
|
73
|
+
if (isNewer(installedVersion, template_1.CLI_VERSION))
|
|
74
|
+
return;
|
|
67
75
|
fs.writeFileSync(dest, template_1.SKILL_MD);
|
|
68
76
|
process.stderr.write(`sente: refreshed Claude Code skill (${installedVersion} -> ${template_1.CLI_VERSION}). Restart Claude Code to pick up changes.\n`);
|
|
69
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autoupdate.js","sourceRoot":"","sources":["../../src/skill/autoupdate.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"autoupdate.js","sourceRoot":"","sources":["../../src/skill/autoupdate.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,wDAsBC;AAwBD,8CAsBC;AAtFD,uCAAyB;AACzB,uCAAyB;AACzB,2CAA6B;AAC7B,yCAAuF;AACvF,sCAA4C;AAE5C;;;;;;;;;;;GAWG;AACH,SAAgB,sBAAsB;IACpC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO;IAC5C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAA,2BAAgB,EAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,iCAAiC;QACnE,MAAM,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,gBAAgB,GAAG,IAAA,2BAAgB,EAAC,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,gBAAgB;YAAE,OAAO,CAAC,8BAA8B;QAC7D,IAAI,gBAAgB,KAAK,sBAAW;YAAE,OAAO,CAAC,kBAAkB;QAChE,2EAA2E;QAC3E,qEAAqE;QACrE,oEAAoE;QACpE,2EAA2E;QAC3E,2DAA2D;QAC3D,IAAI,OAAO,CAAC,gBAAgB,EAAE,sBAAW,CAAC;YAAE,OAAO;QACnD,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,mBAAQ,CAAC,CAAC;QACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uCAAuC,gBAAgB,OAAO,sBAAW,8CAA8C,CACxH,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,kEAAkE;IACpE,CAAC;AACH,CAAC;AAOD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,wBAAe,EAAE,mBAAmB,CAAC,CAAC;AACnE,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,MAAM;AAChD,MAAM,YAAY,GAAG,qDAAqD,CAAC;AAE3E;;;;;;;;;;;;GAYG;AACI,KAAK,UAAU,iBAAiB;IACrC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO;IAC5C,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B;QAAE,OAAO;IACnD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,MAAM,GAAkB,IAAI,CAAC;QACjC,IAAI,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,YAAY,EAAE,CAAC;YACxE,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;YACpC,IAAI,MAAM;gBAAE,UAAU,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,IAAI,OAAO,CAAC,MAAM,EAAE,sBAAW,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,UAAU,sBAAW,OAAO,MAAM,oDAAoD,CACvF,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB;IAC/B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QACrE,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyB,CAAC;QACxD,OAAO,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,SAAS;IAChB,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAgB,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,CAAc;IAChC,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,wBAAe,CAAC,EAAE,CAAC;YACpC,EAAE,CAAC,SAAS,CAAC,wBAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,OAAO,CAAC,SAAiB,EAAE,OAAe;IACjD,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACtD,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACrB,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,IAAI,CAAC;QACzB,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,KAAK,CAAC;IAC5B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/package.json
CHANGED