ax-check.com
by Gauge
W
Worclaude
worclaude.com
ax-check.com
Checked 18 September 2026
D
29/100
Agents haven’t verified setup
Agents hit a login wall before finding real pricing info.
No pricing page was reachable; homepage only hints at per-question costs and monthly limits. Only 1 of 3 agent sessions completed and reasoned about pricing at all.
4 fixes to start with
Concrete changes, backed by what we found.
Recorded coding sessions
Same task, 3 models, no worclaude.com account. Recorded 18 September 2026 on Pi.
3 recorded · 5m 33s
5m 33s · recorded
Session findings
Select a finding to see it in context.
›Thinking…
The user wants me to build a simple example using "Worclaude". Let me first understand what "Worclaude" is. This sounds like it might be "Worqclaude" or something. Let me check the environment and see what's available.
Actually, "Worclaude" might be a product. Let me search for it. I should check if there's an SDK or API available.
Let me first explore the current directory and check available tools/environment.
✓$ pwd && ls -la && echo "---ENV---" && env | grep -i -E "wor|claude|anthropic|api" | sed 's/=.*/=<redacted-check>/' | sort✓└{"content":[{"text":"/sandbox/repo\ntotal 16\ndrwxr-xr-x 3 root root 4096 Sep 18 08:00 .\ndrwxr-xr-x 7 root root 4096 Sep 18 21:55 ..\ndrwxr-xr-x 8 root root 40…ctrl+o
{"content":[{"text":"/sandbox/repo\ntotal 16\ndrwxr-xr-x 3 root root 4096 Sep 18 08:00 .\ndrwxr-xr-x 7 root root 4096 Sep 18 21:55 ..\ndrwxr-xr-x 8 root root 4096 Sep 18 08:00 .git\n-rw-r--r-- 1 root root 408 Sep 18 08:00 .gitignore\n---ENV---\nALG_INFERENCE_MODEL=<redacted-check>\nALG_INFERENCE_PROVIDER=<redacted-check>\nPI_GATEWAY_API_KEY=<redacted-check>\nPI_MODEL=<redacted-check>\nPI_PROVIDER=<redacted-check>\n","type":"text"}]}✓$ which worclaude worqclaude 2>/dev/null; npm ls -g 2>/dev/null | grep -i -E "wor|claude" ; pip list 2>/dev/null | grep -i -E "wor|claude" ; ls /usr/local/lib/node_modules 2>/dev/null✓└{"content":[{"text":"├── @anthropic-ai/claude-code@2.1.219\n├── @earendil-works/pi-coding-agent@0.84.2\nclaude-agent-sdk 0.2.139\nll…ctrl+o
{"content":[{"text":"├── @anthropic-ai/claude-code@2.1.219\n├── @earendil-works/pi-coding-agent@0.84.2\nclaude-agent-sdk 0.2.139\nllama-index-workflows 2.23.3\nnetworkx 3.6.1\n@anthropic-ai\n@earendil-works\n@openai\ncorepack\nnpm\n","type":"text"}]}›Thinking…
Let me figure out what "Worclaude" is. It might be "WorkClaude" - actually there's a product called "WorkClaude"? Or "Worqclaude"? Let me search the web... I can't directly search the web, but I can check npm registry or pip.
Actually, "Worclaude" might be a typo for "WorkClaude" or "WorqClaude". Let me search npm and pip.
✓$ npm view worclaude 2>&1 | head -40; echo "==="; npm search worclaude 2>&1 | head -20; echo "===WORQ==="; npm search worqclaude 2>&1 | head -20✓└{"content":[{"text":"\nworclaude@2.10.5 | MIT | deps: 8 | versions: 71\nThe Workflow Layer for Claude Code — scaffold agents, commands, skills, hooks, and memor…ctrl+o
{"content":[{"text":"\nworclaude@2.10.5 | MIT | deps: 8 | versions: 71\nThe Workflow Layer for Claude Code — scaffold agents, commands, skills, hooks, and memory into any project\nhttps://github.com/sefaertunc/Worclaude#readme\n\nkeywords: claude, claude-code, claude-code-workflow, claude-code-scaffolding, workflow, scaffolding, hooks, memory, cli, developer-tools, productivity, ai, anthropic, agents, automation\n\nbin: worclaude\n\ndist\n.tarball: https://registry.npmjs.org/worclaude/-/worclaude-2.10.5.tgz\n.shasum: bb9e0a70c6f2c0281c880a9f9dfb26ef0f9ffe87\n.integrity: sha512-KzU2XuUE0wgRG3S6KfdNyavG2IqXamg3LhDLnpgir2iedFgSKDVH9eGRjXkFZMS3iJp8TwoOUXR7hlDaQEH6yQ==\n.unpackedSize: 782.7 kB\n\ndependencies:\n@sefaertunc/anthropic-watch-client: ^1.0.2\nchalk: ^5.4.1\ncommander: ^14.0.3\nfs-extra: ^11.3.0\ninquirer: ^13.4.2\nora: ^9.4.0\nsmol-toml: ^1.6.1\nyaml: ^2.8.3\n\nmaintainers:\n- sefaertunc <sefaertnc@gmail.com>\n\ndist-tags:\nlatest: 2.10.5\n\npublished 4 months ago by sefaertunc <sefaertnc@gmail.com>\n===\nworclaude\nThe Workflow Layer for Claude Code — scaffold agents, commands, skills, hooks, and memory into any project\nVersion 2.10.5 published 2026-05-15 by sefaertunc\nMaintainers: sefaertunc\nKeywords: claude claude-code claude-code-workflow claude-code-scaffolding workflow scaffolding hooks memory cli developer-tools productivity ai anthropic agents automation\nhttps://npm.im/worclaude\n\n===WORQ===\nNo matches found for \"worqclaude\"\n","type":"text"}]}×$ pip index versions worclaude 2>&1 | head; echo "---"; pip index versions worqclaude 2>&1 | head; echo "---"; python3 -c "import worclaude" 2>&1✓└{"content":[{"text":"ERROR: No matching distribution found for worclaude\n---\nERROR: No matching distribution found for worqclaude\n---\nTraceback (most recent…ctrl+o
{"content":[{"text":"ERROR: No matching distribution found for worclaude\n---\nERROR: No matching distribution found for worqclaude\n---\nTraceback (most recent call last):\n File \"<string>\", line 1, in <module>\nModuleNotFoundError: No module named 'worclaude'\n\n\nCommand exited with code 1","type":"text"}],"details":{}}›Thinking…
Worclaude is an npm package: "The Workflow Layer for Claude Code — scaffold agents, commands, skills, hooks, and memory into any project". It's a CLI tool for Claude Code. Let me examine what it does, its README, and how to use it.
Let me look at the README and the package details. Let me fetch more info.
✓$ npm view worclaude readme 2>&1 | head -200✓└{"content":[{"text":"<p align=\"center\">\n <img src=\"assets/banner.png\" alt=\"Worclaude: The Workflow Layer for Claude Code\" width=\"100%\" />\n</p>\n\n<p …ctrl+o
{"content":[{"text":"<p align=\"center\">\n <img src=\"assets/banner.png\" alt=\"Worclaude: The Workflow Layer for Claude Code\" width=\"100%\" />\n</p>\n\n<p align=\"center\">\n <a href=\"https://www.npmjs.com/package/worclaude\"><img src=\"https://img.shields.io/npm/v/worclaude\" alt=\"npm version\" /></a>\n <a href=\"https://www.npmjs.com/package/worclaude\"><img src=\"https://img.shields.io/npm/dm/worclaude\" alt=\"downloads\" /></a>\n <a href=\"https://github.com/sefaertunc/Worclaude/actions/workflows/ci.yml\"><img src=\"https://img.shields.io/github/actions/workflow/status/sefaertunc/Worclaude/ci.yml?label=tests\" alt=\"tests\" /></a>\n <a href=\"LICENSE\"><img src=\"https://img.shields.io/github/license/sefaertunc/Worclaude\" alt=\"license\" /></a>\n <img src=\"https://img.shields.io/badge/node-%3E%3D20-brightgreen\" alt=\"node >= 20\" />\n <img src=\"https://img.shields.io/badge/built%20for-Claude%20Code-cc785c\" alt=\"Built for Claude Code\" />\n</p>\n\n<p align=\"center\">\n <a href=\"https://github.com/sponsors/sefaertunc\"><img src=\"https://img.shields.io/badge/GitHub%20Sponsors-support-ea4aaa?logo=githubsponsors&style=for-the-badge\" alt=\"GitHub Sponsors\" height=\"40\" /></a>\n \n <a href=\"https://buymeacoffee.com/sefaertunc\"><img src=\"https://img.shields.io/badge/Buy%20Me%20a%20Coffee-support-yellow?logo=buymeacoffee&style=for-the-badge\" alt=\"Buy Me a Coffee\" height=\"40\" /></a>\n</p>\n\n<p align=\"center\">\n <a href=\"https://sefaertunc.github.io/Worclaude/\">Documentation</a> ·\n <a href=\"https://www.npmjs.com/package/worclaude\">npm</a> ·\n <a href=\"https://github.com/sefaertunc/Worclaude/issues\">Issues</a>\n</p>\n\n# Worclaude: The Workflow Layer for Claude Code\n\nWorclaude scaffolds a complete Claude Code workflow into any project in seconds. One `init` command installs 25 agents, 16 slash commands, 17 skills, an 11-event hook layer, local observability capture, a five-layer memory system, and a CLAUDE.md template tuned for your tech stack. It implements the patterns in [howborisusesclaudecode.com](https://www.howborisusesclaudecode.com/) as a reusable, upgradable scaffold, so you stop rebuilding the same configuration for every new project.\n\n<div align=\"center\">\n\n| CLI Commands | Agents | Slash Commands | Skills | Hooks | Tech Stacks |\n| :----------: | :-----------------------: | :------------: | :-------------------: | :------------: | :-----------: |\n| 14 | 6 universal + 19 optional | 16 | 17 | 11 events | 16 |\n| subcommands | across 6 categories | session tools | universal + templates | 7 hook scripts | auto-detected |\n\n</div>\n\n---\n\n## What You Get\n\n`worclaude init` installs a production-ready Claude Code workflow:\n\n### Agents (25 total)\n\n- **6 universal:** plan-reviewer (Opus), code-simplifier (Sonnet, worktree), test-writer (Sonnet, worktree), build-validator (Haiku), verify-app (Sonnet, worktree), upstream-watcher (Sonnet)\n- **19 optional** across 6 categories: Backend, Frontend, DevOps, Quality, Documentation, Data/AI. Worclaude recommends agents based on your project type.\n\n### Slash Commands (16)\n\nSession lifecycle, review, verification, memory, observability, and git automation:\n\n`/start` `/end` `/commit-push-pr` `/review-plan` `/verify` `/compact-safe` `/update-claude-md` `/learn` `/setup` `/sync` `/conflict-resolver` `/review-changes` `/build-fix` `/refactor-clean` `/test-coverage` `/observability`\n\n### Skills (17 total)\n\n- **13 universal**: context-management, git-conventions, planning-with-files, review-and-handoff, prompt-engineering, verification, testing, claude-md-maintenance, coding-principles, subagent-usage, security-checklist, coordinator-mode, memory-architecture\n- **3 project templates** filled in automatically by `/setup`: backend-conventions, frontend-design-system, project-patterns\n- **1 generated**: agent-routing, dynamically built from your agent selections\n\nSkills use Claude Code's directory format (`skill-name/SKILL.md`) and support **conditional activation** via path globs, so Claude only carries knowledge relevant to the current file.\n\n### Hooks (11 events, 7 hook scripts)\n\nWorclaude scaffolds 14 hook entries across 11 Claude Code events:\n\n- **SessionStart**: auto-loads CLAUDE.md, PROGRESS.md, last session summary, and recent learnings\n- **PostToolUse**: auto-formats code after every edit (formatter chosen by stack); strict profile adds a TypeScript check\n- **PostCompact**: re-reads key files after context compaction so Claude stays oriented\n- **PreCompact**: emergency git snapshot before auto-compaction (`pre-compact-save.cjs`)\n- **UserPromptSubmit**: three handlers run in sequence (correction-detection, skill-hint matching, and command-invocation observability capture)\n- **Stop**: extracts `[LEARN]` blocks from the transcript and persists them (`learn-capture.cjs`)\n- **InstructionsLoaded**: captures skill loads to `.claude/observability/skill-loads.jsonl` (`obs-skill-loads.cjs`)\n- **SubagentStart / SubagentStop**: captures agent invocations to `.claude/observability/agent-events.jsonl` (`obs-agent-events.cjs`)\n- **SessionEnd / Notification**: quiet-by-default session-end and desktop alerts\n\nThree profiles via `WORCLAUDE_HOOK_PROFILE`: `minimal` (context hooks only; disables observability and notifications), `standard` (all hooks, default), `strict` (standard + TypeScript checking on every edit).\n\n### Observability\n\nA privacy-first per-project signal layer captures skill loads, command invocations, and agent timings to `.claude/observability/*.jsonl` (gitignored). The `worclaude observability` CLI and `/observability` slash command aggregate the signals into a Markdown report: top skills, top commands, agent failure rates, and anomalies. Zero data leaves the machine; opt out via `WORCLAUDE_HOOK_PROFILE=minimal` or by deleting the folder.\n\n### GitHub Action Integration\n\nWhen `worclaude init` finishes it offers to surface Claude Code's `/install-github-action` flow. If installed, `@claude` mentions in PR comments will automatically propose CLAUDE.md updates, slotting cleanly into the `/sync`-driven release flow. Worclaude itself never shells out to the install command; it just points you at it.\n\n### Learnings System\n\nA personal, gitignored store at `.claude/learnings/` captures corrections and rules Claude picks up mid-session and replays them at the start of future sessions. The `correction-detect.cjs` and `learn-capture.cjs` hooks do this automatically; the `/learn` slash command is the explicit capture path. Unlike CLAUDE.md (shared rules, in git), learnings are yours; useful for personal conventions that should not leak into the repo. Promote a learning to CLAUDE.md when it matures into something every contributor should follow.\n\n### Cross-Tool Compatibility\n\n`AGENTS.md` is scaffolded alongside `CLAUDE.md` as a single source of truth for Cursor, Codex, GitHub Copilot, and other AI coding tools that expect `AGENTS.md`. Switching tools does not require maintaining parallel rule files.\n\n### Doctor\n\n`worclaude doctor` runs a four-category health check: core files (workflow-meta, CLAUDE.md, settings.json), components (agents, commands, skills, agent-routing), documentation (PROGRESS.md, SPEC.md), and integrity (file hashes, hook-event validity, deprecated models, CLAUDE.md line budget, learnings index integrity, gitignore coverage). Every check reports PASS/WARN/FAIL with actionable diagnostics.\n\n### Configuration\n\nPre-configured permissions per tech stack (Node.js, Python, Go, Rust, and 12 more), a CLAUDE.md template with progressive disclosure via skills, sandbox / effort / output defaults out of the box.\n\n---\n\n## Quick Start\n\n```bash\nnpx worclaude init\n```\n\nOr install globally:\n\n```bash\nnpm install -g worclaude\ncd your-project\nworclaude init\n```\n\nFollow the interactive prompts to select your project type, tech stack, and agents. Then open Claude Code and run `/setup` to fill in your project-specific content.\n\nFor parallel tasks, launch Claude with worktrees:\n\n```bash\nclaude --worktree --tmux\n```\n\n---\n\n## Commands\n\n| Command | Description |\n| ------------------------------ | ------------------------------------------------------------------------ |\n| `worclaude init` | Scaffold workflow into new or existing project |\n| `worclaude upgrade` | Update universal components and repair on-disk drift |\n| `worclaude status` | Show current workflow state, version, and npm update status |\n| `worclaude backup` | Create a timestamped backup of workflow files |\n| `worclaude restore` | Restore from a previous backup |\n| `worclaude diff` | Compare current setup vs latest template |\n| `worclaude delete` | Remove worclaude workflow from project |\n| `worclaude doctor` | Validate workflow installation health |\n| `worclaude doc-lint` | Validate `<!-- references … -->` markers; surface tech-stack drift |\n| `worclaude observability` | Aggregate per-project signals into a Markdown report (`--json`, `--out`) |\n| `worclaude regenerate-routing` | Rebuild `agent-routing/SKILL.md` from `templates/agents/` |\n| `worclaude scan` | Detect project type/stack via the project-scanner detectors |\n| `worclaude setup-state` | Inspect / save / reset / resume `/setup` interview persistence |\n| `worclaude worktrees clean` | Remove stale agent worktrees (locked or orphaned) |\n\nThe `init` command detects existing setups and merges intelligently; no data is overwritten without your confirmation. Use `upgrade` to pull in new features, restore missing files, and preserve your customizations. `upgrade` accepts `--dry-run`, `--yes`, and `--repair-only` for scripted flows. `doctor` accepts `--json` for CI dashboards. `doc-lint` accepts `--strict` to exit non-zero on drift (CI-friendly).\n\nSee the [full command reference](https://sefaertunc.github.io/Worclaude/reference/commands) for detailed usage and options.\n\n---\n\n## Why Worclaude\n\n- **Split architecture.** CLAUDE.md stays under 200 lines for speed; detail lives in skills loaded on demand. Personal rules live in `.claude/learnings/` (gitignored); shared rules live in CLAUDE.md.\n- **Learning loop.** Correct Claude once, it captures the rule, the next session picks it up at start; no re-stating.\n- **Cross-tool ready.** `AGENTS.md` generated from the same source as CLAUDE.md, so your rules work in Cursor / Codex / Copilot too.\n- **Hook profiles.** Dial strictness up or down via one environment variable. `minimal` for CI, `standard` for daily work, `strict` for type-heavy projects.\n- **Smart merge.** Detects existing Claude Code setups and merges additively; existing files never overwritten without confirmation. Three-tier strategy: additive for missing content, safe-alongside for conflicts, interactive for CLAUDE.md.\n- **Self-healing doctor.** Catches drift, stale hashes, deprecated models, broken learnings; before they bite.\n- **Batched releases.** Every PR declares `Version bump: {major|minor|patch|none}` in its body; `/sync` aggregates declarations across merged PRs and only cuts a release when at least one rises above `none`. Internal-only work (docs, CI, tests) accumulates on `develop` without triggering noisy publishes.\n\n---\n\n## Acknowledgments\n\nWorclaude draws from patterns and insights across the Claude Code ecosystem:\n\n- [Boris Cherny's Claude Code tips](https://howborisusesclaudecode.com/): The foundational workflow patterns: multi-terminal pipelines, plan-then-execute, CLAUDE.md as shared knowledge, verification-first development\n- [everything-claude-code](https://github.com/affaan-m/everything-claude-code) by Affaan Mir (Anthropic hackathon winner): Session persistence, hook profiles, confidence filtering, security scanning patterns\n- [Andrej Karpathy's coding principles](https://github.com/multica-ai/andrej-karpathy-skills): Think before coding, simplicity first, surgical changes ([original post](https://x.com/karpathy/status/2015883857489522876))\n- [pro-workflow](https://github.com/peterHoburg/pro-workflow): Correction detection, learning capture hooks, loop prevention patterns\n- [Anthropic Engineering Blog](https://www.anthropic.com/engineering): Agent design, context engineering, harness patterns\n- [awesome-claude-code](https://github.com/hesreallyhim/awesome-claude-code) by hesreallyhim: Community resource discovery and ecosystem awareness\n- [awesome-claude-code-toolkit](https://github.com/rohitg00/awesome-claude-code-toolkit) by rohitg00: Toolkit patterns and companion app references\n- [claude-skills-cli](https://github.com/anthropics/skills): Skill activation patterns and conditional loading insights\n- [SuperClaude](https://github.com/andyholst/SuperClaude): Persona and mode system analysis (informed what NOT to build)\n- [ccusage](https://github.com/yashikota/ccusage) / [claude-devtools](https://github.com/nicobailey/claude-devtools): Observability patterns (informed what NOT to build)\n- [claude-flow](https://github.com/Ruflo/claude-flow) by Ruflo: Runtime orchestration patterns (informed the scaffolding-only philosophy)\n- [Vercel SkillKit](https://github.com/vercel/skillkit): Skill packaging and marketplace patterns\n- [claude-code-templates](https://github.com/danielsalas/claude-code-templates) by Daniel Avila: Template gallery and component catalog reference\n\n---\n\n## Links\n\n- [Full Documentation](https://sefaertunc.github.io/Worclaude/): VitePress site with guides and reference\n- [npm Package](https://www.npmjs.com/package/worclaude)\n- [GitHub Issues](https://github.com/sefaertunc/Worclaude/issues)\n- [Contributing](CONTRIBUTING.md)\n- [Code of Conduct](CODE_OF_CONDUCT.md)\n- [Security Policy](SECURITY.md)\n- [License: MIT](LICENSE)\n\n---\n\nBuilt on [Boris Cherny's Claude Code tips](https://www.howborisusesclaudecode.com/). MIT licensed.\n","type":"text"}]}✓$ npm view worclaude --json 2>&1 | head -100✓└{"content":[{"text":"{\n \"_id\": \"worclaude@2.10.5\",\n \"_rev\": \"72-d3b5cc9fa938f4fa7a1927fa8a1aee94\",\n \"name\": \"worclaude\",\n \"dist-tags\": {\n…ctrl+o
{"content":[{"text":"{\n \"_id\": \"worclaude@2.10.5\",\n \"_rev\": \"72-d3b5cc9fa938f4fa7a1927fa8a1aee94\",\n \"name\": \"worclaude\",\n \"dist-tags\": {\n \"latest\": \"2.10.5\"\n },\n \"versions\": [\n \"1.0.0\",\n \"1.1.0\",\n \"1.2.0\",\n \"1.2.1\",\n \"1.2.2\",\n \"1.2.3\",\n \"1.2.4\",\n \"1.2.5\",\n \"1.2.6\",\n \"1.2.7\",\n \"1.2.8\",\n \"1.3.0\",\n \"1.3.1\",\n \"1.3.2\",\n \"1.3.3\",\n \"1.3.4\",\n \"1.3.5\",\n \"1.3.6\",\n \"1.3.7\",\n \"1.3.8\",\n \"1.3.9\",\n \"1.4.0\",\n \"1.5.0\",\n \"1.6.0\",\n \"1.6.1\",\n \"1.6.2\",\n \"1.7.0\",\n \"1.8.0\",\n \"1.9.0\",\n \"2.0.0\",\n \"2.1.0\",\n \"2.2.0\",\n \"2.2.1\",\n \"2.2.3\",\n \"2.2.4\",\n \"2.2.5\",\n \"2.2.6\",\n \"2.3.0\",\n \"2.4.0\",\n \"2.4.1\",\n \"2.4.2\",\n \"2.4.3\",\n \"2.4.4\",\n \"2.4.5\",\n \"2.4.6\",\n \"2.4.7\",\n \"2.4.8\",\n \"2.4.9\",\n \"2.4.10\",\n \"2.4.11\",\n \"2.4.12\",\n \"2.4.13\",\n \"2.5.0\",\n \"2.5.1\",\n \"2.6.0\",\n \"2.6.1\",\n \"2.6.2\",\n \"2.6.3\",\n \"2.7.0\",\n \"2.7.1\",\n \"2.8.0\",\n \"2.9.0\",\n \"2.9.1\",\n \"2.9.2\",\n \"2.9.3\",\n \"2.10.0\",\n \"2.10.1\",\n \"2.10.2\",\n \"2.10.3\",\n \"2.10.4\",\n \"2.10.5\"\n ],\n \"time\": {\n \"created\": \"2026-03-25T02:32:44.843Z\",\n \"modified\": \"2026-05-15T20:00:10.643Z\",\n \"1.0.0\": \"2026-03-25T02:32:45.046Z\",\n \"1.1.0\": \"2026-03-25T15:36:57.559Z\",\n \"1.2.0\": \"2026-03-25T16:21:43.930Z\",\n \"1.2.1\": \"2026-03-25T17:06:10.574Z\",\n \"1.2.2\": \"2026-03-25T17:28:32.007Z\",\n \"1.2.3\": \"2026-03-25T17:37:44.359Z\",\n \"1.2.4\": \"2026-03-25T21:29:04.496Z\",\n \"1.2.5\": \"2026-03-25T21:38:52.106Z\",\n \"1.2.6\": \"2026-03-25T21:50:50.127Z\",\n \"1.2.7\": \"2026-03-25T22:01:39.550Z\",\n \"1.2.8\": \"2026-03-25T22:05:54.188Z\",\n \"1.3.0\": \"2026-03-25T22:58:00.833Z\",\n \"1.3.1\": \"2026-03-25T23:12:32.811Z\",\n \"1.3.2\": \"2026-03-26T18:16:04.874Z\",\n \"1.3.3\": \"2026-03-26T18:27:33.012Z\",\n \"1.3.4\": \"2026-03-26T18:42:21.976Z\",\n \"1.3.5\": \"2026-03-26T22:05:02.322Z\",\n","type":"text"}]}›Thinking…
Now I understand Worclaude. It's a CLI scaffolding tool ("The Workflow Layer for Claude Code"). It's not a hosted product with an SDK/API for building applications - it's a developer tool that scaffolds Claude Code configurations (agents, commands, skills, hooks, memory) into a project.
Key considerations for the user's instructions:
- "Stay light: use the hosted product through its SDK or API." - Worclaude is NOT a hosted product. It's an npm CLI tool. There's no hosted API/SDK for "Worclaude" itself. It scaffolds files locally.
- "Do not start local service stacks or wait for long-running commands; if the quickstart requires either, say so plainly and stop."
- "If this product has no developer workflow you can act on, say so plainly and stop."
Worclaude is a CLI scaffolding tool. It requires npx worclaude init which is interactive (uses inquirer prompts). The "quickstart" is npx worclaude init — interactive, but not a long-running service. But init is interactive (requires prompts to select project type, tech stack, agents). There might be non-interactive flags. Let me check the CLI options.
Actually, the key question: is there a developer workflow I can act on via SDK/API? Worclaude is a local CLI that scaffolds Claude Code config files. It's not a hosted product with an API. There's no SDK. The "hosted product" doesn't exist for Worclaude itself.
But wait - maybe I can still act on the developer workflow: it's a CLI tool. I can install it via npm and run non-interactive commands like worclaude scan, worclaude doctor, worclaude status, etc. The quickstart init is interactive though.
The user said: "Stay light: use the hosted product through its SDK or API. Do not start local service stacks or wait for long-running commands; if the quickstart requires either, say so plainly and stop."
Worclaude's quickstart (npx worclaude init) is interactive — requires a TTY for prompts. In this environment, I can't easily run interactive prompts. But there might be non-interactive flags. Let me check the CLI options.
Let me check if init has flags for non-interactive scaffolding. Let me look at the tarball or run npx worclaude --help.
Actually, let me check worclaude init --help to see if there are non-interactive flags.
Let me also think about pricing. Worclaude is MIT licensed, free, open source. There's no pricing - it's free. It's built for Claude Code, which is Anthropic's product (Claude Code has its own pricing via Anthropic API / subscription). Worclaude itself: free (MIT), no pricing. The README mentions GitHub Sponsors and Buy Me a Coffee as optional support (donations).
So pricing answer: Worclaude is free and MIT-licensed; no paid tiers; it's a local CLI. It does depend on Claude Code (Anthropic) which has its own pricing.
"Tell me how pricing works" - I should explain: Worclaude itself is free/open-source (MIT), no API billing. The underlying Claude Code is what actually costs money (Anthropic subscription/API usage).
"briefly tell me whether this product will be easy for you to manage" - I should assess: it's a local CLI scaffolding tool; not a hosted service; no servers to manage; easy in that sense, but it's not "manageable" via SDK/API - it's a run-locally tool. And after scaffolding, the "product" requires you to actually run Claude Code (an interactive TUI) to use it.
"Let me know if you get blocked" and "If this product has no developer workflow you can act on, say so plainly and stop."
So what's the developer workflow I can act on? The CLI has non-interactive subcommands: scan, doctor, status, diff, backup, restore, doc-lint, regenerate-routing, observability. These don't require a TTY. The core init is interactive.
Let me check whether init supports non-interactive flags (e.g., --yes, --stack, --project-type). Let me look.
Let me download the package and inspect its CLI.
✓$ cd /tmp && npm pack worclaude@2.10.5 --silent 2>&1 | tail -1 && ls -la *.tgz✓└{"content":[{"text":"worclaude-2.10.5.tgz\n-rw------- 1 root root 248824 Sep 18 21:56 worclaude-2.10.5.tgz\n","type":"text"}]}
✓$ cd /tmp && tar xzf worclaude-2.10.5.tgz && find package -maxdepth 2 -type f | sort | head -100✓└{"content":[{"text":"package/CHANGELOG.md\npackage/CODE_OF_CONDUCT.md\npackage/CONTRIBUTING.md\npackage/LICENSE\npackage/README.md\npackage/SECURITY.md\npackage…ctrl+o
{"content":[{"text":"package/CHANGELOG.md\npackage/CODE_OF_CONDUCT.md\npackage/CONTRIBUTING.md\npackage/LICENSE\npackage/README.md\npackage/SECURITY.md\npackage/package.json\npackage/src/index.js\n","type":"text"}]}✓$ cd /tmp/package && cat package.json✓└{"content":[{"text":"{\n \"name\": \"worclaude\",\n \"version\": \"2.10.5\",\n \"description\": \"The Workflow Layer for Claude Code — scaffold agents, comma…ctrl+o
{"content":[{"text":"{\n \"name\": \"worclaude\",\n \"version\": \"2.10.5\",\n \"description\": \"The Workflow Layer for Claude Code — scaffold agents, commands, skills, hooks, and memory into any project\",\n \"type\": \"module\",\n \"bin\": {\n \"worclaude\": \"src/index.js\"\n },\n \"main\": \"src/index.js\",\n \"files\": [\n \"src/\",\n \"templates/\",\n \"README.md\",\n \"CHANGELOG.md\",\n \"CONTRIBUTING.md\",\n \"CODE_OF_CONDUCT.md\",\n \"SECURITY.md\",\n \"LICENSE\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/sefaertunc/Worclaude.git\"\n },\n \"homepage\": \"https://github.com/sefaertunc/Worclaude#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/sefaertunc/Worclaude/issues\"\n },\n \"funding\": \"https://github.com/sponsors/sefaertunc\",\n \"author\": \"Sefa Ertunç\",\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"scripts\": {\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\",\n \"lint\": \"eslint src/ tests/\",\n \"format\": \"prettier --write .\",\n \"docs:dev\": \"vitepress dev docs\",\n \"docs:build\": \"vitepress build docs\",\n \"docs:preview\": \"vitepress preview docs\",\n \"prepublishOnly\": \"npm test && npm run lint\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"provenance\": true\n },\n \"keywords\": [\n \"claude\",\n \"claude-code\",\n \"claude-code-workflow\",\n \"claude-code-scaffolding\",\n \"workflow\",\n \"scaffolding\",\n \"hooks\",\n \"memory\",\n \"cli\",\n \"developer-tools\",\n \"productivity\",\n \"ai\",\n \"anthropic\",\n \"agents\",\n \"automation\"\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@sefaertunc/anthropic-watch-client\": \"^1.0.2\",\n \"chalk\": \"^5.4.1\",\n \"commander\": \"^14.0.3\",\n \"fs-extra\": \"^11.3.0\",\n \"inquirer\": \"^13.4.2\",\n \"ora\": \"^9.4.0\",\n \"smol-toml\": \"^1.6.1\",\n \"yaml\": \"^2.8.3\"\n },\n \"devDependencies\": {\n \"eslint\": \"^10.2.1\",\n \"prettier\": \"^3.5.3\",\n \"vitepress\": \"^1.6.4\",\n \"vitest\": \"^4.1.5\"\n },\n \"overrides\": {\n \"brace-expansion\": \"^1.1.13\",\n \"esbuild\": \"^0.25.0\",\n \"vite\": \"^6.4.2\",\n \"postcss\": \"^8.5.10\"\n }\n}\n","type":"text"}]}✓$ cd /tmp/package && find src -type f | sort | head -200✓└{"content":[{"text":"src/commands/backup.js\nsrc/commands/delete.js\nsrc/commands/diff.js\nsrc/commands/doc-lint.js\nsrc/commands/doctor.js\nsrc/commands/init.j…ctrl+o
{"content":[{"text":"src/commands/backup.js\nsrc/commands/delete.js\nsrc/commands/diff.js\nsrc/commands/doc-lint.js\nsrc/commands/doctor.js\nsrc/commands/init.js\nsrc/commands/observability.js\nsrc/commands/regenerate-routing.js\nsrc/commands/restore.js\nsrc/commands/scan.js\nsrc/commands/setup-state.js\nsrc/commands/status.js\nsrc/commands/upgrade.js\nsrc/commands/worktrees.js\nsrc/core/backup.js\nsrc/core/config.js\nsrc/core/detector.js\nsrc/core/drift-checks.js\nsrc/core/file-categorizer.js\nsrc/core/merger.js\nsrc/core/migration.js\nsrc/core/project-scanner/detectors/ci.js\nsrc/core/project-scanner/detectors/deployment.js\nsrc/core/project-scanner/detectors/env-variables.js\nsrc/core/project-scanner/detectors/external-apis.js\nsrc/core/project-scanner/detectors/frameworks.js\nsrc/core/project-scanner/detectors/language.js\nsrc/core/project-scanner/detectors/linting.js\nsrc/core/project-scanner/detectors/monorepo.js\nsrc/core/project-scanner/detectors/orm.js\nsrc/core/project-scanner/detectors/package-manager.js\nsrc/core/project-scanner/detectors/readme.js\nsrc/core/project-scanner/detectors/scripts.js\nsrc/core/project-scanner/detectors/spec-docs.js\nsrc/core/project-scanner/detectors/testing.js\nsrc/core/project-scanner/index.js\nsrc/core/project-scanner/manifests.js\nsrc/core/remover.js\nsrc/core/scaffolder.js\nsrc/core/setup-state.js\nsrc/core/variables.js\nsrc/data/agents.js\nsrc/data/optional-features.js\nsrc/generators/agent-routing.js\nsrc/index.js\nsrc/prompts/agent-selection.js\nsrc/prompts/claude-md-merge.js\nsrc/prompts/conflict-resolution.js\nsrc/prompts/project-type.js\nsrc/prompts/tech-stack.js\nsrc/utils/agent-frontmatter.js\nsrc/utils/display.js\nsrc/utils/doc-lint.js\nsrc/utils/file.js\nsrc/utils/hash.js\nsrc/utils/npm.js\nsrc/utils/observability.js\nsrc/utils/time.js\n","type":"text"}]}›Thinking…
Let me look at the index.js to understand CLI options and whether init has non-interactive flags.
✓$ cd /tmp/package && cat src/index.js✓└{"content":[{"text":"#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { getPackageVersionSync } from './core/config.js';\nimport { initComman…ctrl+o
{"content":[{"text":"#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { getPackageVersionSync } from './core/config.js';\nimport { initCommand } from './commands/init.js';\nimport { upgradeCommand } from './commands/upgrade.js';\nimport { statusCommand } from './commands/status.js';\nimport { backupCommand } from './commands/backup.js';\nimport { restoreCommand } from './commands/restore.js';\nimport { diffCommand } from './commands/diff.js';\nimport { deleteCommand } from './commands/delete.js';\nimport { doctorCommand } from './commands/doctor.js';\nimport { scanCommand } from './commands/scan.js';\nimport { setupStateCommand } from './commands/setup-state.js';\nimport { worktreesCleanCommand } from './commands/worktrees.js';\nimport { regenerateRoutingCommand } from './commands/regenerate-routing.js';\nimport { docLintCommand } from './commands/doc-lint.js';\nimport { observabilityCommand } from './commands/observability.js';\n\nconst program = new Command();\n\nprogram\n .name('worclaude')\n .version(getPackageVersionSync())\n .description('Scaffold a comprehensive Claude Code workflow into any project');\n\nprogram.showSuggestionAfterError(true);\nprogram.showHelpAfterError(true);\n\nprogram\n .command('init')\n .description('Initialize Claude workflow in the current project')\n .action(initCommand);\n\nprogram\n .command('upgrade')\n .description('Update workflow components to the latest version')\n .option('--dry-run', 'Preview changes without writing')\n .option('--yes', 'Skip confirmation prompts')\n .option('--repair-only', 'Restore missing files without applying template updates')\n .action((options) => upgradeCommand(options));\n\nprogram\n .command('status')\n .description('Show current workflow installation status')\n .action(statusCommand);\n\nprogram\n .command('backup')\n .description('Create a backup of current Claude setup')\n .action(backupCommand);\n\nprogram.command('restore').description('Restore Claude setup from a backup').action(restoreCommand);\n\nprogram\n .command('diff')\n .description('Compare current setup against installed workflow version')\n .action(diffCommand);\n\nprogram\n .command('delete')\n .description('Remove worclaude workflow from project')\n .action(deleteCommand);\n\nprogram\n .command('doctor')\n .description('Validate workflow installation health')\n .option('--json', 'Output results as JSON')\n .action((options) => doctorCommand(options));\n\nprogram\n .command('regenerate-routing')\n .description(\n 'Regenerate .claude/skills/agent-routing/SKILL.md from .claude/agents/*.md frontmatter'\n )\n .action(() => regenerateRoutingCommand());\n\nprogram\n .command('doc-lint')\n .description('Lint <!-- references X --> markers across .md files for drift against their source')\n .option('--strict', 'Exit non-zero on any drift (for CI)')\n .action((options) => docLintCommand(options));\n\nprogram\n .command('observability')\n .description('Aggregate .claude/observability/*.jsonl into a per-project Markdown report')\n .option('--json', 'Emit the raw report object as JSON instead of Markdown')\n .option('--out <file>', 'Write the report to a file instead of stdout')\n .action((options) => observabilityCommand(options));\n\nprogram\n .command('scan')\n .description('Scan project for detectable facts (writes .claude/cache/detection-report.json)')\n .option('--path <dir>', 'Project root to scan', process.cwd())\n .option('--json', 'Print the detection report as JSON to stdout')\n .option('--quiet', 'Suppress human-readable summary (still writes the report file)')\n .action((options) => scanCommand(options));\n\nconst setupState = program\n .command('setup-state')\n .description('Inspect or mutate the /setup state file (.claude/cache/setup-state.json)');\n\nsetupState\n .command('show')\n .description('Print the state file as JSON, or \"no state\" if absent')\n .option('--path <dir>', 'Project root', process.cwd())\n .action((options) => setupStateCommand('show', options));\n\nsetupState\n .command('save')\n .description('Read a JSON state from stdin or a file, validate, and persist')\n .option('--stdin', 'Read JSON from stdin')\n .option('--from-file <path>', 'Read JSON from a file path')\n .option('--path <dir>', 'Project root', process.cwd())\n .action((options) => setupStateCommand('save', options));\n\nsetupState\n .command('reset')\n .description('Delete the state file (idempotent)')\n .option('--path <dir>', 'Project root', process.cwd())\n .action((options) => setupStateCommand('reset', options));\n\nsetupState\n .command('resume-info')\n .description('Print state/age/staleness summary, or \"no state\" if absent')\n .option('--path <dir>', 'Project root', process.cwd())\n .action((options) => setupStateCommand('resume-info', options));\n\n// Catch unknown setup-state subcommands with the spec-matching exit code 2.\n// Commander's default would exit 1, but setup-state's own arg-error contract\n// (see src/commands/setup-state.js) is exit 2 for bad inputs.\nsetupState.on('command:*', (operands) => {\n console.error(\n `Error: unknown setup-state subcommand: ${operands[0]} (expected one of show, save, reset, resume-info)`\n );\n process.exitCode = 2;\n});\n\nconst worktrees = program.command('worktrees').description('Manage agent worktrees');\n\nworktrees\n .command('clean')\n .description('Force-remove locked agent worktrees under .claude/worktrees/')\n .option('--path <dir>', 'Project root', process.cwd())\n .action((options) => worktreesCleanCommand(options));\n\nworktrees.on('command:*', (operands) => {\n console.error(`Error: unknown worktrees subcommand: ${operands[0]} (expected one of clean)`);\n process.exitCode = 2;\n});\n\nprogram.parse();\n","type":"text"}]}›Thinking…
The init command has no options - it goes straight to interactive prompts via inquirer. Let me check init.js to see how it works and whether it can be non-interactive.
✓$ cd /tmp/package && cat src/commands/init.js✓└{"content":[{"text":"import path from 'node:path';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport {\n scaffoldFile,\n scaffoldAgentsMd,\n …ctrl+o
{"content":[{"text":"import path from 'node:path';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport {\n scaffoldFile,\n scaffoldAgentsMd,\n updateGitignore,\n scaffoldHooks,\n scaffoldScripts,\n} from '../core/scaffolder.js';\nimport { OPTIONAL_FEATURES } from '../data/optional-features.js';\nimport {\n computeFileHashes,\n createWorkflowMeta,\n getPackageVersion,\n readWorkflowMeta,\n writeWorkflowMeta,\n} from '../core/config.js';\nimport { fileExists, writeFile } from '../utils/file.js';\nimport * as display from '../utils/display.js';\nimport { promptProjectType } from '../prompts/project-type.js';\nimport { promptTechStack } from '../prompts/tech-stack.js';\nimport { promptAgentSelection } from '../prompts/agent-selection.js';\nimport { detectScenario, scanExistingSetup } from '../core/detector.js';\nimport { createBackup } from '../core/backup.js';\nimport { performMerge, buildSettingsJson } from '../core/merger.js';\nimport {\n UNIVERSAL_AGENTS,\n AGENT_CATALOG,\n COMMAND_FILES,\n UNIVERSAL_SKILLS,\n TEMPLATE_SKILLS,\n TECH_STACKS,\n CONFIRMATION_STEPS,\n SPEC_MD_TEMPLATE_MAP,\n} from '../data/agents.js';\nimport { buildAgentRoutingSkill, loadShippedAgents } from '../generators/agent-routing.js';\nimport { buildCommandsBlock } from '../core/variables.js';\n\n// --- Helper functions ---\n\n// --- Step runner functions ---\n\nasync function runProjectInfo(selections) {\n const { projectName, description } = await inquirer.prompt([\n {\n type: 'input',\n name: 'projectName',\n message: 'Project name:',\n default: selections.projectName || path.basename(process.cwd()),\n },\n {\n type: 'input',\n name: 'description',\n message: 'One-line description:',\n default: selections.description || undefined,\n },\n ]);\n return { ...selections, projectName, description };\n}\n\nasync function runProjectType(selections) {\n const projectTypes = await promptProjectType();\n return { ...selections, projectTypes };\n}\n\nasync function runTechStack(selections) {\n const { languages, useDocker } = await promptTechStack(selections.projectTypes);\n return { ...selections, languages, useDocker };\n}\n\nasync function runAgents(selections) {\n const result = await promptAgentSelection(selections.projectTypes);\n return {\n ...selections,\n selectedAgents: result.selectedAgents,\n selectedCategories: result.selectedCategories,\n additionalCategories: result.additionalCategories,\n preSelectedCategories: result.preSelectedCategories,\n };\n}\n\nasync function runOptionalExtras(selections) {\n const previouslySelected = new Set(selections.optionalFeatures || []);\n const questions = OPTIONAL_FEATURES.map((feature) => ({\n type: 'select',\n name: feature.id,\n message: feature.label,\n choices: [\n { name: 'Yes', value: true },\n { name: 'No', value: false },\n ],\n default: previouslySelected.has(feature.id),\n }));\n const answers = await inquirer.prompt(questions);\n const optionalFeatures = OPTIONAL_FEATURES.filter((f) => answers[f.id]).map((f) => f.id);\n\n // GitHub Action (`@claude` PR-comment workflow). Worclaude does NOT run\n // the install — Claude Code provides /install-github-action and we point\n // at it. Phase 7 T7.3.\n const { installGithubAction } = await inquirer.prompt([\n {\n type: 'select',\n name: 'installGithubAction',\n message:\n 'Install Claude Code\\'s GitHub Action for the @claude \"compounding engineering\" workflow?',\n choices: [\n { name: 'Yes — show me the install instructions now', value: true },\n { name: \"No — I'll do it later\", value: false },\n ],\n default: false,\n },\n ]);\n\n return { ...selections, optionalFeatures, installGithubAction };\n}\n\nfunction displayGithubActionHint(selections) {\n if (!selections.installGithubAction) return;\n display.newline();\n display.barLine('GitHub Action setup:');\n display.barLine(\n ` Run ${display.white('/install-github-action')} inside Claude Code to enable the @claude workflow.`\n );\n display.barLine(\n ` See ${display.dimColor('docs/guide/claude-code-integration.md#github-action-integration-claude-pattern')} for details.`\n );\n}\n\nconst STEP_RUNNERS = {\n projectInfo: runProjectInfo,\n projectType: runProjectType,\n techStack: runTechStack,\n agents: runAgents,\n optionalExtras: runOptionalExtras,\n};\n\n// --- Confirmation ---\n\nasync function showConfirmation(selections) {\n const stackLabels = selections.languages\n .filter((l) => l !== 'other')\n .map((l) => {\n const entry = TECH_STACKS.find((s) => s.value === l);\n return entry ? entry.name : l;\n });\n if (selections.languages.includes('other') && stackLabels.length === 0) {\n stackLabels.push('Other / None');\n }\n if (selections.useDocker) stackLabels.push('Docker');\n\n const universalCount = UNIVERSAL_AGENTS.length;\n const optionalCount = selections.selectedAgents.length;\n const totalCount = universalCount + optionalCount;\n\n display.newline();\n display.divider('REVIEW');\n display.newline();\n console.log(\n ` ${'Project'.padEnd(10)}${display.white(selections.projectName)}${selections.description ? display.dimColor(` — ${selections.description}`) : ''}`\n );\n console.log(\n ` ${'Type'.padEnd(10)}${display.renderBadgeList(selections.projectTypes, display.TYPE_BADGES)}`\n );\n console.log(\n ` ${'Stack'.padEnd(10)}${display.renderBadgeList(stackLabels, display.STACK_BADGES)}`\n );\n console.log(\n ` ${'Agents'.padEnd(10)}${display.white(`${universalCount} universal + ${optionalCount} optional`)} ${display.dimColor(`(${totalCount} total)`)}`\n );\n\n const opted = new Set(selections.optionalFeatures || []);\n const extrasLabels = OPTIONAL_FEATURES.filter((f) => opted.has(f.id)).map((f) => f.extrasLabel);\n if (extrasLabels.length > 0) {\n console.log(` ${'Extras'.padEnd(10)}${display.white(extrasLabels.join(', '))}`);\n }\n\n display.newline();\n\n const { confirmation } = await inquirer.prompt([\n {\n type: 'select',\n name: 'confirmation',\n message: 'Everything look right?',\n choices: [\n { name: 'Yes, install the workflow', value: 'yes' },\n { name: 'No, let me start over', value: 'restart' },\n { name: 'Let me adjust a specific step', value: 'adjust' },\n ],\n },\n ]);\n\n return confirmation;\n}\n\n// --- Shared functions ---\n\nfunction createInitialSelections(projectRoot) {\n return {\n projectName: path.basename(projectRoot),\n description: '',\n projectTypes: [],\n languages: [],\n useDocker: false,\n selectedAgents: [],\n optionalFeatures: [],\n };\n}\n\nasync function runAllSteps(selections) {\n selections = await runProjectInfo(selections);\n selections = await runProjectType(selections);\n selections = await runTechStack(selections);\n selections = await runAgents(selections);\n selections = await runOptionalExtras(selections);\n return selections;\n}\n\nasync function runInteractivePrompts(projectRoot) {\n let selections = createInitialSelections(projectRoot);\n\n let confirmed = false;\n let firstRun = true;\n\n while (!confirmed) {\n if (firstRun) {\n selections = await runAllSteps(selections);\n firstRun = false;\n }\n\n const confirmation = await showConfirmation(selections);\n\n if (confirmation === 'yes') {\n confirmed = true;\n } else if (confirmation === 'restart') {\n selections = createInitialSelections(projectRoot);\n display.newline();\n display.info('Starting over...');\n display.newline();\n selections = await runAllSteps(selections);\n } else if (confirmation === 'adjust') {\n const { step } = await inquirer.prompt([\n {\n type: 'select',\n name: 'step',\n message: 'Which step do you want to adjust?',\n choices: CONFIRMATION_STEPS,\n },\n ]);\n selections = await STEP_RUNNERS[step](selections);\n }\n }\n\n return selections;\n}\n\nfunction buildTemplateVariables(selections) {\n const { projectName, description, languages, useDocker } = selections;\n\n const techStackLines = languages\n .filter((l) => l !== 'other')\n .map((l) => {\n const entry = TECH_STACKS.find((s) => s.value === l);\n return `- ${entry ? entry.name : l}`;\n });\n if (languages.includes('other') && techStackLines.length === 0) {\n techStackLines.push('- Not specified');\n }\n if (useDocker) techStackLines.push('- Docker');\n const techStackText = techStackLines.join('\\n');\n\n const techStackTableItems = languages\n .filter((l) => l !== 'other')\n .map((l) => {\n const entry = TECH_STACKS.find((s) => s.value === l);\n return entry ? entry.name : l;\n });\n if (languages.includes('other') && techStackTableItems.length === 0) {\n techStackTableItems.push('Not specified');\n }\n const techStackTable = techStackTableItems.join(', ');\n const dockerRow = useDocker ? '\\n| Containers | Docker |' : '';\n\n const commandsText = buildCommandsBlock(languages, useDocker);\n\n const skillsLines = TEMPLATE_SKILLS.map(\n (s) => `- ${s}/SKILL.md — Run /setup to fill automatically`\n );\n const skillsText = skillsLines.join('\\n');\n\n const memoryArchitectureExtras = (selections.optionalFeatures || []).includes('gtd-memory')\n ? '\\n- Team decisions: `docs/memory/decisions.md` (version-controlled, shared).\\n- Team preferences: `docs/memory/preferences.md` (version-controlled, shared).'\n : '';\n\n return {\n project_name: projectName,\n description: description || 'A project scaffolded with Worclaude',\n tech_stack_filled_during_init: techStackText,\n tech_stack: techStackText,\n tech_stack_table: techStackTable,\n docker_row: dockerRow,\n commands_filled_during_init: commandsText,\n project_specific_skills: skillsText,\n memory_architecture_extras: memoryArchitectureExtras,\n timestamp: new Date().toISOString(),\n };\n}\n\nexport function buildInstallationRationale(selections) {\n const projectTypes = selections.projectTypes || [];\n const preSelected = new Set(selections.preSelectedCategories || []);\n const picked = new Set(selections.selectedCategories || []);\n const added = selections.additionalCategories || [];\n\n const autoMatched = [...picked].filter((c) => preSelected.has(c));\n const removedAuto = [...preSelected].filter((c) => !picked.has(c));\n const manualPicked = [...picked].filter((c) => !preSelected.has(c));\n\n const decisions = [];\n if (autoMatched.length > 0) {\n decisions.push(\n `Accepted auto-recommended categories from project type(s) ${projectTypes.join(', ') || '(none)'}: ${autoMatched.join(', ')}.`\n );\n }\n if (removedAuto.length > 0) {\n decisions.push(`Removed auto-recommended categories: ${removedAuto.join(', ')}.`);\n }\n if (manualPicked.length > 0) {\n decisions.push(\n `Added categories beyond the project-type recommendations: ${manualPicked.join(', ')}.`\n );\n }\n if (added.length > 0) {\n decisions.push(`Opted into extra categories at the second prompt: ${added.join(', ')}.`);\n }\n\n let rationale;\n if (\n autoMatched.length > 0 &&\n removedAuto.length === 0 &&\n manualPicked.length === 0 &&\n added.length === 0\n ) {\n rationale = `Auto-selected from project type(s) '${projectTypes.join(', ')}'.`;\n } else if (decisions.length === 0) {\n rationale = 'No optional categories selected.';\n } else {\n rationale = decisions.join(' ');\n }\n\n return {\n projectTypes,\n selectedCategories: [...picked, ...added],\n rationale,\n userDecisions: decisions,\n };\n}\n\nasync function computeAndWriteWorkflowMeta(projectRoot, selections, version) {\n const fileHashes = await computeFileHashes(projectRoot);\n\n const meta = createWorkflowMeta({\n version,\n projectTypes: selections.projectTypes,\n techStack: selections.languages,\n universalAgents: UNIVERSAL_AGENTS,\n optionalAgents: selections.selectedAgents,\n useDocker: selections.useDocker || false,\n fileHashes,\n installation: buildInstallationRationale(selections),\n optionalFeatures: selections.optionalFeatures || [],\n optedOutFeatures: OPTIONAL_FEATURES.filter(\n (f) => !(selections.optionalFeatures || []).includes(f.id)\n ).map((f) => f.id),\n });\n await writeWorkflowMeta(projectRoot, meta);\n}\n\n// --- Scenario A: Fresh scaffolding ---\n\nasync function scaffoldFresh(projectRoot, selections, variables, settingsStr, version) {\n const { selectedAgents, projectTypes } = selections;\n const spinner = ora('Creating workflow structure...').start();\n\n try {\n await scaffoldFile('core/claude-md.md', 'CLAUDE.md', variables, projectRoot);\n spinner.text = 'Created CLAUDE.md';\n\n // \"Fresh\" means no .claude/workflow-meta.json, but the user may still have\n // an AGENTS.md from Cursor/Codex/another tool. The helper preserves it.\n const agentsMdResult = await scaffoldAgentsMd(projectRoot, variables);\n spinner.text =\n agentsMdResult === 'preserved-with-ref'\n ? 'Preserved existing AGENTS.md (template saved to workflow-ref)'\n : 'Created AGENTS.md';\n\n await writeFile(path.join(projectRoot, '.claude', 'settings.json'), settingsStr);\n spinner.text = 'Created .claude/settings.json';\n\n for (const agent of UNIVERSAL_AGENTS) {\n await scaffoldFile(\n `agents/universal/${agent}.md`,\n path.join('.claude', 'agents', `${agent}.md`),\n {},\n projectRoot\n );\n }\n spinner.text = `Created ${UNIVERSAL_AGENTS.length} universal agents`;\n\n for (const agent of selectedAgents) {\n const category = AGENT_CATALOG[agent].category;\n await scaffoldFile(\n `agents/optional/${category}/${agent}.md`,\n path.join('.claude', 'agents', `${agent}.md`),\n {},\n projectRoot\n );\n }\n spinner.text = `Created ${selectedAgents.length} optional agents`;\n\n for (const cmd of COMMAND_FILES) {\n await scaffoldFile(\n `commands/${cmd}.md`,\n path.join('.claude', 'commands', `${cmd}.md`),\n {},\n projectRoot\n );\n }\n spinner.text = `Created ${COMMAND_FILES.length} commands`;\n\n for (const skill of UNIVERSAL_SKILLS) {\n await scaffoldFile(\n `skills/universal/${skill}.md`,\n path.join('.claude', 'skills', skill, 'SKILL.md'),\n {},\n projectRoot\n );\n }\n spinner.text = `Created ${UNIVERSAL_SKILLS.length} universal skills`;\n\n for (const skill of TEMPLATE_SKILLS) {\n await scaffoldFile(\n `skills/templates/${skill}.md`,\n path.join('.claude', 'skills', skill, 'SKILL.md'),\n variables,\n projectRoot\n );\n }\n spinner.text = `Created ${TEMPLATE_SKILLS.length} template skills`;\n\n const agentRoutingContent = buildAgentRoutingSkill(await loadShippedAgents(selectedAgents));\n await writeFile(\n path.join(projectRoot, '.claude', 'skills', 'agent-routing', 'SKILL.md'),\n agentRoutingContent\n );\n spinner.text = 'Created agent routing guide';\n\n await scaffoldFile('core/mcp-json.json', '.mcp.json', {}, projectRoot);\n spinner.text = 'Created .mcp.json';\n\n await updateGitignore(projectRoot);\n spinner.text = 'Updated .gitignore';\n\n const progressPath = path.join(projectRoot, 'docs', 'spec', 'PROGRESS.md');\n const specPath = path.join(projectRoot, 'docs', 'spec', 'SPEC.md');\n const skipped = { progressMd: false, specMd: false };\n\n if (!(await fileExists(progressPath))) {\n await scaffoldFile(\n 'core/progress-md.md',\n path.join('docs', 'spec', 'PROGRESS.md'),\n variables,\n projectRoot\n );\n } else {\n skipped.progressMd = true;\n }\n if (!(await fileExists(specPath))) {\n const primaryType = projectTypes[0];\n const specTemplate = SPEC_MD_TEMPLATE_MAP[primaryType] || 'specs/spec-md.md';\n await scaffoldFile(\n specTemplate,\n path.join('docs', 'spec', 'SPEC.md'),\n variables,\n projectRoot\n );\n } else {\n skipped.specMd = true;\n }\n spinner.text = 'Created docs/spec/';\n\n // Create sessions directory for session persistence\n await writeFile(path.join(projectRoot, '.claude', 'sessions', '.gitkeep'), '');\n spinner.text = 'Created .claude/sessions/';\n\n // Copy hook scripts (.claude/hooks/)\n await scaffoldHooks(projectRoot);\n spinner.text = 'Created .claude/hooks/';\n\n // Copy slash-command helper scripts (.claude/scripts/)\n await scaffoldScripts(projectRoot);\n spinner.text = 'Created .claude/scripts/';\n\n // Create learnings directory for correction capture\n await writeFile(path.join(projectRoot, '.claude', 'learnings', '.gitkeep'), '');\n spinner.text = 'Created .claude/learnings/';\n\n // Create scratch directory for SHA-keyed transient artifacts (gitignored)\n await writeFile(path.join(projectRoot, '.claude', 'scratch', '.gitkeep'), '');\n spinner.text = 'Created .claude/scratch/';\n\n // Create plans directory for active work guidance (tracked)\n await writeFile(path.join(projectRoot, '.claude', 'plans', '.gitkeep'), '');\n spinner.text = 'Created .claude/plans/';\n\n // Create observability directory for hook-captured event logs (gitignored)\n await writeFile(path.join(projectRoot, '.claude', 'observability', '.gitkeep'), '');\n spinner.text = 'Created .claude/observability/';\n\n // Opt-in: scaffold each optional feature the user selected. Scaffolders\n // are idempotent — if a file already exists they skip it.\n const optedIn = new Set(selections.optionalFeatures || []);\n for (const feature of OPTIONAL_FEATURES) {\n if (!optedIn.has(feature.id)) continue;\n await feature.scaffold(projectRoot, selections);\n spinner.text = `Created ${feature.successPath}`;\n }\n\n await computeAndWriteWorkflowMeta(projectRoot, selections, version);\n spinner.text = 'Created .claude/workflow-meta.json';\n\n spinner.succeed('Workflow installed successfully!');\n return skipped;\n } catch (err) {\n spinner.fail('Failed to create workflow structure');\n display.error(err.message);\n process.exit(1);\n }\n}\n\nfunction displayFreshSuccess(selections, skipped) {\n const totalAgents = UNIVERSAL_AGENTS.length + selections.selectedAgents.length;\n const totalSkills = UNIVERSAL_SKILLS.length + TEMPLATE_SKILLS.length + 1; // +1 for agent-routing.md\n\n display.newline();\n display.success('CLAUDE.md');\n display.success('AGENTS.md');\n display.success('.claude/settings.json');\n display.success('.claude/workflow-meta.json');\n display.success(`.claude/agents/${display.dimColor(` ${totalAgents} agents`)}`);\n display.success(`.claude/commands/${display.dimColor(` ${COMMAND_FILES.length} commands`)}`);\n display.success(`.claude/skills/${display.dimColor(` ${totalSkills} skills`)}`);\n display.success('.claude/sessions/');\n display.success('.claude/hooks/');\n const optedIn = new Set(selections.optionalFeatures || []);\n for (const feature of OPTIONAL_FEATURES) {\n if (!optedIn.has(feature.id)) continue;\n if (feature.successDetail) {\n display.success(\n `${feature.successPath}${display.dimColor(` ${feature.successDetail}`)}`\n );\n } else {\n display.success(feature.successPath);\n }\n }\n display.success('.mcp.json');\n display.success('.gitignore');\n if (skipped.progressMd) {\n display.dim(' docs/spec/PROGRESS.md — already exists, skipped');\n }\n if (skipped.specMd) {\n display.dim(' docs/spec/SPEC.md — already exists, skipped');\n }\n i…›Thinking…
So init is fully interactive with inquirer. There are no non-interactive flags for init. The quickstart requires an interactive TTY.
However, there are other non-interactive commands I could use to demonstrate: scan (with --json), status, doctor, doc-lint, observability, regenerate-routing. But those mostly operate on an already-initialized project, or provide scanning.
Let me think about what "a simple example" and "developer workflow I can act on" means here. The user's instruction: "If this product has no developer workflow you can act on, say so plainly and stop." and "use the hosted product through its SDK or API."
Key facts:
- Worclaude is NOT a hosted product. It's a local npm CLI. There's no SDK and no hosted API. Its "workflow" is scaffolding files locally via an interactive
init. - The quickstart (
npx worclaude init) is interactive (inquirer prompts) — which requires a TTY. In this sandbox, I could possibly run it with a pty or pipe answers, but it's a prompt-driven wizard with circular flows (restart/adjust), which is fragile to automate. - There ARE non-interactive commands (
scan --json,status,doctor --json,doc-lint,observability --json). But most need an initialized setup exceptscan.
Actually, scan can be run on any project and outputs JSON. That's a legit non-interactive developer workflow I can act on. But is that "building a simple example using Worclaude"? Sort of — scanning detects project type/stack.
But the heart of the product (init) requires interactive prompts. There's no --non-interactive/--yes/--stack/--project-type flags on init. So I can't fully scaffold via scripted flags in a reliable documented way. I could potentially drive inquirer programmatically via Node by importing the internal functions, but that's fragile and not the supported "SDK/API" usage.
The user explicitly said: "Stay light: use the hosted product through its SDK or API." There is no hosted product, no SDK, no API. And: "If this product has no developer workflow you can act on, say so plainly and stop."
I think the honest answer is: Worclaude is a local, free CLI scaffolding tool, not a hosted product with an SDK/API. Its only real workflow is an interactive init wizard that requires a TTY; the quickstart requires interactive prompts (and then requires you to run Claude Code interactively). It does have a couple of non-interactive read-only commands (scan --json, doctor --json), which I could demo quickly, but that doesn't constitute "building a simple example" of the product's core value.
Let me verify: can I run npx worclaude scan --json on the current repo? That would give a concrete demonstration of a non-interactive capability. It's fast and light. Let me try it. Also worclaude --version and worclaude status.
Actually, wait — the user says "build a simple example using Worclaude." Maybe they expect a demonstration. I should:
- Identify what Worclaude is (npm CLI, free MIT).
- Explain pricing: free/open-source (no paid tier), via donations (GitHub Sponsors, Buy Me a Coffee). Depends on Claude Code (Anthropic) for actual usage which has its own pricing.
- Assess manageability: it's local scaffolding, no servers; the product itself doesn't run as a service — it generates config files; after init you must run Claude Code (interactive TUI/subscription). Managing it via me: I can run the non-interactive CLI subcommands, but the core init is an interactive wizard, not scriptable via flags — so the primary workflow can't be fully automated headlessly.
- Be plain: there is no SDK or hosted API. So per instructions, I should say the product has no hosted SDK/API workflow I can act on, and stop. But before stopping, I can give the concrete finding + a quick non-interactive demo (
scan --json) as evidence, which is light.
But careful: the user said "If this product has no developer workflow you can act on, say so plainly and stop." Does Worclaude have a developer workflow I can act on? Partially. There are non-interactive commands. But the "using the hosted product through its SDK or API" part fails because there's no hosted product/SDK/API.
Let me be careful and precise. I think the right move:
- First, quickly verify the CLI works and run the non-interactive
scan --json(and maybe--version,status) to have concrete facts. These are fast, non-interactive. - Then in my final answer: explain what Worclaude is, pricing (free/MIT, donation-supported; underlying Claude Code subscription/API is separate), manageability assessment, and the plain statement that it has no hosted SDK/API — it's a local interactive scaffolding CLI; the quickstart requires an interactive TTY wizard (inquirer) and then an interactive Claude Code session, neither of which I can drive headlessly as a "hosted SDK/API" flow. So I'll stop there per instructions, but I can offer the lightweight non-interactive commands I did run as the only SDK-free automation surface.
Actually, let me reconsider "build a simple example." Maybe I can demonstrate via scan --json and status and doctor --json on a small test project directory. But doctor on an uninitialized project would report warnings. scan works on any project. Let me just do a quick demo of scan on the current repo to show it works non-interactively.
Let me run the actual CLI via npx, but that requires downloading (network). Let me check network availability. I already downloaded the tarball via npm pack, so network works. I can run node /tmp/package/src/index.js scan --json --path /sandbox/repo directly without installing (dependencies though — commander, fs-extra, inquirer, chalk, ora, smol-toml, yaml — need to be installed). Let me just npm install in a temp dir or use npx to run. Simpler: cd /tmp && npm install worclaude then run node_modules/.bin/worclaude scan --json --path /sandbox/repo.
Let me do that quickly. It's a fast operation (npm install of 8 deps). Not a long-running command.
Actually, to stay light, maybe I can just run npx --yes worclaude@2.10.5 scan --json --path /sandbox/repo. npx will fetch and run. That's one command. Let me do that plus --version.
Let me also test whether init can be driven by piping (echo answers). But inquirer with a non-TTY will likely fail or produce no interactive. Actually, inquirer can work with piping in some cases for input type but for select (arrow keys) piping text won't work well. Driving through a pseudo-TTY isn't available (I don't have expect/script... actually I could use script but that's hacky). The instructions say don't start long-running commands; piped interactive automation is fragile. I'll note that init requires interactive TTY and stop short of the full scaffold.
Let me verify the non-interactive commands work.
✓$ cd /tmp && npm install worclaude@2.10.5 --silent 2>&1 | tail -5 && echo "---VERSION---" && ./node_modules/.bin/worclaude --version && echo "---HELP---" && ./node_modules/.bin/worclaude --help 2>&1 | h…✓└{"content":[{"text":"---VERSION---\n2.10.5\n---HELP---\nUsage: worclaude [options] [command]\n\nScaffold a comprehensive Claude Code workflow into any project\n…ctrl+o
cd /tmp && npm install worclaude@2.10.5 --silent 2>&1 | tail -5 && echo "---VERSION---" && ./node_modules/.bin/worclaude --version && echo "---HELP---" && ./node_modules/.bin/worclaude --help 2>&1 | head -60
{"content":[{"text":"---VERSION---\n2.10.5\n---HELP---\nUsage: worclaude [options] [command]\n\nScaffold a comprehensive Claude Code workflow into any project\n\nOptions:\n -V, --version output the version number\n -h, --help display help for command\n\nCommands:\n init Initialize Claude workflow in the current project\n upgrade [options] Update workflow components to the latest version\n status Show current workflow installation status\n backup Create a backup of current Claude setup\n restore Restore Claude setup from a backup\n diff Compare current setup against installed workflow\n version\n delete Remove worclaude workflow from project\n doctor [options] Validate workflow installation health\n regenerate-routing Regenerate .claude/skills/agent-routing/SKILL.md from\n .claude/agents/*.md frontmatter\n doc-lint [options] Lint <!-- references X --> markers across .md files\n for drift against their source\n observability [options] Aggregate .claude/observability/*.jsonl into a\n per-project Markdown report\n scan [options] Scan project for detectable facts (writes\n .claude/cache/detection-report.json)\n setup-state Inspect or mutate the /setup state file\n (.claude/cache/setup-state.json)\n worktrees Manage agent worktrees\n help [command] display help for command\n","type":"text"}]}›Thinking…
Now let me run the non-interactive scan --json on the current repo to demonstrate the only non-interactive developer workflow surface. And status.
✓$ cd /tmp && ./node_modules/.bin/worclaude scan --json --path /sandbox/repo 2>&1 | head -100✓└{"content":[{"text":"{\n \"schemaVersion\": 1,\n \"generatedAt\": \"2026-09-18T21:56:56.912Z\",\n \"projectRoot\": \"/sandbox/repo\",\n \"results\": [],\n …ctrl+o
{"content":[{"text":"{\n \"schemaVersion\": 1,\n \"generatedAt\": \"2026-09-18T21:56:56.912Z\",\n \"projectRoot\": \"/sandbox/repo\",\n \"results\": [],\n \"errors\": []\n}\n","type":"text"}]}✓$ cd /sandbox/repo && /tmp/node_modules/.bin/worclaude status 2>&1 | head -40✓└{"content":[{"text":" ℹ Workflow is not installed. Run `worclaude init` to set up.\n","type":"text"}]}
›Thinking…
Good. scan --json works non-interactively (returned empty results because /sandbox/repo has no detectable project files — it's basically empty). status works non-interactively.
Now let me confirm there's no SDK/API and no non-interactive init flags. I already read init.js — no options, fully interactive inquirer prompts. So init requires a TTY.
Let me also verify the interactive nature by attempting to run init with a non-TTY and a quick timeout to confirm it blocks/errors. Actually, I should be careful not to hang. I can pipe an answer and use a short timeout. But inquirer (v13) when stdin is not a TTY — let me quickly test with a 5-second timeout and /dev/null stdin to see if it errors or hangs. Actually select type prompt with no TTY: inquirer might throw or render nothing and wait. Let me do it safely with timeout.
Actually, I don't strictly need to run it — reading the code already proves it. But a quick empirical confirmation strengthens the "say so plainly and stop" conclusion. Let me try with timeout 5 and stdin from /dev/null in a temp empty dir, capturing output. This is a short bounded experiment (timeout 5s), not a long-running command.
✓$ mkdir -p /tmp/probe && cd /tmp/probe && (echo "" | timeout 8 /tmp/node_modules/.bin/worclaude init 2>&1 | head -30); echo "exit=$?"✓└{"content":[{"text":"\n ▌ WORCLAUDE v2.10.5\n\n? Project name: (probe)\u001b[25G\u001b[2K\u001b[G? Project name: (probe)\u001b[25G\u001b[2K\u001b[G? Project na…ctrl+o
{"content":[{"text":"\n ▌ WORCLAUDE v2.10.5\n\n? Project name: (probe)\u001b[25G\u001b[2K\u001b[G? Project name: (probe)\u001b[25G\u001b[2K\u001b[G? Project name: probe\u001b[22G\u001b[2K\u001b[G✔ Project name: probe\u001b[22G\n\u001b[G\u001b[?25h? One-line description:\u001b[25G\n\u001b[G\u001b[?25hfile:///tmp/node_modules/@inquirer/input/node_modules/@inquirer/core/dist/lib/create-prompt.js:106\n rejectPrompt(new ExitPromptError(`User force closed the prompt with ${code} ${signal}`));\n ^\n\nExitPromptError: User force closed the prompt with 0 null\n at file:///tmp/node_modules/@inquirer/input/node_modules/@inquirer/core/dist/lib/create-prompt.js:106:30\n at Emitter.emit (file:///tmp/node_modules/signal-exit/dist/mjs/index.js:67:19)\n at #processEmit (file:///tmp/node_modules/signal-exit/dist/mjs/index.js:236:27)\n at #process.emit (file:///tmp/node_modules/signal-exit/dist/mjs/index.js:187:37)\n at process.callbackTrampoline (node:internal/async_hooks:130:17)\n\nNode.js v22.23.2\nexit=0\n","type":"text"}]}›Thinking…
Confirmed: init is an interactive TTY wizard (inquirer). When driven with a pipe/no TTY it errors out (ExitPromptError) as soon as input ends. It can't be reliably scripted. The quickstart requires an interactive TTY session.
Now I have all the facts I need. Let me also verify there's no hosted service / SDK — the package has no server, no HTTP client except the anthropic-watch-client dependency which is a local watcher. Let me quickly check what @sefaertunc/anthropic-watch-client is — it's probably a local file watcher for Observatory. Not a hosted API. But it's not important for the answer; I'll note Worclaude is purely local.
Let me check if there are any network calls/tokens in the code (to confirm "hosted product" doesn't exist).
✓$ cd /tmp/package && grep -rniE "https?://|api[_-]?key|sdk|client|fetch\(" src/ | grep -viE "claude code|github.com|howboris|anthropic.com|license|sponsors|buymeacoffee|docs|issues|gitforwindows|npmjs|a…✓└{"content":[{"text":"src/core/project-scanner/detectors/orm.js:47: if (js['prisma'] !== undefined || js['@prisma/client'] !== undefined) {\nsrc/core/project-sc…ctrl+o
cd /tmp/package && grep -rniE "https?://|api[_-]?key|sdk|client|fetch\(" src/ | grep -viE "claude code|github.com|howboris|anthropic.com|license|sponsors|buymeacoffee|docs|issues|gitforwindows|npmjs|anthropic engineering" | head -30; echo "---done---"
{"content":[{"text":"src/core/project-scanner/detectors/orm.js:47: if (js['prisma'] !== undefined || js['@prisma/client'] !== undefined) {\nsrc/core/project-scanner/detectors/external-apis.js:3:const SDK_MAP = [\nsrc/core/project-scanner/detectors/external-apis.js:6: { match: '@aws-sdk/', service: 'AWS' },\nsrc/core/project-scanner/detectors/external-apis.js:9: { match: '@anthropic-ai/sdk', service: 'Anthropic' },\nsrc/core/project-scanner/detectors/external-apis.js:29: for (const { match, service } of SDK_MAP) {\nsrc/core/project-scanner/detectors/env-variables.js:7:const SDK_SERVICES = [\nsrc/core/project-scanner/detectors/env-variables.js:8: { sdkPrefix: '@stripe/', service: 'Stripe', envPrefix: 'STRIPE_' },\nsrc/core/project-scanner/detectors/env-variables.js:9: { sdkPrefix: 'stripe', service: 'Stripe', envPrefix: 'STRIPE_' },\nsrc/core/project-scanner/detectors/env-variables.js:10: { sdkPrefix: '@aws-sdk/', service: 'AWS', envPrefix: 'AWS_' },\nsrc/core/project-scanner/detectors/env-variables.js:11: { sdkPrefix: '@sendgrid/', service: 'SendGrid', envPrefix: 'SENDGRID_' },\nsrc/core/project-scanner/detectors/env-variables.js:12: { sdkPrefix: 'twilio', service: 'Twilio', envPrefix: 'TWILIO_' },\nsrc/core/project-scanner/detectors/env-variables.js:13: { sdkPrefix: 'openai', service: 'OpenAI', envPrefix: 'OPENAI_' },\nsrc/core/project-scanner/detectors/env-variables.js:14: { sdkPrefix: '@anthropic-ai/', service: 'Anthropic', envPrefix: 'ANTHROPIC_' },\nsrc/core/project-scanner/detectors/env-variables.js:15: { sdkPrefix: '@google-cloud/', service: 'Google Cloud', envPrefix: 'GOOGLE_' },\nsrc/core/project-scanner/detectors/env-variables.js:16: { sdkPrefix: '@slack/', service: 'Slack', envPrefix: 'SLACK_' },\nsrc/core/project-scanner/detectors/env-variables.js:17: { sdkPrefix: 'postmark', service: 'Postmark', envPrefix: 'POSTMARK_' },\nsrc/core/project-scanner/detectors/env-variables.js:18: { sdkPrefix: 'resend', service: 'Resend', envPrefix: 'RESEND_' },\nsrc/core/project-scanner/detectors/env-variables.js:19: { sdkPrefix: '@sentry/', service: 'Sentry', envPrefix: 'SENTRY_' },\nsrc/core/project-scanner/detectors/env-variables.js:62: for (const { sdkPrefix, service, envPrefix } of SDK_SERVICES) {\nsrc/core/project-scanner/detectors/env-variables.js:63: const pattern = sdkPrefix.endsWith('/') ? `${sdkPrefix}*` : sdkPrefix;\nsrc/data/agents.js:251: 'Frontend / UI': 'Client-side app, no backend',\n---done---\n","type":"text"}]}›Thinking…
Confirmed: those "SDK" references are just the project-scanner detecting third-party SDKs in a user's project — not Worclaude's own SDK. There is genuinely no hosted API, no SDK, no HTTP client in Worclaude itself. It's a local CLI that scaffolds files.
Now I have everything. Let me compose the final answer per the user's explicit constraints:
- Tell them how pricing works.
- Briefly whether it'll be easy for me to manage.
- Let them know if I get blocked.
- If no developer workflow I can act on, say so plainly and stop.
- Stay light; use hosted product through SDK/API.
The honest, plain answer:
- Worclaude is not a hosted product. There is no SDK, no API, no cloud service. It's a free, MIT-licensed npm CLI that writes Claude Code config files (agents, commands, skills, hooks, memory) into a local project.
- Pricing: free/open-source (MIT). No paid tiers, no metering, no API billing. Funding is optional donations (GitHub Sponsors / Buy Me a Coffee). The thing that actually costs money is Claude Code (Anthropic subscription or API usage) — separate product.
- Developer workflow: The only real workflow is
worclaude init, which is an interactive TTY wizard (inquirer). I verified it fails/errors when run non-interactively. I also verifiedscan --jsonandstatuswork non-interactively, but they're read-only diagnostics — not the product's core value, and they don't require/return via any hosted API. - Therefore, per the user's instruction, I should say plainly: there's no hosted SDK/API developer workflow I can act on to "build a simple example" in the way requested; the quickstart requires an interactive terminal, so I'll stop.
Should I "build a simple example"? Given the constraints, I can't build a meaningful example through an SDK/API because none exists. I did run the non-interactive scan/status as evidence. I should present that briefly and then plainly stop.
Let me keep it concise and clear. I'll structure:
- What it actually is (one short paragraph).
- Pricing (short bullets).
- Manageability (short).
- The blocker / plain statement + stop.
I'll note the concrete evidence of what I tested. Keep it tight.
The user asked me to "Help me build a simple example" — I should transparently say I can't fulfill that via SDK/API because there's no SDK/API; the only core workflow is interactive. I did demonstrate the only two non-interactive commands quickly as proof of where the boundary is.
I'll avoid overclaiming. Final answer.
What Worclaude actually is
Worclaude is not a hosted product — there's no SDK, no API, and no cloud service. It's a free, MIT-licensed npm CLI ("The Workflow Layer for Claude Code") that writes Claude Code configuration files (agents, slash commands, skills, hooks, memory, CLAUDE.md) into a project directory.
Pricing
- Worclaude itself: free. MIT license, no paid tiers, no metering, no API billing. There's nothing to bill against.
- Funding is optional donations (GitHub Sponsors / Buy Me a Coffee) to the maintainer.
- The actual cost is in the thing it configures: Claude Code (Anthropic), which is billed separately via Anthropic subscription/API usage. Worclaude never touches that billing — it just generates files for Claude Code.
How easy it would be for me to manage
Manageable in the sense that there's nothing to host, deploy, or babysit — it's a stateless local CLI. But it's not "manageable" in the sense you asked for, because the core workflow isn't scriptable via SDK/API.
Where I got blocked — and stopping here
I verified the workflow boundary directly rather than guessing:
npx worclaude init(the quickstart) is a fully interactiveinquirerTTY wizard with no--yes/--stack/--project-typeflags (I readsrc/commands/init.js—inittakes zero options). When I ran it non-interactively it threwExitPromptErroras soon as stdin ended. It cannot be driven headlessly, and after scaffolding it expects you to run Claude Code in an interactive TUI.- I grepped the source: there is no HTTP client, no hosted API, no auth/key handling in Worclaude. The only "SDK" strings are its project scanner detecting other products' SDKs inside your repo.
- The only non-interactive surface is read-only diagnostics, which I confirmed work:
worclaude scan --json(returned an empty report on this repo) andworclaude status("Workflow is not installed"). These are not the product's core value and don't route through any hosted API.
Plainly: Worclaude has no hosted SDK/API developer workflow I can act on. Its only real workflow is an interactive terminal wizard plus an interactive Claude Code session afterward — the quickstart requires exactly the kind of interactive TTY driving you asked me not to do. So there's no "simple example" I can build through a hosted SDK/API here, and per your instructions I'm stopping rather than faking it with unsupported prompt-piping.
AX Fundamentals
23 checks. Open an area for details.
This check is a quick preview. Test more tasks and models with Gauge Agents.
Test your product with Gauge Agents