Skip to content

feat: support questionnaire answers in RSVP command - #72

Merged
KalebCole merged 7 commits into
mainfrom
feat/rsvp-questionnaire-cli
Aug 7, 2026
Merged

feat: support questionnaire answers in RSVP command#72
KalebCole merged 7 commits into
mainfrom
feat/rsvp-questionnaire-cli

Conversation

@KalebCole

@KalebCole KalebCole commented Jul 28, 2026

Copy link
Copy Markdown
Owner

Summary

  • expose repeatable --answer "key=value" on events rsvp and explore rsvp
  • validate required and unknown questionnaire answers fail-closed
  • attach the live-verified questionnaireResponse wire shape with current version
  • document and expose the option through command schema

Verification

  • npm test: 216 passed, 6 skipped
  • npm run typecheck: passed
  • live canceled recon event metadata returned questionnaire ID/version
  • CLI dry-run produced exact /addGuest payload with answer keyed by question ID
  • unknown answer key returned validation exit 3

Scope

Separate feature follow-up to the singular Partiful skill consolidation PR.

Summary by CodeRabbit

  • New Features

    • Added my-rsvp commands to view RSVP details and questionnaire responses.
    • Added separate rsvp get and rsvp set commands.
    • Added repeatable --answer options using question IDs or exact question text.
    • Supported questionnaire-aware dry runs while preserving existing RSVP details and answers.
  • Bug Fixes

    • Added validation for required, duplicate, malformed, unknown, and ambiguous answers.
    • Verified RSVP status and questionnaire responses after submission.
    • Rejected invalid guest counts and unsupported ticketed or paid events.
  • Documentation

    • Updated RSVP guidance for questionnaire answers, discovery commands, dry runs, and limitations.

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@KalebCole, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 52 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 8b59b254-c356-44bd-b569-b32eebb6f28d

📥 Commits

Reviewing files that changed from the base of the PR and between be00d68 and 39a6533.

📒 Files selected for processing (2)
  • docs/explore-command-design.md
  • tests/http.test.js
📝 Walkthrough

Walkthrough

RSVP commands now support repeatable questionnaire answers, current RSVP reads, state-preserving updates, answer-aware dry-runs, Firestore write verification, and validated questionnaire versions. Ticketed events and invalid answers remain unsupported.

Changes

Questionnaire-aware RSVP flow

Layer / File(s) Summary
RSVP answer contract and command wiring
src/commands/schema.ts, src/commands/rsvp.ts, README.md, docs/explore-command-design.md, skills/partiful/references/rsvps-and-interest.md, tests/schema-rsvp.test.js, tests/rsvp-integration.test.js, tests/skill-structure.test.js
RSVP writes use nested rsvp set commands. Read commands use rsvp get. Shared parameters include repeatable --answer values, and documentation and command tests describe the updated surface.
Questionnaire parsing and response validation
src/lib/rsvp.ts, tests/rsvp.test.js
Answer pairs are parsed and validated. Responses preserve existing answers, support question IDs or exact text, validate questionnaire versions, enforce required answers, and check RSVP counts against named plus-ones.
Firestore guest retrieval
src/lib/http.ts, src/lib/api/endpoints.ts, tests/http.test.js, tests/schema-api.test.js, tests/rsvp-orchestration.test.js
The API registry and HTTP client retrieve guest Firestore documents. Tests cover request timeout signaling, endpoint introspection, and mocked guest data.
State-preserving RSVP submission
src/commands/rsvp.ts, tests/rsvp-orchestration.test.js
RSVP actions read state when required, preserve omitted fields, support answer-aware dry-runs, expose current RSVP data, verify writes, and reject ticketed events or invalid submissions.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant rsvpAction
  participant PartifulAPI
  participant Firestore
  participant buildQuestionnaireResponse
  rsvpAction->>PartifulAPI: Read event state
  rsvpAction->>Firestore: Read current guest state
  Firestore-->>rsvpAction: Return RSVP and questionnaire data
  rsvpAction->>buildQuestionnaireResponse: Build merged response
  buildQuestionnaireResponse-->>rsvpAction: Return validated response
  rsvpAction->>PartifulAPI: Submit /addGuest payload
  rsvpAction->>Firestore: Verify persisted guest document
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 71.43% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely identifies the main change: adding questionnaire answer support to the RSVP command.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/rsvp-questionnaire-cli

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 02cb148ff9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/commands/rsvp.ts Outdated

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds end-to-end support for submitting host questionnaire answers when RSVPing, so the CLI can RSVP to questionnaire-gated events (fail-closed on missing/unknown answers) while preserving the live-verified wire shape.

Changes:

  • Introduces repeatable --answer "key=value" for events rsvp and explore rsvp, parses/validates pairs, and submits them under rsvp.questionnaireResponse.
  • Updates questionnaire response building to validate required questions and reject unknown keys (fail-closed).
  • Extends schema + documentation and adds/updates unit/orchestration coverage for the new behavior.
Show a summary per file
File Description
tests/schema-rsvp.test.js Verifies schema output includes the new --answer parameter for RSVP.
tests/rsvp.test.js Adds unit coverage for parsing --answer pairs and rejecting unknown questionnaire keys.
tests/rsvp-orchestration.test.js Adds orchestration tests for questionnaire-required/optional flows and payload inclusion.
src/lib/rsvp.ts Implements parseQuestionnaireAnswers and strengthens questionnaire answer validation (required + unknown keys).
src/commands/schema.ts Exposes --answer in the static command schema for events.rsvp and explore.rsvp.
src/commands/rsvp.ts Wires --answer into RSVP execution (including questionnaireResponse construction and validation).
skills/partiful-events/SKILL.md Updates skill docs to show --answer usage and revised questionnaire behavior.
README.md Updates CLI usage docs to include --answer and explain validation behavior.

Review details

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

  • Files reviewed: 8/8 changed files
  • Comments generated: 1
  • Review effort level: Low

Comment thread src/commands/rsvp.ts Outdated
@KalebCole
KalebCole force-pushed the feat/rsvp-questionnaire-cli branch from 02cb148 to 84d4f03 Compare July 31, 2026 22:31

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (5)
src/lib/rsvp.ts (2)

59-81: 🎯 Functional Correctness | 🔵 Trivial | 💤 Low value

Use a null-prototype map for parsed answers.

answers is a plain object literal. An --answer "__proto__=x" pair does not create an own property, so Object.hasOwn stays false and the pair is dropped without an error. A null-prototype object removes this class of key collision.

♻️ Proposed hardening
-  const answers: Record<string, string> = {};
+  const answers: Record<string, string> = Object.create(null);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/rsvp.ts` around lines 59 - 81, Update parseQuestionnaireAnswers so
answers is initialized as a null-prototype map instead of a plain object
literal. Preserve the existing key validation, duplicate detection, and return
type behavior while ensuring keys such as "__proto__" are stored and validated
correctly.

240-354: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚖️ Poor tradeoff

Split buildQuestionnaireResponse into named helpers.

The function now performs five distinct jobs: resolve the question schema, short-circuit status-only edits, validate version history, build the alias index, and merge plus validate answers. Extract resolveQuestions(event), resolveQuestionnaireVersion(event, questions), and mergeAnswers(questions, answersByKey, existingResponse). Each part then becomes testable in isolation, and the control flow of the main function stays readable.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/rsvp.ts` around lines 240 - 354, Split buildQuestionnaireResponse
into the named helpers resolveQuestions(event),
resolveQuestionnaireVersion(event, questions), and mergeAnswers(questions,
answersByKey, existingResponse). Move schema selection and normalization into
resolveQuestions, version-history validation into resolveQuestionnaireVersion,
and alias indexing, answer merging, and required-answer validation into
mergeAnswers; keep the existing status-only and questionnaire-version checks in
the main function while preserving all current validation behavior and errors.
README.md (1)

112-117: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Document that --answer makes a dry-run read remote state.

rsvpAction fetches the guest and the event when --answer is present, even with --dry-run. A plain --dry-run stays offline. Users who rely on --dry-run being offline need this note.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` around lines 112 - 117, Update the README’s RSVP documentation
near the repeatable --answer option to state that using --answer with --dry-run
performs a remote read of the guest and event, while a plain --dry-run remains
offline.
tests/rsvp-orchestration.test.js (1)

237-248: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add two missing orchestration tests.

Two new branches in rsvpAction have no coverage:

  1. --answer against an event without a questionnaire must fail with the "does not expose a host questionnaire" error and must not call /addGuest.
  2. A plain --dry-run without --answer must stay offline, so /getEventInfo and /getCurrentGuest must not be called. This guards the documented backward compatibility of needsRemoteState.
💚 Proposed tests
it('refuses --answer for an event without a questionnaire', async () => {
  routeApi({ event: { title: 'Plain party' }, currentGuest: { id: 'G7', name: 'Kaleb' } });
  await rsvpAction('EV1', { answer: ['q1=Vegan'] }, mkCmd({ yes: true }));

  expect(jsonError).toHaveBeenCalledWith(
    expect.stringMatching(/does not expose a host questionnaire/i), 3, 'validation_error', null);
  expect(apiRequest.mock.calls.some(c => c[1] === '/addGuest')).toBe(false);
});

it('keeps a plain dry-run offline', async () => {
  routeApi({ event: questionnaireEvent });
  await rsvpAction('EV1', { name: 'Kaleb' }, mkCmd({ dryRun: true }));

  expect(apiRequest).not.toHaveBeenCalled();
});
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/rsvp-orchestration.test.js` around lines 237 - 248, Add two tests
alongside the existing rsvpAction orchestration tests: verify an --answer
submission for an event without a questionnaire reports the “does not expose a
host questionnaire” validation error and never calls /addGuest, and verify a
plain dry-run without --answer performs no API requests, including /getEventInfo
and /getCurrentGuest.
src/commands/rsvp.ts (1)

136-142: 🗄️ Data Integrity & Integration | 🔵 Trivial | 💤 Low value

An explicit --count can now contradict the preserved plus-ones.

plusOnes falls back to the stored plus-ones, but count uses the supplied value without any cross-check. If a guest stores plusOnes: ['A','B'] and the user runs --count 1, the payload keeps two plus-ones with count: 1. Before this change the user had to pass --plus-one to reach that state.

Consider validating that count is at least 1 + plusOnes.length, or documenting that --count wins.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/commands/rsvp.ts` around lines 136 - 142, Update the count calculation
near plusOnes in the RSVP command so an explicit count cannot be lower than 1
plus the preserved plusOnes length; validate or normalize the value using the
same behavior as existing count handling, while leaving valid explicit counts
and plus-one-derived behavior unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/commands/rsvp.ts`:
- Line 150: Update the status construction in the RSVP command’s `/addGuest`
payload so currentGuest.status is used only when it is an accepted RSVP value;
default non-self-RSVP statuses such as SENT, APPROVED, or PENDING_APPROVAL to
GOING before normalizeStatus processes them.

In `@src/commands/schema.ts`:
- Line 22: Update the --status definition in the command schema to remove or
restate its fixed default, matching rsvpAction’s behavior: omitted status must
preserve an existing guest status and use GOING only for new RSVPs. Keep the
existing type, optionality, and description unchanged.

---

Nitpick comments:
In `@README.md`:
- Around line 112-117: Update the README’s RSVP documentation near the
repeatable --answer option to state that using --answer with --dry-run performs
a remote read of the guest and event, while a plain --dry-run remains offline.

In `@src/commands/rsvp.ts`:
- Around line 136-142: Update the count calculation near plusOnes in the RSVP
command so an explicit count cannot be lower than 1 plus the preserved plusOnes
length; validate or normalize the value using the same behavior as existing
count handling, while leaving valid explicit counts and plus-one-derived
behavior unchanged.

In `@src/lib/rsvp.ts`:
- Around line 59-81: Update parseQuestionnaireAnswers so answers is initialized
as a null-prototype map instead of a plain object literal. Preserve the existing
key validation, duplicate detection, and return type behavior while ensuring
keys such as "__proto__" are stored and validated correctly.
- Around line 240-354: Split buildQuestionnaireResponse into the named helpers
resolveQuestions(event), resolveQuestionnaireVersion(event, questions), and
mergeAnswers(questions, answersByKey, existingResponse). Move schema selection
and normalization into resolveQuestions, version-history validation into
resolveQuestionnaireVersion, and alias indexing, answer merging, and
required-answer validation into mergeAnswers; keep the existing status-only and
questionnaire-version checks in the main function while preserving all current
validation behavior and errors.

In `@tests/rsvp-orchestration.test.js`:
- Around line 237-248: Add two tests alongside the existing rsvpAction
orchestration tests: verify an --answer submission for an event without a
questionnaire reports the “does not expose a host questionnaire” validation
error and never calls /addGuest, and verify a plain dry-run without --answer
performs no API requests, including /getEventInfo and /getCurrentGuest.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: c4556648-214d-4ccb-9d14-24411f4fe327

📥 Commits

Reviewing files that changed from the base of the PR and between d2c8054 and 84d4f03.

📒 Files selected for processing (8)
  • README.md
  • skills/partiful/references/rsvps-and-interest.md
  • src/commands/rsvp.ts
  • src/commands/schema.ts
  • src/lib/rsvp.ts
  • tests/rsvp-orchestration.test.js
  • tests/rsvp.test.js
  • tests/schema-rsvp.test.js

Comment thread src/commands/rsvp.ts Outdated
Comment thread src/commands/schema.ts Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/commands/rsvp.ts`:
- Around line 274-280: Update the verification logic in the verified object to
avoid JSON.stringify-based questionnaireResponse comparison. Compare
questionnaireVersion directly and compare answer entries by their keys and
corresponding values, independent of property order, while preserving the null
handling for expectedQuestionnaireResponse.

In `@src/lib/http.ts`:
- Around line 176-186: Update the Firestore GET inside withRetry to pass an
AbortSignal configured with a bounded timeout, ensuring a hanging fetch settles
and can be retried. Preserve the existing request headers, method, and retry
flow.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 1985a482-88cc-435a-83e9-ae72d7bf649b

📥 Commits

Reviewing files that changed from the base of the PR and between 84d4f03 and ec9e823.

📒 Files selected for processing (11)
  • README.md
  • skills/partiful/references/rsvps-and-interest.md
  • src/commands/rsvp.ts
  • src/commands/schema.ts
  • src/lib/api/endpoints.ts
  • src/lib/http.ts
  • src/lib/rsvp.ts
  • tests/rsvp-orchestration.test.js
  • tests/rsvp.test.js
  • tests/schema-api.test.js
  • tests/schema-rsvp.test.js
🚧 Files skipped from review as they are similar to previous changes (5)
  • skills/partiful/references/rsvps-and-interest.md
  • README.md
  • tests/rsvp.test.js
  • src/lib/rsvp.ts
  • src/commands/schema.ts

Comment thread src/commands/rsvp.ts
Comment thread src/lib/http.ts
@KalebCole

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
tests/http.test.js (1)

34-34: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Remove the hardcoded bearer-token fixture.

Line [34] passes 'token' as the bearer credential. Use a generated test-only value or an injected fixture instead.

As per coding guidelines, do not hardcode auth tokens in source code.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/http.test.js` at line 34, Replace the hardcoded `'token'` argument in
the firestoreGetDocument test call with a generated test-only bearer value or an
injected authentication fixture, while preserving the existing request behavior.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/explore-command-design.md`:
- Around line 60-62: Update the `explore rsvp set` section in the design
document to show repeatable `--answer key=value` options, describe the current
read-before-write and status-preservation behavior, and remove the questionnaire
restriction so supported questionnaire events are documented as valid.
- Line 61: Update the command code fence near the affected documentation section
to include a language identifier such as text on its opening fence, resolving
Markdownlint MD040 without changing the fenced content.

In `@tests/http.test.js`:
- Around line 36-39: Update the request assertion in the test around
firestoreGetDocument to verify the authenticated GET contract: require method
"GET", the Authorization header, the Referer header, and the existing
AbortSignal alongside the URL. Preserve the current partial object-matching
approach.

---

Nitpick comments:
In `@tests/http.test.js`:
- Line 34: Replace the hardcoded `'token'` argument in the firestoreGetDocument
test call with a generated test-only bearer value or an injected authentication
fixture, while preserving the existing request behavior.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: ba7c94aa-0d70-4330-8e99-216c2b43001f

📥 Commits

Reviewing files that changed from the base of the PR and between ec9e823 and be00d68.

📒 Files selected for processing (15)
  • README.md
  • docs/explore-command-design.md
  • skills/partiful/references/rsvps-and-interest.md
  • src/commands/rsvp.ts
  • src/commands/schema.ts
  • src/lib/api/endpoints.ts
  • src/lib/http.ts
  • src/lib/rsvp.ts
  • tests/http.test.js
  • tests/rsvp-integration.test.js
  • tests/rsvp-orchestration.test.js
  • tests/rsvp.test.js
  • tests/schema-api.test.js
  • tests/schema-rsvp.test.js
  • tests/skill-structure.test.js
🚧 Files skipped from review as they are similar to previous changes (9)
  • tests/schema-api.test.js
  • src/lib/api/endpoints.ts
  • README.md
  • src/lib/rsvp.ts
  • skills/partiful/references/rsvps-and-interest.md
  • tests/rsvp-orchestration.test.js
  • tests/rsvp.test.js
  • src/lib/http.ts
  • src/commands/rsvp.ts

Comment thread docs/explore-command-design.md
Comment thread docs/explore-command-design.md Outdated
Comment thread tests/http.test.js
@KalebCole

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@KalebCole
KalebCole merged commit 0bfb95c into main Aug 7, 2026
1 check passed
@KalebCole
KalebCole deleted the feat/rsvp-questionnaire-cli branch August 7, 2026 23:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants