@sun-asterisk/sungen 3.2.3-beta.3 → 3.2.4
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/cli/commands/feedback.d.ts +11 -0
- package/dist/cli/commands/feedback.d.ts.map +1 -1
- package/dist/cli/commands/feedback.js +154 -57
- package/dist/cli/commands/feedback.js.map +1 -1
- package/dist/cli/commands/login.d.ts +19 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/login.js +76 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/qa-feedback.d.ts +14 -0
- package/dist/cli/commands/qa-feedback.d.ts.map +1 -0
- package/dist/cli/commands/qa-feedback.js +83 -0
- package/dist/cli/commands/qa-feedback.js.map +1 -0
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/dashboard/snapshot-builder.d.ts.map +1 -1
- package/dist/dashboard/snapshot-builder.js +108 -33
- package/dist/dashboard/snapshot-builder.js.map +1 -1
- package/dist/dashboard/templates/index.html +23 -23
- package/dist/dashboard/types.d.ts +4 -0
- package/dist/dashboard/types.d.ts.map +1 -1
- package/dist/exporters/csv-exporter.d.ts.map +1 -1
- package/dist/exporters/csv-exporter.js +11 -4
- package/dist/exporters/csv-exporter.js.map +1 -1
- package/dist/exporters/feature-parser.d.ts +4 -0
- package/dist/exporters/feature-parser.d.ts.map +1 -1
- package/dist/exporters/feature-parser.js +7 -2
- package/dist/exporters/feature-parser.js.map +1 -1
- package/dist/exporters/json-exporter.d.ts.map +1 -1
- package/dist/exporters/json-exporter.js +11 -3
- package/dist/exporters/json-exporter.js.map +1 -1
- package/dist/exporters/playwright-report-parser.d.ts +21 -2
- package/dist/exporters/playwright-report-parser.d.ts.map +1 -1
- package/dist/exporters/playwright-report-parser.js +52 -12
- package/dist/exporters/playwright-report-parser.js.map +1 -1
- package/dist/exporters/scenario-merger.d.ts.map +1 -1
- package/dist/exporters/scenario-merger.js +50 -2
- package/dist/exporters/scenario-merger.js.map +1 -1
- package/dist/exporters/spec-parser.js +1 -1
- package/dist/exporters/spec-parser.js.map +1 -1
- package/dist/exporters/test-data-resolver.d.ts +7 -0
- package/dist/exporters/test-data-resolver.d.ts.map +1 -1
- package/dist/exporters/test-data-resolver.js +13 -0
- package/dist/exporters/test-data-resolver.js.map +1 -1
- package/dist/exporters/types.d.ts +6 -0
- package/dist/exporters/types.d.ts.map +1 -1
- package/dist/exporters/xlsx-exporter.d.ts.map +1 -1
- package/dist/exporters/xlsx-exporter.js +131 -42
- package/dist/exporters/xlsx-exporter.js.map +1 -1
- package/dist/generators/gherkin-parser/index.d.ts +15 -0
- package/dist/generators/gherkin-parser/index.d.ts.map +1 -1
- package/dist/generators/gherkin-parser/index.js +33 -1
- package/dist/generators/gherkin-parser/index.js.map +1 -1
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/check-action.hbs +29 -8
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/scroll-action.hbs +21 -17
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/toggle-action.hbs +3 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/uncheck-action.hbs +26 -6
- package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/is-hidden-assertion.hbs +3 -1
- package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/visible-assertion.hbs +14 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/gestures/tap-top-action.hbs +3 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/partials/locator.hbs +9 -2
- package/dist/generators/test-generator/adapters/appium/templates/test-file.hbs +115 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row.hbs +1 -1
- package/dist/harness/script-check.d.ts.map +1 -1
- package/dist/harness/script-check.js +10 -5
- package/dist/harness/script-check.js.map +1 -1
- package/dist/orchestrator/ai-skills/writer.d.ts.map +1 -1
- package/dist/orchestrator/ai-skills/writer.js +46 -4
- package/dist/orchestrator/ai-skills/writer.js.map +1 -1
- package/dist/orchestrator/templates/ai-src/commands/add-flow.md +52 -5
- package/dist/orchestrator/templates/ai-src/commands/create-test.md +7 -0
- package/dist/orchestrator/templates/ai-src/commands/feedback.md +6 -6
- package/dist/orchestrator/templates/ai-src/commands/locale.md +26 -4
- package/dist/orchestrator/templates/ai-src/skills/sungen-delivery/SKILL.md +5 -4
- package/dist/orchestrator/templates/wdio.conf.ts +39 -3
- package/dist/tools/sungen-api/edit-in-editor.d.ts +15 -0
- package/dist/tools/sungen-api/edit-in-editor.d.ts.map +1 -0
- package/dist/tools/sungen-api/edit-in-editor.js +85 -0
- package/dist/tools/sungen-api/edit-in-editor.js.map +1 -0
- package/dist/tools/sungen-api/feedback-client.d.ts +24 -0
- package/dist/tools/sungen-api/feedback-client.d.ts.map +1 -0
- package/dist/tools/sungen-api/feedback-client.js +53 -0
- package/dist/tools/sungen-api/feedback-client.js.map +1 -0
- package/dist/tools/sungen-api/read-stdin.d.ts +6 -0
- package/dist/tools/sungen-api/read-stdin.d.ts.map +1 -0
- package/dist/tools/sungen-api/read-stdin.js +19 -0
- package/dist/tools/sungen-api/read-stdin.js.map +1 -0
- package/dist/tools/sungen-auth/api-base-url.d.ts +14 -0
- package/dist/tools/sungen-auth/api-base-url.d.ts.map +1 -0
- package/dist/tools/sungen-auth/api-base-url.js +28 -0
- package/dist/tools/sungen-auth/api-base-url.js.map +1 -0
- package/dist/tools/sungen-auth/credentials-store.d.ts +19 -0
- package/dist/tools/sungen-auth/credentials-store.d.ts.map +1 -0
- package/dist/tools/sungen-auth/credentials-store.js +94 -0
- package/dist/tools/sungen-auth/credentials-store.js.map +1 -0
- package/dist/tools/sungen-auth/login-flow.d.ts +33 -0
- package/dist/tools/sungen-auth/login-flow.d.ts.map +1 -0
- package/dist/tools/sungen-auth/login-flow.js +107 -0
- package/dist/tools/sungen-auth/login-flow.js.map +1 -0
- package/dist/tools/sungen-auth/loopback-server.d.ts +20 -0
- package/dist/tools/sungen-auth/loopback-server.d.ts.map +1 -0
- package/dist/tools/sungen-auth/loopback-server.js +132 -0
- package/dist/tools/sungen-auth/loopback-server.js.map +1 -0
- package/dist/tools/sungen-auth/open-browser.d.ts +10 -0
- package/dist/tools/sungen-auth/open-browser.d.ts.map +1 -0
- package/dist/tools/sungen-auth/open-browser.js +43 -0
- package/dist/tools/sungen-auth/open-browser.js.map +1 -0
- package/dist/tools/sungen-auth/pkce.d.ts +13 -0
- package/dist/tools/sungen-auth/pkce.d.ts.map +1 -0
- package/dist/tools/sungen-auth/pkce.js +27 -0
- package/dist/tools/sungen-auth/pkce.js.map +1 -0
- package/dist/tools/sungen-auth/sungen-auth-types.d.ts +41 -0
- package/dist/tools/sungen-auth/sungen-auth-types.d.ts.map +1 -0
- package/dist/tools/sungen-auth/sungen-auth-types.js +7 -0
- package/dist/tools/sungen-auth/sungen-auth-types.js.map +1 -0
- package/package.json +3 -3
- package/src/cli/commands/feedback.ts +123 -51
- package/src/cli/commands/login.ts +75 -0
- package/src/cli/commands/qa-feedback.ts +77 -0
- package/src/cli/index.ts +4 -0
- package/src/dashboard/snapshot-builder.ts +100 -27
- package/src/dashboard/templates/index.html +23 -23
- package/src/dashboard/types.ts +5 -1
- package/src/exporters/csv-exporter.ts +10 -4
- package/src/exporters/feature-parser.ts +7 -2
- package/src/exporters/json-exporter.ts +11 -3
- package/src/exporters/playwright-report-parser.ts +50 -11
- package/src/exporters/scenario-merger.ts +49 -3
- package/src/exporters/spec-parser.ts +1 -1
- package/src/exporters/test-data-resolver.ts +13 -0
- package/src/exporters/types.ts +6 -0
- package/src/exporters/xlsx-exporter.ts +155 -49
- package/src/generators/gherkin-parser/index.ts +44 -1
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/check-action.hbs +29 -8
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/scroll-action.hbs +21 -17
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/toggle-action.hbs +3 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/uncheck-action.hbs +26 -6
- package/src/generators/test-generator/adapters/appium/templates/steps/assertions/is-hidden-assertion.hbs +3 -1
- package/src/generators/test-generator/adapters/appium/templates/steps/assertions/visible-assertion.hbs +14 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/gestures/tap-top-action.hbs +3 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/partials/locator.hbs +9 -2
- package/src/generators/test-generator/adapters/appium/templates/test-file.hbs +115 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row.hbs +1 -1
- package/src/harness/script-check.ts +10 -5
- package/src/orchestrator/ai-skills/writer.ts +39 -4
- package/src/orchestrator/templates/ai-src/commands/add-flow.md +52 -5
- package/src/orchestrator/templates/ai-src/commands/create-test.md +7 -0
- package/src/orchestrator/templates/ai-src/commands/feedback.md +6 -6
- package/src/orchestrator/templates/ai-src/commands/locale.md +26 -4
- package/src/orchestrator/templates/ai-src/skills/sungen-delivery/SKILL.md +5 -4
- package/src/orchestrator/templates/wdio.conf.ts +39 -3
- package/src/tools/sungen-api/edit-in-editor.ts +48 -0
- package/src/tools/sungen-api/feedback-client.ts +62 -0
- package/src/tools/sungen-api/read-stdin.ts +15 -0
- package/src/tools/sungen-auth/api-base-url.ts +23 -0
- package/src/tools/sungen-auth/credentials-store.ts +57 -0
- package/src/tools/sungen-auth/login-flow.ts +135 -0
- package/src/tools/sungen-auth/loopback-server.ts +113 -0
- package/src/tools/sungen-auth/open-browser.ts +42 -0
- package/src/tools/sungen-auth/pkce.ts +27 -0
- package/src/tools/sungen-auth/sungen-auth-types.ts +45 -0
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `sungen feedback "<content>"` — submit PRODUCT feedback to the remote backend.
|
|
3
|
+
*
|
|
4
|
+
* One markdown record per call. Content comes from the positional arg, piped
|
|
5
|
+
* stdin, or — when run bare in a TTY — an $EDITOR session. Login-gated:
|
|
6
|
+
* missing/expired token prompts an interactive login. The author (created_by)
|
|
7
|
+
* is NEVER sent; the backend stamps it from the bearer token.
|
|
8
|
+
*
|
|
9
|
+
* NOTE: distinct from `sungen qa-feedback` (commands/qa-feedback.ts) — that writes
|
|
10
|
+
* the LOCAL QA-feedback log and is what the /sungen:feedback slash command calls.
|
|
11
|
+
*/
|
|
1
12
|
import { Command } from 'commander';
|
|
2
13
|
export declare function registerFeedbackCommand(program: Command): void;
|
|
3
14
|
//# sourceMappingURL=feedback.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/feedback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8CpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8E9D"}
|
|
@@ -1,67 +1,164 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `sungen feedback "<content>"` — submit PRODUCT feedback to the remote backend.
|
|
4
|
+
*
|
|
5
|
+
* One markdown record per call. Content comes from the positional arg, piped
|
|
6
|
+
* stdin, or — when run bare in a TTY — an $EDITOR session. Login-gated:
|
|
7
|
+
* missing/expired token prompts an interactive login. The author (created_by)
|
|
8
|
+
* is NEVER sent; the backend stamps it from the bearer token.
|
|
9
|
+
*
|
|
10
|
+
* NOTE: distinct from `sungen qa-feedback` (commands/qa-feedback.ts) — that writes
|
|
11
|
+
* the LOCAL QA-feedback log and is what the /sungen:feedback slash command calls.
|
|
12
|
+
*/
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
2
46
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
47
|
exports.registerFeedbackCommand = registerFeedbackCommand;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
.
|
|
20
|
-
.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
throw new Error(`--type must be one of ${TYPES.join(', ')}`);
|
|
25
|
-
if (!DECISIONS.includes(o.decision))
|
|
26
|
-
throw new Error(`--decision must be one of ${DECISIONS.join(', ')}`);
|
|
27
|
-
const p = (0, feedback_1.recordFeedback)({
|
|
28
|
-
type: o.type,
|
|
29
|
-
screen: o.screen,
|
|
30
|
-
target: o.target,
|
|
31
|
-
decision: o.decision,
|
|
32
|
-
message: o.message,
|
|
33
|
-
reason: o.reason,
|
|
34
|
-
source: o.source,
|
|
35
|
-
});
|
|
36
|
-
console.log(`✓ feedback recorded (${o.type}${o.screen ? ' · ' + o.screen : ''}) → ${p}`);
|
|
37
|
-
}
|
|
38
|
-
catch (e) {
|
|
39
|
-
console.error('Error:', e instanceof Error ? e.message : e);
|
|
40
|
-
process.exit(1);
|
|
41
|
-
}
|
|
48
|
+
const readline = __importStar(require("readline"));
|
|
49
|
+
const credentials_store_1 = require("../../tools/sungen-auth/credentials-store");
|
|
50
|
+
const api_base_url_1 = require("../../tools/sungen-auth/api-base-url");
|
|
51
|
+
const login_1 = require("./login");
|
|
52
|
+
const feedback_client_1 = require("../../tools/sungen-api/feedback-client");
|
|
53
|
+
const read_stdin_1 = require("../../tools/sungen-api/read-stdin");
|
|
54
|
+
const edit_in_editor_1 = require("../../tools/sungen-api/edit-in-editor");
|
|
55
|
+
const CATEGORIES = ['quality', 'feature_request', 'bug', 'other'];
|
|
56
|
+
const QA_WORDS = ['record', 'list'];
|
|
57
|
+
const MAX_CONTENT_LEN = 10000;
|
|
58
|
+
// CLI version → sungen_version; same source as cli/index.ts so it never drifts.
|
|
59
|
+
const { version: SUNGEN_VERSION } = require('../../../package.json');
|
|
60
|
+
/** Ask a yes/no question on the terminal; defaults to "no" on empty input. */
|
|
61
|
+
function promptYesNo(question) {
|
|
62
|
+
return new Promise((resolve) => {
|
|
63
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
64
|
+
rl.question(question, (answer) => {
|
|
65
|
+
rl.close();
|
|
66
|
+
resolve(/^y(es)?$/i.test(answer.trim()));
|
|
67
|
+
});
|
|
42
68
|
});
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
69
|
+
}
|
|
70
|
+
/** Resolve feedback content from positional arg or piped stdin. */
|
|
71
|
+
async function resolveContent(positional) {
|
|
72
|
+
if (positional && positional.trim())
|
|
73
|
+
return positional;
|
|
74
|
+
const piped = await (0, read_stdin_1.readStdin)();
|
|
75
|
+
if (piped && piped.trim())
|
|
76
|
+
return piped;
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
/** Ensure we have a valid token; prompt an interactive login if not. Returns creds or null if the user declines. */
|
|
80
|
+
async function ensureLogin(apiBaseUrl) {
|
|
81
|
+
const creds = (0, credentials_store_1.loadCredentials)();
|
|
82
|
+
if (creds && !(0, credentials_store_1.isExpired)(creds))
|
|
83
|
+
return creds;
|
|
84
|
+
const reason = creds ? 'Your session has expired.' : 'You are not logged in.';
|
|
85
|
+
const yes = await promptYesNo(`${reason} Log in now? (y/n) `);
|
|
86
|
+
if (!yes)
|
|
87
|
+
return null;
|
|
88
|
+
return (0, login_1.performLogin)(apiBaseUrl);
|
|
89
|
+
}
|
|
90
|
+
function registerFeedbackCommand(program) {
|
|
91
|
+
program
|
|
92
|
+
.command('feedback [content]')
|
|
93
|
+
.description('Send product feedback about sungen (one record; pass as an argument, pipe via stdin, or run with no argument to compose in $EDITOR)')
|
|
94
|
+
.option('--category <c>', `Feedback category (${CATEGORIES.join('|')})`, 'other')
|
|
95
|
+
.option('--api-base-url <url>', 'Backend base URL (overrides SUNGEN_API_BASE_URL + stored value)')
|
|
96
|
+
.action(async (content, options) => {
|
|
50
97
|
try {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
98
|
+
// Footgun guard: a bare `record`/`list` with no stdin is almost certainly
|
|
99
|
+
// someone reaching for the moved QA primitive, not real feedback text.
|
|
100
|
+
if (content && QA_WORDS.includes(content.trim()) && process.stdin.isTTY) {
|
|
101
|
+
console.error(`The local QA log moved to \`sungen qa-feedback ${content.trim()}\`.\n` +
|
|
102
|
+
`To send "${content.trim()}" as product feedback, pipe it via stdin: echo "${content.trim()}" | sungen feedback`);
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
let text = await resolveContent(content);
|
|
106
|
+
if (!text) {
|
|
107
|
+
if (process.stdin.isTTY) {
|
|
108
|
+
// No arg and interactive: open the editor (like `git commit`).
|
|
109
|
+
text = (0, edit_in_editor_1.composeInEditor)();
|
|
110
|
+
if (!text) {
|
|
111
|
+
console.error('Aborting — no feedback provided (empty message).');
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
// Piped but empty.
|
|
117
|
+
console.error('Provide feedback text as an argument or pipe it via stdin.');
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (text.length > MAX_CONTENT_LEN) {
|
|
122
|
+
console.error(`Feedback is too long (${text.length} chars; max ${MAX_CONTENT_LEN}).`);
|
|
123
|
+
process.exit(1);
|
|
124
|
+
}
|
|
125
|
+
if (!CATEGORIES.includes(options.category)) {
|
|
126
|
+
console.error(`--category must be one of ${CATEGORIES.join(', ')}`);
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
const apiBaseUrl = (0, api_base_url_1.resolveApiBaseUrl)(options.apiBaseUrl);
|
|
130
|
+
const creds = await ensureLogin(apiBaseUrl);
|
|
131
|
+
if (!creds) {
|
|
132
|
+
console.error('Run `sungen login` first, then re-send your feedback.');
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
135
|
+
const payload = {
|
|
136
|
+
content: text,
|
|
137
|
+
category: options.category,
|
|
138
|
+
sungen_version: SUNGEN_VERSION,
|
|
139
|
+
os: process.platform,
|
|
140
|
+
source: 'cli',
|
|
141
|
+
};
|
|
142
|
+
try {
|
|
143
|
+
const { id } = await (0, feedback_client_1.submitFeedback)(creds.api_base_url, creds.token, payload);
|
|
144
|
+
console.log(`Feedback submitted (id=${id}).`);
|
|
55
145
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
146
|
+
catch (err) {
|
|
147
|
+
if (err instanceof feedback_client_1.AuthExpiredError) {
|
|
148
|
+
// Token died between load and POST — re-login once, then retry.
|
|
149
|
+
const yes = await promptYesNo('Your session expired. Log in again and retry? (y/n) ');
|
|
150
|
+
if (!yes) {
|
|
151
|
+
console.error('Aborted.');
|
|
152
|
+
process.exit(1);
|
|
153
|
+
}
|
|
154
|
+
const fresh = await (0, login_1.performLogin)(apiBaseUrl);
|
|
155
|
+
const { id } = await (0, feedback_client_1.submitFeedback)(fresh.api_base_url, fresh.token, payload);
|
|
156
|
+
console.log(`Feedback submitted (id=${id}).`);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
throw err;
|
|
160
|
+
}
|
|
63
161
|
}
|
|
64
|
-
console.log('');
|
|
65
162
|
}
|
|
66
163
|
catch (e) {
|
|
67
164
|
console.error('Error:', e instanceof Error ? e.message : e);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../../src/cli/commands/feedback.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../../src/cli/commands/feedback.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `sungen login` / `sungen logout`.
|
|
3
|
+
*
|
|
4
|
+
* login — RFC 8252 native-app login (PKCE-S256 + loopback + one-time code)
|
|
5
|
+
* against the FastSchema backend; caches the token at
|
|
6
|
+
* ~/.sungen/credentials.json (0600).
|
|
7
|
+
* logout — clears that file.
|
|
8
|
+
*
|
|
9
|
+
* Mirrors the structure of `commands/figma.ts` (commander + scrubbed errors).
|
|
10
|
+
*/
|
|
11
|
+
import { Command } from 'commander';
|
|
12
|
+
import type { Credentials } from '../../tools/sungen-auth/sungen-auth-types';
|
|
13
|
+
/**
|
|
14
|
+
* Run the full login flow against `apiBaseUrl`, persist the token, and return
|
|
15
|
+
* the stored credentials. Reused by `sungen feedback` for on-demand re-auth.
|
|
16
|
+
*/
|
|
17
|
+
export declare function performLogin(apiBaseUrl: string): Promise<Credentials>;
|
|
18
|
+
export declare function registerLoginCommand(program: Command): void;
|
|
19
|
+
//# sourceMappingURL=login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AAE7E;;;GAGG;AACH,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAwB3E;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwB3D"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `sungen login` / `sungen logout`.
|
|
4
|
+
*
|
|
5
|
+
* login — RFC 8252 native-app login (PKCE-S256 + loopback + one-time code)
|
|
6
|
+
* against the FastSchema backend; caches the token at
|
|
7
|
+
* ~/.sungen/credentials.json (0600).
|
|
8
|
+
* logout — clears that file.
|
|
9
|
+
*
|
|
10
|
+
* Mirrors the structure of `commands/figma.ts` (commander + scrubbed errors).
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.performLogin = performLogin;
|
|
14
|
+
exports.registerLoginCommand = registerLoginCommand;
|
|
15
|
+
const pkce_1 = require("../../tools/sungen-auth/pkce");
|
|
16
|
+
const loopback_server_1 = require("../../tools/sungen-auth/loopback-server");
|
|
17
|
+
const login_flow_1 = require("../../tools/sungen-auth/login-flow");
|
|
18
|
+
const credentials_store_1 = require("../../tools/sungen-auth/credentials-store");
|
|
19
|
+
const open_browser_1 = require("../../tools/sungen-auth/open-browser");
|
|
20
|
+
const api_base_url_1 = require("../../tools/sungen-auth/api-base-url");
|
|
21
|
+
/**
|
|
22
|
+
* Run the full login flow against `apiBaseUrl`, persist the token, and return
|
|
23
|
+
* the stored credentials. Reused by `sungen feedback` for on-demand re-auth.
|
|
24
|
+
*/
|
|
25
|
+
async function performLogin(apiBaseUrl) {
|
|
26
|
+
const pkce = (0, pkce_1.generatePkce)();
|
|
27
|
+
const correlation = (0, pkce_1.randomCorrelation)();
|
|
28
|
+
const loopback = await (0, loopback_server_1.startLoopback)();
|
|
29
|
+
try {
|
|
30
|
+
const result = await (0, login_flow_1.runLoginFlow)({
|
|
31
|
+
apiBaseUrl,
|
|
32
|
+
pkce,
|
|
33
|
+
correlation,
|
|
34
|
+
redirectUri: loopback.redirectUri,
|
|
35
|
+
openBrowser: open_browser_1.openBrowser,
|
|
36
|
+
waitForCode: (corr, timeoutMs) => loopback.waitForCode(corr, timeoutMs),
|
|
37
|
+
});
|
|
38
|
+
const creds = {
|
|
39
|
+
token: result.token,
|
|
40
|
+
email: result.email,
|
|
41
|
+
api_base_url: apiBaseUrl,
|
|
42
|
+
expires_at: result.expires_at,
|
|
43
|
+
};
|
|
44
|
+
(0, credentials_store_1.saveCredentials)(creds);
|
|
45
|
+
return creds;
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
loopback.close();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function registerLoginCommand(program) {
|
|
52
|
+
program
|
|
53
|
+
.command('login')
|
|
54
|
+
.description('Log in to the sungen feedback backend (opens your browser)')
|
|
55
|
+
.option('--api-base-url <url>', 'Backend base URL (overrides SUNGEN_API_BASE_URL + stored value)')
|
|
56
|
+
.action(async (options) => {
|
|
57
|
+
const apiBaseUrl = (0, api_base_url_1.resolveApiBaseUrl)(options.apiBaseUrl);
|
|
58
|
+
try {
|
|
59
|
+
const creds = await performLogin(apiBaseUrl);
|
|
60
|
+
console.log(`Logged in as ${creds.email}.`);
|
|
61
|
+
console.log(`Token saved to ${(0, credentials_store_1.credentialsPath)()} (mode 0600).`);
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
console.error(`Login failed: ${err?.message ?? err}`);
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
program
|
|
69
|
+
.command('logout')
|
|
70
|
+
.description('Remove the cached sungen login token')
|
|
71
|
+
.action(() => {
|
|
72
|
+
(0, credentials_store_1.clearCredentials)();
|
|
73
|
+
console.log(`Logged out. Removed ${(0, credentials_store_1.credentialsPath)()} (if present).`);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AAeH,oCAwBC;AAED,oDAwBC;AA9DD,uDAA+E;AAC/E,6EAAwE;AACxE,mEAAkE;AAClE,iFAA+G;AAC/G,uEAAmE;AACnE,uEAAyE;AAGzE;;;GAGG;AACI,KAAK,UAAU,YAAY,CAAC,UAAkB;IACnD,MAAM,IAAI,GAAG,IAAA,mBAAY,GAAE,CAAC;IAC5B,MAAM,WAAW,GAAG,IAAA,wBAAiB,GAAE,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,IAAA,+BAAa,GAAE,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAY,EAAC;YAChC,UAAU;YACV,IAAI;YACJ,WAAW;YACX,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,WAAW,EAAX,0BAAW;YACX,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC;SACxE,CAAC,CAAC;QACH,MAAM,KAAK,GAAgB;YACzB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,YAAY,EAAE,UAAU;YACxB,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC;QACF,IAAA,mCAAe,EAAC,KAAK,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAgB,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,4DAA4D,CAAC;SACzE,MAAM,CAAC,sBAAsB,EAAE,iEAAiE,CAAC;SACjG,MAAM,CAAC,KAAK,EAAE,OAAgC,EAAE,EAAE;QACjD,MAAM,UAAU,GAAG,IAAA,gCAAiB,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAA,mCAAe,GAAE,eAAe,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,iBAAiB,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,GAAG,EAAE;QACX,IAAA,oCAAgB,GAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAA,mCAAe,GAAE,gBAAgB,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `sungen qa-feedback` — the LOCAL QA-feedback log (test-design knowledge +
|
|
3
|
+
* product telemetry), persisted to .sungen/feedback/feedback.jsonl.
|
|
4
|
+
*
|
|
5
|
+
* This is the persistence primitive behind the `/sungen:feedback` slash command
|
|
6
|
+
* (which auto-attaches screen/viewpoint/decision context and then calls
|
|
7
|
+
* `sungen qa-feedback record`). It is rarely typed by hand.
|
|
8
|
+
*
|
|
9
|
+
* NOTE: distinct from `sungen feedback` (see commands/feedback.ts) — that command
|
|
10
|
+
* submits PRODUCT feedback to the remote backend. This one only writes locally.
|
|
11
|
+
*/
|
|
12
|
+
import { Command } from 'commander';
|
|
13
|
+
export declare function registerQaFeedbackCommand(program: Command): void;
|
|
14
|
+
//# sourceMappingURL=qa-feedback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qa-feedback.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/qa-feedback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0DhE"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `sungen qa-feedback` — the LOCAL QA-feedback log (test-design knowledge +
|
|
4
|
+
* product telemetry), persisted to .sungen/feedback/feedback.jsonl.
|
|
5
|
+
*
|
|
6
|
+
* This is the persistence primitive behind the `/sungen:feedback` slash command
|
|
7
|
+
* (which auto-attaches screen/viewpoint/decision context and then calls
|
|
8
|
+
* `sungen qa-feedback record`). It is rarely typed by hand.
|
|
9
|
+
*
|
|
10
|
+
* NOTE: distinct from `sungen feedback` (see commands/feedback.ts) — that command
|
|
11
|
+
* submits PRODUCT feedback to the remote backend. This one only writes locally.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.registerQaFeedbackCommand = registerQaFeedbackCommand;
|
|
15
|
+
const feedback_1 = require("../../harness/feedback");
|
|
16
|
+
const TYPES = ['test-design', 'product', 'other'];
|
|
17
|
+
const DECISIONS = ['accept', 'reject', 'edit', 'add', 'none'];
|
|
18
|
+
function registerQaFeedbackCommand(program) {
|
|
19
|
+
const fb = program
|
|
20
|
+
.command('qa-feedback')
|
|
21
|
+
.description('Local-first QA feedback log (test-design knowledge + product telemetry). Primarily invoked by the /sungen:feedback slash command.');
|
|
22
|
+
fb
|
|
23
|
+
.command('record')
|
|
24
|
+
.description('Record a feedback entry')
|
|
25
|
+
.requiredOption('--message <text>', 'The feedback')
|
|
26
|
+
.option('--type <t>', `Feedback type (${TYPES.join('|')})`, 'test-design')
|
|
27
|
+
.option('-s, --screen <name>', 'Screen/flow the feedback relates to')
|
|
28
|
+
.option('--target <ref>', 'What it is about (viewpoint id / scenario / command / artifact)')
|
|
29
|
+
.option('--decision <d>', `QA decision (${DECISIONS.join('|')})`, 'none')
|
|
30
|
+
.option('--reason <text>', 'Why')
|
|
31
|
+
.option('--source <who>', 'Who gave the feedback', 'qa')
|
|
32
|
+
.action((o) => {
|
|
33
|
+
try {
|
|
34
|
+
if (!TYPES.includes(o.type))
|
|
35
|
+
throw new Error(`--type must be one of ${TYPES.join(', ')}`);
|
|
36
|
+
if (!DECISIONS.includes(o.decision))
|
|
37
|
+
throw new Error(`--decision must be one of ${DECISIONS.join(', ')}`);
|
|
38
|
+
const p = (0, feedback_1.recordFeedback)({
|
|
39
|
+
type: o.type,
|
|
40
|
+
screen: o.screen,
|
|
41
|
+
target: o.target,
|
|
42
|
+
decision: o.decision,
|
|
43
|
+
message: o.message,
|
|
44
|
+
reason: o.reason,
|
|
45
|
+
source: o.source,
|
|
46
|
+
});
|
|
47
|
+
console.log(`✓ feedback recorded (${o.type}${o.screen ? ' · ' + o.screen : ''}) → ${p}`);
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
console.error('Error:', e instanceof Error ? e.message : e);
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
fb
|
|
55
|
+
.command('list')
|
|
56
|
+
.description('List / summarise recorded feedback')
|
|
57
|
+
.option('-s, --screen <name>', 'Filter by screen')
|
|
58
|
+
.option('--type <t>', 'Filter by type')
|
|
59
|
+
.option('--json', 'Output raw JSON')
|
|
60
|
+
.action((o) => {
|
|
61
|
+
try {
|
|
62
|
+
const s = (0, feedback_1.summarize)({ screen: o.screen, type: o.type });
|
|
63
|
+
if (o.json) {
|
|
64
|
+
console.log(JSON.stringify(s, null, 2));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
console.log(`\n━━━ Feedback (${s.total}) ━━━`);
|
|
68
|
+
console.log(` by type: ${Object.entries(s.byType).map(([k, v]) => `${k}=${v}`).join(' ') || '—'}`);
|
|
69
|
+
console.log(` by decision: ${Object.entries(s.byDecision).map(([k, v]) => `${k}=${v}`).join(' ') || '—'}\n`);
|
|
70
|
+
for (const e of s.entries.slice(-20)) {
|
|
71
|
+
console.log(` [${e.type}${e.decision && e.decision !== 'none' ? '/' + e.decision : ''}] ${e.screen ? e.screen + ' · ' : ''}${e.target ? e.target + ' — ' : ''}${e.message}`);
|
|
72
|
+
if (e.reason)
|
|
73
|
+
console.log(` reason: ${e.reason}`);
|
|
74
|
+
}
|
|
75
|
+
console.log('');
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
console.error('Error:', e instanceof Error ? e.message : e);
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=qa-feedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qa-feedback.js","sourceRoot":"","sources":["../../../src/cli/commands/qa-feedback.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -24,6 +24,7 @@ const eval_1 = require("./commands/eval");
|
|
|
24
24
|
const manifest_1 = require("./commands/manifest");
|
|
25
25
|
const ledger_1 = require("./commands/ledger");
|
|
26
26
|
const feedback_1 = require("./commands/feedback");
|
|
27
|
+
const qa_feedback_1 = require("./commands/qa-feedback");
|
|
27
28
|
const script_check_1 = require("./commands/script-check");
|
|
28
29
|
const trace_1 = require("./commands/trace");
|
|
29
30
|
const challenge_1 = require("./commands/challenge");
|
|
@@ -32,6 +33,7 @@ const capability_1 = require("./commands/capability");
|
|
|
32
33
|
const flow_check_1 = require("./commands/flow-check");
|
|
33
34
|
const context_1 = require("./commands/context");
|
|
34
35
|
const repair_1 = require("./commands/repair");
|
|
36
|
+
const login_1 = require("./commands/login");
|
|
35
37
|
const registry_1 = require("../capabilities/registry");
|
|
36
38
|
const discover_1 = require("../capabilities/discover");
|
|
37
39
|
// Read version from package.json so `--version` never drifts from the released version.
|
|
@@ -62,6 +64,7 @@ async function main() {
|
|
|
62
64
|
(0, manifest_1.registerManifestCommand)(program);
|
|
63
65
|
(0, ledger_1.registerLedgerCommand)(program);
|
|
64
66
|
(0, feedback_1.registerFeedbackCommand)(program);
|
|
67
|
+
(0, qa_feedback_1.registerQaFeedbackCommand)(program);
|
|
65
68
|
(0, script_check_1.registerScriptCheckCommand)(program);
|
|
66
69
|
(0, trace_1.registerTraceCommand)(program);
|
|
67
70
|
(0, challenge_1.registerChallengeCommand)(program);
|
|
@@ -72,6 +75,7 @@ async function main() {
|
|
|
72
75
|
(0, repair_1.registerRepairCommand)(program);
|
|
73
76
|
(0, ingest_1.registerIngestCommand)(program);
|
|
74
77
|
(0, eval_1.registerEvalCommand)(program);
|
|
78
|
+
(0, login_1.registerLoginCommand)(program);
|
|
75
79
|
// Capability-contributed CLI commands (Capability SPI): drivers own their authoring commands
|
|
76
80
|
// (e.g. @sungen/driver-api → `sungen api import`). Discover, then register each.
|
|
77
81
|
(0, discover_1.discoverAndRegisterCapabilities)();
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AACA;;;GAGG;;AAEH,yCAAoC;AACpC,0CAAsD;AACtD,wCAAoD;AACpD,kDAA8D;AAC9D,kDAA8D;AAC9D,8CAA0D;AAC1D,kDAA8D;AAC9D,4CAAwD;AACxD,kDAA6D;AAC7D,oDAAgE;AAChE,4CAAwD;AACxD,sDAAiE;AACjE,gDAA4D;AAC5D,0CAAsD;AACtD,8CAA0D;AAC1D,0CAAsD;AACtD,kDAA8D;AAC9D,8CAA0D;AAC1D,kDAA8D;AAC9D,0DAAqE;AACrE,4CAAwD;AACxD,oDAAgE;AAChE,oDAAgE;AAChE,sDAAkE;AAClE,sDAAiE;AACjE,gDAA4D;AAC5D,8CAA0D;AAC1D,uDAA8D;AAC9D,uDAA2E;AAE3E,wFAAwF;AACxF,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;AAEzE,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,QAAQ,CAAC;SACd,WAAW,CAAC,oEAAoE,CAAC;SACjF,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,iBAAiB;IACjB,OAAO;SACJ,MAAM,CAAC,eAAe,EAAE,wBAAwB,CAAC,CAAC;IAErD,oBAAoB;IACpB,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;IAC7B,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;IAC5B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IACjC,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IACjC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;IAC/B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IACjC,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;IAC9B,IAAA,iCAAsB,EAAC,OAAO,CAAC,CAAC;IAChC,IAAA,oCAAwB,EAAC,OAAO,CAAC,CAAC;IAClC,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;IAC9B,IAAA,qCAAwB,EAAC,OAAO,CAAC,CAAC;IAClC,IAAA,gCAAsB,EAAC,OAAO,CAAC,CAAC;IAChC,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;IAC7B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IACjC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;IAC/B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IACjC,IAAA,yCAA0B,EAAC,OAAO,CAAC,CAAC;IACpC,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;IAC9B,IAAA,oCAAwB,EAAC,OAAO,CAAC,CAAC;IAClC,IAAA,oCAAwB,EAAC,OAAO,CAAC,CAAC;IAClC,IAAA,sCAAyB,EAAC,OAAO,CAAC,CAAC;IACnC,IAAA,qCAAwB,EAAC,OAAO,CAAC,CAAC;IAClC,IAAA,gCAAsB,EAAC,OAAO,CAAC,CAAC;IAChC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;IAC/B,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;IAC/B,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot-builder.d.ts","sourceRoot":"","sources":["../../src/dashboard/snapshot-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAeH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAEL,iBAAiB,EAGjB,gBAAgB,EAIjB,MAAM,SAAS,CAAC;AAQjB,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,GAAG,EAAE,eAAe,CAAC;IACrB,oEAAoE;IACpE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,oBAAoB,GAAG,iBAAiB,CAwBvF;
|
|
1
|
+
{"version":3,"file":"snapshot-builder.d.ts","sourceRoot":"","sources":["../../src/dashboard/snapshot-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAeH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAEL,iBAAiB,EAGjB,gBAAgB,EAIjB,MAAM,SAAS,CAAC;AAQjB,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,GAAG,EAAE,eAAe,CAAC;IACrB,oEAAoE;IACpE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,oBAAoB,GAAG,iBAAiB,CAwBvF;AAiXD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,EAAE,CAkBnE;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,CAK5E;AAwFD,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
|