Benjamin DiedrichsenandClaude Fable 5 8973ff7113
Publish snapshot / snapshot (push) Successful in 1m17s
nopy: add create-cube command scaffolding a cube from bundled templates
Gathers id, name and directory from flags or prompts (only what the flags
do not supply), then writes manifest.mjs + deploy.py from templates under
src/templates/cube. Templates are named *.example.* so the template
directory itself can never match the loader's manifest+deploy pair rule.

The scaffold refuses a directory that already holds cube files by the
loader's own patterns, checks the id against the loaded cube set (best
effort, exempting the target directory so --force re-scaffolds work), and
warns when the target lands outside every configured cube directory.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ApuW1MMGK2pUQ9mTVRTxc5
2026-09-02 13:57:51 +02:00
2026-07-27 13:09:00 +02:00
2026-07-29 13:21:04 +02:00
2026-07-29 13:21:04 +02:00
2026-07-29 13:21:04 +02:00

ansiblings

Infrastructure tooling monorepo: two published CLIs plus the pyinfra "cubes" they deploy.

Path Package Binary What it is
packages/nopy @bitsquare/nopy nopy interactive pyinfra script management and execution
packages/keyman @bitsquare/keyman keyman SSH key management with age encryption
packages/nopy-cubes @bitsquare/nopy-cubes — the authoring surface a cube's manifest.mjs imports
packages/nopy-cubes-core @bitsquare/nopy-cubes-core — the core bundle of deployment units nopy runs
npm install -g @bitsquare/nopy @bitsquare/keyman

See each package's README for usage, and README.PUBLISH.md for how they get published.

Development

Requires Node ≥ 22 (the repo pins 24 in .nvmrc) and pnpm — the version is pinned by packageManager, so corepack enable is enough.

pnpm install
Command Does
pnpm run build compiles both packages with tsc
pnpm run typecheck tsc --build across the workspace (see below)
pnpm run lint Biome check
pnpm run lint:fix Biome check with fixes applied
pnpm test vitest, both packages
pnpm run test:coverage vitest with the coverage gate
pnpm run coverage:summary renders the last coverage run as a Markdown table

typescript is on the 7.x native compiler, so tsc is the fast one — there is no separate tsgo binary to keep in sync. typecheck is plain tsc --build, not --noEmit: once a project has references, TypeScript rejects --noEmit outright (TS6310), because a composite project has to emit the declarations its dependents read. So the typecheck writes dist as a side effect — gitignored, and it means the gate also proves the build works. Each package also has a dev-run script (pnpm --filter @bitsquare/nopy run nopy) that executes the TypeScript sources directly through tsx.

Git hooks

Installed by simple-git-hooks on pnpm install, configured in the root package.json:

  • pre-commit — Biome check with fixes, on staged files only, re-staging what it fixed. Fast; blocks only on problems it cannot fix itself.
  • pre-push — lint:ci → typecheck → test:coverage. This is the same gate CI runs, so a push that survives it will not surprise you on the runner.

Set SKIP_SIMPLE_GIT_HOOKS=1 to bypass either one; re-install them after changing the config with pnpm exec simple-git-hooks.

Coverage

Both packages hold a hard 85 % branch floor, enforced by coverage.thresholds in their vitest.config.ts rather than by a CI-only flag — pnpm run test:coverage fails the same way locally, in the pre-push hook, and on the runner. Barrel files and CLI argv wiring are excluded; everything with behaviour in it is not.

S
Description
No description provided
Readme MIT
942 KiB
2026-09-02 14:03:39 +02:00
Languages
TypeScript 83.2%
JavaScript 12%
Python 4.5%
Dockerfile 0.2%