{"_id":"@alabasta/mcp","_rev":"7-f1562e03a691cf319cb9581292811d1a","name":"@alabasta/mcp","dist-tags":{"latest":"0.7.1"},"versions":{"0.1.0":{"name":"@alabasta/mcp","version":"0.1.0","_id":"@alabasta/mcp@0.1.0","maintainers":[{"name":"cowboyshibuya","email":"cowboyshibuya@pm.me"}],"bin":{"alabasta":"dist/cli.js","alabasta-mcp":"dist/index.js"},"dist":{"shasum":"b07a28d6275c0353c8df380872143d611753d734","tarball":"https://registry.npmjs.org/@alabasta/mcp/-/mcp-0.1.0.tgz","fileCount":6,"integrity":"sha512-rplmo8JEDosFsAC6srwCFpfOViQe+sitA0hjcZgqr8aMZGB+hM/peYPtUcLVA2K0l1tmUFzhAAqUgJiNqWfzVg==","signatures":[{"sig":"MEUCIB1M+XEEl7qhTiKmKZQvTJ+BkD+qi5tohgF6XWWY/uqgAiEAoQodEd9KJwW2KqIMR0pBJZHeV3mG4D+CjjxtVTwFPT4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":23215},"type":"module","shasum":"b07a28d6275c0353c8df380872143d611753d734","engines":{"node":">=18"},"scripts":{"dev":"tsc && node dist/index.js","build":"tsc","start":"node dist/index.js"},"_npmUser":{"name":"cowboyshibuya","email":"cowboyshibuya@pm.me"},"_integrity":"sha512-rplmo8JEDosFsAC6srwCFpfOViQe+sitA0hjcZgqr8aMZGB+hM/peYPtUcLVA2K0l1tmUFzhAAqUgJiNqWfzVg==","_npmVersion":"10.8.3","description":"MCP server that connects coding agents (Claude Code, Codex) to Alabasta tasks — read a task and submit a structured resolution.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"zod":"^3.23.8","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.1.0_1783942564343_0.23115846832592823","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@alabasta/mcp","version":"0.1.1","_id":"@alabasta/mcp@0.1.1","maintainers":[{"name":"cowboyshibuya","email":"cowboyshibuya@pm.me"}],"bin":{"mcp":"dist/index.js","alabasta":"dist/cli.js"},"dist":{"shasum":"2cfc62be2018dee9e59f0dd54967abb675215460","tarball":"https://registry.npmjs.org/@alabasta/mcp/-/mcp-0.1.1.tgz","fileCount":6,"integrity":"sha512-mXJVkhmUt9pkctye12AzDruyU6HoL1C+U87tBvfUyzKiuE5oa7J6vBcU+KIqiz1NS0zgj/EaqH7fgTJvJ2HnBA==","signatures":[{"sig":"MEYCIQCyA3HZz4KeYo02yEF3CBuHS7Gb7OS2cfty/yVq3R9R2QIhANuSxIF64KBe26ZkeSWKFXCWEMipzd8Y40HXUNh7ajkp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":23206},"type":"module","shasum":"2cfc62be2018dee9e59f0dd54967abb675215460","engines":{"node":">=18"},"scripts":{"dev":"tsc && node dist/index.js","build":"tsc","start":"node dist/index.js"},"_npmUser":{"name":"cowboyshibuya","email":"cowboyshibuya@pm.me"},"_integrity":"sha512-mXJVkhmUt9pkctye12AzDruyU6HoL1C+U87tBvfUyzKiuE5oa7J6vBcU+KIqiz1NS0zgj/EaqH7fgTJvJ2HnBA==","_npmVersion":"10.8.3","description":"MCP server that connects coding agents (Claude Code, Codex) to Alabasta tasks — read a task and submit a structured resolution.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"zod":"^3.23.8","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.1.1_1783942746818_0.07925755272226875","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@alabasta/mcp","version":"0.2.0","_id":"@alabasta/mcp@0.2.0","maintainers":[{"name":"cowboyshibuya","email":"cowboyshibuya@pm.me"}],"bin":{"mcp":"dist/index.js","alabasta":"dist/cli.js"},"dist":{"shasum":"3706f74873c6d8b90fdf1a22af39fcf735233efa","tarball":"https://registry.npmjs.org/@alabasta/mcp/-/mcp-0.2.0.tgz","fileCount":6,"integrity":"sha512-hKxoOAHI9ou/b4TXmtFVU1F1u3zgr2zW8Tb8e1HT1BrYKQ2APVn+q+etbFVoB0gnSk8IlSEmpsxywMDMQGIT5A==","signatures":[{"sig":"MEUCIQDqg9qWT43AbuOHJNNnbNBOKLF8sJ4SnRMyT11/zG1xDAIgPnDK5gXlKOSFBDwIm3IhrSt2bVHgOxiqxFC4sVIee3M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29056},"type":"module","engines":{"node":">=18"},"gitHead":"004be42996b8d2ad58abce32aa15513b25c0374f","scripts":{"dev":"tsc && node dist/index.js","build":"tsc","start":"node dist/index.js"},"_npmUser":{"name":"cowboyshibuya","email":"cowboyshibuya@pm.me"},"_npmVersion":"11.17.0","description":"MCP server that connects coding agents (Claude Code, Codex) to Alabasta tasks — read a task and submit a structured resolution.","directories":{},"_nodeVersion":"26.5.1","dependencies":{"zod":"^3.23.8","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.2.0_1786039154722_0.7819953237674915","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@alabasta/mcp","version":"0.3.0","_id":"@alabasta/mcp@0.3.0","maintainers":[{"name":"cowboyshibuya","email":"cowboyshibuya@pm.me"}],"bin":{"mcp":"dist/index.js","alabasta":"dist/cli.js"},"dist":{"shasum":"917c7988f0cafd2b8b12eace465507491c40df0a","tarball":"https://registry.npmjs.org/@alabasta/mcp/-/mcp-0.3.0.tgz","fileCount":6,"integrity":"sha512-T4+5C+b2IVwgmOyyDivDlvuQmMU2acaLrxNB+fOknI6rQxpcz+bBb2PCD+MCe7ZLUPNtvvh2ki0thtZ082n0cA==","signatures":[{"sig":"MEYCIQCRIMqZgzb7qKvvQg61roc137kkG34o0SaCIKWVvcneuAIhAKPLflMCbMcu1HWMtICtPue0+CS8xVDoCdqD71aNZIIa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":32834},"type":"module","engines":{"node":">=18"},"gitHead":"e8f35454d06f4f9d72253375e913cbb4c5cb4ac2","scripts":{"dev":"tsc && node dist/index.js","build":"tsc","start":"node dist/index.js"},"_npmUser":{"name":"cowboyshibuya","email":"cowboyshibuya@pm.me"},"_npmVersion":"11.19.0","description":"MCP server that connects coding agents (Claude Code, Codex) to Alabasta tasks — read a task and submit a structured resolution.","directories":{},"_nodeVersion":"26.7.0","dependencies":{"zod":"^3.23.8","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.3.0_1786631387611_0.6464802532851888","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@alabasta/mcp","version":"0.5.0","_id":"@alabasta/mcp@0.5.0","maintainers":[{"name":"cowboyshibuya","email":"cowboyshibuya@pm.me"}],"bin":{"mcp":"dist/index.js","alabasta":"dist/cli.js"},"dist":{"shasum":"a8e524823389c59ce39dc3bf893dc39ce10a9731","tarball":"https://registry.npmjs.org/@alabasta/mcp/-/mcp-0.5.0.tgz","fileCount":6,"integrity":"sha512-so9W99d9nzYV+UIpybIhptS2VR4fD/3UnldgUHSVugEfxIxWrbZ3+PGlQjpOzGXuo+Au+oHuZHzSbJ9AhAb/FA==","signatures":[{"sig":"MEUCIFjhx8p9SGwnsYmpNLmNuxs8GrWWStY26I845mwAHrcnAiEA/mhTSV0yIUh23/Y/t5zn3Cq/EwBbom2PLByzJ8Xbr30=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":48748},"type":"module","engines":{"node":">=18"},"gitHead":"aca571eec863f3236ff368cd3a5c14986606270e","scripts":{"dev":"tsc && node dist/index.js","build":"tsc","start":"node dist/index.js"},"_npmUser":{"name":"cowboyshibuya","email":"cowboyshibuya@pm.me"},"_npmVersion":"11.19.0","description":"MCP server that connects coding agents (Claude Code, Codex) to Alabasta tasks — read a task and submit a structured resolution.","directories":{},"_nodeVersion":"26.7.0","dependencies":{"zod":"^3.23.8","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.5.0_1786640801503_0.6066558753035332","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@alabasta/mcp","version":"0.7.0","_id":"@alabasta/mcp@0.7.0","maintainers":[{"name":"cowboyshibuya","email":"cowboyshibuya@pm.me"}],"bin":{"mcp":"dist/index.js","alabasta":"dist/cli.js"},"dist":{"shasum":"74f470cf03cff6f9a3edb883c39e9f7f701ee046","tarball":"https://registry.npmjs.org/@alabasta/mcp/-/mcp-0.7.0.tgz","fileCount":7,"integrity":"sha512-m4jxA9P+ePhinlqOXlnpBwsDNRmo4qno9SSU0W9ShI3FBsWIrFeRxt7qR3eDqM+5Jfyl79ntTg2CKQDC5+CuTQ==","signatures":[{"sig":"MEQCIGm7Q0Q8MuiqOgXTD1HU5nHF5hGGY6c27PHultwq6FTCAiA9Je93y1xr/Cmar43vaFBnU2fFWnrd5RORhqQM3zzkMw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51676},"type":"module","engines":{"node":">=18"},"gitHead":"a84b31b8a69b9a1ab14abfb63bf1915736e169db","scripts":{"dev":"tsc && node dist/index.js","test":"node --test dist/contracts.test.js","build":"tsc","start":"node dist/index.js"},"_npmUser":{"name":"cowboyshibuya","email":"cowboyshibuya@pm.me"},"_npmVersion":"11.19.0","description":"MCP server that connects coding agents (Claude Code, Codex) to Alabasta tasks — read a task and submit a structured resolution.","directories":{},"_nodeVersion":"26.7.0","dependencies":{"zod":"^3.23.8","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.7.0_1787234568855_0.7805036361827014","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@alabasta/mcp","version":"0.7.1","description":"MCP server that connects coding agents (Claude Code, Codex) to Alabasta tasks — read a task and submit a structured resolution.","type":"module","bin":{"mcp":"dist/index.js","alabasta":"dist/cli.js"},"engines":{"node":">=18"},"scripts":{"build":"tsc","test":"node --test dist/contracts.test.js","start":"node dist/index.js","dev":"tsc && node dist/index.js"},"dependencies":{"@modelcontextprotocol/sdk":"^1.12.0","zod":"^3.23.8"},"devDependencies":{"@types/node":"^22.0.0","typescript":"^5.6.0"},"gitHead":"f76d89b46613df6c709f63b817a87529a48b621d","_id":"@alabasta/mcp@0.7.1","_nodeVersion":"26.7.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-JE8QKE+of2ufaZZ+cVVePG3chVWZ27rNsd3hd1Q6ScPwboDa+ugtJqGVdAzIQzhVUhm34bxdMhmhu222InNHgQ==","shasum":"d20fbe9ba62fb552c450a597a26bc1158026a42f","tarball":"https://registry.npmjs.org/@alabasta/mcp/-/mcp-0.7.1.tgz","fileCount":7,"unpackedSize":56974,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCpiYgabUadYFvOJKbp1sCpGL2YA4XE+ZwqgNzHVQSIAgIgDZGSuO86JujZ3ZyKRse0Bc72W2dK5qCsDEPKCedfT1M="}]},"_npmUser":{"name":"cowboyshibuya","email":"cowboyshibuya@pm.me"},"directories":{},"maintainers":[{"name":"cowboyshibuya","email":"cowboyshibuya@pm.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp_0.7.1_1787506474350_0.6256366381995757"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-13T11:36:04.203Z","modified":"2026-08-23T17:34:34.836Z","0.1.0":"2026-07-13T11:36:04.487Z","0.1.1":"2026-07-13T11:39:06.958Z","0.2.0":"2026-08-06T17:59:14.878Z","0.3.0":"2026-08-13T14:29:47.794Z","0.5.0":"2026-08-13T17:06:41.640Z","0.7.0":"2026-08-20T14:02:49.034Z","0.7.1":"2026-08-23T17:34:34.563Z"},"description":"MCP server that connects coding agents (Claude Code, Codex) to Alabasta tasks — read a task and submit a structured resolution.","maintainers":[{"name":"cowboyshibuya","email":"cowboyshibuya@pm.me"}],"readme":"# @alabasta/mcp\n\nMCP server that connects coding agents (Claude Code, Codex, Cursor, …) to\n[Alabasta](https://alabasta.io) tasks. The agent can read a task, start work, and\nsubmit a **structured resolution** — what changed, verification, what's\nunverified, deferred work, references — which a human reviews inside Alabasta.\n\nIt never overwrites the task description and never marks a task done: submitting a\nresolution moves the task to **review**, and only a human Accept reaches **Done**.\n\nThis is a thin stdio adapter over Alabasta's `/agent/v1/*` HTTP API. The API key\nencodes the workspace and principal, so that plus the site URL is all the config\nit needs.\n\n## Setup\n\n1. In Alabasta, go to **Workspace settings → Agent access** and generate an API\n   key (shown once).\n2. Note your deployment's site URL — the `https://<deployment>.convex.site` value\n   (`NEXT_PUBLIC_CONVEX_SITE_URL`).\n\n### Claude Code\n\n```bash\nclaude mcp add alabasta \\\n  --env ALABASTA_SITE_URL=https://<deployment>.convex.site \\\n  --env ALABASTA_API_KEY=alab_sk_... \\\n  -- npx -y @alabasta/mcp\n```\n\n### Codex / manual (`.mcp.json`)\n\n```json\n{\n  \"mcpServers\": {\n    \"alabasta\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@alabasta/mcp\"],\n      \"env\": {\n        \"ALABASTA_SITE_URL\": \"https://<deployment>.convex.site\",\n        \"ALABASTA_API_KEY\": \"alab_sk_...\"\n      }\n    }\n  }\n}\n```\n\n### Environment\n\n| Variable | Required | Purpose |\n|---|---|---|\n| `ALABASTA_SITE_URL` | yes | `https://<deployment>.convex.site` |\n| `ALABASTA_API_KEY` | yes | Workspace API key (`alab_sk_...`) |\n| `ALABASTA_TASK_ID` | no | Default task for this session (a launcher can export it, so tools work without a `taskId` argument) |\n| `ALABASTA_RUN_ID` | no | Correlates a resolution to an agent run (used as `externalRunId` for idempotent resubmits) |\n\n## Tools\n\n| Tool | Does |\n|---|---|\n| `alabasta_get_context` | **Call this once, first.** Objective, requirements, the constraints that apply, and anything blocking the task |\n| `alabasta_read_resource` | Read one `alabasta://` URI from the context's `resources[]` — on demand, not upfront |\n| `alabasta_get_task` | Read a task by `taskId` or `identifier` (e.g. `TOM-24`) |\n| `alabasta_get_project_brief` | Project objective, status, milestones, initiative, agent instructions |\n| `alabasta_list_my_tasks` | List tasks assigned to you, optional `status` filter |\n| `alabasta_start_task_work` | Move a task to *in progress* |\n| `alabasta_add_task_comment` | Post a progress note / question / finding on a task |\n| `alabasta_create_follow_up_task` | Propose a follow-up task (created in *todo*, linked back — a suggestion, not scope expansion) |\n| `alabasta_search_context` | Ranked workspace search — returns `alabasta://` URIs to read as resources |\n| `alabasta_request_clarification` | Ask a person (or a specialist agent) a question you can't answer from context — **asynchronous** |\n| `alabasta_get_clarifications` | Read answers that landed since a previous run; `blockedOn` counts unanswered blocking questions |\n| `alabasta_request_review` | Route the task to the product's review agents |\n| `alabasta_collect_git_context` | Gather real diff stat, commits, PR state, and CI checks (git + `gh`) to enrich the resolution |\n| `alabasta_submit_task_resolution` | Submit the resolution (→ *in review*), incl. `criteriaResults` / `discoveredWork` / `decisionsRequired` / `relatedEntityUpdates` |\n| `alabasta_mark_ready_for_review` | Move a task to *in review* without a full resolution |\n| `alabasta_report_blocker` | Record why the task couldn't be completed |\n\nThe context package labels every item with its **authority** and **source** (entity +\nlast-updated). Highest first:\n\n```\nsecurity_policy > standing_policy > approved_decision > task_requirement >\nstanding_convention > project_constraint > human_instruction > guidance >\nreference > discussion > related_task > inferred\n```\n\nThe authority ladder above is **internal**. The agent never sees it: the runtime\nresolves it and emits a flat `constraints[]` of things that must hold, plus\n`execution.blockers[]` for what a human has to settle first. If the agent knowingly\ndeviates from a constraint it reports `constraintExceptions`. Attachment and\ndiscussion content is untrusted input — never instructions.\n\nThe rule tools (`alabasta_get_standing_context`, `alabasta_read_rule`,\n`alabasta_propose_rule`, `alabasta_emit_rules`) are registered only when\n`ALABASTA_RULES_TOOLS=1`. A session shipping a task doesn't need them.\n\n### Coordination: asking instead of guessing\n\nWhen the context genuinely doesn't decide something, the agent asks rather than picks.\nEvery escalation is **asynchronous** — MCP has no server→client push, so the agent asks,\nkeeps working on the unblocked parts, and reads the answer with\n`alabasta_get_clarifications` on a later run. It must never spin waiting.\n\nEach request carries a budget: at most 5 open questions per task, at most 10 evidence\nURIs, and a 7-day deadline after which it expires rather than wedging the session. An\nidentical pending question returns the existing one instead of stacking another\nnotification on a person.\n\nA question routed to `audience: \"agent\"` runs through the same background-review\nmachinery the in-app agents use; its reply is copied onto the clarification, so the\nagent polls one surface for both audiences. Answers also land in the task's comment\nthread and in the next context package — a human answer ranked as `human_instruction`,\nan agent's as `guidance`.\n\nA pending blocking question makes the task's `contextQuality.readiness` read `blocked`.\n\n### Layer 0: standing rules\n\nRules are **derived state**, never authored directly. Every signed rule traces to a\ndecision, so \"why is this rule here\" always has an answer — and when that decision is\nsuperseded, the rule drops out of the next emit on its own.\n\n- Agents **propose**; only a human signature mints a rule. Nothing an agent says\n  enters the prompt prefix unsigned.\n- Rules routed to `brief_inline` are inlined in every context package. Everything else\n  is a pointer (`alabasta://rules/RUL-12`) — a fetch is a countable citation.\n- Inlined rules can't be measured by fetch, so they are recovered at the write\n  boundary when an agent volunteers them. **Citation is never required** — demanding\n  it in a workspace with no rules in scope left the agent no way through but to invent\n  a rule id. A cited id must be real and in scope; an absent one is fine.\n\n## Resources (`alabasta://`)\n\nThe context package's `contextIndex.resources` lists deeper material as MCP\nresources, readable on demand (and `@`-mentionable in Claude Code):\n\n| URI | Content |\n|---|---|\n| `alabasta://tasks/{id}` | Full task + description |\n| `alabasta://tasks/{id}/context` | The compiled package itself |\n| `alabasta://tasks/{id}/discussion` | Full discussion thread |\n| `alabasta://tasks/{id}/criteria` | Acceptance criteria |\n| `alabasta://decisions/{id}` | Decision: summary, reasoning, tradeoffs, consequences |\n| `alabasta://projects/{id}/brief` | Project objective, milestones, agent instructions |\n| `alabasta://memories/{id}` | Memory item (rule, constraint, conflict, open question) |\n| `alabasta://files/{id}` | Attachment metadata + storage URL (content never inlined) |\n| `alabasta://documents/{id}` | Document content |\n| `alabasta://rules/{id}` | One standing rule + the decision behind it |\n| `alabasta://standing/context` | Every rule in scope |\n\nThe package also carries `conflicts[]` (deterministic flags only — superseded\ndecisions, `contradicts` relations, conflict/open-question memories, and\nrule-vs-task conflicts an earlier run actually reported; no NLP guesswork) and\n`contextQuality` (readiness + what's missing). A conflict means: ask, don't guess.\n\nResolution submits are idempotent on `(taskId, externalRunId, revision)` — a\nresubmit updates the same record; a new `revision` creates a new attempt.\n\n## CLI launcher\n\nBind a coding-agent session to a task in one command:\n\n```bash\nalabasta work TOM-24 --agent claude   # or --agent codex\nalabasta work TOM-24 --branch         # also cut a branch: tom/TOM-24-<slug>\nalabasta work TOM-24 --print          # print the env + command instead of launching\n```\n\nIt fetches the task, mints a run id, exports `ALABASTA_TASK_ID` + `ALABASTA_RUN_ID`, and\nlaunches the agent with a priming prompt — the installed plugin (skill + MCP + hooks)\ntakes it from there. `--print` is what the Alabasta UI's \"Copy agent command\" produces.\nNeeds `ALABASTA_SITE_URL` + `ALABASTA_API_KEY` in the environment.\n\n### Syncing rules into the repo\n\n```bash\nalabasta rules sync                      # write AGENTS.md from the signed rules\nalabasta rules sync --target claude_md   # writes CLAUDE.md\nalabasta rules sync --scope repo:web     # workspace rules + this repo's rules\nalabasta rules sync --product <id>       # workspace + product rules\nalabasta rules sync --check              # exit 1 if the on-disk digest has drifted\n```\n\nThe written file carries a digest header. It is a **build artifact** — hand edits are\noverwritten, and `--check` (also run automatically by the SessionStart hook) tells you\nwhen the file and the workspace have diverged. Commit it like any other generated file.\n\n## Claude Code plugin (skill + enforcement)\n\n`claude-plugin/` bundles three layers so the feature is reliable, not just possible:\n\n- **Hands** — `.mcp.json` wires the MCP server above (set `ALABASTA_SITE_URL` +\n  `ALABASTA_API_KEY` in your env).\n- **Training** — `skills/task-resolution/SKILL.md` teaches the agent the resolution\n  protocol, format, and invariants (preserve scope; separate verified from unverified; no\n  conversational text).\n- **Enforcement** — `hooks/stop.py` (a Stop hook) blocks the agent from finishing when it\n  edited code for a linked Alabasta task but never submitted a resolution. It nudges at most\n  twice, then allows the stop, so it can never trap a session. Task linkage comes from\n  `ALABASTA_TASK_ID` or a branch name containing an identifier (e.g. `tom/TOM-24-fix`).\n  `hooks/rules_drift.py` (a SessionStart hook) warns when the repo's emitted rules file has\n  drifted from the workspace. Advisory only — it never blocks, and fails open on any error.\n\nRequires `python3` (stdlib only). Install it via the bundled marketplace:\n\n```\n/plugin marketplace add cowboyshibuya/alabasta-agent-bridge   # or a local path to this repo\n/plugin install alabasta@alabasta\n```\n\nThe marketplace catalog is `.claude-plugin/marketplace.json` at the repo root; the plugin\nsource is the self-contained `claude-plugin/` directory. (Relative-path sources need a git or\nlocal marketplace add, not a bare URL to the JSON file.) Alternatively, copy\n`hooks/hooks.json` into your `.claude/settings.json` and the skill into `.claude/skills/`.\n\n## Develop\n\n```bash\nbun install      # or npm install\nnpm run build    # tsc -> dist/\nnode dist/index.js\n```\n\n## Roadmap\n\nDone: MCP server (hands), resolution skill (training), Stop-hook enforcement\n(Claude Code **and** Codex — see [`codex/`](./codex)), the `alabasta work` CLI\nlauncher, Git/CI/PR enrichment (`alabasta_collect_git_context`), the\nmarketplace-installable Claude Code plugin bundle, and Layer 0 standing rules\n(standing context, `rules sync` + drift hook, rule citation at the write\nboundary). Next: a remote HTTP\ntransport (enabling per-user OAuth) and automated CI publishing — see\n[DEVELOPMENT.md](./DEVELOPMENT.md#8-roadmap).\n\n## Contributing / maintaining this repo\n\nSee [DEVELOPMENT.md](./DEVELOPMENT.md) — what MCP is, how the pieces fit together, how to\nadd a new tool, and how to publish a new version (including the exact failure modes hit\nthe first time and how to avoid them).\n","readmeFilename":"README.md"}