$ craftar doctor [--fetch] [--strict] [--json] # one line per finding, each with its fix$ craftar docs validate [path] [--fetch] [--strict] [--json] # the workspace's Markdown: links, leaked tool-call tags, encoding, the profile's docs: block
Checks this machine — Node ≥ 22, git, ~/.craftar, the registry, the Forge cache — and, inside a workspace, its configuration and Forge, the plan's warnings, declared parameters with no value (an error when a file the plan writes cites one, a warn when nothing does), the variables a written MCP server declares in authEnv or references as ${NAME} and the environment lacks (names only, never values), the lock, status and registration, and — in a workspace with a local service — Docker with its Compose plugin and the variables a service fragment needs that nothing sets (names only), and — when the profile declares templates — the templates block and, for a dotnet-new entry, the .NET SDK — and the planned AGENTS.md against its byte budget — and, under agents-md.primary, a CLAUDE.md, CLAUDE.local.md or .claude/CLAUDE.md — at the root or in a directory above it — that keeps Claude Code from reading AGENTS.md and the Kiro agents' hand-written resources — and, when the plan writes a hook's registration, a planned handler that is in no settings file Claude Code reads (at most a warn, so --strict exits 1 until the block is copied) — and, when claude-code writes a skill as one file, that Claude Code (measured with 2.1.310) does not list it (a warn per skill, with the fix, so --strict exits 1; the file is still written) — and, in a git repository, a generated file git ignores (generated-ignored, a warn, unless the path is listed under mayBeIgnored) — and a hook craftar git-hooks wrote (git-hooks) — and a path that leaves the workspace through a symbolic link (workspace-links, an error). Each finding is one line — ok, warn or error — with the command that fixes it. It only reports: nothing is written to a workspace, a lock or the registry, and a remote Forge is read from the cache unless --fetch is given. It exits 1 on an error, or on a warn under --strict; --json is a contract for tooling. craftar docs validate checks a workspace's Markdown under docs/, .claude/ and at its root — links that resolve inside the workspace, tool-call tags leaked outside code, files that are not UTF-8 text and, where the profile declares a docs: block, its categories, required frontmatter, dated file names and related: entries — one line per finding, naming a file, a line and a column, never a line of the file; it writes nothing and reads without the network unless --fetch, which concerns the Forge only. Planned: a rulesync check once it is a dependency.