@firenet-designs/fnd-cli
v2.4.0
Published
A new CLI generated with oclif
Readme
fnd
A new CLI generated with oclif
Usage
$ npm install -g @firenet-designs/fnd-cli
$ fnd COMMAND
running command...
$ fnd (--version)
@firenet-designs/fnd-cli/2.4.0 linux-x64 node-v24.18.0
$ fnd --help [COMMAND]
USAGE
$ fnd COMMAND
...Commands
fnd backfill-project [SHOP]fnd create-appfnd create-project [SHOP]fnd help [COMMAND]fnd tokenfnd workspacefnd workspace cleanup
fnd backfill-project [SHOP]
Backfill missing scaffold files in an EXISTING repo + theme: .gitignore, .shopifyignore, CLAUDE.md. Each is created only if absent — existing files are left untouched. Does NOT git init, pull the theme, commit, or touch GitHub.
USAGE
$ fnd backfill-project [SHOP...]
ARGUMENTS
[SHOP...] Shopify store handle, passed to Claude as a hint
DESCRIPTION
Backfill missing scaffold files in an EXISTING repo + theme: .gitignore, .shopifyignore, CLAUDE.md. Each is created
only if absent — existing files are left untouched. Does NOT git init, pull the theme, commit, or touch GitHub.
Requires the claude CLI (npm install -g @anthropic-ai/claude-code) for the CLAUDE.md step.
EXAMPLES
$ fnd backfill-project
$ fnd backfill-project my-store
$ fnd backfill-project my-store "extra hints"See code: src/commands/backfill-project.ts
fnd create-app
sets up a preconfigued vite app directory on for a shopify theme
USAGE
$ fnd create-app [-d <value>] [-s]
FLAGS
-d, --dir=<value> [default: src] directory to create the vite app in
-s, --skip-check skips the checking of the parent directory for a shopify theme
DESCRIPTION
sets up a preconfigued vite app directory on for a shopify theme
EXAMPLES
$ fnd create-appSee code: src/commands/create-app.ts
fnd create-project [SHOP]
Scaffold a new client project: git on branch production, ignore files, Shopify theme pull, a Claude-generated CLAUDE.md, then a private GitHub repo under the FireNet-Designs org.
USAGE
$ fnd create-project [SHOP...]
ARGUMENTS
[SHOP...] Shopify store handle — pulls the live theme from <shop>.myshopify.com (omit to skip)
DESCRIPTION
Scaffold a new client project: git on branch production, ignore files, Shopify theme pull, a Claude-generated
CLAUDE.md, then a private GitHub repo under the FireNet-Designs org.
Requires the claude CLI (npm install -g @anthropic-ai/claude-code) for the CLAUDE.md step.
GitHub auth comes from YOUR environment — run `gh auth login` once, or export GH_TOKEN in your shell profile. This CLI
never stores credentials. Override the org with FND_GH_ORG.
EXAMPLES
$ fnd create-project
$ fnd create-project my-store
$ fnd create-project my-store "Acme storefront, Klaviyo"See code: src/commands/create-project.ts
fnd help [COMMAND]
Display help for fnd.
USAGE
$ fnd help [COMMAND...] [-n]
ARGUMENTS
[COMMAND...] Command to show help for.
FLAGS
-n, --nested-commands Include all nested commands in the output.
DESCRIPTION
Display help for fnd.See code: @oclif/plugin-help
fnd token
Mint an offline Shopify Admin API access token (shpat_) for a custom app via the OAuth authorization-code grant. Works cross-org, unlike client_credentials.
USAGE
$ fnd token [-i <value>] [-c <value>] [--no-open] [-p <value>] [--scopes <value>] [-s <value>] [-w
<value>]
FLAGS
-c, --client-secret=<value> app Client secret (shpss_...)
-i, --client-id=<value> app Client ID
-p, --port=<value> [default: 3456] local callback port (must match the app redirect URL)
-s, --store=<value> store domain (mystore or mystore.myshopify.com)
-w, --write=<value> path to an .mcp.json whose 'shopify' server should be rewritten to use the token
--no-open don't auto-open the authorize URL in a browser
--scopes=<value> [default: read_products] comma-separated Admin API scopes to request
DESCRIPTION
Mint an offline Shopify Admin API access token (shpat_) for a custom app via the OAuth authorization-code grant. Works
cross-org, unlike client_credentials.
EXAMPLES
$ fnd token --store trafalgar-store --client-id 0b42... --client-secret shpss_...
$ fnd token -s mystore -i <id> -c <secret> --scopes read_products,read_orders
$ fnd token -s mystore -i <id> -c <secret> --write ./.mcp.jsonSee code: src/commands/token.ts
fnd workspace
Open a remote workspace: two-way sync the current directory to a remote Linux box with Mutagen and drop into a shell there, tearing the sync down on exit.
USAGE
$ fnd workspace --ssh <value> [--delete-remote-dir] [--devtools <value>] [--ignore-vcs] [--remote-base
<value>] [--rpc <value>] [--source remote|local]
FLAGS
--delete-remote-dir
on exit, delete the remote workspace directory instead of leaving the synced copy in place
--devtools=<value>
expose your LOCAL browser to Claude on the remote via the chrome-devtools MCP. Value is "port" (same port both ends)
or "remote:local" (local = this machine, where the browser runs). Your browser must already be listening with
--remote-debugging-port=<local>.
--ignore-vcs
don't sync paths matched by the project's .gitignore files (node_modules, build output, …) so each side keeps its
own platform-specific artifacts. Every .gitignore in the tree is honoured relative to its directory, like git does.
The .git directory itself still syncs, so the remote stays a working repo.
--remote-base=<value>
[default: /home/fnd] base dir on the remote; the workspace lands at <base>/<local-user>/<dir-name>
--rpc=<value>
expose a run_local_command MCP tool to Claude on the remote that executes commands back on THIS machine (the one
running fnd workspace). Value is
port=<port|remote:local>[,profile=<true|1|false|0>][,shell=<bash|batch|powershell|sh|zsh>] — port opens a reverse
tunnel (ssh -R <remote>:localhost:<local>) to a command server started here; shell defaults to the shell fnd
workspace was called from; profile (default true) controls whether the shell loads its startup files — with it on,
POSIX shells run interactively (-i) so rc files like ~/.bashrc or ~/.zshrc are sourced and tools such as nvm work.
--source=<option>
which side wins on conflict: "remote" = this server (where the workspace shell runs), "local" = the machine you ran
fnd workspace from. Omit to flag conflicts instead of auto-resolving them.
<options: remote|local>
--ssh=<value>
(required) remote to connect to, as user@host
DESCRIPTION
Open a remote workspace: two-way sync the current directory to a remote Linux box with Mutagen and drop into a shell
there, tearing the sync down on exit.
Both sides keep a real copy on local disk and only deltas cross the network, so the remote reads files at native
speed. Conflicting edits on both ends are flagged rather than silently overwritten; pass --source to auto-resolve them
in favour of one side. Mutagen connects the normal direction (this machine → remote over SSH) and auto-deploys its
agent to the remote, so no local SSH server, reverse tunnel, or authorized_keys trust is required. You need the
Mutagen CLI installed on THIS machine.
EXAMPLES
$ fnd workspace --ssh [email protected]
$ fnd workspace --ssh user@host --source local
$ fnd workspace --ssh user@host --remote-base /home/fnd
$ fnd workspace --ssh user@host --ignore-vcs
$ fnd workspace --ssh user@host --devtools 9222
$ fnd workspace --ssh user@host --devtools 9333:9222
$ fnd workspace --ssh user@host --rpc port=7777:7700
$ fnd workspace --ssh user@host --rpc port=7777:7700,profile=false,shell=zsh
$ fnd workspace --ssh user@host --delete-remote-dirSee code: src/commands/workspace/index.ts
fnd workspace cleanup
Tear down a leftover workspace — use this if a workspace session dropped before it could clean up after itself.
USAGE
$ fnd workspace cleanup --ssh <value> [--delete-remote-dir] [--devtools] [--remote-base <value>] [--remote-dir
<value>] [--rpc]
FLAGS
--delete-remote-dir also delete the remote workspace directory (by default the synced files are left in place)
--devtools also strip the chrome-devtools MCP entry from the remote (only if the dropped session used
--devtools)
--remote-base=<value> [default: /home/fnd] base dir on the remote, used to derive the default remote directory path
--remote-dir=<value> exact remote directory to target (defaults to the current dir mapping)
--rpc also strip the local-shell MCP entry from the remote (only if the dropped session used --rpc)
--ssh=<value> (required) remote to connect to, as user@host
DESCRIPTION
Tear down a leftover workspace — use this if a `workspace` session dropped before it could clean up after itself.
Terminates any Mutagen sync sessions this machine started for the directory. Pass --devtools or --rpc to also strip
the matching MCP entries from the remote (only do this if the dropped session used those flags). With no --remote-dir,
it targets the same path `workspace` would use for the current directory. The synced files themselves are left in
place unless you pass --delete-remote-dir.
EXAMPLES
$ fnd workspace cleanup --ssh user@host
$ fnd workspace cleanup --ssh user@host --remote-dir /home/fnd/cole/fnd-cli
$ fnd workspace cleanup --ssh user@host --devtools
$ fnd workspace cleanup --ssh user@host --rpc
$ fnd workspace cleanup --ssh user@host --delete-remote-dirSee code: src/commands/workspace/cleanup.ts
