@devdogsuga/backstage 0.1.8 → 0.1.9

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
@@ -37,29 +37,30 @@ pnpm backstage creds renew # extend every Send 30 days
37
37
  pnpm backstage import involvement --file OrganizationRoster.csv # verify members; previews, then asks
38
38
  pnpm backstage import attendance --meeting 2026-09-09 --file sign-in.csv
39
39
  pnpm backstage export stars --from 2026-08-17 # audited under your gh login
40
+ pnpm backstage export attendance --meeting 2026-09-09 --format bevy,involvement
40
41
  ```
41
42
 
42
43
  ## Commands
43
44
 
44
- | Command | What it does |
45
- | ------------------------------------------------ | -------------------------------------------------------------------------------------- |
46
- | `deploy <app> --tier <t>` | Checks `CLOUDFLARE_API_TOKEN`, writes the Worker's secrets file, deploys, removes it. |
47
- | `deploy write-env` | Composes `.env.<DEPLOY_ENV>` from the GitHub environment. |
48
- | `deploy preflight` | Classifies the project: paused (skip) or broken (fail). |
49
- | `deploy plan`, `deploy migrate` | Dry-run the migrations into the job summary; apply them to `DB_URL`. |
50
- | `deploy smoke --tier <t> [--app]` | Public routes answer 200, the auth redirect works, this deploy's Sentry release shows. |
51
- | `deploy reconcile --tier <t>` | The platform's config reconcile, after the deploy (`CRON_SECRET`). |
52
- | `deploy prune-monitors --tier <t> [--app]` | Deletes the app's Sentry Crons monitors it no longer declares (production only). |
53
- | `env pull\|push\|audit --target <t>` | One env file per target, synced to Bitwarden and GitHub. `audit` lists orphans. |
54
- | `planner status\|create\|reset-password\|drop` | The `migration_planner` role the preflight tier holds. |
55
- | `graphics [graphic…]` | Club images from `@devdogsuga/brand`: `brand/*`, `app/*`, `event/*`. |
56
- | `qr <text>` | QR codes with every option of `/console/qr`. |
57
- | `github rulesets\|settings` | Diff (and with `--apply` write) GitHub config, through `gh`. |
58
- | `newsletter render\|draft\|send <issue…>` | Changelog issues as files, mailbox drafts, or a send. |
59
- | `creds send\|add\|renew\|list\|report` | Club logins from Bitwarden as email-verified Sends, and the Linear report. |
60
- | `import involvement --file <csv>` | Verifies the members on the Involvement Network roster, unverifies everyone else. |
61
- | `import attendance --meeting <day> --file <csv>` | Records a meeting's attendance from a sign-in sheet (method `import`). |
62
- | `export stars\|attendance\|reflections` | Member data as CSV, each export audited under the officer's gh login. |
45
+ | Command | What it does |
46
+ | -------------------------------------------------- | -------------------------------------------------------------------------------------- |
47
+ | `deploy <app> --tier <t>` | Checks `CLOUDFLARE_API_TOKEN`, writes the Worker's secrets file, deploys, removes it. |
48
+ | `deploy write-env` | Composes `.env.<DEPLOY_ENV>` from the GitHub environment. |
49
+ | `deploy preflight` | Classifies the project: paused (skip) or broken (fail). |
50
+ | `deploy plan`, `deploy migrate` | Dry-run the migrations into the job summary; apply them to `DB_URL`. |
51
+ | `deploy smoke --tier <t> [--app]` | Public routes answer 200, the auth redirect works, this deploy's Sentry release shows. |
52
+ | `deploy reconcile --tier <t>` | The platform's config reconcile, after the deploy (`CRON_SECRET`). |
53
+ | `deploy prune-monitors --tier <t> [--app]` | Deletes the app's Sentry Crons monitors it no longer declares (production only). |
54
+ | `env pull\|push\|audit --target <t>` | One env file per target, synced to Bitwarden and GitHub. `audit` lists orphans. |
55
+ | `planner status\|create\|reset-password\|drop` | The `migration_planner` role the preflight tier holds. |
56
+ | `graphics [graphic…]` | Club images from `@devdogsuga/brand`: `brand/*`, `app/*`, `event/*`. |
57
+ | `qr <text>` | QR codes with every option of `/console/qr`. |
58
+ | `github rulesets\|settings` | Diff (and with `--apply` write) GitHub config, through `gh`. |
59
+ | `newsletter render\|draft\|send <issue…>` | Changelog issues as files, mailbox drafts, or a send. |
60
+ | `creds send\|add\|renew\|list\|report` | Club logins from Bitwarden as email-verified Sends, and the Linear report. |
61
+ | `import involvement --file <csv>` | Verifies the members on the Involvement Network roster, unverifies everyone else. |
62
+ | `import attendance --meeting <day> --file <csv>` | Records a meeting's attendance from a sign-in sheet (method `import`). |
63
+ | `export stars\|attendance\|reflections\|responses` | Member data as CSV, each export audited under the officer's gh login. |
63
64
 
64
65
  `smoke` and `reconcile` replace DevDogsUGA's `packages/deploy-checks`. The
65
66
  per-app data (hosts, public paths, the protected path and its redirect) stays in
@@ -201,15 +202,32 @@ meetings are refused. Rerunning a sheet records nothing new; `--replace`
201
202
  makes the sheet the meeting's whole imported set, removing earlier imported
202
203
  rows it no longer lists. Every run previews, then asks (`--dry-run`, `--yes`).
203
204
 
204
- ### `export stars|attendance|reflections`
205
+ ### `export stars|attendance|reflections|responses`
205
206
 
206
207
  The platform's three CSVs, columns unchanged: `stars` (one row per earned
207
208
  star), `attendance` (one row per check-in; `--meeting` for one night) and
208
- `reflections` (each member's current text). Each export writes a
209
+ `reflections` (each member's current text). `responses` is the check-in
210
+ survey: one row per answer, worded with each question's current labels
211
+ beside the stored value. With `--meeting` it is that meeting's answers plus
212
+ its attendees' member answers as they stood when it ended (from the answer
213
+ history); `--format wide` writes one meeting as one row per person and one
214
+ column per question. Each export writes a
209
215
  `platform.exportAudit` row before reading anything, attributed to the
210
216
  platform account linked to the GitHub login `gh` is signed in as, and refuses
211
- to run when there is none. The file goes to `./<kind>….csv` (owner-readable
212
- only, never over an existing file without `--yes`) or stdout with `--out -`.
217
+ to run when there is none.
218
+
219
+ `attendance` can also be written as a Bevy attendee import (GDG's
220
+ gdg.community.dev; one row per person, checked in, with a `survey:` column
221
+ for each question mapped to one in `questions.json` that anyone answered) and
222
+ an Involvement Network
223
+ list (one MyID email per line), both for one `--meeting`. `--format
224
+ platform,bevy,involvement` picks any of them, written from one read with an
225
+ audit row each; at a terminal it is asked. At a terminal each file's
226
+ destination is asked for too, with path completion (Tab completes the
227
+ highlighted suggestion; a folder means the suggested name inside it).
228
+ Otherwise files go to `./<kind>…[-<format>].<ext>`, or `--out` (a file, a
229
+ folder for several, or `-` for stdout). Files are owner-readable only and
230
+ never replace an existing file without `--yes` or a yes at the prompt.
213
231
 
214
232
  No secret value reaches stdout, stderr, the failure log, Sentry, an error
215
233
  message or argv: values go to `bw` as base64 JSON on stdin, every error is
@@ -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-DeEwfe2c.js";
5
+ import { t as EXPORTS } from "./queries-CaAe3cve.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";
@@ -1242,8 +1242,8 @@ const TO = {
1242
1242
  };
1243
1243
  const OUT = {
1244
1244
  flag: "--out",
1245
- value: "<path|->",
1246
- summary: "Where to write. Defaults to ./<kind>….csv; - for stdout."
1245
+ value: "<path|dir|->",
1246
+ summary: "Where to write (a folder for several files; - for stdout). Asked at a terminal."
1247
1247
  };
1248
1248
  function exportOf(kind, extra = []) {
1249
1249
  return {
@@ -1261,18 +1261,28 @@ function exportOf(kind, extra = []) {
1261
1261
  ]
1262
1262
  };
1263
1263
  }
1264
+ const MEETING = {
1265
+ flag: "--meeting",
1266
+ value: "<meeting>",
1267
+ summary: "One meeting: its day (2026-09-09), slug, config id or id."
1268
+ };
1264
1269
  const exportCommand = {
1265
1270
  name: "export",
1266
- summary: "Member data as CSV: stars, attendance, reflections. Audited.",
1271
+ summary: "Member data as CSV: stars, attendance, reflections, survey responses. Audited.",
1267
1272
  hint: "production database; your gh login is recorded",
1268
1273
  subcommands: [
1269
1274
  exportOf("stars"),
1270
- exportOf("attendance", [{
1271
- flag: "--meeting",
1272
- value: "<meeting>",
1273
- summary: "One meeting: its day (2026-09-09), slug, config id or id."
1275
+ exportOf("attendance", [MEETING, {
1276
+ flag: "--format",
1277
+ value: "<formats>",
1278
+ summary: "platform, bevy (GDG attendee import), involvement (MyID emails); comma-separated. Asked at a terminal."
1274
1279
  }]),
1275
- exportOf("reflections")
1280
+ exportOf("reflections"),
1281
+ exportOf("responses", [MEETING, {
1282
+ flag: "--format",
1283
+ value: "<formats>",
1284
+ summary: "platform (one row per answer), wide (one row per person; needs --meeting). Asked at a terminal."
1285
+ }])
1276
1286
  ]
1277
1287
  };
1278
1288
  //#endregion
@@ -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-BWtUtxMF.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";
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";
@@ -5380,12 +5380,12 @@ const HANDLERS = {
5380
5380
  },
5381
5381
  completions: handleCompletions,
5382
5382
  github: handleGithub,
5383
- graphics: async (rest) => (await import("./commands-CQ-vbNe9.js")).handleGraphics(rest),
5383
+ graphics: async (rest) => (await import("./commands-jJcS7D2a.js")).handleGraphics(rest),
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-zApyD2Rk.js")).handleImport(rest),
5388
- export: async (rest) => (await import("./commands-D4FcDQuh.js")).handleExport(rest)
5387
+ import: async (rest) => (await import("./commands-CuYIkHeU.js")).handleImport(rest),
5388
+ export: async (rest) => (await import("./commands-CaSixDwT.js")).handleExport(rest)
5389
5389
  };
5390
5390
  /**
5391
5391
  * Names that were commands of the contributor CLI, refused with where they
@@ -133,4 +133,4 @@ function reportFailure(command, err, worded = []) {
133
133
  explainError(`${command} failed.`, err);
134
134
  }
135
135
  //#endregion
136
- export { reportFailure as a, connect as c, withConnection as d, readInputFile as i, dbError as l, confirmWrite as n, say as o, plural as r, ProductionError as s, canPrompt as t, requireProductionKey as u };
136
+ export { readInputFile as a, ProductionError as c, requireProductionKey as d, withConnection as f, plural as i, connect as l, confirmWrite as n, reportFailure as o, expandHome as r, say as s, canPrompt as t, dbError as u };