@sente-labs/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,168 @@
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.registerProjectCommands = registerProjectCommands;
37
+ exports.registerSyncCommand = registerSyncCommand;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const client_1 = require("../client");
41
+ const output_1 = require("../output");
42
+ /**
43
+ * Read the local .sente/config.json (written by `sente init` in M4).
44
+ * Walks up from the cwd looking for it -- same pattern as git/node_modules.
45
+ */
46
+ function readLocalProjectId() {
47
+ let dir = process.cwd();
48
+ while (true) {
49
+ const candidate = path.join(dir, '.sente', 'config.json');
50
+ if (fs.existsSync(candidate)) {
51
+ try {
52
+ const parsed = JSON.parse(fs.readFileSync(candidate, 'utf8'));
53
+ if (typeof parsed.projectId === 'string')
54
+ return parsed.projectId;
55
+ }
56
+ catch {
57
+ return null;
58
+ }
59
+ }
60
+ const parent = path.dirname(dir);
61
+ if (parent === dir)
62
+ return null;
63
+ dir = parent;
64
+ }
65
+ }
66
+ function registerProjectCommands(program, globalOpts) {
67
+ const project = program.command('project').description('Project commands');
68
+ project
69
+ .command('show')
70
+ .description('Show the current project (from .sente/config.json or --id)')
71
+ .option('--id <projectId>', 'Project id (overrides .sente/config.json)')
72
+ .action(async (cmdOpts) => {
73
+ const opts = globalOpts();
74
+ try {
75
+ const projectId = cmdOpts.id ?? readLocalProjectId();
76
+ if (!projectId) {
77
+ throw new Error('No project id found. Pass --id <projectId> or run `sente init` to create a .sente/config.json.');
78
+ }
79
+ const client = new client_1.GatewayClient();
80
+ const res = await client.request(`/api/projects/${projectId}`);
81
+ (0, output_1.printSuccess)(res.project, () => {
82
+ const p = res.project;
83
+ process.stdout.write(`Project: ${p.name} (${p.id})\n`);
84
+ if (p.description)
85
+ process.stdout.write(`Description: ${p.description}\n`);
86
+ if (p.baseUrl)
87
+ process.stdout.write(`Base URL: ${p.baseUrl}\n`);
88
+ process.stdout.write(`Created: ${p.createdAt}\n`);
89
+ process.stdout.write(`Updated: ${p.updatedAt}\n`);
90
+ }, opts);
91
+ }
92
+ catch (err) {
93
+ process.exit((0, output_1.printError)(err, opts));
94
+ }
95
+ });
96
+ }
97
+ function registerSyncCommand(program, globalOpts) {
98
+ program
99
+ .command('sync')
100
+ .description('Regenerate .sente/tasks.json from the current Sente project')
101
+ .action(async () => {
102
+ const opts = globalOpts();
103
+ try {
104
+ const projectId = readLocalProjectId();
105
+ if (!projectId) {
106
+ throw new Error('No project id found. Run `sente init` first, or run this from inside a repo with .sente/config.json.');
107
+ }
108
+ const client = new client_1.GatewayClient();
109
+ const res = await client.request('/api/tasks/list', {
110
+ query: { projectId },
111
+ });
112
+ const tasksDir = findSenteDir();
113
+ if (!tasksDir) {
114
+ throw new Error('No .sente directory found upward from cwd.');
115
+ }
116
+ const tasksPath = path.join(tasksDir, 'tasks.json');
117
+ // Preserve existing tags + relatedPaths -- the file is the authoring hint
118
+ // layer, so we treat user-written annotations as canonical for those fields.
119
+ const existing = readExistingTasksFile(tasksPath);
120
+ const existingById = new Map(existing.tasks.map((t) => [t.id, t]));
121
+ const merged = {
122
+ projectId,
123
+ tasks: res.tasks.map((t) => {
124
+ const prev = existingById.get(t.id);
125
+ return {
126
+ id: t.id,
127
+ name: t.name,
128
+ tags: prev?.tags ?? [],
129
+ relatedPaths: prev?.relatedPaths ?? [],
130
+ };
131
+ }),
132
+ };
133
+ fs.writeFileSync(tasksPath, JSON.stringify(merged, null, 2) + '\n');
134
+ (0, output_1.printSuccess)({ path: tasksPath, taskCount: merged.tasks.length }, `Wrote ${merged.tasks.length} task(s) to ${tasksPath}`, opts);
135
+ }
136
+ catch (err) {
137
+ process.exit((0, output_1.printError)(err, opts));
138
+ }
139
+ });
140
+ }
141
+ function findSenteDir() {
142
+ let dir = process.cwd();
143
+ while (true) {
144
+ const candidate = path.join(dir, '.sente');
145
+ if (fs.existsSync(candidate) && fs.statSync(candidate).isDirectory()) {
146
+ return candidate;
147
+ }
148
+ const parent = path.dirname(dir);
149
+ if (parent === dir)
150
+ return null;
151
+ dir = parent;
152
+ }
153
+ }
154
+ function readExistingTasksFile(p) {
155
+ if (!fs.existsSync(p))
156
+ return { projectId: '', tasks: [] };
157
+ try {
158
+ const parsed = JSON.parse(fs.readFileSync(p, 'utf8'));
159
+ return {
160
+ projectId: typeof parsed.projectId === 'string' ? parsed.projectId : '',
161
+ tasks: Array.isArray(parsed.tasks) ? parsed.tasks : [],
162
+ };
163
+ }
164
+ catch {
165
+ return { projectId: '', tasks: [] };
166
+ }
167
+ }
168
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDA,0DAmCC;AAED,kDAqDC;AAjJD,uCAAyB;AACzB,2CAA6B;AAE7B,sCAA0C;AAC1C,sCAAiE;AA6BjE;;;GAGG;AACH,SAAS,kBAAkB;IACzB,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACxB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC9D,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;oBAAE,OAAO,MAAM,CAAC,SAAS,CAAC;YACpE,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAChC,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAgB,uBAAuB,CAAC,OAAgB,EAAE,UAA4B;IACpF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAE3E,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,4DAA4D,CAAC;SACzE,MAAM,CAAC,kBAAkB,EAAE,2CAA2C,CAAC;SACvE,MAAM,CAAC,KAAK,EAAE,OAAwB,EAAE,EAAE;QACzC,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,OAAO,CAAC,EAAE,IAAI,kBAAkB,EAAE,CAAC;YACrD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CACb,gGAAgG,CACjG,CAAC;YACJ,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,sBAAa,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAsB,iBAAiB,SAAS,EAAE,CAAC,CAAC;YAEpF,IAAA,qBAAY,EACV,GAAG,CAAC,OAAO,EACX,GAAG,EAAE;gBACH,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC;gBACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBAC1D,IAAI,CAAC,CAAC,WAAW;oBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC;gBAC3E,IAAI,CAAC,CAAC,OAAO;oBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;gBACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC;gBACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC;YACxD,CAAC,EACD,IAAI,CACL,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,IAAA,mBAAU,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,mBAAmB,CAAC,OAAgB,EAAE,UAA4B;IAChF,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;YACvC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CACb,sGAAsG,CACvG,CAAC;YACJ,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,sBAAa,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAoB,iBAAiB,EAAE;gBACrE,KAAK,EAAE,EAAE,SAAS,EAAE;aACrB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;YAChC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAChE,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAEpD,0EAA0E;YAC1E,6EAA6E;YAC7E,MAAM,QAAQ,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;YAClD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAEnE,MAAM,MAAM,GAAc;gBACxB,SAAS;gBACT,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACzB,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACpC,OAAO;wBACL,EAAE,EAAE,CAAC,CAAC,EAAE;wBACR,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE;wBACtB,YAAY,EAAE,IAAI,EAAE,YAAY,IAAI,EAAE;qBACvC,CAAC;gBACJ,CAAC,CAAC;aACH,CAAC;YAEF,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAEpE,IAAA,qBAAY,EACV,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,EACnD,SAAS,MAAM,CAAC,KAAK,CAAC,MAAM,eAAe,SAAS,EAAE,EACtD,IAAI,CACL,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,IAAA,mBAAU,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,YAAY;IACnB,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACxB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC3C,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACrE,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAChC,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,CAAS;IACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACtD,OAAO;YACL,SAAS,EAAE,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;YACvE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;SACvD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACtC,CAAC;AACH,CAAC"}
@@ -0,0 +1,364 @@
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.registerTaskCommands = registerTaskCommands;
37
+ const fs = __importStar(require("fs"));
38
+ const client_1 = require("../client");
39
+ const output_1 = require("../output");
40
+ /**
41
+ * Translate raw gateway shape into the CLI-stable results envelope
42
+ * documented in plans/sente-cc-skill.md. Insulates CC from DB drift.
43
+ */
44
+ function buildResultsPayload(task, opts) {
45
+ const steps = (task.steps ?? []).map((s) => {
46
+ const result = (s.result || {});
47
+ return {
48
+ index: s.stepOrder,
49
+ action: s.action,
50
+ assertion: s.assertion ?? '',
51
+ status: s.status,
52
+ actual: result.actual ?? null,
53
+ reasoning: result.reasoning ?? null,
54
+ failureCategory: result.failureCategory ?? null,
55
+ suggestedFix: result.suggestedFix ?? null,
56
+ adapted: result.adapted ?? false,
57
+ adaptationNote: result.adaptationNote ?? null,
58
+ screenshot: s.screenshot ?? null,
59
+ };
60
+ });
61
+ const failedStep = steps.find((s) => s.status === 'failed');
62
+ const overallStatus = task.status;
63
+ const base = {
64
+ taskId: task.id,
65
+ taskName: task.name,
66
+ status: overallStatus,
67
+ reportUrl: task.shortId ? `https://app.sente.run/report/${task.shortId}` : null,
68
+ };
69
+ if (opts.failedOnly) {
70
+ return { ...base, failedStep: failedStep ?? null };
71
+ }
72
+ return { ...base, steps };
73
+ }
74
+ function registerTaskCommands(program, globalOpts) {
75
+ const task = program.command('task').description('Task commands');
76
+ task
77
+ .command('list')
78
+ .description('List tasks in the current organization (optionally scoped to a project)')
79
+ .option('--project <projectId>', 'Filter by project id')
80
+ .action(async (cmdOpts) => {
81
+ const opts = globalOpts();
82
+ try {
83
+ const client = new client_1.GatewayClient();
84
+ const res = await client.request('/api/tasks/list', {
85
+ query: { projectId: cmdOpts.project },
86
+ });
87
+ (0, output_1.printSuccess)({ tasks: res.tasks }, () => {
88
+ if (res.tasks.length === 0) {
89
+ process.stdout.write('No tasks found.\n');
90
+ return;
91
+ }
92
+ for (const t of res.tasks) {
93
+ process.stdout.write(`${t.id} ${t.status.padEnd(12)} ${t.workflow.project.name} / ${t.workflow.name} / ${t.name}\n`);
94
+ }
95
+ }, opts);
96
+ }
97
+ catch (err) {
98
+ process.exit((0, output_1.printError)(err, opts));
99
+ }
100
+ });
101
+ task
102
+ .command('show')
103
+ .description('Show a task by id (or shortId)')
104
+ .argument('<taskId>', 'task id or short id')
105
+ .action(async (taskId) => {
106
+ const opts = globalOpts();
107
+ try {
108
+ const client = new client_1.GatewayClient();
109
+ const res = await client.request(`/api/tasks/${taskId}`);
110
+ (0, output_1.printSuccess)({ task: res.task }, () => {
111
+ const t = res.task;
112
+ process.stdout.write(`${t.name} (${t.id})\n`);
113
+ process.stdout.write(`Status: ${t.status}\n`);
114
+ if (t.description)
115
+ process.stdout.write(`Description: ${t.description}\n`);
116
+ if (t.instruction)
117
+ process.stdout.write(`Instruction:\n ${t.instruction}\n`);
118
+ if (t.qaInstruction)
119
+ process.stdout.write(`QA Instruction:\n ${t.qaInstruction}\n`);
120
+ if (t.steps && t.steps.length > 0) {
121
+ process.stdout.write(`\nSteps:\n`);
122
+ for (const s of t.steps) {
123
+ process.stdout.write(` ${s.stepOrder}. [${s.status}] ${s.action}\n` +
124
+ (s.assertion ? ` assert: ${s.assertion}\n` : ''));
125
+ }
126
+ }
127
+ }, opts);
128
+ }
129
+ catch (err) {
130
+ process.exit((0, output_1.printError)(err, opts));
131
+ }
132
+ });
133
+ task
134
+ .command('create')
135
+ .description('Create a new QA task with steps')
136
+ .requiredOption('--workflow <id>', 'workflow id this task belongs to')
137
+ .requiredOption('--name <name>', 'task name')
138
+ .option('--instruction <text>', 'top-level task instruction (preserves UI mechanism)')
139
+ .option('--description <text>', 'optional description')
140
+ .option('--type <type>', 'task type (qa)', 'qa')
141
+ .option('--steps-from <file>', 'JSON file containing the step array')
142
+ .action(async (cmdOpts) => {
143
+ const opts = globalOpts();
144
+ try {
145
+ const steps = cmdOpts.stepsFrom ? readStepsFile(cmdOpts.stepsFrom) : undefined;
146
+ const body = {
147
+ name: cmdOpts.name,
148
+ description: cmdOpts.description,
149
+ qaInstruction: cmdOpts.instruction,
150
+ steps,
151
+ };
152
+ const client = new client_1.GatewayClient();
153
+ const res = await client.request(`/api/workflows/${cmdOpts.workflow}/tasks`, { method: 'POST', body });
154
+ const taskId = res.task?.id;
155
+ const warnings = res.warnings ?? [];
156
+ (0, output_1.printSuccess)({ task: res.task, warnings }, () => {
157
+ process.stdout.write(`Created task: ${res.task.name} (${taskId})\n`);
158
+ renderWarnings(warnings);
159
+ }, opts);
160
+ }
161
+ catch (err) {
162
+ renderValidationErrors(err, opts);
163
+ process.exit((0, output_1.printError)(err, opts));
164
+ }
165
+ });
166
+ task
167
+ .command('update')
168
+ .description('Update an existing task')
169
+ .argument('<taskId>', 'task id')
170
+ .option('--name <name>', 'new name')
171
+ .option('--instruction <text>', 'new instruction')
172
+ .option('--description <text>', 'new description')
173
+ .option('--steps-from <file>', 'replace steps with the JSON file contents')
174
+ .action(async (taskId, cmdOpts) => {
175
+ const opts = globalOpts();
176
+ try {
177
+ const body = {};
178
+ if (cmdOpts.name)
179
+ body.name = cmdOpts.name;
180
+ if (cmdOpts.instruction)
181
+ body.qaInstruction = cmdOpts.instruction;
182
+ if (cmdOpts.description !== undefined)
183
+ body.description = cmdOpts.description;
184
+ if (cmdOpts.stepsFrom)
185
+ body.steps = readStepsFile(cmdOpts.stepsFrom);
186
+ if (Object.keys(body).length === 0) {
187
+ throw new Error('No fields to update. Pass --name, --instruction, --description, or --steps-from.');
188
+ }
189
+ const client = new client_1.GatewayClient();
190
+ const res = await client.request(`/api/tasks/${taskId}`, { method: 'PUT', body });
191
+ (0, output_1.printSuccess)({ task: res.task, warnings: res.warnings ?? [] }, () => {
192
+ process.stdout.write(`Updated task: ${res.task.name} (${res.task.id})\n`);
193
+ renderWarnings(res.warnings ?? []);
194
+ }, opts);
195
+ }
196
+ catch (err) {
197
+ renderValidationErrors(err, opts);
198
+ process.exit((0, output_1.printError)(err, opts));
199
+ }
200
+ });
201
+ task
202
+ .command('delete')
203
+ .description('Delete a task')
204
+ .argument('<taskId>', 'task id')
205
+ .action(async (taskId) => {
206
+ const opts = globalOpts();
207
+ try {
208
+ const client = new client_1.GatewayClient();
209
+ await client.request(`/api/tasks/${taskId}`, { method: 'DELETE' });
210
+ (0, output_1.printSuccess)({ ok: true, taskId }, `Deleted task ${taskId}`, opts);
211
+ }
212
+ catch (err) {
213
+ process.exit((0, output_1.printError)(err, opts));
214
+ }
215
+ });
216
+ task
217
+ .command('run')
218
+ .description('Queue a task run against the configured staging URL')
219
+ .argument('<taskId>', 'task id')
220
+ .action(async (taskId) => {
221
+ const opts = globalOpts();
222
+ try {
223
+ // Surface the staging-deploy caveat before firing. Skipped in --json mode
224
+ // so machine consumers (CC) don't choke on free-form text.
225
+ if (!(0, output_1.isJson)(opts)) {
226
+ process.stderr.write('Note: this runs against the current staging URL. Ensure the deploy you want to test has landed.\n');
227
+ }
228
+ const client = new client_1.GatewayClient();
229
+ const res = await client.request(`/api/tasks/${taskId}/run`, {
230
+ method: 'POST',
231
+ body: {},
232
+ });
233
+ (0, output_1.printSuccess)(res, () => {
234
+ const status = res.session?.status ?? res.status ?? 'queued';
235
+ process.stdout.write(`Queued task ${taskId}: status=${status}\n`);
236
+ if (res.session?.id)
237
+ process.stdout.write(`Session: ${res.session.id}\n`);
238
+ }, opts);
239
+ }
240
+ catch (err) {
241
+ process.exit((0, output_1.printError)(err, opts));
242
+ }
243
+ });
244
+ task
245
+ .command('results')
246
+ .description('Show step-by-step results for a task')
247
+ .argument('<taskId>', 'task id or short id')
248
+ .option('--latest', 'Latest run summary (default)')
249
+ .option('--failed-step', 'Return only the failed step + minimal context')
250
+ .action(async (taskId, cmdOpts) => {
251
+ const opts = globalOpts();
252
+ try {
253
+ const client = new client_1.GatewayClient();
254
+ const res = await client.request(`/api/tasks/${taskId}`);
255
+ const payload = buildResultsPayload(res.task, { failedOnly: !!cmdOpts.failedStep });
256
+ (0, output_1.printSuccess)(payload, () => {
257
+ const p = payload;
258
+ process.stdout.write(`Task: ${p.taskName} (${p.taskId})\n`);
259
+ process.stdout.write(`Status: ${p.status}\n`);
260
+ if (p.reportUrl)
261
+ process.stdout.write(`Report: ${p.reportUrl}\n`);
262
+ if (p.failedStep !== undefined) {
263
+ if (p.failedStep) {
264
+ process.stdout.write(`\nFailed step ${p.failedStep.index}:\n`);
265
+ process.stdout.write(` Action: ${p.failedStep.action}\n`);
266
+ process.stdout.write(` Assertion: ${p.failedStep.assertion}\n`);
267
+ if (p.failedStep.actual)
268
+ process.stdout.write(` Actual: ${p.failedStep.actual}\n`);
269
+ if (p.failedStep.reasoning)
270
+ process.stdout.write(` Reasoning: ${p.failedStep.reasoning}\n`);
271
+ if (p.failedStep.failureCategory)
272
+ process.stdout.write(` Category: ${p.failedStep.failureCategory}\n`);
273
+ if (p.failedStep.suggestedFix)
274
+ process.stdout.write(` Suggested fix: ${p.failedStep.suggestedFix}\n`);
275
+ }
276
+ else {
277
+ process.stdout.write('\nNo failed step.\n');
278
+ }
279
+ }
280
+ else {
281
+ for (const s of p.steps) {
282
+ process.stdout.write(` ${s.index}. [${s.status.padEnd(7)}] ${s.action}` +
283
+ (s.failureCategory ? ` (${s.failureCategory})` : '') +
284
+ '\n');
285
+ }
286
+ }
287
+ }, opts);
288
+ }
289
+ catch (err) {
290
+ process.exit((0, output_1.printError)(err, opts));
291
+ }
292
+ });
293
+ }
294
+ /**
295
+ * Read a JSON array of `{action, assertion}` from disk. Throws a clear error
296
+ * if the file is missing, malformed, or has the wrong shape.
297
+ */
298
+ function readStepsFile(path) {
299
+ let raw;
300
+ try {
301
+ raw = fs.readFileSync(path, 'utf8');
302
+ }
303
+ catch (e) {
304
+ throw new Error(`Cannot read steps file ${path}: ${e.message}`);
305
+ }
306
+ let parsed;
307
+ try {
308
+ parsed = JSON.parse(raw);
309
+ }
310
+ catch (e) {
311
+ throw new Error(`Steps file ${path} is not valid JSON: ${e.message}`);
312
+ }
313
+ if (!Array.isArray(parsed)) {
314
+ throw new Error(`Steps file ${path} must be a JSON array of {action, assertion} objects.`);
315
+ }
316
+ return parsed.map((s, i) => {
317
+ if (typeof s?.action !== 'string') {
318
+ throw new Error(`Step ${i + 1} in ${path} is missing a string "action" field.`);
319
+ }
320
+ return {
321
+ action: s.action,
322
+ assertion: typeof s.assertion === 'string' ? s.assertion : undefined,
323
+ };
324
+ });
325
+ }
326
+ /**
327
+ * Pretty-print validator warnings in human mode. No-op in --json mode --
328
+ * warnings are already in the JSON payload.
329
+ */
330
+ function renderWarnings(warnings) {
331
+ if (!warnings || warnings.length === 0)
332
+ return;
333
+ process.stderr.write(`\n${warnings.length} warning(s):\n`);
334
+ for (const w of warnings) {
335
+ process.stderr.write(` - [${w.code}] ${w.message}\n`);
336
+ }
337
+ }
338
+ /**
339
+ * When the gateway returns 400 STEP_VALIDATION_FAILED, ApiError.body carries the
340
+ * structured errors + warnings. Surface them clearly before the generic error
341
+ * message so the user sees what to fix.
342
+ */
343
+ function renderValidationErrors(err, opts) {
344
+ if ((0, output_1.isJson)(opts))
345
+ return;
346
+ if (!(err instanceof client_1.ApiError))
347
+ return;
348
+ const body = err.body;
349
+ if (!body || err.code !== 'STEP_VALIDATION_FAILED')
350
+ return;
351
+ if (Array.isArray(body.errors)) {
352
+ process.stderr.write(`Validation errors (${body.errors.length}):\n`);
353
+ for (const e of body.errors) {
354
+ process.stderr.write(` - [${e.code}] ${e.message}\n`);
355
+ }
356
+ }
357
+ if (Array.isArray(body.warnings) && body.warnings.length > 0) {
358
+ process.stderr.write(`\nWarnings (${body.warnings.length}):\n`);
359
+ for (const w of body.warnings) {
360
+ process.stderr.write(` - [${w.code}] ${w.message}\n`);
361
+ }
362
+ }
363
+ }
364
+ //# sourceMappingURL=task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/commands/task.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerWhoamiCommand = registerWhoamiCommand;
4
+ const client_1 = require("../client");
5
+ const output_1 = require("../output");
6
+ function registerWhoamiCommand(program, globalOpts) {
7
+ program
8
+ .command('whoami')
9
+ .description('Show the current user, organization, and token')
10
+ .action(async () => {
11
+ const opts = globalOpts();
12
+ try {
13
+ const client = new client_1.GatewayClient();
14
+ const me = await client.request('/api/cli/whoami');
15
+ (0, output_1.printSuccess)({
16
+ user: me.user,
17
+ organization: me.organization,
18
+ token: me.token,
19
+ }, () => {
20
+ process.stdout.write(`User: ${me.user.email ?? me.user.id}\n`);
21
+ process.stdout.write(`Organization: ${me.organization.name} (${me.organization.role})\n`);
22
+ if (me.token) {
23
+ process.stdout.write(`Token: ${me.token.name} [${me.token.prefix}...]\n`);
24
+ }
25
+ }, opts);
26
+ }
27
+ catch (err) {
28
+ process.exit((0, output_1.printError)(err, opts));
29
+ }
30
+ });
31
+ }
32
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":";;AAWA,sDA6BC;AAvCD,sCAA0C;AAC1C,sCAAiE;AASjE,SAAgB,qBAAqB,CAAC,OAAgB,EAAE,UAA4B;IAClF,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,sBAAa,EAAE,CAAC;YACnC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAiB,iBAAiB,CAAC,CAAC;YAEnE,IAAA,qBAAY,EACV;gBACE,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,YAAY,EAAE,EAAE,CAAC,YAAY;gBAC7B,KAAK,EAAE,EAAE,CAAC,KAAK;aAChB,EACD,GAAG,EAAE;gBACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;gBACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,YAAY,CAAC,IAAI,KAAK,EAAE,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,CAAC;gBAC1F,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;oBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;gBACnF,CAAC;YACH,CAAC,EACD,IAAI,CACL,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,IAAA,mBAAU,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,56 @@
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.CREDENTIALS_PATH = exports.CREDENTIALS_DIR = exports.DEFAULT_GATEWAY_URL = void 0;
37
+ exports.gatewayUrl = gatewayUrl;
38
+ exports.envToken = envToken;
39
+ /**
40
+ * CLI runtime configuration. Env vars take precedence over defaults.
41
+ *
42
+ * SENTE_GATEWAY_URL -- override the gateway base URL
43
+ * SENTE_API_TOKEN -- override the stored PAT (CI use)
44
+ */
45
+ const os = __importStar(require("os"));
46
+ const path = __importStar(require("path"));
47
+ exports.DEFAULT_GATEWAY_URL = 'https://api.sente.run';
48
+ exports.CREDENTIALS_DIR = path.join(os.homedir(), '.sente');
49
+ exports.CREDENTIALS_PATH = path.join(exports.CREDENTIALS_DIR, 'credentials');
50
+ function gatewayUrl() {
51
+ return process.env.SENTE_GATEWAY_URL || exports.DEFAULT_GATEWAY_URL;
52
+ }
53
+ function envToken() {
54
+ return process.env.SENTE_API_TOKEN || undefined;
55
+ }
56
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,gCAEC;AAED,4BAEC;AAnBD;;;;;GAKG;AACH,uCAAyB;AACzB,2CAA6B;AAEhB,QAAA,mBAAmB,GAAG,uBAAuB,CAAC;AAC9C,QAAA,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AACpD,QAAA,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,uBAAe,EAAE,aAAa,CAAC,CAAC;AAE1E,SAAgB,UAAU;IACxB,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,2BAAmB,CAAC;AAC9D,CAAC;AAED,SAAgB,QAAQ;IACtB,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,SAAS,CAAC;AAClD,CAAC"}