@devdogsuga/backstage 0.1.9 → 0.1.10
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 +1 -1
- package/dist/{catalog-COleRgQD.js → catalog-CaTnrGVr.js} +3 -3
- package/dist/{cli-CMThHZgV.js → cli-feRmGaGi.js} +3 -3
- package/dist/{commands-CaSixDwT.js → commands-C8pXvbv1.js} +3 -3
- package/dist/{commands-DL5fpABN.js → commands-CD1v_-6y.js} +1 -1
- package/dist/{commands-CuYIkHeU.js → commands-Ye0G_5bZ.js} +1 -1
- package/dist/launch.js +2 -2
- package/dist/{meetings-CLZ6xQQB.js → meetings-Du5asTAj.js} +5 -7
- package/dist/{queries-CaAe3cve.js → queries-D3mTchag.js} +4 -4
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -187,7 +187,7 @@ names are never changed. Rerunning the same export changes nothing.
|
|
|
187
187
|
Records a meeting's attendance from a sign-in sheet, for members who could not
|
|
188
188
|
check in on the platform. The sheet is a Google or Microsoft Forms response
|
|
189
189
|
export or a hand-made spreadsheet, saved as CSV; one sheet is one meeting,
|
|
190
|
-
named with `--meeting` (its day, slug
|
|
190
|
+
named with `--meeting` (its day, slug or id; a day with two meetings
|
|
191
191
|
asks for the slug). The header and columns are found, not assumed: the email
|
|
192
192
|
column is the one holding UGA addresses, the name is "First/Last Name" or a
|
|
193
193
|
column mentioning "name", and `--email-column`/`--name-column` override
|
|
@@ -2,7 +2,7 @@ import { A as YES, D as DRY_RUN, O as JSON_FLAG, j as createCatalog, k as SCOPES
|
|
|
2
2
|
import { n as isDryRun } from "./dry-run-CFCZUpjb.js";
|
|
3
3
|
import { o as unwrap } from "./ui-Bb69ZfVv.js";
|
|
4
4
|
import { n as positionals } from "./args-Cjr_Iqts.js";
|
|
5
|
-
import { t as EXPORTS } from "./queries-
|
|
5
|
+
import { t as EXPORTS } from "./queries-D3mTchag.js";
|
|
6
6
|
import { r as qrCatalogOptions } from "./options-DCaqm8BI.js";
|
|
7
7
|
import { existsSync, readFileSync } from "node:fs";
|
|
8
8
|
import { join } from "node:path";
|
|
@@ -1264,7 +1264,7 @@ function exportOf(kind, extra = []) {
|
|
|
1264
1264
|
const MEETING = {
|
|
1265
1265
|
flag: "--meeting",
|
|
1266
1266
|
value: "<meeting>",
|
|
1267
|
-
summary: "One meeting: its day (2026-09-09), slug
|
|
1267
|
+
summary: "One meeting: its day (2026-09-09), slug or id."
|
|
1268
1268
|
};
|
|
1269
1269
|
const exportCommand = {
|
|
1270
1270
|
name: "export",
|
|
@@ -1409,7 +1409,7 @@ const importCommand = {
|
|
|
1409
1409
|
{
|
|
1410
1410
|
flag: "--meeting",
|
|
1411
1411
|
value: "<meeting>",
|
|
1412
|
-
summary: "The meeting: its day (2026-09-09), slug
|
|
1412
|
+
summary: "The meeting: its day (2026-09-09), slug or id."
|
|
1413
1413
|
},
|
|
1414
1414
|
{
|
|
1415
1415
|
flag: "--file",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { C as discoverRepoRoot, T as cliName, b as ownPackageDir, c as reportDevtoolsError, f as isNoEnv, l as reportDevtoolsFailure, n as captureDevtoolsError, o as initDevtoolsTelemetry, p as isNonInteractive, w as findRepoRoot, x as ownVersion } from "./telemetry-Be_lbB5c.js";
|
|
2
|
-
import { a as recordEnteredTier, f as helpPath, i as beginInvocation, l as dbPush, m as renderHelp, n as bareGroupStartPath, o as recordResolved, p as renderCommandList, r as runMenu, s as reproducibleCommand, t as catalog, u as dbPushDryRun } from "./catalog-
|
|
2
|
+
import { a as recordEnteredTier, f as helpPath, i as beginInvocation, l as dbPush, m as renderHelp, n as bareGroupStartPath, o as recordResolved, p as renderCommandList, r as runMenu, s as reproducibleCommand, t as catalog, u as dbPushDryRun } from "./catalog-CaTnrGVr.js";
|
|
3
3
|
import { a as repoPeerUrl, n as loadEnv, r as loadEnvLoad, t as getEnvSync } from "./peers-u1zxe-Ub.js";
|
|
4
4
|
import { t as nonEmpty } from "./connection-D3XsOE3S.js";
|
|
5
5
|
import { a as wouldRunLine, n as isDryRun, t as dryRunKind } from "./dry-run-CFCZUpjb.js";
|
|
@@ -5384,8 +5384,8 @@ const HANDLERS = {
|
|
|
5384
5384
|
qr: async (rest) => (await import("./commands-DQYH_m6i.js")).handleQr(rest),
|
|
5385
5385
|
newsletter: async (rest) => (await import("./commands-35rBJ1R0.js")).handleNewsletter(rest),
|
|
5386
5386
|
creds: async (rest) => (await import("./commands-BF5eptEi.js")).handleCreds(rest),
|
|
5387
|
-
import: async (rest) => (await import("./commands-
|
|
5388
|
-
export: async (rest) => (await import("./commands-
|
|
5387
|
+
import: async (rest) => (await import("./commands-Ye0G_5bZ.js")).handleImport(rest),
|
|
5388
|
+
export: async (rest) => (await import("./commands-C8pXvbv1.js")).handleExport(rest)
|
|
5389
5389
|
};
|
|
5390
5390
|
/**
|
|
5391
5391
|
* Names that were commands of the contributor CLI, refused with where they
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { n as isDryRun } from "./dry-run-CFCZUpjb.js";
|
|
2
2
|
import { o as unwrap, r as errorMessage, t as UsageError } from "./ui-Bb69ZfVv.js";
|
|
3
|
-
import { i as exportParams, n as EXPORT_KINDS, r as auditFilters, t as EXPORTS } from "./queries-
|
|
3
|
+
import { i as exportParams, n as EXPORT_KINDS, r as auditFilters, t as EXPORTS } from "./queries-D3mTchag.js";
|
|
4
4
|
import { t as DONE } from "./dispatch-D048O65I.js";
|
|
5
5
|
import { c as ProductionError, d as requireProductionKey, i as plural, l as connect, o as reportFailure, r as expandHome, s as say, t as canPrompt, u as dbError } from "./cli-DjIwbjnx.js";
|
|
6
|
-
import { i as parseBound, n as findMeetingsWith, r as pickMeeting, t as describeMeeting } from "./meetings-
|
|
6
|
+
import { i as parseBound, n as findMeetingsWith, r as pickMeeting, t as describeMeeting } from "./meetings-Du5asTAj.js";
|
|
7
7
|
import { existsSync, readdirSync, statSync } from "node:fs";
|
|
8
8
|
import { basename, dirname, join } from "node:path";
|
|
9
9
|
import { autocomplete, confirm, multiselect, text } from "@clack/prompts";
|
|
@@ -551,7 +551,7 @@ async function pickFormats(kind) {
|
|
|
551
551
|
}
|
|
552
552
|
async function askMeeting() {
|
|
553
553
|
return unwrap(await text({
|
|
554
|
-
message: "Which meeting? Its day, slug
|
|
554
|
+
message: "Which meeting? Its day, slug or id.",
|
|
555
555
|
placeholder: "2026-09-09",
|
|
556
556
|
validate: (v) => v?.trim() ? void 0 : "A meeting, please."
|
|
557
557
|
})).trim();
|
|
@@ -3,7 +3,7 @@ import { o as unwrap, r as errorMessage, t as UsageError } from "./ui-Bb69ZfVv.j
|
|
|
3
3
|
import { t as DONE } from "./dispatch-D048O65I.js";
|
|
4
4
|
import { a as readInputFile, c as ProductionError, d as requireProductionKey, f as withConnection, i as plural, l as connect, n as confirmWrite, o as reportFailure, s as say, t as canPrompt } from "./cli-DjIwbjnx.js";
|
|
5
5
|
import { a as createAccounts, i as createAccountFor, n as accountFinder, r as accountsWith, t as parseCsv } from "./read-B8DSwYfB.js";
|
|
6
|
-
import { n as findMeetingsWith, r as pickMeeting, t as describeMeeting } from "./meetings-
|
|
6
|
+
import { n as findMeetingsWith, r as pickMeeting, t as describeMeeting } from "./meetings-Du5asTAj.js";
|
|
7
7
|
import { text } from "@clack/prompts";
|
|
8
8
|
import { parseArgs } from "node:util";
|
|
9
9
|
//#region src/attendance/plan.ts
|
|
@@ -3,7 +3,7 @@ import { i as explain } from "./ui-Bb69ZfVv.js";
|
|
|
3
3
|
const handleImport = async (rest) => {
|
|
4
4
|
const [what, ...args] = rest;
|
|
5
5
|
if (what === "involvement") return (await import("./commands-KY-9X1Rh.js")).handleInvolvement(args);
|
|
6
|
-
if (what === "attendance") return (await import("./commands-
|
|
6
|
+
if (what === "attendance") return (await import("./commands-CD1v_-6y.js")).handleAttendance(args);
|
|
7
7
|
explain(what ? `Unknown import "${what}". Try involvement or attendance.` : "Name the import: involvement or attendance.", "");
|
|
8
8
|
process.exitCode = 1;
|
|
9
9
|
return null;
|
package/dist/launch.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { C as discoverRepoRoot, E as setCliName, S as RepoNotFoundError, T as cliName, _ as installFailureLog, d as hasYes, g as stripTierFlag, h as stripNoEnvFlag, m as setNoEnv, n as captureDevtoolsError, o as initDevtoolsTelemetry, p as isNonInteractive, s as lastSentryEventId } from "./telemetry-Be_lbB5c.js";
|
|
2
|
-
import { c as setMenuEnvHook, d as formatCommand, f as helpPath, n as bareGroupStartPath, t as catalog } from "./catalog-
|
|
2
|
+
import { c as setMenuEnvHook, d as formatCommand, f as helpPath, n as bareGroupStartPath, t as catalog } from "./catalog-CaTnrGVr.js";
|
|
3
3
|
import { i as loadEnvSession, r as loadEnvLoad } from "./peers-u1zxe-Ub.js";
|
|
4
4
|
import { t as nonEmpty } from "./connection-D3XsOE3S.js";
|
|
5
5
|
import { i as setDryRun, n as isDryRun, r as resolveDryRun } from "./dry-run-CFCZUpjb.js";
|
|
@@ -322,7 +322,7 @@ async function launchWith(argv, options) {
|
|
|
322
322
|
*/
|
|
323
323
|
async function launch(argv) {
|
|
324
324
|
await launchWith(argv, { dispatch: async (args) => {
|
|
325
|
-
const { main } = await import("./cli-
|
|
325
|
+
const { main } = await import("./cli-feRmGaGi.js");
|
|
326
326
|
await main(args);
|
|
327
327
|
} });
|
|
328
328
|
}
|
|
@@ -64,18 +64,17 @@ function parseBound(flag, text) {
|
|
|
64
64
|
//#endregion
|
|
65
65
|
//#region src/production/meetings.ts
|
|
66
66
|
/**
|
|
67
|
-
* Naming a meeting on the command line: `--meeting <day|slug|
|
|
67
|
+
* Naming a meeting on the command line: `--meeting <day|slug|uuid>`.
|
|
68
68
|
*
|
|
69
69
|
* Slugs are the meeting's Eastern date (`2026-09-09`), with `-2` for a second
|
|
70
70
|
* meeting that day, so a day is how officers will usually name one. A day with
|
|
71
71
|
* two meetings is ambiguous and the error lists both slugs rather than picking.
|
|
72
72
|
*/
|
|
73
|
-
/** Live meetings an argument could mean: by id
|
|
73
|
+
/** Live meetings an argument could mean: by id or slug, or on that Eastern day. */
|
|
74
74
|
const MEETING_QUERY = `
|
|
75
75
|
select
|
|
76
76
|
m."id"::text as "id",
|
|
77
77
|
m."slug",
|
|
78
|
-
m."configId",
|
|
79
78
|
coalesce(m."nameOverride", m."kind", 'Meeting') as "title",
|
|
80
79
|
m."startsAt",
|
|
81
80
|
m."endsAt",
|
|
@@ -84,7 +83,7 @@ select
|
|
|
84
83
|
from "platform"."meetings" m
|
|
85
84
|
where m."deletedAt" is null
|
|
86
85
|
and (
|
|
87
|
-
m."id"::text = $1 or m."slug" = $1
|
|
86
|
+
m."id"::text = $1 or m."slug" = $1
|
|
88
87
|
or ($2::boolean and (m."startsAt" at time zone '${EVENT_TZ}')::date = $1::date)
|
|
89
88
|
)
|
|
90
89
|
order by m."startsAt"
|
|
@@ -94,7 +93,6 @@ function findMeetingsWith(sql) {
|
|
|
94
93
|
return (await sql.unsafe(MEETING_QUERY, [named, isDay(named)])).map((r) => ({
|
|
95
94
|
id: String(r.id),
|
|
96
95
|
slug: String(r.slug),
|
|
97
|
-
configId: r.configId ?? null,
|
|
98
96
|
title: String(r.title),
|
|
99
97
|
startsAt: r.startsAt,
|
|
100
98
|
endsAt: r.endsAt,
|
|
@@ -105,10 +103,10 @@ function findMeetingsWith(sql) {
|
|
|
105
103
|
}
|
|
106
104
|
/** The one meeting `named` means, or a usage error saying why there isn't one. */
|
|
107
105
|
function pickMeeting(named, found) {
|
|
108
|
-
const exact = found.filter((m) => m.id === named || m.slug === named
|
|
106
|
+
const exact = found.filter((m) => m.id === named || m.slug === named);
|
|
109
107
|
const candidates = exact.length > 0 ? exact : found;
|
|
110
108
|
if (candidates.length === 1) return candidates[0];
|
|
111
|
-
if (candidates.length === 0) throw new UsageError(`No meeting matches "${named}". Name it by day (2026-09-09), slug
|
|
109
|
+
if (candidates.length === 0) throw new UsageError(`No meeting matches "${named}". Name it by day (2026-09-09), slug or id.`);
|
|
112
110
|
throw new UsageError(`"${named}" could be ${candidates.map((m) => `${m.slug} (${m.title})`).join(" or ")}. Pass the slug.`);
|
|
113
111
|
}
|
|
114
112
|
function describeMeeting(m) {
|
|
@@ -89,7 +89,7 @@ const RESPONSES = {
|
|
|
89
89
|
summary: "One row per survey answer; --meeting for one meeting's.",
|
|
90
90
|
columns: [
|
|
91
91
|
...MEMBER_COLUMNS,
|
|
92
|
-
"
|
|
92
|
+
"meeting_slug",
|
|
93
93
|
"meeting_title",
|
|
94
94
|
"question_id",
|
|
95
95
|
"question_scope",
|
|
@@ -101,7 +101,7 @@ const RESPONSES = {
|
|
|
101
101
|
sql: `
|
|
102
102
|
with ${PICKED_ANSWERS}
|
|
103
103
|
select ${MEMBER("pa.\"userId\"")},
|
|
104
|
-
m."
|
|
104
|
+
m."slug" as "meeting_slug",
|
|
105
105
|
case when m.id is not null
|
|
106
106
|
then coalesce(m."nameOverride", m."kind", 'Meeting') end as "meeting_title",
|
|
107
107
|
q.id as "question_id",
|
|
@@ -168,7 +168,7 @@ order by ms."startsAt", ms."userId", ms."activityType", ms."activityId"`
|
|
|
168
168
|
summary: "One row per check-in: who, which meeting, when, and how.",
|
|
169
169
|
columns: [
|
|
170
170
|
...MEMBER_COLUMNS,
|
|
171
|
-
"
|
|
171
|
+
"meeting_slug",
|
|
172
172
|
"meeting_title",
|
|
173
173
|
"meeting_starts_at",
|
|
174
174
|
"checked_in_at",
|
|
@@ -177,7 +177,7 @@ order by ms."startsAt", ms."userId", ms."activityType", ms."activityId"`
|
|
|
177
177
|
],
|
|
178
178
|
sql: `
|
|
179
179
|
select ${MEMBER("a.\"userId\"")},
|
|
180
|
-
m."
|
|
180
|
+
m."slug" as "meeting_slug",
|
|
181
181
|
coalesce(m."nameOverride", m."kind", 'Meeting') as "meeting_title",
|
|
182
182
|
m."startsAt" as "meeting_starts_at",
|
|
183
183
|
a."recordedAt" as "checked_in_at",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devdogsuga/backstage",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.10",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Officer and production CLI for DevDogsUGA: deploys, env sync with Bitwarden and GitHub, the migration planner role, club graphics and QR codes, GitHub rulesets and settings, and the newsletter. Ships built JS; run it anywhere with `pnpm dlx @devdogsuga/backstage` (no checkout needed to start; commands that read a checkout say so).",
|
|
@@ -41,9 +41,9 @@
|
|
|
41
41
|
"typescript": "^6.0.3",
|
|
42
42
|
"zod": "4.4.3",
|
|
43
43
|
"@devdogsuga/brand": "0.1.6",
|
|
44
|
-
"@devdogsuga/events": "0.1.6",
|
|
45
44
|
"@devdogsuga/telemetry": "0.1.4",
|
|
46
|
-
"@devdogsuga/
|
|
45
|
+
"@devdogsuga/events": "0.1.7",
|
|
46
|
+
"@devdogsuga/newsletter": "0.1.12"
|
|
47
47
|
},
|
|
48
48
|
"peerDependencies": {
|
|
49
49
|
"@devdogsuga/db": "*",
|
|
@@ -65,8 +65,8 @@
|
|
|
65
65
|
"tsdown": "^0.23.0",
|
|
66
66
|
"vitest": "^4.1.11",
|
|
67
67
|
"@devdogsuga/cli-core": "0.0.0",
|
|
68
|
-
"@devdogsuga/db": "0.1.3",
|
|
69
68
|
"@devdogsuga/config": "0.1.2",
|
|
69
|
+
"@devdogsuga/db": "0.1.3",
|
|
70
70
|
"@devdogsuga/env": "0.1.5"
|
|
71
71
|
},
|
|
72
72
|
"scripts": {
|