Arkgate

io.github.pedroknigge由 GitHub 账号 pedroknigge 发布v4.8.24更新于 Oct 24, 2026

When the agent writes a bad import, the write doesn’t land. The same check fails the pull request.

已验证STDIO仅桌面开发者工具安全与监控

概览

AI 生成的概览

ArkGate 为 AI 编写的 TypeScript 执行导入分层规则,在支持的宿主上写入时拦截违规导入,并让拉取请求检查失败。

可以做什么
ArkGate 是面向 AI 代理编写的 TypeScript 项目的导入规则闸门。它检查某一层的文件是否导入了不该导入的内容,例如领域文件导入基础设施,并给出违规报告和下一步建议。在支持的宿主上,写入前的钩子可以拦截所列出的写入操作,同一检查也会作为必需状态在 CI 中运行。可选项还包括层内规则、实验性的内存运行时,以及对少数重大产品选择的保护。
适用场景
当 AI 代理在具有多层边界的仓库中编写 TypeScript,并且你希望在违规导入落地之前就阻止它,而不只是在代理完成后才发现时,值得添加。对于没有代理、没有分层边界的小型代码库,或不愿维护配置文件与必需 CI 状态的团队,则属于过度配置。
运行要求
作为 npm 包在本地运行(npx arkgate,当前版本 4.8.25),需要 Node.js 以及 npm、pnpm 或 yarn。要获得硬性保证,还需要规则文件和一个运行严格合并检查的必需 GitHub 状态。未声明任何认证、环境变量或请求头。
安装前请注意
写入时拦截并非完整保证:它只覆盖受支持宿主上所列出的钩子操作,shell 写入、托管工具和人工编辑不在其内。未设置 failClosed 的 Cursor 钩子是失败开放的,检查器无法运行时写入仍会落地。仓库级的硬性防线是必需的 GitHub 状态;没有它,规则文件只是文档。可选的 ArkRun 存储为内存实现,重启后不会保留。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Arkgate,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

ArkGate — Write. Check. Ship.

When the agent writes a bad import, the write doesn’t land. The same check fails the pull request.

[Website] [CI] [npm] [License: MIT] [Node] [TS 5–7]

ArkGate is import rules for AI-written TypeScript. Contener · Guiar · Ordenar: contain what the AI may write, and in what shape. Guide the next step. Order leftover mess toward a clean tree, a little at a time.

Why

AI takes the shortest path. One bad import lands, then another, and the product gets harder to change. A linter that runs only after the agent finishes sees the mess too late.

Design the boundary before you implement. Put a small interface in front of the work and keep the detail behind it. When leftover mess remains, the honest light is needs a refactor. Weakening the rules to paint the check green leaves that design unfinished.

Try it

One command. Preview only — no files change. Current release is 4.8.30 (check npm latest with npm view arkgate version):

bash

What a red result looks like

After a rules file exists, a domain file that imports infrastructure fails the check (exit 1). This is real output from arkgate-check on [email protected]:

text
✖ LAYER_IMPORT_VIOLATION  src/domain/order.ts:1  DomainModel → Infrastructure  (src/infra/db.ts)  DomainModel must not import Infrastructure.  Next action: Classify the import: if it is constants/types/pure, adopt into DomainModel or SharedKernel; define a port only if the target is a real use-case. Then preflight again.
✖ 1 violation(s).

Do that next action. Classify the import, or introduce a port when the dependency is a real use case. Then run the check again.

That red line is the check. It does not stop every write. On Cursor, a hook without failClosed: true is fail-open: if the checker cannot run, the write still lands. Shell writes, hosted tools, and human edits are outside the local hook. The hard line for every path is a required GitHub status running arkgate-check --strict-merge. Until that status is required, the rules file is just documentation.

Anyone: Use ArkGate · Developers: Develop · This library: CONTRIBUTING


Appendix

The minute above is the product. Below is reference: the longer introduction, what this is not, hosts, commands, extras, and where release history lives.

Choose your path

You are…Go here
Anyone (ship with AI, minimal jargon)Use ArkGate
Developer (hosts, CI, config, brownfield)Develop with ArkGate
Contributor (improve this library)CONTRIBUTING

Full map: docs/README.md

The longer introduction

AI can build fast—and make a mess just as fast.

Keep the product easy to understand, change, and trust.

Contain what the AI may write, and in what shape. Guide you with proven patterns and one next step. Order leftover mess toward a clean tree, a little at a time.

Safer changes, fewer surprises, and extra protection only when you choose it.

That is Contener · Guiar · Ordenar.

What this is not

Not an API Gateway. Not a folder linter. If the check is not required on the PR, the config is just documentation.

ArkGate is not a web framework, ORM, or job runner. The npm package is arkgate — not affiliated with the separate Archgate CLI project.

ArkRun is an optional experimental runtime. In-memory. Not Postgres. @arkgate/runtime is deprecated. ArkOrder does not replace import rules: layers can be green while the agent still rewrites the billing plan like a seat count.

What it is

text
  src/domain/order.ts       │  import { db } from "../infra/postgres"       ▼  ┌──────────────────────────────────────────┐  │  CHECK                                   │  │  Domain ─✕─▶ Infrastructure              │  │  write doesn't land · PR check fails     │  └──────────────────────────────────────────┘

When the agent writes a bad import, the write doesn’t land. The same check fails the pull request. That is ArkGate — import rules, always on once you adopt (Contener). The other three are optional.

RoleWhen
While the agent writesThe write doesn’t land on supported hosts; warning only elsewhereAlways (ArkGate)
Before mergearkgate-check as a required CI statusAlways (ArkGate)
ArkRulesOptional policies inside a layer (Contener — shape)When you ask
ArkRunOptional experimental runtime (arkgate/runtime) (Guiar)Off unless you turn it on
ArkOrderExtra for the few big choices — billing plan, not seat counts (arkgate/order) (Ordenar)Off unless you turn it on

Layers (who may import whom) always run. ArkRules, ArkRun, and ArkOrder change no inter-layer verdict when absent. Label leftovers [Layer] vs [ArkRules] vs [ArkRun] vs [ArkOrder]. Details: configuration · use.

text
  ┌─────────┐     ┌─────────┐     ┌─────────┐  │  WRITE  │────▶│  CHECK  │────▶│  SHIP   │  │  agent  │     │  block  │     │  merge  │  └─────────┘     └────┬────┘     └─────────┘                       │                       ▼                 bad import                 doesn't land

[Write gate: agent blocked, then self-corrects]

Adopted means a required GitHub status running arkgate-check --strict-merge, or an explicit advisory-only stance. Status is compact (arkgate-check --doctor; --all for details).

When not to adopt

ArkGate is overkill for small trees with no AI agents and no multi-layer boundaries, for single-developer hobby CRUDs under no integration pressure, and for teams that will not maintain ark.config.json or a required CI status running arkgate-check --strict-merge. Without that status the rules file is just documentation — stay with a boundary linter alone (see Why not only ESLint / Nx / cruiser?). Anyone path: docs/use.md — When not to adopt. Limits of a green check: 4.3.0 — What ArkGate is / isn't.


Status lights (not settings)

text
  [ Setup ] ──▶ [ In progress ] ──▶ [ Ready ]                                      │                                      └── Ready · needs a refactor
LightMeansYour move
SetupThin / new treeFinish start → status
In progressNot fully protectedStatus action #1
ReadyHonest import edges, and no new UI business-rule files vs merge-baseKeep write path + CI
Ready · needs a refactorEdges clean; leftover design work remainsOne small change — not “done”

Details: docs/use.md.


Start in one minute

bash
npx arkgate start                 # preview files + commandsnpx arkgate start --apply         # compact config + host router + CI plannpx --package=arkgate arkgate-check --doctor        # status — one next stepnpx --package=arkgate arkgate-check --doctor --all  # full details

start --apply pins arkgate with this repo's package manager (pnpm add -w / yarn add -W at a workspace root). Do not run npm install -D arkgate at a workspace:* root — npm rejects that protocol. After a local install, npx arkgate-check --doctor also works. arkgate-check is a command in the arkgate package, not its own npm package. If pnpm Age (minimumReleaseAge) blocks a brand-new release, keep using npx --package=arkgate@<version> — do not re-run the same add. Put arkgate on minimumReleaseAgeExclude in pnpm config or pnpm-workspace.yaml (a CLI flag is not enough), or wait until the package is mature.

start --apply refuses when projected governed coverage is below 50% or shape confidence is weak (below 0.6 with coverage under 80%), or when the planned write is too big for compact start (more than 8 gate files or 32 KB). That lock is deliberate. Coverage/shape: lock with --archetype <id>, --preset <name>, or --force. Size: --force does not unlock. Next: npx arkgate-check --init. Or inspect ranked shapes with npx arkgate-check --recommend.

That is the fuller path. Stuck? Run status (--doctor) and do action #1.

text
start → doctor → new files in the right folder              ↘ leftover mess: map, then one small refactor

Keep the rules file out of product PRs. Local check: ark-check --local --base origin/dev (same as --changed; refused with --strict-merge). Changing the rules themselves uses --contract-session.

Aliases ark / ark-check / ark-mcp still work. npm / pnpm / yarn. No install lifecycle scripts — and none on pack or prepare either, so pnpm add git+https://github.com/pedroknigge/arkgate installs at a pinned commit with no allowBuilds entry. A git install gives you the CLIs and the schemas; the library, MCP and ESLint entry points live in the built dist/ and come from npm. See docs/package-surface.md.


Host enforcement support

HostLocal write boundaryMCP validationCI / merge pathRepair payload
Claude CodeHard block for listed ops (PreToolUse Write / Edit / MultiEdit) when installed + trustedAdvisory; the agent must call itRequired GitHub status context running arkgate-check --strict-merge (alias ark-check)Emitted on hook deny; host must re-inject (hard path when installed + trusted)
Grok BuildHard block for listed ops (PreToolUse write / search_replace (plus aliases)) when installed + trustedAdvisory; the agent must call itRequired GitHub status context running arkgate-check --strict-merge (alias ark-check)Emitted on hook deny; host must re-inject (hard path when installed + trusted)
Google AntigravityHard block for listed ops (PreToolUse write_to_file / replace_file_content / multi_replace_file_content) when installed + trustedAdvisory; the agent must call itRequired GitHub status context running arkgate-check --strict-merge (alias ark-check)Emitted on hook deny; host must re-inject (hard path when installed + trusted)
CursorHard block for listed ops (preToolUse Write / StrReplace) when installed + trustedAdvisory; the agent must call itRequired GitHub status context running arkgate-check --strict-merge (alias ark-check)Envelope may emit (--hook-repair); reinjection not guaranteed
OpenAI CodexHard block for listed ops (PreToolUse apply_patch in Codex CLI and local ChatGPT Desktop/App Server) when installed + trustedAdvisory; the agent must call itRequired GitHub status context running arkgate-check --strict-merge (alias ark-check)Envelope may emit (--hook-repair); reinjection not guaranteed
OpenCodeAdvisory / best-effort at write (MCP + optional plugin; not a hard boundary)Advisory; the agent must call itRequired GitHub status context running arkgate-check --strict-merge (alias ark-check)No hard-boundary payload

Read the CI column: for every host, the repository-wide hard guarantee is a required GitHub status context that runs the CLI — not “CI file present,” and not the CLI binary name alone. Codex hard write covers only a complete local apply_patch; Cursor covers only listed preToolUse ops with failClosed: true. A Cursor hook without that flag is fail-open (if the checker cannot run, the write still lands). In both cases the project hook must be installed + trusted, while shell/direct filesystem writes, hosted or specialized opt-out paths, and human edits still rely on CI.

This table describes the supported profile after its files are installed and the host loads/trusts them. A hard local boundary covers only the listed hook operations; alternate tools, direct filesystem writes, and human edits still rely on CI. Write-gate order: install and trust the host pre-hook first. MCP prepare is fallback when that path is missing or fail-open. MCP validation is advisory because the agent must call it. The CI check blocks a merge only when the repository makes that status required. Repair envelopes may be emitted without reinjection being guaranteed; silent auto-apply never happens. Run arkgate-check --doctor (or ark-check --doctor) for the evidence actually detected in the current repository.

Why required CI is the hard line

The split above is a deliberate trade-off, not a gap. ArkGate validates at the earliest boundary each host offers and enforces at the earliest boundary a repository can make non-bypassable: the required merge status. Hard hooks (Claude Code, Grok Build, Google Antigravity, Cursor, and Codex’s complete local apply_patch) deny their listed write operations at write time; advisory surfaces (MCP, rules, OpenCode plugins) warn the agent while it works. But any local boundary can be routed around — another tool, a hosted/specialized path, a direct filesystem write, or a human edit — so the only guarantee ArkGate claims for every path is the arkgate-check --strict-merge check, and only when the repository makes that status required. Local checks optimize feedback speed; required CI owns correctness.

A useful consequence: the rules file doubles as a pressure sensor. Recurring violations or baseline exceptions concentrated on one layer edge are evidence that the current design stopped fitting the code — a reason to reshape the rules deliberately (start with /ark-explore), never to weaken the check.

Setup per host: docs/ai-gates.md · Develop path: docs/develop.md

For authoritative MCP contract evidence, call ark_identity with the exact project root, then call ark_manifest with that root plus the returned project id. A contained descendant requires the matching id. The legacy ark://manifest resource remains compatibility-only and always unverified/non-authoritative because standard resources/read cannot portably carry that expectation.


Why not only ESLint / Nx / cruiser?

ArkGateTypical boundary linter
CI import rules✅✅
Hard-block AI writes on supported hosts✅❌
Project-bound rules agents can read (ark_manifest)✅❌
Placement + preflight for multi-file changes✅❌
Honest governed % + dual plan (edges vs shape)✅❌
Opt-in intra-layer ArkRules (structure + invariants)✅❌
Stops rewriting a big product choice like billing plan (ArkOrder)✅❌
Incomplete analysis cannot look green✅varies

Common commands

bash
npx arkgate start --applynpx arkgate status --json          # session/project snapshot (identity, activation, last check)npx arkgate-check --doctornpx arkgate-check --plannpx arkgate-check --coveragenpx arkgate-check --path-drift --base-ref origin/main   # stale paths in strings/comments after a renamenpx arkgate-check --sensors        # which sensors can EVER be enforced, and which of your rules can be promotednpx arkgate-check --promote        # what enforcing each advisory rule would cost, from one runnpx arkgate-check --strict-merge   # CI / required statusnpx arkgate-check --install-agent-gates --tools claude,cursor,codex,grok,antigravity# optional: refresh shared home skills (Claude/Grok/Antigravity/Codex; never downgrades)# npx arkgate-check --install-agent-gates --skills-only --agent-homes --force# optional: closed skill catalog via Agent Skills ecosystem (ARK_SKILL_NAMES)# npx skills add ./node_modules/arkgate/templates/agent-skills# optional ArkRun: poll the loopback inspector (ANSI TUI — not a gate)# npx ark-dashboard --url http://127.0.0.1:<port>/snapshot

More: docs/develop.md · skills install: docs/agent-guide.md · enthusiast track: docs/enthusiast/

Other skills, only when you need them

Day-to-day work uses the compact router and status. The full /ark-* pack is expert depth: install it when you want a guided next step, not as the first action. Catalog and install paths: Install skills — Ark and ecosystem.


Optional ArkRun

Gates need no app runtime. Skip this unless you want an optional runtime for decoupling.

ArkRun (arkgate/runtime, same npm package) is that runtime. Each createStrictArkKernel() call is a new instance — no process singleton. Data lives in memory and dies on restart. Fine for local. Not Postgres, not an outbox, not Temporal. @arkgate/runtime is deprecated.

Dev inspector and observability dashboard

Opt-in startInspector() binds loopback only (127.0.0.1), refuses NODE_ENV=production, and serves JSON facts — not a TUI. Alongside GET /snapshot, GET /events (SSE), and GET /graph, the inspector exposes queue monitors:

PathBody (JSON)
GET /outboxPending/failed outbox summaries + counts (available, pendingCount, failedCount, pending, failed) — no event payloads
GET /workflowsWorkflow summaries + counts (available, total, runningCount, …, workflows)

Poll those facts from the dual bins ark-dashboard / arkgate-dashboard (bin/ark-dashboard.mjs). ANSI + polling only (no React/Ink/Blessed). Point --url / -u at the inspector (handle.url or handle.snapshotUrl); the dashboard also fetches sibling /outbox and /workflows. startInspector() binds a random port unless you pass { port }, so the fallback http://127.0.0.1:3000/snapshot (or ARK_DASHBOARD_URL) only matches startInspector({ port: 3000 }). --interval / -i is clamped to 200–60000 ms (default 2000); --once, --help, --version are supported. Also available as ark dashboard / arkgate dashboard (passthrough to the same bin). Kernel stays JSON-only; presentation stays in bin/.

Durability stance

Default stores (InMemoryEventBuffer, InMemoryAuditStore, InMemoryReadModelStore, InMemoryWorkflowStore) are reference in-memory only. Fine for tests. They do not survive restarts and are not production durability. Wire real store interfaces for production. Details: docs/production-hardening.md.


Optional ArkOrder

Layers stop a bad import. ArkOrder stops rewriting a big product choice — like the billing plan — as if it were a seat count. Change those choices through a valve, not a generic update.

Off unless you add arkOrder. Same npm package (arkgate/order). In-memory. Not a service. Does not replace ArkGate or ArkRun.

Name the few choices (xiKeys: plan, cycle, tenancy — not seat counts). First freeze is release(). Later change is proposeRelease then apply. A generic update does not land.

Proof path (GitHub, not the npm tarball): examples/arkorder-billing — first freeze is release(); later plan change is proposeRelease then apply. Gallery index: examples/README.md. Compact starters leave the extra off. Details: ArkOrder.


Documentation

AudienceLink
Docs hubdocs/README.md
Anyonedocs/use.md
Developers integrating ArkGatedocs/develop.md
Contributors to this libraryCONTRIBUTING.md
Host install detaildocs/ai-gates.md
Config · package surface · TSconfiguration · package-surface · typescript-support
Brownfielddocs/brownfield-adoption.md
SecuritySECURITY.md
Release historyCHANGELOG.md · site changelog · docs hub index
History / maintainer evidencedocs/archive/

Version notes live in CHANGELOG.md and on the site changelog. The docs hub keeps the per-version index: History and maintainer material.


Contribute to this library

bash
git clone https://github.com/pedroknigge/arkgatecd arkgate && npm ci && npm run buildnpm test && npm run check:architecture

Full guide: CONTRIBUTING.md · queue: ROADMAP.md


Website: arkgate.online · npm: arkgate
MCP: io.github.pedroknigge/arkgate
Node ≥ 18 · MIT

Ark doesn’t invent your product. It rejects the illegal write — and tells you when it isn’t really enforcing anything yet.

来源:README.md,提交 cdc2dc5

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

2
  1. v4.8.24最新Sep 29, 2026
  2. v4.8.11Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分