@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 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, config id or id; a day with two meetings
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-CaAe3cve.js";
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, config id or id."
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, config id or id."
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-COleRgQD.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-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-CuYIkHeU.js")).handleImport(rest),
5388
- export: async (rest) => (await import("./commands-CaSixDwT.js")).handleExport(rest)
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-CaAe3cve.js";
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-CLZ6xQQB.js";
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, config id or id.",
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-CLZ6xQQB.js";
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-DL5fpABN.js")).handleAttendance(args);
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-COleRgQD.js";
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-CMThHZgV.js");
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|config id|uuid>`.
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, slug or config id, or on that Eastern day. */
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 or m."configId" = $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 || m.configId === 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, config id or id.`);
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
- "meeting_config_id",
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."configId" as "meeting_config_id",
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
- "meeting_config_id",
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."configId" as "meeting_config_id",
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.9",
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/newsletter": "0.1.11"
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": {