agent-core-dev
Skill53 starsChanged 14 days agoMITView on GitHub
Use when developing in packages/agent-core-v2 (the DI × Scope agent engine) — adding or modifying a domain Service, choosing a LifecycleScope, wiring DI dependencies, splitting a domain across scopes, owning or migrating a config section, gating behavior behind an experimental flag, raising coded errors, working on the permission system, writing DI/Scope tests, porting business logic from agent-core (v1) to v2, triaging a main-branch commit against v2, or exposing a v2 domain over server-v2 while keeping the /api/v1 wire contract compatible with released clients. Self-contained guide organized by development stage (orient → design → implement → test → verify) plus align workflows for v1→v2 migration, main-branch commit triage, and server-v2 wire exposure; each file carries the rules, examples, and red lines for its step.
In this repository12 other files it gives its agents.
- AGENTS.mdAGENTS.md
- docs/AGENTS.mdAGENTS.md
- agent-core-reviewSkill
- gen-changesetsSkill
- gen-docsSkill
- kiki-docs-catchupSkill
- kiki-docsSkill
- kiki-docs-writingSkill
- pre-changelogSkill
- sync-changelogSkill
- translate-docsSkill
- write-tuiSkill
The file
We split this skill into the rules it gives an agent
1 rule. About 0 are common, 1 is distinctive, and 0 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 64
No cyclic dependencies — refactor (extract a third Service / use an event / re-scope).
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
agent-core-dev
Develop
packages/agent-core-v2by lifecycle stage. This skill is self-contained: every rule, recipe, and red line lives in the stage files below — it does not delegate topackages/agent-core-v2/docs/.
agent-core-v2 is the new agent engine built on the DI × Scope architecture (a port of packages/agent-core). Everything resolves through the container: a service declares an identity, its dependencies, and a lifetime; the container decides construction, singleton-per-scope, ordering, and disposal. The stage files restate the rules in imperative form so you can work without reading the source docs.
Lifecycle at a glance
Orient → Design → Implement → Test → Verify
│ │ │ │ │
│ │ │ │ └─ lint:imports · typecheck · test · dep graph · red lines
│ │ │ └─ test.md
│ │ └─ implement.md (+ errors.md · flags.md · permission.md)
│ └─ design.md
└─ orient.mdStages are ordered but not strictly linear: a test failure (stage 4) that reveals a wrong scope sends you back to design (stage 2); a CyclicDependencyError sends you to design.md §dependency-direction and implement.md §cycles.
Workflows
End-to-end procedures that span the stages. Reach for these before reading the stage files individually.
- Align (port
agent-core→agent-core-v2): split a v1 class into semantic units, fix each unit's domain / scope / Service / dependencies, then migrate the logic and tests. Use when the task is "move feature X from v1 to v2" or "portIXxxServiceto v2". - Commit align (triage a
maincommit against v2): given onemaincommit hash + a short note, find the v1 logic it changed, check whether v2 already has the corresponding implementation, bucket it (aligned / partial / missing / not-applicable), and recommend a minimal fix. Use in thekimi-code-v2-catching-up-to-mainphase, for one commit at a time; escalate to align.md if the gap is a whole domain. - Server align (expose
agent-core-v2overserver-v2): wire a v2 domain intopackages/kap-serverover/api/v2(native) and/api/v1(v1-compatible mirror), keep the wire schema byte-compatible with the established v1 contract by sharing the@moonshot-ai/protocolschema, and isolate v1-only behavior in a<domain>Legacyedge adapter instead of distorting the native v2 Service. Use when the task is "expose the new v2 Service on the server", "add a route to the/api/v1surface", or "keep server-v2 wire-compatible with released v1 clients".
Stages
- Stage 1 — Orient: the DI black box (identity / dependencies / lifetime), the four
LifecycleScopetiers and visibility, and the no-comment convention. Read before touching business code. - Stage 2 — Design a service: pick a scope, split a domain across scopes, choose a calling style (direct call vs event vs hook), and direct dependencies. Decide where things live and who knows whom before coding.
- Topic: Domain boundaries vs Scope — keep
session/agent/turnfrom becoming god objects; data-ownership test and their split conclusions. - Topic: Persistence layering — the three-layer
Store → Storage → backendmodel, naming Stores by access pattern, and which layer business code should depend on. - Topic: Edge exposure —
resource:action+ WS events — which Services are exposed over/api/v2(per-scope action map) and which events stream over WS; what to wrap in a facade. - Topic: Hot-path unbounded-work checklist — mandatory data-volume, trigger-frequency, caching, pagination, degradation, and observability checks before adding any route, poller, timer, or projection that reads session/workspace data.
- Topic: Domain boundaries vs Scope — keep
- Stage 3 — Implement: the standard Service recipe and the DI building blocks — interface + identity, constructor injection, scoped registration,
Disposable, eager vs delayed,invokeFunction,createInstance, child scopes, and the cycle-refactor playbook.- Topic: Service authoring — file layout, naming, contract vs impl contents, interface style, constructor/field conventions, events, multi-Service domains, comment rules.
- Topic: Config — the section-registry model, App vs Session split, owning a config section, the TOML format, and the env overlay.
- Topic: Errors — co-located
XxxError, the central code registry, wire serialization, boundary translation. - Topic: Flags —
registerFlagDefinition,IFlagService.enabled(id), the[experimental]config section, resolution precedence. - Topic: Permission — risk-only chain-of-responsibility kernel, harness constraints and product reviews as domain
onBeforeExecuteToolveto listeners (veto/allow/pass/ coldwaitUntilfactories), sharedtoolApprovalround-trip, policy registry + composer,modes/agentTypesmetadata,resolveExecution/accesses. - Topic: Telemetry — emitting events via
ITelemetryService, context propagation, and appender destinations.
- Stage 4 — Test: resolve the system under test by interface, pick
TestInstantiationServicevscreateScopedTestHost, shared stubs, service groups, teardown. - Stage 5 — Verify & submit:
lint:imports,typecheck,test, and the pre-submit checklist.
How to use this skill
Jump to the stage you are in and read that one file; each is self-contained and ends with its own red lines. Skim the global red lines below before submitting — they catch most mistakes across every stage. The repo's source of truth remains the code in packages/agent-core-v2/src/; this skill codifies the same rules so you do not have to re-derive them.
Global red lines
Invariants that hold across every stage. Each is expanded in the stage file noted.
- No
newon a class whose constructor carries@IServicedeps — inject with@IXoraccessor.get(IX). (implement.md) @IXdecorates constructor parameters only; parameter order depends on construction (static-first forcreateInstance,@IX-first for scoped services). (service-authoring.md)- Both interface and impl carry
_serviceBrand; thecreateDecoratorname is globally unique. (implement.md) - Parent scope never depends on child scope — short-lived may inject long-lived, never the reverse. (orient.md)
- No cyclic dependencies — refactor (extract a third Service / use an event / re-scope); activation timing does not break dependency cycles. (design.md, implement.md)
ServicesAccessoris valid only duringinvokeFunction— never stash it for async use. (implement.md)- Scope follows state identity — no
Map<sessionId, …>atAppto fake per-session state. (design.md) - Foundational layers never know upstream ones; business code never depends on the edge layer (
gateway/rpc). (design.md) - Throw coded errors; register codes centrally; branch on
codeacross the wire, neverinstanceof. (errors.md) - Product features default on. A real rollout or rollback flag uses
registerFlagDefinitionandIFlagService.enabled(id), with complete bilingual Settings copy; default off requires an explicit human requirement. Preserve user off choices, consent and permissions; no ad-hoc env toggles or redundant experimental master gates. (flags.md) - Tests resolve the SUT by interface; shared stubs live under
test/, neversrc/. (test.md) - Config is the preference registry: only preferences that are persistable, schema'd, and user/operator-facing go in
IConfigService. Domain-specific config (including env-only operational toggles) goes throughregisterConfigSection+envOverlay. Facts →IBootstrapService, and host invocation arguments (CLI flags, host identity headers, prompt identity) →BootstrapInput.args/IBootstrapService.args— never new per-domain runtime-options services; domain runtime state (cron/flags/model) never goes ontoIBootstrapService; session state → Session scope; constants → code. Business domains never callIBootstrapService.getEnv()directly. (config.md)
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

