Home CLI guides

CLI guides

Command-line guides for Firestruct project selection, Firestore commands, Auth administration, Storage automation, and GUI-only module boundaries. Use these articles to understand which workflows can run from terminal commands today, which remain macOS app workflows, and which confirmation or task-queue rules future CLI features must preserve.
By Tomas Radvansky
14 articles

Foundation and App Shell CLI

Purpose The CLI mirrors core workspace concepts for automation: project selection, module selection, JSON output, and shared access to FirestructCore services. Executable Layout - Sources/FirestructCLI/main.swift is the thin executable. - Sources/FirestructCLIKit parses arguments, loads local state, dispatches commands, and encodes JSON output. - Sources/FirestructCore provides the same project, query, and write services used by GUI flows. Global Behavior - help and --help print usage. - Missing commands, missing actions, invalid flags, and unknown commands exit with code 1. - Successful command payloads are JSON unless the command is help text. - --project <name|firebaseProjectID|uuid> overrides the selected project for supported commands. Current Command Groups project connect project list project select module list module select firestore query firestore create firestore update firestore delete auth list auth search auth create auth update auth delete auth export auth import auth transfer auth run storage buckets storage list storage upload storage upload-folder storage download storage download-batch storage zip storage zip-folder storage inspect storage copy storage move storage delete storage signed-url run <selected-module-action> Module Selection module select <module> saves the selected module. run <action> currently dispatches to firestore, auth, or storage when one of those modules is selected. Known module names accepted by module select: firestore auth storage index-advisor seed-studio workspace-link migrations The CLI module list is narrower than the GUI module list. Push, PITR, Tasks, Support, Purchases, and Settings do not currently expose first-class CLI command groups. Source Anchors - Sources/FirestructCLI/main.swift - Sources/FirestructCLIKit/FirestructCLI.swift - Sources/FirestructCLIKit/CLIArguments.swift - Sources/FirestructCLIKit/CLIStateStore.swift - Sources/FirestructCLIKit/ModuleCommand.swift

Last updated on May 07, 2026

Project Registry CLI

Purpose The project CLI manages local project links and the selected project used by other CLI commands. Use it to prepare repeatable emulator, development, or production targets before running Firestore, Auth, or Storage commands. The registry keeps local metadata only; connecting a project does not create, modify, or delete Firebase resources. That separation lets teams script local setup while preserving Firestruct's production confirmation rules in the modules that actually mutate data. Connect a Project project connect --name Local --project-id demo-firestruct --environment emulator --host localhost --port 8080 Aliases: project add ... projects connect ... projects add ... Options: - --name is required. - --project-id is required. - --environment accepts emulator, development, or production; default is emulator. - --read-only marks the project read-only. - --host sets the emulator host. - --port sets the Firestore emulator port. - --auth-port sets the Auth emulator port. - --storage-port sets the Storage emulator port. - --database sets the selected Firestore database ID; default is the Firestore default database. On success the command saves the project, selects it, and returns JSON under connected. For emulator projects, include host and port values so downstream commands can send requests to the local Firebase Emulator Suite without extra flags. For live projects, store the project ID and environment label, then pass authorization to the individual service commands that need live Firebase access. List Projects project list Returns JSON: { "projects": [] } Each project payload includes selection state. Select Project project select Local project select --project demo-firestruct The identifier can be the local name, Firebase project ID, or UUID. Selection is stored in CLI state for future commands. The selected project is the default target, but supported commands can still override it with --project <name|firebaseProjectID|uuid>. Prefer explicit overrides in automation and CI-like scripts so a previous interactive selection does not send a command to the wrong Firebase project. For production runbooks, print or inspect the selected project before any mutation command and keep the environment label visible in the captured output. If a project link is no longer needed, remove it through the app or reset the local CLI state as part of a controlled cleanup. Removing local registry data does not remove remote Firebase data, service accounts, emulator data, or App Store entitlements. Source Anchors - Sources/FirestructCLIKit/ProjectCommand.swift - Sources/FirestructCLIKit/CLIStateStore.swift - Sources/FirestructCLIKit/JSONOutput.swift

Last updated on May 07, 2026

Firestore CLI

Purpose The Firestore CLI covers simple query and single-document create/update/delete automation through shared FirestructCore services. Query Documents firestore query --collection users --limit 50 firestore query --collection users --where "role == admin" --order-by "createdAt desc" firestore query --project demo-firestruct --collection users --limit 0 Options: - --collection is required and accepts a collection path. - --limit defaults to 50; 0 means no explicit limit where supported by the service. - --where accepts Firestruct simple-query syntax. - --order-by accepts comma-compatible parsed order clauses from the query service. - --project optionally overrides selected project. Output contains: - selected project JSON - documents - logs Create Document firestore create --collection users --document-id alice --data '{"name":"Alice"}' firestore create --collection users --document-id alice --data '{"name":"Alice"}' --allow-overwrite Required options: - --collection - --document-id - --data --allow-overwrite permits replacing an existing target when the core service supports it. Update Document firestore update --document users/alice --data '{"name":"Alice"}' Required options: - --document - --data Delete Document firestore delete --document users/alice --confirm Required options: - --document - --confirm Deletes fail without --confirm. Run Through Selected Module module select firestore run query --collection users --limit 50 run dispatches Firestore actions only when the selected CLI module is firestore. Not Yet Covered by CLI The GUI Firestore module has broader coverage than the current CLI. These flows are not first-class CLI commands yet: - JS Query execution - bulk field operations - import/export/transfer/backup - recursive copy/move/rename - schema analyzer - vector nearest-neighbor query mode - saved query/script management Source Anchors - Sources/FirestructCLIKit/FirestoreCommand.swift - Sources/FirestructCore/FirestoreSimpleQueryService.swift - Sources/FirestructCore/FirestoreDocumentWriteService.swift

Last updated on May 07, 2026

Auth CLI

Purpose The Auth CLI exposes Firebase Authentication user administration through the same AuthListService used by the macOS app. It supports emulator projects by default and supports live Firebase projects when a bearer token is supplied. All successful commands print JSON. Failures return exit code 1 with a readable error on stderr. Project Setup project connect --name Local --project-id demo-firestruct --environment emulator --host localhost --port 8080 --auth-port 9099 project select Local Options shared by Auth commands: - --project <name|firebaseProjectID|uuid> overrides the selected project. - --authorization "Bearer <token>" supplies a live-project authorization header. - --access-token <token> is shorthand for --authorization "Bearer <token>". For emulator projects, Firestruct sends the emulator admin authorization header automatically. List Users auth list --limit 100 auth list --limit 100 --page-token <nextPageToken> auth list --filter alice --sort-by email auth list --sort-by createdAt --descending Options: - --limit defaults to 1000 and must be between 1 and 1000. - --page-token requests a specific Firebase Auth page. - --filter applies a client-side substring filter across UID, email, phone, and display name. - --sort-by accepts uid, email, phoneNumber, createdAt, or lastLoginAt. - --descending reverses the sort order. Output contains project, users, nextPageToken, and logs. Each user includes profile fields, disabled and email verification state, custom claims JSON, metadata timestamps, password hash/salt when returned by Firebase, linked provider IDs, and provider details. Search And Get auth search --uid auth_alice auth search --email alice@example.test auth search --phone +15555550123 auth get --uid auth_alice auth search and auth get use the Identity Toolkit lookup endpoint. Provide one of --uid, --email, --phone, or --search. Create User auth create --uid auth_alice --email alice@example.test --password secret auth create --email alice@example.test --display-name "Alice" --email-verified true auth create --uid auth_alice --custom-claims '{"role":"admin"}' Supported fields: - --uid - --email - --password - --phone - --display-name - --photo-url - --disabled true|false - --email-verified true|false - --custom-claims '<json object>' Update User auth update --uid auth_alice --display-name "Alice Updated" auth update --uid auth_alice --disabled true auth update --uid auth_alice --email-verified false auth update --uid auth_alice --custom-claims '{"tier":"pro"}' auth update --uid auth_alice --delete-password --uid is required. The other fields match auth create. Custom claims are validated by the core Auth service before the request is sent. Bulk Enable, Disable, And Delete auth disable --uid auth_alice --confirm auth enable --uids auth_alice,auth_bob --confirm auth delete --uid auth_alice --confirm auth delete --uids auth_alice,auth_bob --confirm Bulk mutation commands require --confirm. --uid targets one user, and --uids accepts a comma-separated list. Output includes a task object with queued/running/success lifecycle fields, processed and total operation counters, attempt count, duration, and any retained error description. Export Users auth export --format json --output build/auth-users.json auth export --format csv --output build/auth-users.csv auth export --search alice@example.test --output build/alice.json auth export --uids auth_alice,auth_bob --fields uid,email,customClaims --output build/auth-users.json Options: - --format json|csv defaults to json. - --output <path> is required. - --search <text> exports lookup results instead of all users. - --uid or --uids narrows the exported all-user result. - --page-size controls all-user pagination and defaults to 1000. - --fields <comma-separated AuthExportField names> selects export fields. - --no-metadata omits metadata fields. - --no-custom-claims omits custom claims. - --include-hashes includes password hash and salt when Firebase returns them. - --delimiter <char> sets CSV delimiter. - --json-structure array|keyedByUID|envelope controls JSON shape. - --timestamps iso8601|unixMilliseconds|unixSeconds controls timestamp encoding. Output includes export counts, destination metadata, logs, and the completed task snapshot. Import Users auth import --file auth-users.json --format json --confirm auth import --file auth-users.csv --format csv --uid-column uid --confirm auth import --file auth-users.json --update-existing --confirm Options: - --file <path> is required. - --format json|csv defaults to json. - --delimiter <char> sets CSV delimiter. - --no-header treats CSV as headerless. - --uid-column <name> defaults to uid. - --update-existing updates users when create returns an already-exists error. - --confirm is required. JSON imports accept either an array of user objects or an object keyed by UID. CSV imports require a UID column unless --no-header is used. Output includes imported count, logs, and the completed task snapshot. Transfer Users auth transfer --target Staging --confirm auth transfer --target Production --uids auth_alice,auth_bob --confirm auth transfer --target Staging --delete-source --confirm The selected or --project project is the source. --target accepts the target project name, Firebase project ID, or UUID. Transfer exports users from the source, creates or updates them in the target, and optionally deletes source users with --delete-source. For live-to-live or emulator-to-live transfer, use target-specific credentials when needed: auth transfer --target Production --access-token <source-token> --target-access-token <target-token> --confirm Output includes transferred count, optional source deletion count, logs, and the completed task snapshot. JavaScript Auth Scripts auth run --file scripts/auth-report.js auth run --script 'async function run(ctx, admin) { const r = await admin.auth().listUsers(100); return r.users.map(u => ({ uid: u.uid, email: u.email })); }' auth run loads all Auth users first, injects them into the local JavaScript runtime as admin.auth() data, and returns structured documents, raw runtime JSON, and logs. The Auth shim supports common Admin Auth methods such as listUsers, getUser, getUserByEmail, getUserByPhoneNumber, getUsers, createUser, updateUser, deleteUser, deleteUsers, setCustomUserClaims, token helpers, and email link helpers. Options: - --file <path> reads a script from disk. - --script <text> runs an inline script. - --timeout <seconds> defaults to 15. Script mutations run against the local runtime snapshot, not Firebase. Use auth create, auth update, auth delete, auth import, or auth transfer for Firebase mutations. Run Through Selected Module module select auth run list --limit 100 run export --output build/auth-users.json run dispatches Auth actions when the selected CLI module is auth. Current CLI Gaps The GUI Auth module still has a few workflows that are not first-class CLI commands: - Auth-to-Firestore linked-user navigation. - Storage-backed profile photo upload picker. - Saved Auth query/script presets. - Persistent task history across separate CLI invocations. Source Anchors - Sources/FirestructCLIKit/AuthCommand.swift - Sources/FirestructCLIKit/FirestructCLI.swift - Sources/FirestructCore/AuthListService.swift - Sources/FirestructCore/AuthListService+Operations.swift - Tests/FirestructCLIIntegrationTests/FirestructCLIIntegrationTests.swift

Last updated on May 07, 2026

Storage CLI

Current Status Storage has a first-class CLI command group in Sources/FirestructCLIKit/StorageCommand.swift. It reuses StorageService, so emulator and production URL behavior match the macOS Storage module. Project Selection Commands use the selected project from project select unless --project <name|firebaseProjectID|uuid> is passed. If --bucket is omitted, the CLI defaults to: <firebaseProjectID>.appspot.com Live Storage requests can pass either: --authorization "Bearer <token>" --access-token <token> Commands Bucket discovery: storage buckets [--bucket fallback-bucket] Object browsing: storage list --bucket demo.appspot.com [--prefix avatars/] [--recursive] [--browser] storage list --bucket demo.appspot.com --browser --sort-by updated --descending storage inspect --bucket demo.appspot.com --path avatars/alice.png --browser adds GUI-like folder/file entries built with StorageService.browserEntries. inspect returns object metadata, preview kind, metadata rows, and the object download URL. Uploads: storage upload --bucket demo.appspot.com --file ./avatar.png --path avatars/alice.png --confirm storage upload --bucket demo.appspot.com --file ./data.json --path imports/data.json --content-type application/json --metadata '{"owner":"alice"}' --confirm storage upload-folder --bucket demo.appspot.com --folder ./avatars --target avatars --confirm Downloads: storage download --bucket demo.appspot.com --path avatars/alice.png --output ./avatar.png storage download-batch --bucket demo.appspot.com --paths avatars/a.png,avatars/b.png --output-dir ./downloads [--concurrency 4] storage zip --bucket demo.appspot.com --paths avatars/a.png,avatars/b.png --output ./selection.zip storage zip-folder --bucket demo.appspot.com --path avatars --output ./avatars.zip Mutations: storage delete --bucket demo.appspot.com --path avatars/alice.png --confirm storage delete --bucket demo.appspot.com --paths avatars/a.png,avatars/b.png --confirm storage delete-folder --bucket demo.appspot.com --path avatars --confirm storage copy --bucket demo.appspot.com --path avatars/a.png --target avatars/b.png --confirm storage move --bucket demo.appspot.com --path avatars/a.png --target archive/a.png --confirm storage copy-folder --bucket demo.appspot.com --path avatars --target avatars-copy --confirm storage move-folder --bucket demo.appspot.com --path avatars --target archive/avatars --confirm storage rename-folder --bucket demo.appspot.com --path avatars --name archived-avatars --confirm storage duplicate-folder --bucket demo.appspot.com --path avatars --confirm URL helpers: storage url --bucket demo.appspot.com --path avatars/alice.png storage signed-url --bucket demo.appspot.com --path avatars/alice.png --expires 3600 storage signed-url --bucket demo.appspot.com --path avatars/alice.png --expires 3600 --service-account-file ./service-account.json For emulator projects, signed-url returns a deterministic emulator download URL with the requested expiration. For production projects, V4 signing requires --service-account-file. Safety - Upload, delete, copy, move, folder upload, folder delete, folder copy, folder move, folder rename, and folder duplicate require --confirm. - Read-only project links reject Storage mutations. - Folder copy/move checks for nested targets and duplicate destination objects before mutating. - Object copy/move validates that source and target paths differ. - Long multi-object operations run through TaskOrchestrator and return task status, counters, duration, and errors in JSON output. Output All commands emit JSON. Long-running commands include a task object: { "status": "success", "processedOperations": 2, "totalOperations": 2, "attemptCount": 1 } Source Anchors - Sources/FirestructCLIKit/StorageCommand.swift - Sources/FirestructCLIKit/FirestructCLI.swift - Sources/FirestructCLIKit/JSONOutput.swift - Sources/FirestructCore/StorageService.swift - Tests/FirestructCLIIntegrationTests/FirestructCLIIntegrationTests.swift

Last updated on May 07, 2026

Push CLI

Current Status There is no first-class Push command group in the current CLI implementation. Push testing is available through the macOS module rather than terminal commands. This protects the current workflow from accidental sends by keeping payload editing, token resolution, environment labels, and confirmation in one interactive surface. Do not assume a push send command exists in release runbooks yet. GUI-Only Coverage Today Use the macOS Push module for: - token source configuration - token resolution - payload validation - FCM send testing - logs and per-token result inspection Before sending any notification, confirm the selected project, environment, token source, notification fields, data payload, and resolved recipient count. The GUI validates payload shape, records resolver output, and shows per-token send results so a support or QA user can distinguish token problems from FCM request failures. For automation planning, store payload JSON and token-source configuration as separate artifacts. A future CLI should validate both before send, require --confirm for live delivery, refuse read-only targets, and preserve logs that show which tokens succeeded or failed. Future CLI Shape Expected future commands: push validate --payload payload.json push resolve-tokens --source saved-source push send --payload payload.json --tokens tokens.json --confirm Source Anchors - Sources/FirestructCore/PushTestingService.swift - Sources/FirestructCore/PushTokenSourceResolverService.swift

Last updated on May 07, 2026

PITR Recovery CLI

Current Status There is no first-class PITR command group in the current CLI implementation. Point-in-time recovery is currently reviewed through the macOS module because the workflow needs careful target labeling, historical timestamp selection, current-vs-historical diffing, and guarded restore behavior. The CLI page exists to define the boundary for operators: do not expect terminal commands to load or restore historical documents yet, and do not bypass the GUI safety checks with ad hoc scripts unless your team has its own approval process. GUI-Only Coverage Today Use the macOS PITR Recovery module for: - point-in-time document loading - current vs recovered diff - historical JSON inspection - guarded restore When investigating a recovery, collect the project ID, database ID, document path, target timestamp, and environment before opening the module. Firestruct loads the current document and the historical version side by side, then shows structured JSON and diff output so the user can verify the exact fields that would change during restore. The GUI workflow is also where restore confirmation belongs. Production restore requires explicit confirmation, read-only projects must block writes, and any long-running restore should be task-backed with visible status and actionable errors. Those requirements should carry forward unchanged when CLI support is implemented. Future CLI Shape Expected future commands: pitr load --document users/alice --read-time 2026-05-03T12:00:00Z pitr diff --document users/alice --read-time 2026-05-03T12:00:00Z pitr restore --document users/alice --read-time 2026-05-03T12:00:00Z --confirm Source Anchors - Sources/FirestructCore/FirestorePITRService.swift

Last updated on May 07, 2026

Index Advisor CLI

Current Status There is no first-class Index Advisor command group in the current CLI implementation. Index diagnostics are still part of the Firestruct product model, but the CLI does not yet expose the same query-shape parser, index sync controls, or remediation actions that the macOS workspace shows. Treat this page as the operator note for automation planning: it explains what can be inspected today, which GUI workflow owns the behavior, and what a future terminal interface should preserve when index checks become scriptable. GUI-Only Coverage Today Use the macOS Index Advisor module for: - query-index error explanation - index sync and comparison - copy/open/create index remediation helpers - deterministic query shape checks When a Firestore query fails because a composite index is missing, capture the raw Firebase error message, the collection or collection-group target, every filter, every order clause, and the selected Firebase project/database. Open the same project in Firestruct, run or paste the query shape in Index Advisor, then use the table, tree, JSON, and logs output modes to compare the required index against current synced indexes. For repeatable support work, keep the query definition beside the CLI command that triggered the error. That gives future CLI implementation a clear contract: accept the same path, filters, order clauses, database ID, and optional captured error, then return deterministic evidence before offering any deploy or create action. Future CLI Shape Expected future commands: index-advisor explain --error error.json index-advisor check --collection users --where "role == admin" --order-by "createdAt desc" index-advisor sync index-advisor copy-spec --query query.json Future write-like behavior, such as creating an index or deploying an index file, must keep the same safety defaults as the app. The command should label the target project and environment, refuse read-only projects, require explicit confirmation for production changes, and route longer deploy work through the task system when execution is added. Source Anchors - Sources/FirestructCore/IndexAdvisorService.swift - Sources/FirestructCore/FirestoreIndexCreationLinkSummary.swift

Last updated on May 07, 2026

Seed Studio CLI

Current Status There is no first-class Seed Studio command group in the current CLI implementation. Seed generation and apply flows currently belong to the macOS module because users need to review generated data, snapshots, drift output, target project/database labels, and overwrite behavior before writes occur. This page documents the expected future command shape without implying that terminal seed execution exists today. GUI-Only Coverage Today Use the macOS Seed Studio module for: - schema/template editing - deterministic seed generation - snapshot review - seed apply - drift comparison The GUI workflow is the supported place to choose a deterministic seed, inspect generated Firestore document paths, compare snapshot values against current project data, and decide whether applying the seed is appropriate. That review step matters for emulator setup and is mandatory for production-like targets. When preparing future CLI automation, keep the template, deterministic seed options, expected output path, target project, target database, and confirmation requirements together. A CLI should generate and diff safely before it applies, and any apply command must expose overwrite behavior and route longer work through Tasks. Future CLI Shape Expected future commands: seed generate --template seed.json --output snapshot.json seed apply --snapshot snapshot.json --confirm seed diff --snapshot snapshot.json Source Anchors - Sources/FirestructCore/SeedStudioService.swift - Sources/FirestructCore/SeedStudioService+GenerationUtilities.swift

Last updated on May 07, 2026

Migrations CLI

Current Status There is no first-class Migrations command group in the current CLI implementation. The migration model currently lives in the macOS app and core services. The CLI does not yet read Fireway files, compare them with Firestore migration records, or execute migration hooks. Use this page as the support boundary for teams that want terminal automation later: it records the expected inputs, safety behavior, and evidence a future command should return. GUI-Only Coverage Today Use the macOS Migrations module for: - local Fireway file inspection - migration record listing - status comparison - source content review Before relying on migration status, link the local Firebase workspace in Firestruct, select the Firebase project/database, and confirm the configured migration collection. The GUI can then show local file names, remote records, applied or missing status, source text, and logs that explain parsing or Firestore read failures. If a deployment runbook needs a terminal checkpoint today, export or copy the GUI evidence into the runbook rather than assuming a CLI command exists. Keep the migration ID, source file path, selected database, environment label, and remote record state together so the future CLI can reproduce the same status table. Future CLI Shape Expected future commands: migrations list migrations show <migration-id> migrations status migrations apply <migration-id> --confirm Execution must remain guarded when CLI support is added. Migration apply should be Pro-gated, refuse read-only projects, require explicit confirmation for production, show the target project/environment, expose overwrite or rerun behavior, and run through Tasks so operators can inspect progress and failures. Source Anchors - Sources/FirestructCore/FirewayIntegrationService.swift - Sources/FirestructCore/ProjectRegistry+Migrations.swift

Last updated on May 07, 2026

Workspace Link CLI

Current Status There is no first-class Workspace Link command group in the current CLI implementation. Workspace Link is currently managed in the macOS app, where the user can select a local Firebase repo, inspect configuration files, compare local and remote state, and review deploy targets before any write-like action. The CLI page documents the desired terminal boundary without claiming those commands are available today. GUI-Only Coverage Today Use the macOS Workspace Link module for: - local Firebase workspace linking - firebase.json and .firebaserc inspection - rules/index viewing - local vs remote diffing - guarded deploy workflows Before a deploy or configuration review, confirm that the linked folder contains the expected firebase.json, .firebaserc, rules files, indexes files, and selected Firebase project alias. The GUI makes those details visible so users do not accidentally compare or deploy from the wrong checkout. For automation planning, separate read-only inspection from deploy behavior. Future workspace status and workspace diff commands can be safe by default, while deploy commands must require confirmation, show project/environment labels, respect read-only and Pro gates, and send long-running work through the task queue. Future CLI Shape Expected future commands: workspace link --path . workspace status workspace diff --rules workspace diff --indexes workspace deploy --rules --confirm workspace deploy --indexes --confirm Source Anchors - Sources/FirestructCore/WorkspaceLinkRemoteService.swift - Sources/FirestructCore/ProjectRegistry+WorkspaceServices.swift

Last updated on May 07, 2026

Support CLI

Current Status There is no Support CLI command group. Support is currently an in-app and help-center workflow, not a terminal interface. The macOS app embeds the configured Chatwoot support surface and the public help center carries module articles for users who need setup or workflow guidance. CLI users should open those resources rather than expecting commands to create tickets or chat sessions. GUI-Only Coverage Today Use the macOS Support module for Chatwoot support access. When reporting an issue, include the Firestruct version, macOS version, target Firebase project type, emulator or production environment, module name, command or UI action, relevant logs, and whether the project is read-only. For data operations, avoid sending secrets, service-account JSON, private Firebase data, or access tokens unless a secure support channel explicitly requests them. The absence of a Support CLI command keeps diagnostics gathering manual for now. That is deliberate while the product is early: users can review the contents of any logs or screenshots before sharing them with support. Future CLI Shape Support CLI coverage is optional. If added, it should focus on diagnostics bundles rather than interactive chat: support diagnostics --output firestruct-diagnostics.zip support open-ticket --subject "Issue summary" If diagnostics support is added later, it should generate a local archive first and ask the user to review it before upload. Interactive chat and account identity should remain tied to the configured support provider. Source Anchors - Sources/FirestructApp/Features/Support/

Last updated on May 07, 2026

Purchases and Pro Access CLI

Current Status There is no Purchases CLI command group and no CLI entitlement workflow. Purchases are intentionally GUI-owned today because StoreKit purchase, restore, and entitlement presentation belong in the native macOS app. The CLI can run project, Firestore, Auth, and Storage workflows, but it should not present itself as a purchase surface or a way to avoid paid feature gates. Current CLI Implication The CLI currently exposes project/module selection and Firestore query/create/update/delete. It does not yet document or enforce the full GUI StoreKit purchase flow. Before broadening CLI mutation coverage, CLI Pro enforcement should be designed explicitly so command-line automation cannot bypass GUI access rules. For internal testing, treat CLI mutation access as an implementation detail rather than a product entitlement promise. Any public automation path that creates, updates, deletes, imports, exports, transfers, uploads, deploys, runs scripts, sends push notifications, applies seeds, or applies migrations should respect the same commercial and safety boundaries shown in the app. Support conversations should direct users to the Purchases and Pro Access GUI article for plan details, restore behavior, and paywall expectations. CLI scripts can still be documented for read-only inspection and emulator-safe workflows, but the purchase decision and restore state should remain clear to the user before paid actions begin. Future CLI Shape Expected future commands: pro status pro restore StoreKit purchase itself is likely to remain GUI-native. Source Anchors - Sources/FirestructApp/Features/Purchases/Model/ProAccessState.swift - Sources/FirestructApp/Features/Purchases/Services/AppModel+Purchases.swift

Last updated on May 07, 2026