{"_id":"@atindo23/tamo","_rev":"3-e041c96c600dbf0e98a51e9cd34b4df2","name":"@atindo23/tamo","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"@atindo23/tamo","version":"0.1.0","license":"MIT","_id":"@atindo23/tamo@0.1.0","maintainers":[{"name":"atindo23","email":"emailta.indo@gmail.com"}],"homepage":"https://github.com/athif23/tamo#readme","bugs":{"url":"https://github.com/athif23/tamo/issues"},"bin":{"tamo":"dist/cli.js"},"dist":{"shasum":"7ca26fdba1a80c5b7acb7bf6d5ab406dbe67ce7b","tarball":"https://registry.npmjs.org/@atindo23/tamo/-/tamo-0.1.0.tgz","fileCount":19,"integrity":"sha512-Qnc2m7dAkzWqX50FAl/7fg2x1CvtVp7ttEwU/9gVSUF5VnlllG/ZKnHMoJJrJzuIQ7PK8W60oLy7Jqbk023EYA==","signatures":[{"sig":"MEUCIQCviqkwT1q/j26Qjbsx5UmBQrTWTd/jYFH0XB9mAAmojwIgPCbVIOlYFmwHR+5aOIMcD7644/xlJRh7Szm76mqHgUQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":174554},"type":"module","engines":{"node":">=24.15.0"},"gitHead":"388b1e499566b6a2f87bbc6c768abb904728396a","scripts":{"lint":"oxlint --disable-nested-config src test","tamo":"node src/cli.ts","test":"node --test test/*.test.ts","build":"tsc -p tsconfig.build.json","check":"pnpm typecheck && pnpm lint && pnpm format:check && pnpm test","format":"oxfmt --write src/*.ts src/handlers/*.ts test/*.ts","prepack":"pnpm build","prepare":"effect-tsgo patch --no-typescript --oxlint","typecheck":"tsc --noEmit","format:check":"oxfmt --check src/*.ts src/handlers/*.ts test/*.ts","test:integration":"node test/integration.ts","test:smoke-shadcn":"node test/shadcn-smoke.ts","test:smoke-shadcn-create":"node test/shadcn-create-smoke.ts"},"_npmUser":{"name":"atindo23","email":"emailta.indo@gmail.com"},"repository":{"url":"git+https://github.com/athif23/tamo.git","type":"git"},"_npmVersion":"11.16.0","description":"Tamo remembers reusable project setup so developers and coding agents do not have to repeatedly reconstruct the same setup decisions.","directories":{},"_nodeVersion":"24.18.1","dependencies":{"effect":"4.0.0-rc.112","jsonc-parser":"3.3.1","@effect/platform-node":"4.0.0-rc.112"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.11.0","devDependencies":{"oxfmt":"^0.66.0","oxlint":"1.80.0","typescript":"^5.9.2","@types/node":"^24.0.0","@effect/tsgo":"0.38.0","@oxlint/plugins":"1.80.0","oxlint-tsgolint":"7.0.2001","oxlint-plugin-complexity":"^2.1.8"},"_npmOperationalInternal":{"tmp":"tmp/tamo_0.1.0_1788869950723_0.17749421748357208","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@atindo23/tamo","version":"0.2.0","license":"MIT","_id":"@atindo23/tamo@0.2.0","maintainers":[{"name":"atindo23","email":"emailta.indo@gmail.com"}],"homepage":"https://github.com/athif23/tamo#readme","bugs":{"url":"https://github.com/athif23/tamo/issues"},"bin":{"tamo":"dist/cli.js"},"dist":{"shasum":"723fe454f199e1359628675c5f15436044fd48c8","tarball":"https://registry.npmjs.org/@atindo23/tamo/-/tamo-0.2.0.tgz","fileCount":19,"integrity":"sha512-2h3uU+oF1OAHcb8cVfL9gzrfOo3hGKXoYlZrodpOsTKoZtFvvwyP2YwmgIeBGk3ocCbWdrsBq9d3Luu9pbYrPw==","signatures":[{"sig":"MEUCIGNEns9HkjaBR8AIPIOJ+M2hDnT9j6aataQlT63P9bA7AiEAotttWKSsJmQxJrvIDN/wEgrOh6eF1bEVg/mN7RbR82E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":186941},"type":"module","engines":{"node":">=24.15.0"},"gitHead":"f34dbac4090f4161e54e46dcc6a0561f7268f57d","scripts":{"lint":"oxlint --disable-nested-config src test","tamo":"node src/cli.ts","test":"node --test test/*.test.ts","build":"tsc -p tsconfig.build.json","check":"pnpm typecheck && pnpm lint && pnpm format:check && pnpm test","format":"oxfmt --write src/*.ts src/handlers/*.ts test/*.ts","prepack":"pnpm build","prepare":"effect-tsgo patch --no-typescript --oxlint","typecheck":"tsc --noEmit","format:check":"oxfmt --check src/*.ts src/handlers/*.ts test/*.ts","test:integration":"node test/integration.ts","test:smoke-shadcn":"node test/shadcn-smoke.ts","test:smoke-shadcn-create":"node test/shadcn-create-smoke.ts"},"_npmUser":{"name":"atindo23","email":"emailta.indo@gmail.com"},"repository":{"url":"git+https://github.com/athif23/tamo.git","type":"git"},"_npmVersion":"11.16.0","description":"Tamo remembers reusable project setup so developers and coding agents do not have to repeatedly reconstruct the same setup decisions.","directories":{},"_nodeVersion":"24.18.1","dependencies":{"effect":"4.0.0-rc.112","jsonc-parser":"3.3.1","@effect/platform-node":"4.0.0-rc.112"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.11.0","devDependencies":{"oxfmt":"^0.66.0","oxlint":"1.80.0","typescript":"^5.9.2","@types/node":"^24.0.0","@effect/tsgo":"0.38.0","@oxlint/plugins":"1.80.0","oxlint-tsgolint":"7.0.2001","oxlint-plugin-complexity":"^2.1.8"},"_npmOperationalInternal":{"tmp":"tmp/tamo_0.2.0_1788969312902_0.3873784593093925","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"_id":"@atindo23/tamo@0.3.0","bin":{"tamo":"dist/cli.js"},"bugs":{"url":"https://github.com/athif23/tamo/issues"},"dist":{"shasum":"5d8e1846180fc5d6ad658a7691546e4bbbc4fcf1","tarball":"https://registry.npmjs.org/@atindo23/tamo/-/tamo-0.3.0.tgz","fileCount":23,"integrity":"sha512-IBD5fY4bbLmuSbZme0NoL3h2PUP/Vc6wnajwZsIYL/noINRpyxo9nHQAvNV9Tbzq0/sISTClUyfzWeFLXHq9MA==","signatures":[{"sig":"MEUCIQCzvdlD+8jjjb5pv/ePqp7RwO95Ps964aomdMGgOao7wAIgb0fceK7ao4k+V41+4MomUZBBLmgc3rptkA8QarWLpQA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDOOeAhmjWaMIg5lEqBuit2MtloYEpctaK30m1TzENW6QIhAIE9foi8n1Cri2P4hc4eARsi3vAwZvny368vlG6JqfpB"}],"unpackedSize":280794},"name":"@atindo23/tamo","type":"module","_from":"file:atindo23-tamo-0.3.0.tgz","engines":{"node":">=24.15.0"},"license":"MIT","scripts":{"lint":"oxlint --disable-nested-config src test","tamo":"node src/cli.ts","test":"node --test test/*.test.ts","build":"tsc -p tsconfig.build.json","check":"pnpm typecheck && pnpm lint && pnpm format:check && pnpm test","format":"oxfmt --write src/*.ts src/handlers/*.ts test/*.ts","typecheck":"tsc --noEmit","format:check":"oxfmt --check src/*.ts src/handlers/*.ts test/*.ts","test:package":"node test/package-gate.ts","check:release":"pnpm check && pnpm test:integration && pnpm test:package","test:integration":"node test/integration.ts","test:smoke-shadcn":"node test/shadcn-smoke.ts","test:smoke-shadcn-create":"node test/shadcn-create-smoke.ts"},"version":"0.3.0","_npmUser":{"name":"atindo23","email":"emailta.indo@gmail.com"},"homepage":"https://github.com/athif23/tamo#readme","_resolved":"C:\\Users\\advan\\AppData\\Local\\Temp\\6e493cc568bab6baf03dd51e862e37af\\atindo23-tamo-0.3.0.tgz","_integrity":"sha512-IBD5fY4bbLmuSbZme0NoL3h2PUP/Vc6wnajwZsIYL/noINRpyxo9nHQAvNV9Tbzq0/sISTClUyfzWeFLXHq9MA==","repository":{"url":"git+https://github.com/athif23/tamo.git","type":"git"},"_npmVersion":"10.2.3","description":"`tamo` remembers reusable project setup so you do not have to rebuild or re-explain the same setup every time.","directories":{},"maintainers":[{"name":"atindo23","email":"emailta.indo@gmail.com"}],"_nodeVersion":"24.15.0","dependencies":{"yaml":"^2.9.0","effect":"4.0.0-rc.112","jsonc-parser":"3.3.1","@effect/platform-node":"4.0.0-rc.112","@effect/platform-node-shared":"4.0.0-rc.112"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.66.0","oxlint":"1.80.0","typescript":"^5.9.2","@types/node":"^24.0.0","@effect/tsgo":"0.38.0","@oxlint/plugins":"1.80.0","oxlint-tsgolint":"7.0.2001","oxlint-plugin-complexity":"^2.1.8"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/tamo_0.3.0_1789715111855_0.14891147258646908"}}},"time":{"created":"2026-09-08T12:19:10.532Z","modified":"2026-09-18T07:05:12.211Z","0.1.0":"2026-09-08T12:19:10.850Z","0.2.0":"2026-09-09T15:55:13.036Z","0.3.0":"2026-09-18T07:05:12.064Z"},"bugs":{"url":"https://github.com/athif23/tamo/issues"},"license":"MIT","homepage":"https://github.com/athif23/tamo#readme","repository":{"url":"git+https://github.com/athif23/tamo.git","type":"git"},"description":"`tamo` remembers reusable project setup so you do not have to rebuild or re-explain the same setup every time.","maintainers":[{"name":"atindo23","email":"emailta.indo@gmail.com"}],"readme":"# tamo\n\n`tamo` remembers reusable project setup so you do not have to rebuild or re-explain the same setup every time.\n\nIt helps set up ordinary projects without taking ownership of them. Native project files stay authoritative, and the project does not depend on `tamo` afterward.\n\n<video src=\"https://github.com/user-attachments/assets/7aedaa4d-2a8e-4f86-87b2-d881f18960ea\" controls muted loop playsinline width=\"880\"></video>\n\n## Install\n\n### CLI\n\n```sh\nnpm install -g @atindo23/tamo\ntamo --help\n```\n\n### Agent skill\n\nThe coding-agent skill teaches compatible agents how to discover, save, and reuse Recipes with `tamo`.\n\n```sh\nnpx skills add athif23/tamo --skill tamo      # project-level\nnpx skills add athif23/tamo --skill tamo -g   # global\n```\n\nInstalling the skill does not install the CLI itself.\n\n## Quick start\n\n### With an agent\n\nOnce the skill is installed, you can describe what you want without naming a Recipe first:\n\n> create a web app using TanStack Start, TypeScript, Tailwind, and shadcn\n\nThe agent can discover matching saved Recipes before rebuilding the same setup.\n\nWhen you want to keep a setup for later:\n\n> i like this setup, save it with tamo\n\nThe agent can curate the reusable parts into a Recipe while leaving the source project untouched.\n\n### Create from a Recipe\n\n```sh\ntamo create my-app --recipe web --dry-run\n```\n\nReview the plan, then apply it:\n\n```sh\ntamo create my-app --recipe web --yes\n```\n\n### Save reusable setup\n\n```sh\ntamo pack web --cwd ./my-project \\\n  --include tsconfig.json \\\n  --include src/styles.css \\\n  --dry-run\n```\n\nThen save it:\n\n```sh\ntamo pack web --cwd ./my-project \\\n  --include tsconfig.json \\\n  --include src/styles.css \\\n  --yes\n```\n\n### Add setup to an existing project\n\n```sh\ntamo add lint --cwd ./my-project --dry-run\n```\n\n### Inspect a project\n\n```sh\ntamo inspect --cwd ./my-project\n```\n\n`inspect` walks nested directories too, so a repository containing several apps or services reports the setup artifacts at their own paths — `apps/web/vite.config.ts`, `apps/desktop/Cargo.toml`, `services/api/pyproject.toml` — without classifying the repository as any particular kind of project.\n\nEvery mutating command supports `--dry-run`, so you can review what `tamo` plans to do before anything changes.\n\n## Why tamo\n\nProject setup is repetitive. The same framework choices, TypeScript settings, lint rules, UI setup, test tooling, and directory conventions often get rebuilt or re-explained from project to project.\n\n`tamo` lets those decisions live as reusable Recipes.\n\nThe key idea is:\n\n> Reusable setup without tool ownership.\n\nA Recipe can be used to create a new project or reconciled into an existing one. The result stays an ordinary project with ordinary native files.\n\n### Templates\n\nTemplates and starter repos are useful when you want to copy a known starting point.\n\n```text\ntemplate\n  ↓ copy / render\nnew project\n```\n\nA Recipe is different. It represents reusable setup that can be planned against the project that already exists.\n\n```text\nRecipe\n  ↓ plan + reconcile\nnew or existing project\n```\n\nRecipes can also compose. Where `tamo` understands the artifact type, compatible contributions combine and incompatible intent blocks instead of silently picking a winner.\n\nA template is still the simpler choice when a fixed copied starting point is exactly what you want.\n\n### Projen\n\nProjen-style generators keep a generator definition as the source of truth and generate project files from it.\n\n```text\ngenerator definition\n        ↓\ngenerated project files\n```\n\n`tamo` deliberately keeps the native project files as the source of truth.\n\n```text\nnative project files\n        ↕\n   reusable Recipe\n        ↓\nnative project files\n```\n\n`tamo` applies setup when asked, then gets out of the way. It does not continuously own or regenerate the project afterward.\n\nUse a generator when you want centralized ownership of project configuration. Use `tamo` when you want reusable setup without handing ownership of the project to the setup tool.\n\nCoding agents are one useful way to drive `tamo`, but they are not required. The CLI works on its own.\n\n## Recipes\n\nA Recipe is reusable setup expressed through ordinary native project files plus a small amount of composition metadata.\n\nRecipes live under the `tamo` home directory, which defaults to `~/.tamo` and can be changed with `TAMO_HOME`.\n\n```text\n~/.tamo/\n  recipes/\n    web/\n      recipe.json\n      behavior.mjs        # optional default behavior entrypoint\n      artifacts/\n        package.json\n        tsconfig.json\n        ...\n```\n\n### Artifacts\n\n`artifacts/` contains ordinary native project files. These are the files the underlying tools already understand, such as `package.json`, `tsconfig.json`, `components.json`, `Cargo.toml`, or any tool-specific config.\n\nThe project itself does not get a project-level `tamo.json`.\n\n### recipe.json\n\n`recipe.json` contains Recipe composition metadata, such as included Recipes, persistent customizations, and an optional Behavior entrypoint.\n\nExample:\n\n```json\n{\n  \"includes\": [\n    { \"recipe\": \"typescript\" },\n    { \"recipe\": \"lint\" }\n  ]\n}\n```\n\nA Recipe may also choose a custom relative `.mjs` Behavior entrypoint:\n\n```json\n{\n  \"behavior\": \"scripts/setup.mjs\"\n}\n```\n\nIf no explicit path is configured, `behavior.mjs` is the zero-config default.\n\n### Behavior\n\nBehavior is optional trusted local JavaScript for procedural setup that native files alone cannot express, such as running an upstream initializer.\n\nMost Recipes do not need it.\n\nBehavior can participate around artifact application through three hooks:\n\n```text\nprepare\n  ↓\napply artifacts\n  ↓\nfinalize\n  ↓\nverify\n```\n\nBehavior is trusted executable code and is not currently sandboxed.\n\n## Commands\n\nRun `tamo <command> --help` for exact flags.\n\n### pack\n\n`pack` saves selected native artifacts from an existing directory as a Recipe.\n\n```sh\ntamo pack web --cwd ./my-project \\\n  --include tsconfig.json \\\n  --include src \\\n  --dry-run\n```\n\nA root `package.json`, when present, is captured with package-manifest semantics. Nested manifests selected via `--include` keep their own `name` and `version`.\n\n`pack` is package-manager agnostic: any valid `package.json` is packable regardless of the `packageManager` field or lockfiles present.\n\nA `package.json` is optional. A directory without one can be packed from `--include` artifacts alone — `pack` never synthesizes one — and at least one artifact is required.\n\nThe root source `name` and `version` are not treated as reusable setup. `packageManager` is preserved when present and is never invented.\n\nSecrets, private keys, lockfiles, caches, dependency directories, generated output, and symlinked source state are not captured. Naming one directly with `--include` is blocked rather than quietly capturing nothing.\n\n`--include` of a directory expands it recursively, and that expansion skips known dependency, generated, cache, and VCS state at any depth (`node_modules`, `dist`, `build`, `target`, `__pycache__`, virtualenvs, tool caches, `.git`, and the rest of the same list). A project that has already been installed and built therefore packs without deleting anything first:\n\n```sh\ntamo pack web --cwd ./my-project \\\n  --include apps \\\n  --include packages \\\n  --include services\n```\n\nThe source project is never modified.\n\nRepacking over an existing Recipe requires `--force`.\n\n### create\n\n`create` applies a Recipe to a new project.\n\n```sh\ntamo create my-app --recipe web --dry-run\n```\n\nReview the plan, then apply it, or materialize the files without installing:\n\n```sh\ntamo create my-app --recipe web --no-install --yes\n```\n\nNative artifacts are written to their normal relative paths. A root `package.json` takes the new target directory's package name and plans a visible install by default; the manager comes from its `packageManager` field (pnpm, npm, yarn, or bun; pnpm when the field is absent). Nested manifests keep their own names and never trigger installs, and known workspace membership never triggers installs either. An unmatched nested manifest does not install either, and absence of membership never marks it independent. Tamo runs the root package manager once; that manager determines its own workspace behavior — tamo does not promise the root install covers any specific member. A Recipe with no root `package.json` creates without any install step. `--no-install` skips the automatic install while still creating and verifying the files.\n\nTargets that already exist and are non-empty are blocked instead of overwritten.\n\nThe resulting project contains no `tamo` metadata.\n\n### add\n\n`add` reconciles a Recipe with an existing project.\n\n```sh\ntamo add lint --cwd ./my-project --dry-run\n```\n\nCompatible state is preserved or combined, identical state becomes a no-op, missing state is added, and conflicting intent blocks instead of silently overwriting existing setup.\n\nRerunning a settled Recipe is idempotent.\n\n### inspect\n\n`inspect` reports setup detected in an existing project and does not modify it.\n\n```sh\ntamo inspect --cwd ./my-project\n```\n\nIt reports root package facts plus a recursive inventory of setup artifacts — each at its project-relative path, with the handler that understands it or `whole-file` for artifacts carried with conservative whole-file semantics. `package.json` artifacts use `package-manifest` composition semantics at any nested path:\n\n```sh\ntamo inspect --cwd ./my-monorepo\n```\n\n```text\nNode project (pnpm@10.11.0) in C:\\my-monorepo\nArtifacts:\n  apps/desktop/Cargo.toml (whole-file)\n  apps/desktop/rustfmt.toml (whole-file)\n  apps/web/components.json (whole-file)\n  apps/web/package.json (package-manifest)\n  apps/web/vite.config.ts (whole-file)\n  package.json (package-manifest)\n  pnpm-workspace.yaml (whole-file)\n  services/api/pyproject.toml (whole-file)\nWorkspace memberships:\n  apps/web/package.json <- pnpm-workspace.yaml\n```\n\nNested setup is visible without the repository being classified: `inspect` never reports a project type, ecosystem, or language, and artifacts that cluster under `apps/web` or `services/api` stay plain paths. Known workspace membership links a nested manifest to the root declaration that proves it; absence of a fact means no known membership, never independence, and membership alone never triggers installation. Dependency, build, cache, and VCS trees are skipped, links are never followed, and ordinary source files are not listed.\n\nFor machine-readable output:\n\n```sh\ntamo inspect --cwd ./my-monorepo --json\n```\n\nEach artifact is one `{ path, handler }` entry (abridged here):\n\n```json\n{\n  \"inspection\": {\n    \"artifacts\": [\n      { \"path\": \"apps/web/vite.config.ts\", \"handler\": null },\n      { \"path\": \"apps/web/package.json\", \"handler\": \"package-manifest\" },\n      { \"path\": \"package.json\", \"handler\": \"package-manifest\" }\n    ],\n    \"workspaceMemberships\": [\n      { \"member\": \"apps/web/package.json\", \"declaredBy\": \"pnpm-workspace.yaml\" }\n    ]\n  }\n}\n```\n\nA `null` handler is not missing data: it means Core's conservative whole-file fallback owns that artifact. Anything not listed can still be selected explicitly for `pack` with `--include`.\n\n### recipe\n\n`recipe` reads and maintains the Recipes saved under the `tamo` home. `list` and `inspect` are read-only discovery; `edit` changes what one Recipe stores.\n\n```sh\ntamo recipe list\ntamo recipe list --json\n\ntamo recipe inspect web\ntamo recipe inspect web --json\n```\n\n`recipe list` reports which Recipes exist, sorted by name, with a lightweight artifact count, their includes, and their Behavior entrypoint. A malformed Recipe is reported in place with its error instead of blocking the others.\n\n`recipe inspect <name>` reports what one Recipe contains: includes, persistent customizations, its Behavior entrypoint, artifact paths, and the handler claiming each path. Paths are listed as stored, so nested artifacts appear as `apps/web/components.json`. Includes are named, not expanded.\n\nNeither `list` nor `inspect` resolves a Recipe against a project, executes Behavior, ranks Recipes, or classifies them by ecosystem.\n\n### recipe edit\n\n`recipe edit` changes the artifacts a saved Recipe stores.\n\n```sh\ntamo recipe edit web --remove apps/desktop --dry-run\ntamo recipe edit web --cwd . --add biome.json --dry-run\ntamo recipe edit web --cwd . --replace vite.config.ts --dry-run\n```\n\n`--add` captures a path from `--cwd` — a file, or a directory that expands into the files beneath it — and stores it at the same relative path. Adding over a differing artifact is a conflict, not an overwrite. `--replace` swaps the Recipe's own stored artifact at that path; replacing something the Recipe does not store is a conflict, not an implicit add. `--remove` deletes one stored artifact, or every stored artifact beneath a path prefix, so removing a whole area is one command. A `--remove` path that matches nothing is a conflict rather than a silent success.\n\nCapture follows the same rules as `pack`: secrets, keys, lockfiles, caches, dependency directories, generated output, and symlinks are never captured; a root `package.json` keeps package-manifest semantics (source `name` and `version` stripped, `packageManager` preserved and never invented) while nested manifests keep their own `name` and `version`; and the source project is never modified.\n\nEvery change is planned and validated before anything is written, so conflicting or overlapping requests leave the Recipe untouched. The result is re-loaded through the same Recipe loader `recipe inspect` uses.\n\n> Editing a Recipe changes reusable future setup only. Projects previously created from that Recipe are never touched, and an included Recipe is never edited through it.\n\nArtifacts contributed by an included Recipe cannot be edited from the parent: the conflict names the owning Recipe. Includes, persistent customizations, Behavior entrypoints, and an artifact's contents are not editable here.\n\n## Safety\n\n`behavior.mjs` and custom Behavior entrypoints are trusted local executable JavaScript. They run during planning, before confirmation.\n\nReview untrusted Recipes before using them.\n\nOther safety properties:\n\n- reviewed inputs are fingerprinted and rechecked before execution\n- changed inputs invalidate the reviewed plan\n- conflicts produce zero operations instead of partial writes\n- secrets, keys, lockfiles, generated output, and symlinked source state are never captured\n- mutating commands support `--dry-run`\n- external commands can still partially change state\n- there is currently no automatic rollback\n\nIf execution fails after some operations have completed, `tamo` reports completed and remaining work so the project can be replanned before retrying.\n\n## Limitations\n\n- `tamo` can carry arbitrary native artifacts. Rich semantic handling exists for `package.json` at any nested path and for Oxlint config at the repository root. Other artifacts, including `Cargo.toml` and `pyproject.toml`, are carried with conservative whole-file semantics.\n- `tamo pack` can save selected artifacts from any directory. A root `package.json` is captured when present but is not required.\n- `tamo create` plans dependency installation only when the Recipe contributes a root `package.json`. The manager comes from that manifest's `packageManager` field (pnpm, npm, yarn, or bun; pnpm when absent), and `--no-install` skips it. Nested manifests and known workspace membership never trigger installs.\n- `tamo inspect` discovers setup artifacts recursively and reports known workspace membership as facts only; `pack` still captures a root `package.json` plus explicit `--include` paths. This is not full monorepo support: per-member or filtered installs, scoped whole-subtree packing, automatic whole-repository packing, and nested package rename policies are not implemented. The single root install's workspace behavior is delegated to the package manager, and no install-coverage model is planned. Nested names are preserved, never reconciled.\n- `tamo recipe edit` adds, replaces, and removes a Recipe's stored artifacts. Editing an artifact's contents, includes, persistent customizations, or Behavior is not implemented.\n- Native integration has primarily been exercised on Windows x64.\n- Behavior is trusted local code and is not sandboxed.\n- There is no automatic rollback after partial execution failures.\n\n## Development\n\nRequires Node.js 24.15+ and pnpm.\n\n```sh\npnpm install\npnpm check\npnpm format\npnpm test:integration\n```\n\nTo run the CLI directly from source:\n\n```sh\npnpm install\nnode src/cli.ts --help\n```\n\nSee [SPEC.md](SPEC.md) for the full contract and [PARKING_LOT.md](PARKING_LOT.md) for deferred work.\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n","readmeFilename":"README.md"}