@kindgi/cli 0.1.8 → 0.1.9-rc.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/README.md +59 -2
- package/dist/api-address.d.ts +104 -12
- package/dist/api-address.d.ts.map +1 -1
- package/dist/api-address.js +169 -30
- package/dist/api-address.js.map +1 -1
- package/dist/build/host-install.d.ts.map +1 -1
- package/dist/build/host-install.js +5 -2
- package/dist/build/host-install.js.map +1 -1
- package/dist/cli.js +12 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/approvals.d.ts.map +1 -1
- package/dist/commands/approvals.js +15 -3
- package/dist/commands/approvals.js.map +1 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +27 -0
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/build.d.ts +18 -0
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +118 -13
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/conversations.d.ts.map +1 -1
- package/dist/commands/conversations.js +13 -3
- package/dist/commands/conversations.js.map +1 -1
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +235 -53
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/deployments.d.ts +3 -0
- package/dist/commands/deployments.d.ts.map +1 -0
- package/dist/commands/deployments.js +196 -0
- package/dist/commands/deployments.js.map +1 -0
- package/dist/commands/doctor.d.ts +1 -5
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +42 -22
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/egress.d.ts +9 -0
- package/dist/commands/egress.d.ts.map +1 -0
- package/dist/commands/egress.js +40 -0
- package/dist/commands/egress.js.map +1 -0
- package/dist/commands/env-scoped.d.ts +5 -0
- package/dist/commands/env-scoped.d.ts.map +1 -1
- package/dist/commands/env-scoped.js +64 -19
- package/dist/commands/env-scoped.js.map +1 -1
- package/dist/commands/env.d.ts.map +1 -1
- package/dist/commands/env.js +91 -30
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/environments.d.ts +6 -0
- package/dist/commands/environments.d.ts.map +1 -0
- package/dist/commands/environments.js +166 -0
- package/dist/commands/environments.js.map +1 -0
- package/dist/commands/exports.d.ts.map +1 -1
- package/dist/commands/exports.js +118 -3
- package/dist/commands/exports.js.map +1 -1
- package/dist/commands/feedback.d.ts +1 -2
- package/dist/commands/feedback.d.ts.map +1 -1
- package/dist/commands/feedback.js +55 -24
- package/dist/commands/feedback.js.map +1 -1
- package/dist/commands/helpers.d.ts +6 -0
- package/dist/commands/helpers.d.ts.map +1 -1
- package/dist/commands/helpers.js +8 -0
- package/dist/commands/helpers.js.map +1 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +12 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/license.d.ts +3 -0
- package/dist/commands/license.d.ts.map +1 -1
- package/dist/commands/license.js +1 -1
- package/dist/commands/license.js.map +1 -1
- package/dist/commands/people.d.ts.map +1 -1
- package/dist/commands/people.js +105 -10
- package/dist/commands/people.js.map +1 -1
- package/dist/commands/projects.d.ts.map +1 -1
- package/dist/commands/projects.js +133 -11
- package/dist/commands/projects.js.map +1 -1
- package/dist/commands/promote.d.ts +38 -0
- package/dist/commands/promote.d.ts.map +1 -0
- package/dist/commands/promote.js +371 -0
- package/dist/commands/promote.js.map +1 -0
- package/dist/commands/proposals.d.ts.map +1 -1
- package/dist/commands/proposals.js +2 -1
- package/dist/commands/proposals.js.map +1 -1
- package/dist/commands/providers.d.ts.map +1 -1
- package/dist/commands/providers.js +29 -5
- package/dist/commands/providers.js.map +1 -1
- package/dist/commands/schedules.d.ts.map +1 -1
- package/dist/commands/schedules.js +30 -2
- package/dist/commands/schedules.js.map +1 -1
- package/dist/commands/secrets.d.ts.map +1 -1
- package/dist/commands/secrets.js +65 -40
- package/dist/commands/secrets.js.map +1 -1
- package/dist/commands/sign-in.d.ts +3 -0
- package/dist/commands/sign-in.d.ts.map +1 -0
- package/dist/commands/sign-in.js +61 -0
- package/dist/commands/sign-in.js.map +1 -0
- package/dist/commands/sites.d.ts +3 -0
- package/dist/commands/sites.d.ts.map +1 -0
- package/dist/commands/sites.js +244 -0
- package/dist/commands/sites.js.map +1 -0
- package/dist/commands/tools.d.ts.map +1 -1
- package/dist/commands/tools.js +2 -2
- package/dist/commands/tools.js.map +1 -1
- package/dist/commands/types.d.ts +11 -0
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/webhooks.d.ts.map +1 -1
- package/dist/commands/webhooks.js +38 -2
- package/dist/commands/webhooks.js.map +1 -1
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +20 -7
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +38 -2
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +12 -1
- package/dist/context.js.map +1 -1
- package/dist/deploy/defaults.d.ts.map +1 -1
- package/dist/deploy/defaults.js +7 -1
- package/dist/deploy/defaults.js.map +1 -1
- package/dist/deploy/pack-service-text.d.ts +29 -0
- package/dist/deploy/pack-service-text.d.ts.map +1 -0
- package/dist/deploy/pack-service-text.js +72 -0
- package/dist/deploy/pack-service-text.js.map +1 -0
- package/dist/deploy/post.d.ts +17 -4
- package/dist/deploy/post.d.ts.map +1 -1
- package/dist/deploy/post.js +177 -60
- package/dist/deploy/post.js.map +1 -1
- package/dist/deploy/promotion-path.d.ts +44 -0
- package/dist/deploy/promotion-path.d.ts.map +1 -0
- package/dist/deploy/promotion-path.js +86 -0
- package/dist/deploy/promotion-path.js.map +1 -0
- package/dist/deploy/response.d.ts +3 -0
- package/dist/deploy/response.d.ts.map +1 -1
- package/dist/deploy/response.js +66 -12
- package/dist/deploy/response.js.map +1 -1
- package/dist/deploy/runners.d.ts +99 -5
- package/dist/deploy/runners.d.ts.map +1 -1
- package/dist/dev/java-builder.d.ts.map +1 -1
- package/dist/dev/java-builder.js +19 -3
- package/dist/dev/java-builder.js.map +1 -1
- package/dist/dev/python-builder.d.ts.map +1 -1
- package/dist/dev/python-builder.js +18 -3
- package/dist/dev/python-builder.js.map +1 -1
- package/dist/dev/runtime-container.d.ts +28 -3
- package/dist/dev/runtime-container.d.ts.map +1 -1
- package/dist/dev/runtime-container.js +103 -36
- package/dist/dev/runtime-container.js.map +1 -1
- package/dist/dev/runtime-image.d.ts +1 -1
- package/dist/dev/runtime-image.d.ts.map +1 -1
- package/dist/dev/runtime-image.js +1 -1
- package/dist/dev/runtime-image.js.map +1 -1
- package/dist/dev/scala-builder.d.ts.map +1 -1
- package/dist/dev/scala-builder.js +55 -21
- package/dist/dev/scala-builder.js.map +1 -1
- package/dist/dev/shared-watch.d.ts +30 -0
- package/dist/dev/shared-watch.d.ts.map +1 -1
- package/dist/dev/shared-watch.js +46 -1
- package/dist/dev/shared-watch.js.map +1 -1
- package/dist/env/pack-env-hint.d.ts +52 -0
- package/dist/env/pack-env-hint.d.ts.map +1 -0
- package/dist/env/pack-env-hint.js +57 -0
- package/dist/env/pack-env-hint.js.map +1 -0
- package/dist/env/pack-env-plan.d.ts +2 -0
- package/dist/env/pack-env-plan.d.ts.map +1 -1
- package/dist/env/pack-env-plan.js +2 -1
- package/dist/env/pack-env-plan.js.map +1 -1
- package/dist/env-projects.d.ts +23 -0
- package/dist/env-projects.d.ts.map +1 -0
- package/dist/env-projects.js +28 -0
- package/dist/env-projects.js.map +1 -0
- package/dist/exports/create.d.ts +71 -0
- package/dist/exports/create.d.ts.map +1 -0
- package/dist/exports/create.js +576 -0
- package/dist/exports/create.js.map +1 -0
- package/dist/exports/plan.d.ts +69 -0
- package/dist/exports/plan.d.ts.map +1 -0
- package/dist/exports/plan.js +496 -0
- package/dist/exports/plan.js.map +1 -0
- package/dist/exports/reader.d.ts +48 -0
- package/dist/exports/reader.d.ts.map +1 -0
- package/dist/exports/reader.js +181 -0
- package/dist/exports/reader.js.map +1 -0
- package/dist/feedback/entries.d.ts +53 -0
- package/dist/feedback/entries.d.ts.map +1 -0
- package/dist/feedback/entries.js +173 -0
- package/dist/feedback/entries.js.map +1 -0
- package/dist/feedback/intake.d.ts +37 -0
- package/dist/feedback/intake.d.ts.map +1 -0
- package/dist/feedback/intake.js +101 -0
- package/dist/feedback/intake.js.map +1 -0
- package/dist/feedback/protocol.d.ts +111 -0
- package/dist/feedback/protocol.d.ts.map +1 -0
- package/dist/feedback/protocol.js +143 -0
- package/dist/feedback/protocol.js.map +1 -0
- package/dist/feedback/redact.d.ts +34 -0
- package/dist/feedback/redact.d.ts.map +1 -0
- package/dist/feedback/redact.js +258 -0
- package/dist/feedback/redact.js.map +1 -0
- package/dist/feedback/report.d.ts +51 -0
- package/dist/feedback/report.d.ts.map +1 -0
- package/dist/feedback/report.js +122 -0
- package/dist/feedback/report.js.map +1 -0
- package/dist/feedback/run.d.ts +21 -0
- package/dist/feedback/run.d.ts.map +1 -0
- package/dist/feedback/run.js +578 -0
- package/dist/feedback/run.js.map +1 -0
- package/dist/feedback/store.d.ts +24 -0
- package/dist/feedback/store.d.ts.map +1 -0
- package/dist/feedback/store.js +117 -0
- package/dist/feedback/store.js.map +1 -0
- package/dist/main.d.ts +6 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +86 -5
- package/dist/main.js.map +1 -1
- package/dist/node-version.d.ts +13 -0
- package/dist/node-version.d.ts.map +1 -0
- package/dist/node-version.js +37 -0
- package/dist/node-version.js.map +1 -0
- package/dist/parse.d.ts +8 -2
- package/dist/parse.d.ts.map +1 -1
- package/dist/parse.js +7 -2
- package/dist/parse.js.map +1 -1
- package/dist/project-ref.d.ts +44 -0
- package/dist/project-ref.d.ts.map +1 -0
- package/dist/project-ref.js +69 -0
- package/dist/project-ref.js.map +1 -0
- package/dist/sdk-skills/kindgi-authoring-agents/SKILL.md +15 -2
- package/dist/sdk-skills/kindgi-authoring-flows/SKILL.md +1 -1
- package/dist/sdk-skills/kindgi-authoring-guardrails/SKILL.md +44 -7
- package/dist/sdk-skills/kindgi-authoring-mcp-servers/SKILL.md +11 -2
- package/dist/sdk-skills/kindgi-authoring-providers/SKILL.md +60 -13
- package/dist/sdk-skills/kindgi-authoring-tools/SKILL.md +19 -2
- package/dist/sdk-skills/kindgi-framework-feedback/SKILL.md +82 -3
- package/dist/sdk-skills/kindgi-getting-started/SKILL.md +1 -1
- package/dist/sdk-skills/kindgi-java-authoring-agents/SKILL.md +17 -3
- package/dist/sdk-skills/kindgi-java-authoring-flows/SKILL.md +1 -1
- package/dist/sdk-skills/kindgi-java-authoring-guardrails/SKILL.md +43 -6
- package/dist/sdk-skills/kindgi-java-authoring-tools/SKILL.md +19 -2
- package/dist/sdk-skills/kindgi-java-getting-started/SKILL.md +1 -1
- package/dist/sdk-skills/kindgi-python-authoring-agents/SKILL.md +17 -3
- package/dist/sdk-skills/kindgi-python-authoring-flows/SKILL.md +1 -1
- package/dist/sdk-skills/kindgi-python-authoring-guardrails/SKILL.md +49 -13
- package/dist/sdk-skills/kindgi-python-authoring-tools/SKILL.md +27 -3
- package/dist/sdk-skills/kindgi-python-getting-started/SKILL.md +1 -1
- package/dist/sdk-skills/kindgi-scala-authoring-agents/SKILL.md +17 -3
- package/dist/sdk-skills/kindgi-scala-authoring-flows/SKILL.md +1 -1
- package/dist/sdk-skills/kindgi-scala-authoring-guardrails/SKILL.md +43 -6
- package/dist/sdk-skills/kindgi-scala-authoring-tools/SKILL.md +19 -2
- package/dist/sdk-skills/kindgi-scala-getting-started/SKILL.md +1 -1
- package/dist/sdk-skills/kindgi-using/SKILL.md +1 -1
- package/dist/slug.d.ts +18 -0
- package/dist/slug.d.ts.map +1 -0
- package/dist/slug.js +29 -0
- package/dist/slug.js.map +1 -0
- package/dist/templates/drupal/AGENTS.md +2 -0
- package/dist/templates/java/AGENTS.md +2 -0
- package/dist/templates/minimal/AGENTS.md +2 -0
- package/dist/templates/python/AGENTS.md +2 -0
- package/dist/templates/sample/AGENTS.md +2 -0
- package/dist/templates/scala/AGENTS.md +2 -0
- package/dist/templates/woocommerce/AGENTS.md +11 -4
- package/dist/templates/woocommerce/README.md.tmpl +47 -4
- package/dist/templates/woocommerce/agents/store-agent/index.test.ts.tmpl +13 -0
- package/dist/templates/woocommerce/agents/store-agent/index.ts.tmpl +11 -1
- package/dist/templates/woocommerce/tools/publish-product/index.ts.tmpl +7 -1
- package/dist/templates/woocommerce/tools/refund/index.ts.tmpl +7 -2
- package/dist/templates/woocommerce/tools/refund-large/index.ts.tmpl +8 -2
- package/dist/templates/woocommerce/tools/set-price/index.ts.tmpl +6 -0
- package/dist/value-target.d.ts +139 -0
- package/dist/value-target.d.ts.map +1 -0
- package/dist/value-target.js +231 -0
- package/dist/value-target.js.map +1 -0
- package/package.json +13 -13
|
@@ -0,0 +1,578 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
/**
|
|
4
|
+
* `kindgi feedback submit`, `status` and `withdraw`: sending `FEEDBACK.md`'s
|
|
5
|
+
* entries to Kindgi's intake, hearing back, and taking a report back.
|
|
6
|
+
*
|
|
7
|
+
* - **submit** sends only what the person has seen. `--preview` prints the
|
|
8
|
+
* exact request, redacted, with its digest; at a terminal it asks; with no
|
|
9
|
+
* terminal (a coding agent) it needs `--yes=<digest>`, and refuses if the
|
|
10
|
+
* request changed since. `KINDGI_FEEDBACK_SUBMIT=off` turns it off.
|
|
11
|
+
* - **status** asks about the reports sent, at most once a day each unless
|
|
12
|
+
* named, and never again once a report is fixed, won't be fixed, or was
|
|
13
|
+
* withdrawn, or, unless named, once the intake doesn't have it. A fixed
|
|
14
|
+
* one gets its `> **Fixed:**` line.
|
|
15
|
+
* - **withdraw** takes reports back with the keys this machine kept. The
|
|
16
|
+
* intake clears their text at once.
|
|
17
|
+
*/
|
|
18
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
19
|
+
import { arch, platform, release } from 'node:os';
|
|
20
|
+
import { isAbsolute, join, resolve } from 'node:path';
|
|
21
|
+
import { createInterface } from 'node:readline';
|
|
22
|
+
import { runDoctor } from '../commands/doctor.js';
|
|
23
|
+
import { commandResultFromThrown, stringFlag } from '../commands/helpers.js';
|
|
24
|
+
import { accessOrigin } from '../commands/license.js';
|
|
25
|
+
import { loadLocalEnvSettings } from '../env/project-env.js';
|
|
26
|
+
import { UsageError } from '../errors.js';
|
|
27
|
+
import { pickHome } from '../key/paths.js';
|
|
28
|
+
import { renderJson } from '../output.js';
|
|
29
|
+
import { FEEDBACK_FILENAME, addSubmissions, markFixed, markWithdrawn, parseFeedback, } from './entries.js';
|
|
30
|
+
import { askStatus, sendReports, withdrawReports } from './intake.js';
|
|
31
|
+
import { FEEDBACK_REPORTS_PATH, FINAL_STATES, MAX_REPORT_IDS, REPORT_ID, WITHDRAW_KEY, } from './protocol.js';
|
|
32
|
+
import { readPackEnvEntries } from './redact.js';
|
|
33
|
+
import { clientInfo, entryPayload, fitRequest, fitsOneRequest, pickEntries, serialize, } from './report.js';
|
|
34
|
+
import { feedbackFiles, readKeys, readStatuses, updateKeys, updateStatuses, } from './store.js';
|
|
35
|
+
/** The env var that turns `submit` off for a machine or a team. */
|
|
36
|
+
export const SUBMIT_SWITCH = 'KINDGI_FEEDBACK_SUBMIT';
|
|
37
|
+
/** How long `status` waits before asking again about a report nobody named. */
|
|
38
|
+
const ASK_EVERY_MS = 24 * 60 * 60 * 1000;
|
|
39
|
+
export async function runSubmit(ctx) {
|
|
40
|
+
try {
|
|
41
|
+
const off = submitOff(ctx.env[SUBMIT_SWITCH]);
|
|
42
|
+
if (off !== undefined)
|
|
43
|
+
return { kind: 'error', stderr: off, exitCode: 1 };
|
|
44
|
+
const prepared = await prepareReport(ctx);
|
|
45
|
+
if (prepared.kind === 'stop')
|
|
46
|
+
return prepared.result;
|
|
47
|
+
const report = prepared.report;
|
|
48
|
+
if (ctx.options.preview === true) {
|
|
49
|
+
return result(ctx, report.preview, `Nothing was sent. This is exactly what would be, after redaction.${report.heldNote} Show it to the person; only after they say yes, send it: kindgi feedback submit${ctx.positionals.map((n) => ` ${n}`).join('')} --yes=${report.digest}\n`);
|
|
50
|
+
}
|
|
51
|
+
const refused = await askConsent(ctx, report);
|
|
52
|
+
if (refused !== undefined)
|
|
53
|
+
return refused;
|
|
54
|
+
return await deliver(ctx, report);
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
return commandResultFromThrown(err, ctx, 'feedback submit');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** Pick the entries, redact them, check them against the caps, and add the environment. */
|
|
61
|
+
async function prepareReport(ctx) {
|
|
62
|
+
const origin = accessOrigin(ctx);
|
|
63
|
+
const to = `${origin}${FEEDBACK_REPORTS_PATH}`;
|
|
64
|
+
const packDir = packDirOf(ctx);
|
|
65
|
+
const named = ctx.positionals;
|
|
66
|
+
const picked = pickEntries(parseFeedback(await readFeedback(packDir, 'required')), named);
|
|
67
|
+
if (picked.kind === 'unmatched') {
|
|
68
|
+
throw new UsageError(`No entry in ${FEEDBACK_FILENAME} has the id or hash ${picked.selectors.join(', ')}.`);
|
|
69
|
+
}
|
|
70
|
+
if (picked.picked.length === 0) {
|
|
71
|
+
return {
|
|
72
|
+
kind: 'stop',
|
|
73
|
+
result: result(ctx, { to, reports: [] }, `Nothing to send: every entry in ${FEEDBACK_FILENAME} was sent or is marked fixed. To send one again, name it: kindgi feedback submit <id>.\n`),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
const home = homeOf(ctx);
|
|
77
|
+
const settings = await loadLocalEnvSettings(ctx, packDir);
|
|
78
|
+
if (settings.kind === 'error') {
|
|
79
|
+
throw new UsageError(`${settings.message} Nothing was sent: redaction needs the pack's env files.`);
|
|
80
|
+
}
|
|
81
|
+
const redaction = {
|
|
82
|
+
packDir,
|
|
83
|
+
home,
|
|
84
|
+
envEntries: await readPackEnvEntries(packDir, settings.localEnvFiles ?? []),
|
|
85
|
+
};
|
|
86
|
+
const payloads = [];
|
|
87
|
+
const problems = duplicateIds(picked.picked);
|
|
88
|
+
for (const entry of picked.picked) {
|
|
89
|
+
const one = entryPayload(entry, redaction);
|
|
90
|
+
if (one.kind === 'problem')
|
|
91
|
+
problems.push(one.problem);
|
|
92
|
+
else
|
|
93
|
+
payloads.push(one);
|
|
94
|
+
}
|
|
95
|
+
if (problems.length > 0) {
|
|
96
|
+
return {
|
|
97
|
+
kind: 'stop',
|
|
98
|
+
result: {
|
|
99
|
+
kind: 'error',
|
|
100
|
+
stderr: `Nothing was sent: ${problems.length === 1 ? 'an entry needs' : 'entries need'} fixing in ${FEEDBACK_FILENAME} first.\n${problems.map((p) => ` ${p.entry}: ${p.problem}\n`).join('')}`,
|
|
101
|
+
exitCode: 1,
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
const seam = ctx.feedbackSeam ?? {};
|
|
106
|
+
const doctor = await (seam.doctor ?? ((dir) => runDoctor(ctx, dir)))(packDir);
|
|
107
|
+
const client = clientInfo(doctor, seam.platform ?? thisPlatform());
|
|
108
|
+
const all = payloads.map((p) => p.payload);
|
|
109
|
+
if (named.length > 0 && !fitsOneRequest(client, all)) {
|
|
110
|
+
throw new UsageError(`Those ${all.length} entries don't fit one report (at most 20 entries and 64 KiB): name fewer at once.`);
|
|
111
|
+
}
|
|
112
|
+
// Named entries all go; otherwise the oldest that fit, and the rest wait.
|
|
113
|
+
const { entries: sent, held } = named.length > 0 ? { entries: all, held: 0 } : fitRequest(client, all);
|
|
114
|
+
const payload = { client, entries: sent };
|
|
115
|
+
const { bytes, digest } = serialize(payload);
|
|
116
|
+
const redacted = payloads
|
|
117
|
+
.filter((p) => sent.includes(p.payload) && p.applied.length > 0)
|
|
118
|
+
.map((p) => ({ entry: p.payload.entry, rules: p.applied }));
|
|
119
|
+
return {
|
|
120
|
+
kind: 'ready',
|
|
121
|
+
report: {
|
|
122
|
+
origin,
|
|
123
|
+
packDir,
|
|
124
|
+
home,
|
|
125
|
+
to,
|
|
126
|
+
sent,
|
|
127
|
+
payload,
|
|
128
|
+
bytes,
|
|
129
|
+
digest,
|
|
130
|
+
preview: { to, digest, redacted, ...(held > 0 && { held }), payload },
|
|
131
|
+
held,
|
|
132
|
+
heldNote: held > 0
|
|
133
|
+
? ` ${held} more ${held === 1 ? 'entry waits' : 'entries wait'} for the next run.`
|
|
134
|
+
: '',
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* The person's OK for exactly these bytes: `--yes` with their digest, or a
|
|
140
|
+
* yes at the terminal. Without either, nothing is sent.
|
|
141
|
+
*/
|
|
142
|
+
async function askConsent(ctx, report) {
|
|
143
|
+
const yes = stringFlag(ctx, 'yes');
|
|
144
|
+
if (yes !== undefined) {
|
|
145
|
+
if (yes === report.digest)
|
|
146
|
+
return undefined;
|
|
147
|
+
return {
|
|
148
|
+
kind: 'error',
|
|
149
|
+
stderr: `Nothing was sent: the report changed since that preview, in an entry or in a check kindgi doctor runs (its digest is now ${report.digest}). Preview it again (--preview) and ask again.\n`,
|
|
150
|
+
exitCode: 1,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
const seam = ctx.feedbackSeam ?? {};
|
|
154
|
+
if (!(seam.interactive ?? isInteractive)()) {
|
|
155
|
+
return {
|
|
156
|
+
kind: 'error',
|
|
157
|
+
stderr: `Nothing was sent: kindgi feedback submit sends only what the person has seen. Run it with --preview, show them the preview, and after they say yes, run it again with --yes=<the preview's digest>.\n`,
|
|
158
|
+
exitCode: 1,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
process.stderr.write(`${JSON.stringify(report.preview, null, 2)}\n`);
|
|
162
|
+
const ok = await (seam.confirm ?? confirmOnTerminal)(`Send this to Kindgi (${report.origin})?${report.heldNote} [y/N] `);
|
|
163
|
+
return ok ? undefined : { kind: 'error', stderr: 'Nothing was sent.\n', exitCode: 1 };
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Send it; keep the keys, then mark each entry submitted. Once the intake
|
|
167
|
+
* has the reports, a failure to keep a key or mark an entry is said beside
|
|
168
|
+
* that they arrived, never in place of it.
|
|
169
|
+
*/
|
|
170
|
+
async function deliver(ctx, report) {
|
|
171
|
+
const { to, digest, payload, held, heldNote } = report;
|
|
172
|
+
// The keys must have somewhere to go before anything is sent.
|
|
173
|
+
const files = feedbackFiles(report.home);
|
|
174
|
+
await updateKeys(files, () => undefined);
|
|
175
|
+
const asked = await sendReports(report.origin, report.bytes, report.sent, { fetch: ctx.fetch });
|
|
176
|
+
if (asked.kind !== 'ok') {
|
|
177
|
+
const maybe = asked.kind === 'failed' && asked.maybeReceived;
|
|
178
|
+
return result(ctx, { to, digest, received: maybe ? 'maybe' : 'no', payload }, `${submitFailure(asked)}\n`, 1);
|
|
179
|
+
}
|
|
180
|
+
const now = isoNow(ctx);
|
|
181
|
+
const reports = asked.value;
|
|
182
|
+
const keysLost = await whyFailed(() => updateKeys(files, (keys) => {
|
|
183
|
+
for (const r of reports) {
|
|
184
|
+
keys[r.reportId] = { withdrawKey: r.withdrawKey, entry: r.entry, submittedAt: now };
|
|
185
|
+
}
|
|
186
|
+
}));
|
|
187
|
+
const path = join(report.packDir, FEEDBACK_FILENAME);
|
|
188
|
+
let missing = [];
|
|
189
|
+
const unmarked = await whyFailed(async () => {
|
|
190
|
+
const marked = addSubmissions(await readFile(path, 'utf8'), reports, now);
|
|
191
|
+
await writeFile(path, marked.text, 'utf8');
|
|
192
|
+
missing = marked.missing;
|
|
193
|
+
});
|
|
194
|
+
const n = reports.length;
|
|
195
|
+
const notes = [
|
|
196
|
+
keysLost === undefined && unmarked === undefined
|
|
197
|
+
? ` ${FEEDBACK_FILENAME} records each report id; the keys that withdraw them are in ${files.keys}, on this machine only.`
|
|
198
|
+
: '',
|
|
199
|
+
heldNote,
|
|
200
|
+
missing.length > 0
|
|
201
|
+
? `\n ${missing.join(', ')} left ${FEEDBACK_FILENAME} while it was sent, so ${missing.length === 1 ? 'it has' : 'they have'} no submitted line; the report ids are on stdout${keysLost === undefined ? ` and in ${files.keys}` : ''}.`
|
|
202
|
+
: '',
|
|
203
|
+
keysLost !== undefined
|
|
204
|
+
? `\n ${n === 1 ? 'Its key' : 'Their keys'} couldn't be kept in ${files.keys} (${keysLost}), so ${n === 1 ? 'it' : 'they'} can't be withdrawn from this machine; Kindgi deletes ${n === 1 ? 'it' : 'them'} after 90 days.`
|
|
205
|
+
: '',
|
|
206
|
+
unmarked !== undefined
|
|
207
|
+
? `\n ${FEEDBACK_FILENAME} couldn't be marked (${unmarked}): the report ids are on stdout. Sending those entries again makes a second report.`
|
|
208
|
+
: '',
|
|
209
|
+
].join('');
|
|
210
|
+
return result(ctx, {
|
|
211
|
+
to,
|
|
212
|
+
reports: reports.map((r) => ({ entry: r.entry, reportId: r.reportId })),
|
|
213
|
+
...(keysLost === undefined && { keys: files.keys }),
|
|
214
|
+
...(held > 0 && { held }),
|
|
215
|
+
}, `✓ sent ${n} ${n === 1 ? 'report' : 'reports'} to Kindgi.${notes}\n Hear back with kindgi feedback status; take one back with kindgi feedback withdraw <id>.\n`, keysLost === undefined && unmarked === undefined ? 0 : 1);
|
|
216
|
+
}
|
|
217
|
+
/** What stopped `step`, or `undefined` when it worked. */
|
|
218
|
+
async function whyFailed(step) {
|
|
219
|
+
try {
|
|
220
|
+
await step();
|
|
221
|
+
return undefined;
|
|
222
|
+
}
|
|
223
|
+
catch (err) {
|
|
224
|
+
return err instanceof Error ? err.message : String(err);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
export async function runStatus(ctx) {
|
|
228
|
+
try {
|
|
229
|
+
const origin = accessOrigin(ctx);
|
|
230
|
+
const packDir = packDirOf(ctx);
|
|
231
|
+
const text = await readFeedback(packDir, 'optional');
|
|
232
|
+
const entries = parseFeedback(text ?? '');
|
|
233
|
+
const named = ctx.positionals;
|
|
234
|
+
const targets = reportsOf(entries, named, 'all');
|
|
235
|
+
const files = feedbackFiles(homeOf(ctx));
|
|
236
|
+
const statuses = await readStatuses(files);
|
|
237
|
+
const nowMs = (ctx.feedbackSeam?.now ?? Date.now)();
|
|
238
|
+
const toAsk = targets.reports.filter((t) => {
|
|
239
|
+
const last = statuses[t.reportId];
|
|
240
|
+
if (t.withdrawn || (last !== undefined && FINAL_STATES.has(last.state)))
|
|
241
|
+
return false;
|
|
242
|
+
if (named.length > 0 || last === undefined)
|
|
243
|
+
return true;
|
|
244
|
+
// The intake doesn't have it (never stored, or past its 90 days), and
|
|
245
|
+
// won't: it's asked about again only when named.
|
|
246
|
+
return last.state !== 'unknown' && nowMs - Date.parse(last.askedAt) >= ASK_EVERY_MS;
|
|
247
|
+
});
|
|
248
|
+
const answers = new Map();
|
|
249
|
+
let failure;
|
|
250
|
+
const toAskIds = toAsk.map((t) => t.reportId);
|
|
251
|
+
for (const [i, chunk] of chunks(toAskIds).entries()) {
|
|
252
|
+
const asked = await askStatus(origin, chunk, { fetch: ctx.fetch });
|
|
253
|
+
if (asked.kind !== 'ok') {
|
|
254
|
+
failure = intakeFailure(asked, 'asked', toAskIds.slice(i * MAX_REPORT_IDS));
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
for (const s of asked.value)
|
|
258
|
+
answers.set(s.reportId, s);
|
|
259
|
+
}
|
|
260
|
+
const askedAt = new Date(nowMs).toISOString();
|
|
261
|
+
if (answers.size > 0) {
|
|
262
|
+
await updateStatuses(files, (records) => {
|
|
263
|
+
for (const s of answers.values()) {
|
|
264
|
+
const { reportId, ...rest } = s;
|
|
265
|
+
records[reportId] = { ...rest, askedAt };
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
const fixes = targets.reports.flatMap((t) => {
|
|
270
|
+
const s = answers.get(t.reportId);
|
|
271
|
+
return s?.state === 'fixed' && t.entry !== undefined
|
|
272
|
+
? [{ entry: t.entry, note: `in ${s.fixedIn ?? 'a release'} (report ${t.reportId})` }]
|
|
273
|
+
: [];
|
|
274
|
+
});
|
|
275
|
+
if (fixes.length > 0 && text !== undefined) {
|
|
276
|
+
const path = join(packDir, FEEDBACK_FILENAME);
|
|
277
|
+
await writeFile(path, markFixed(await readFile(path, 'utf8'), fixes), 'utf8');
|
|
278
|
+
}
|
|
279
|
+
const latest = await readStatuses(files);
|
|
280
|
+
const reports = targets.reports.map((t) => {
|
|
281
|
+
const answer = answers.get(t.reportId);
|
|
282
|
+
const record = latest[t.reportId];
|
|
283
|
+
const state = answer?.state ?? record?.state ?? (t.withdrawn ? 'withdrawn' : 'not-asked');
|
|
284
|
+
return {
|
|
285
|
+
reportId: t.reportId,
|
|
286
|
+
...(t.entry !== undefined && { entry: t.entry }),
|
|
287
|
+
state,
|
|
288
|
+
...pickDetails(answer ?? record),
|
|
289
|
+
asked: answer !== undefined,
|
|
290
|
+
...(record?.askedAt !== undefined && {
|
|
291
|
+
askedAt: answer !== undefined ? askedAt : record.askedAt,
|
|
292
|
+
}),
|
|
293
|
+
};
|
|
294
|
+
});
|
|
295
|
+
const value = { reports, ...(targets.notSent.length > 0 && { notSent: targets.notSent }) };
|
|
296
|
+
if (failure !== undefined) {
|
|
297
|
+
return result(ctx, value, `${failure} The answers on stdout are the last ones had.\n`, 1);
|
|
298
|
+
}
|
|
299
|
+
const notes = [
|
|
300
|
+
targets.notSent.length > 0 ? `Not sent yet: ${targets.notSent.join(', ')}.` : '',
|
|
301
|
+
fixes.length > 0
|
|
302
|
+
? `Marked fixed in ${FEEDBACK_FILENAME}: ${fixes.map((f) => f.entry).join(', ')}.`
|
|
303
|
+
: '',
|
|
304
|
+
].filter((n) => n !== '');
|
|
305
|
+
return result(ctx, value, notes.length > 0 ? `${notes.join('\n')}\n` : undefined);
|
|
306
|
+
}
|
|
307
|
+
catch (err) {
|
|
308
|
+
return commandResultFromThrown(err, ctx, 'feedback status');
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
export async function runWithdraw(ctx) {
|
|
312
|
+
try {
|
|
313
|
+
const named = ctx.positionals;
|
|
314
|
+
if (named.length === 0) {
|
|
315
|
+
throw new UsageError('Name the reports to withdraw: kindgi feedback withdraw <id|hash|reportId>... (kindgi feedback status lists them).');
|
|
316
|
+
}
|
|
317
|
+
const origin = accessOrigin(ctx);
|
|
318
|
+
const packDir = packDirOf(ctx);
|
|
319
|
+
const text = await readFeedback(packDir, 'optional');
|
|
320
|
+
const targets = reportsOf(parseFeedback(text ?? ''), named, 'open');
|
|
321
|
+
const files = feedbackFiles(homeOf(ctx));
|
|
322
|
+
const keys = await readKeys(files);
|
|
323
|
+
const sendable = [];
|
|
324
|
+
const noKey = [];
|
|
325
|
+
for (const t of targets.reports) {
|
|
326
|
+
const key = keys[t.reportId]?.withdrawKey;
|
|
327
|
+
if (typeof key === 'string' && WITHDRAW_KEY.test(key))
|
|
328
|
+
sendable.push({ reportId: t.reportId, withdrawKey: key });
|
|
329
|
+
else
|
|
330
|
+
noKey.push(t.reportId);
|
|
331
|
+
}
|
|
332
|
+
const withdrawn = [];
|
|
333
|
+
const refused = [];
|
|
334
|
+
let failure;
|
|
335
|
+
for (const [i, chunk] of chunks(sendable).entries()) {
|
|
336
|
+
const asked = await withdrawReports(origin, chunk, { fetch: ctx.fetch });
|
|
337
|
+
if (asked.kind !== 'ok') {
|
|
338
|
+
const left = sendable.slice(i * MAX_REPORT_IDS).map((r) => r.reportId);
|
|
339
|
+
failure = intakeFailure(asked, 'withdrawn', left);
|
|
340
|
+
break;
|
|
341
|
+
}
|
|
342
|
+
withdrawn.push(...asked.value.withdrawn);
|
|
343
|
+
refused.push(...asked.value.refused);
|
|
344
|
+
}
|
|
345
|
+
if (withdrawn.length > 0) {
|
|
346
|
+
const at = isoNow(ctx);
|
|
347
|
+
await recordWithdrawn(files, withdrawn, at);
|
|
348
|
+
if (text !== undefined) {
|
|
349
|
+
const path = join(packDir, FEEDBACK_FILENAME);
|
|
350
|
+
await writeFile(path, markWithdrawn(await readFile(path, 'utf8'), withdrawn, at), 'utf8');
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
const value = {
|
|
354
|
+
withdrawn,
|
|
355
|
+
...(refused.length > 0 && { refused }),
|
|
356
|
+
...(noKey.length > 0 && { noKey }),
|
|
357
|
+
...(targets.alreadyWithdrawn.length > 0 && { alreadyWithdrawn: targets.alreadyWithdrawn }),
|
|
358
|
+
...(targets.notSent.length > 0 && { notSent: targets.notSent }),
|
|
359
|
+
};
|
|
360
|
+
const notes = [
|
|
361
|
+
failure,
|
|
362
|
+
refused.length > 0
|
|
363
|
+
? `Refused: ${refused.join(', ')}. The intake doesn't know the report, it's past its 90 days, or the key isn't its.`
|
|
364
|
+
: undefined,
|
|
365
|
+
noKey.length > 0
|
|
366
|
+
? `No key on this machine for ${noKey.join(', ')}: the key stays on the machine that sent the report. Withdraw it from there.`
|
|
367
|
+
: undefined,
|
|
368
|
+
targets.notSent.length > 0
|
|
369
|
+
? `Not sent, so nothing to withdraw: ${targets.notSent.join(', ')}.`
|
|
370
|
+
: undefined,
|
|
371
|
+
].filter((n) => n !== undefined);
|
|
372
|
+
const done = withdrawn.length > 0
|
|
373
|
+
? `✓ withdrew ${withdrawn.join(', ')}: the intake cleared their text.\n`
|
|
374
|
+
: '';
|
|
375
|
+
if (notes.length > 0)
|
|
376
|
+
return result(ctx, value, `${done}${notes.join('\n')}\n`, 1);
|
|
377
|
+
return result(ctx, value, done !== '' ? done : undefined);
|
|
378
|
+
}
|
|
379
|
+
catch (err) {
|
|
380
|
+
return commandResultFromThrown(err, ctx, 'feedback withdraw');
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* The JSON on stdout and a note on stderr. A note is left out with
|
|
385
|
+
* `--quiet`, unless the command failed.
|
|
386
|
+
*/
|
|
387
|
+
function result(ctx, value, note, exitCode = 0) {
|
|
388
|
+
const rendered = renderJson(value, ctx.globals.format);
|
|
389
|
+
const quiet = ctx.globals.format === 'quiet' && exitCode === 0;
|
|
390
|
+
return {
|
|
391
|
+
kind: 'ok',
|
|
392
|
+
rendered: { ...rendered, stderr: note === undefined || quiet ? '' : note },
|
|
393
|
+
...(exitCode !== 0 && { exitCode }),
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* The reports named (an entry's id or hash, or a reportId), or with none
|
|
398
|
+
* named, every report in `FEEDBACK.md`. `open` leaves out the withdrawn ones,
|
|
399
|
+
* listed apart.
|
|
400
|
+
*/
|
|
401
|
+
function reportsOf(entries, named, which) {
|
|
402
|
+
const reports = [];
|
|
403
|
+
const notSent = [];
|
|
404
|
+
const alreadyWithdrawn = [];
|
|
405
|
+
const seen = new Set();
|
|
406
|
+
const add = (t) => {
|
|
407
|
+
if (seen.has(t.reportId))
|
|
408
|
+
return;
|
|
409
|
+
seen.add(t.reportId);
|
|
410
|
+
if (which === 'open' && t.withdrawn)
|
|
411
|
+
alreadyWithdrawn.push(t.reportId);
|
|
412
|
+
else
|
|
413
|
+
reports.push(t);
|
|
414
|
+
};
|
|
415
|
+
const ofEntry = (e) => {
|
|
416
|
+
if (e.submissions.length === 0)
|
|
417
|
+
notSent.push(e.fields.id ?? e.title);
|
|
418
|
+
for (const s of e.submissions) {
|
|
419
|
+
add({
|
|
420
|
+
reportId: s.reportId,
|
|
421
|
+
...(e.fields.id !== undefined && { entry: e.fields.id }),
|
|
422
|
+
withdrawn: s.withdrawnAt !== undefined,
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
};
|
|
426
|
+
if (named.length === 0) {
|
|
427
|
+
for (const e of entries)
|
|
428
|
+
if (e.submissions.length > 0)
|
|
429
|
+
ofEntry(e);
|
|
430
|
+
return { reports, notSent, alreadyWithdrawn };
|
|
431
|
+
}
|
|
432
|
+
const unmatched = [];
|
|
433
|
+
for (const name of named) {
|
|
434
|
+
const matching = entries.filter((e) => e.fields.id === name || e.fields.hash === name);
|
|
435
|
+
if (matching.length > 0) {
|
|
436
|
+
for (const e of matching)
|
|
437
|
+
ofEntry(e);
|
|
438
|
+
continue;
|
|
439
|
+
}
|
|
440
|
+
if (!REPORT_ID.test(name)) {
|
|
441
|
+
unmatched.push(name);
|
|
442
|
+
continue;
|
|
443
|
+
}
|
|
444
|
+
const from = entries.find((e) => e.submissions.some((s) => s.reportId === name));
|
|
445
|
+
const sub = from?.submissions.find((s) => s.reportId === name);
|
|
446
|
+
add({
|
|
447
|
+
reportId: name,
|
|
448
|
+
...(from?.fields.id !== undefined && { entry: from.fields.id }),
|
|
449
|
+
withdrawn: sub?.withdrawnAt !== undefined,
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
if (unmatched.length > 0) {
|
|
453
|
+
throw new UsageError(`${unmatched.join(', ')} ${unmatched.length === 1 ? "isn't" : "aren't"} an entry id or hash in ${FEEDBACK_FILENAME}, or a report id (fbr_…).`);
|
|
454
|
+
}
|
|
455
|
+
return { reports, notSent, alreadyWithdrawn };
|
|
456
|
+
}
|
|
457
|
+
/** A withdrawn report's key is deleted, and its state is final. */
|
|
458
|
+
async function recordWithdrawn(files, reportIds, at) {
|
|
459
|
+
await updateKeys(files, (keys) => {
|
|
460
|
+
for (const id of reportIds)
|
|
461
|
+
delete keys[id];
|
|
462
|
+
});
|
|
463
|
+
await updateStatuses(files, (statuses) => {
|
|
464
|
+
for (const id of reportIds)
|
|
465
|
+
statuses[id] = { state: 'withdrawn', askedAt: at };
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
function pickDetails(s) {
|
|
469
|
+
if (s === undefined)
|
|
470
|
+
return {};
|
|
471
|
+
return {
|
|
472
|
+
...(s.issueUrl !== undefined && { issueUrl: s.issueUrl }),
|
|
473
|
+
...(s.fixedIn !== undefined && { fixedIn: s.fixedIn }),
|
|
474
|
+
...(s.reason !== undefined && { reason: s.reason }),
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
/** Why submit stopped, and whether Kindgi may have the reports all the same. */
|
|
478
|
+
function submitFailure(asked) {
|
|
479
|
+
if (asked.kind === 'failed' && asked.maybeReceived) {
|
|
480
|
+
return `Kindgi may have received it: ${asked.message}. ${FEEDBACK_FILENAME} is unchanged, so sending it again makes a second report. One that arrived can't be withdrawn from this machine, since its key never came back; Kindgi deletes it after 90 days. What was sent is on stdout.`;
|
|
481
|
+
}
|
|
482
|
+
const why = asked.kind === 'failed'
|
|
483
|
+
? `Nothing reached Kindgi: ${asked.message}.`
|
|
484
|
+
: asked.error === 'rate-limited'
|
|
485
|
+
? `Nothing was sent: the intake is taking no more reports for now${asked.retryAfter !== undefined ? `; try again in ${asked.retryAfter} s` : '; try again later'}.`
|
|
486
|
+
: `The intake refused the report (${asked.status} ${asked.error}): ${asked.message} Nothing was stored.`;
|
|
487
|
+
return `${why} ${FEEDBACK_FILENAME} is unchanged; what would have been sent is on stdout.`;
|
|
488
|
+
}
|
|
489
|
+
/** Why the intake answered none of `left` (the reports not yet answered), naming them. */
|
|
490
|
+
function intakeFailure(asked, what, left) {
|
|
491
|
+
const ids = left.join(', ');
|
|
492
|
+
const rest = what === 'asked' ? `Not asked about: ${ids}.` : `Not withdrawn: ${ids}.`;
|
|
493
|
+
if (asked.kind === 'failed' && asked.maybeReceived && what === 'withdrawn') {
|
|
494
|
+
const which = left.length === 1 ? ids : `Some of ${ids}`;
|
|
495
|
+
return `${asked.message}. ${which} may have been withdrawn: run it again to know (withdrawing twice is safe).`;
|
|
496
|
+
}
|
|
497
|
+
if (asked.kind === 'failed')
|
|
498
|
+
return `${asked.message}. ${rest}`;
|
|
499
|
+
if (asked.error === 'rate-limited') {
|
|
500
|
+
return `The intake is busy${asked.retryAfter !== undefined ? `; try again in ${asked.retryAfter} s` : '; try again later'}. ${rest}`;
|
|
501
|
+
}
|
|
502
|
+
return `The intake refused (${asked.status} ${asked.error}): ${asked.message} ${rest}`;
|
|
503
|
+
}
|
|
504
|
+
/** `KINDGI_FEEDBACK_SUBMIT`: unset or `on` sends; `off` doesn't; anything else doesn't either, and says so. */
|
|
505
|
+
function submitOff(value) {
|
|
506
|
+
const v = value?.trim().toLowerCase();
|
|
507
|
+
if (v === undefined || v === '' || v === 'on')
|
|
508
|
+
return undefined;
|
|
509
|
+
if (v === 'off') {
|
|
510
|
+
return `Sending feedback is off here (${SUBMIT_SWITCH}=off): nothing was sent. kindgi feedback write still records entries in ${FEEDBACK_FILENAME}, and status and withdraw still work.\n`;
|
|
511
|
+
}
|
|
512
|
+
return `Nothing was sent: ${SUBMIT_SWITCH} must be on or off (it's "${value}").\n`;
|
|
513
|
+
}
|
|
514
|
+
/** Two entries sharing an id can't go in one report: the answer is matched by it. */
|
|
515
|
+
function duplicateIds(entries) {
|
|
516
|
+
const counts = new Map();
|
|
517
|
+
for (const e of entries)
|
|
518
|
+
if (e.fields.id !== undefined)
|
|
519
|
+
counts.set(e.fields.id, (counts.get(e.fields.id) ?? 0) + 1);
|
|
520
|
+
return [...counts]
|
|
521
|
+
.filter(([, n]) => n > 1)
|
|
522
|
+
.map(([id, n]) => ({ entry: id, problem: `${n} entries have this id: give each its own` }));
|
|
523
|
+
}
|
|
524
|
+
async function readFeedback(packDir, need) {
|
|
525
|
+
try {
|
|
526
|
+
return await readFile(join(packDir, FEEDBACK_FILENAME), 'utf8');
|
|
527
|
+
}
|
|
528
|
+
catch (cause) {
|
|
529
|
+
if (cause.code !== 'ENOENT')
|
|
530
|
+
throw cause;
|
|
531
|
+
if (need === 'optional')
|
|
532
|
+
return undefined;
|
|
533
|
+
throw new UsageError(`There's no ${FEEDBACK_FILENAME} in ${packDir}: write an entry first (kindgi feedback write).`);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
function chunks(items) {
|
|
537
|
+
const out = [];
|
|
538
|
+
for (let i = 0; i < items.length; i += MAX_REPORT_IDS)
|
|
539
|
+
out.push(items.slice(i, i + MAX_REPORT_IDS));
|
|
540
|
+
return out;
|
|
541
|
+
}
|
|
542
|
+
function packDirOf(ctx) {
|
|
543
|
+
const path = stringFlag(ctx, 'path');
|
|
544
|
+
if (path === undefined)
|
|
545
|
+
return ctx.cwd;
|
|
546
|
+
return isAbsolute(path) ? path : resolve(ctx.cwd, path);
|
|
547
|
+
}
|
|
548
|
+
function homeOf(ctx) {
|
|
549
|
+
return pickHome({
|
|
550
|
+
...(ctx.home !== undefined ? { ctxHome: ctx.home } : {}),
|
|
551
|
+
...(typeof ctx.env.HOME === 'string' && ctx.env.HOME !== '' ? { envHome: ctx.env.HOME } : {}),
|
|
552
|
+
});
|
|
553
|
+
}
|
|
554
|
+
function isoNow(ctx) {
|
|
555
|
+
return new Date((ctx.feedbackSeam?.now ?? Date.now)()).toISOString();
|
|
556
|
+
}
|
|
557
|
+
function thisPlatform() {
|
|
558
|
+
return { os: platform(), osRelease: release(), arch: arch(), node: process.versions.node };
|
|
559
|
+
}
|
|
560
|
+
/** A person at a terminal: stdin and stderr are both TTYs. */
|
|
561
|
+
function isInteractive() {
|
|
562
|
+
return Boolean(process.stdin.isTTY) && Boolean(process.stderr.isTTY);
|
|
563
|
+
}
|
|
564
|
+
/** Ask a yes/no question on the terminal; only `y` or `yes` is a yes. */
|
|
565
|
+
async function confirmOnTerminal(question) {
|
|
566
|
+
const rl = createInterface({ input: process.stdin, output: process.stderr });
|
|
567
|
+
try {
|
|
568
|
+
const answer = await new Promise((resolveAnswer) => {
|
|
569
|
+
rl.question(question, resolveAnswer);
|
|
570
|
+
rl.once('close', () => resolveAnswer(''));
|
|
571
|
+
});
|
|
572
|
+
return /^\s*y(es)?\s*$/i.test(answer);
|
|
573
|
+
}
|
|
574
|
+
finally {
|
|
575
|
+
rl.close();
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/feedback/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ReportStatus } from './protocol.js';
|
|
2
|
+
export declare const FEEDBACK_SUBDIR: readonly [".kindgi", "feedback"];
|
|
3
|
+
export interface FeedbackFiles {
|
|
4
|
+
readonly dir: string;
|
|
5
|
+
readonly keys: string;
|
|
6
|
+
readonly status: string;
|
|
7
|
+
}
|
|
8
|
+
export interface KeyRecord {
|
|
9
|
+
readonly withdrawKey: string;
|
|
10
|
+
readonly entry: string;
|
|
11
|
+
readonly submittedAt: string;
|
|
12
|
+
}
|
|
13
|
+
export interface StatusRecord extends Omit<ReportStatus, 'reportId'> {
|
|
14
|
+
readonly askedAt: string;
|
|
15
|
+
}
|
|
16
|
+
export type Keys = Record<string, KeyRecord>;
|
|
17
|
+
export type Statuses = Record<string, StatusRecord>;
|
|
18
|
+
export declare function feedbackFiles(home: string): FeedbackFiles;
|
|
19
|
+
export declare function readKeys(files: FeedbackFiles): Promise<Keys>;
|
|
20
|
+
export declare function readStatuses(files: FeedbackFiles): Promise<Statuses>;
|
|
21
|
+
/** Change `keys.json` under the lock; `change` edits the records in place. */
|
|
22
|
+
export declare function updateKeys(files: FeedbackFiles, change: (keys: Keys) => void): Promise<void>;
|
|
23
|
+
export declare function updateStatuses(files: FeedbackFiles, change: (statuses: Statuses) => void): Promise<void>;
|
|
24
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/feedback/store.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,eAAO,MAAM,eAAe,kCAAmC,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC;IAClE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAC7C,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAMpD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAGzD;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAElE;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,CAE1E;AAED,8EAA8E;AAC9E,wBAAsB,UAAU,CAC9B,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,GAC3B,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,GACnC,OAAO,CAAC,IAAI,CAAC,CAEf"}
|