T-D4CZ-ungated-ts-packages-get-a-check
State: closed/done · Impact: high · Complexity: small
agent-call, system-model and vault-graph-core have no moon.yml. The
packages/ts/* glob still registers each as a project, but with no
language/layer/stack — moon project system-model reports Language: javascript, Stack: unknown, Layer: unknown — so they match none of
.moon/tasks/ts-lib.yml’s three inheritedBy conditions and have no
check task at all — moon run agent-call:check answers “Unknown task check
for project agent-call”. agent-call is on the publish channel, so a package
that ships to npm is never typechecked in CI. All three compile clean today, so
this is pure wiring with no cleanup behind it.
| Location | Role today |
|---|---|
packages/ts/agent-call/ | On the publish channel (publish-libs.json), has tsconfig.json + tsconfig.build.json + 6 test files, and NO moon.yml — so no check, no test, no CI gate of any kind |
packages/ts/system-model/ | Contract-only package (types + one port interface), no moon.yml, no gate |
packages/ts/vault-graph-core/ | Pure graph builder with a test/ directory, no moon.yml, no gate |
.moon/tasks/ts-lib.yml | Supplies the inherited check to language: typescript + layer: library + stack: backend; a project with no moon.yml matches none of the three |
scripts/guard-ts-lib-checks.ts | Guards against a backend lib redefining the inherited check — it cannot see a project that never inherits one |
Proposed
Section titled “Proposed”Each of the three carries a moon.yml declaring the ts-lib triple, so it
inherits bunx tsc --noEmit -p tsconfig.json and appears in moon run :check.
The two with tests (agent-call, vault-graph-core) also declare the local
test task the aspect deliberately leaves to each library.
None declares a local check — guard-ts-lib-checks.ts exists to keep that
from happening, and inheriting is the whole point.
Approach
Section titled “Approach”- Add
packages/ts/system-model/moon.yml—layer: library,stack: backend,language: typescript, no tasks beyond what it inherits. No test task: the package has no tests. - Add
packages/ts/vault-graph-core/moon.ymlwith the same triple plustest: bun run test— its suites are written againstnode:testand its package script runs them on node’s runner, the shape its two siblingsobsidian-vaultandobsidian-basesalready use. Declare nodependsOn: the bun toolchain already infersobsidian-vaultfrom the workspace dependency inpackage.json. - Add
packages/ts/agent-call/moon.ymlwith the same triple plustest: bun test. Declare noid:— per S-0009 ids derive by default and no Rust crate of any of these three names exists, so there is nothing to disambiguate. - Confirm each new project is picked up by the
packages/ts/*glob in.moon/workspace.ymland add NOsources:entry — that file documents at length that an explicit source alongside a matching glob registers the directory twice with no duplicate-id error.
Files to touch
Section titled “Files to touch”| Location | Kind | Change |
|---|---|---|
packages/ts/agent-call/moon.yml | new | ts-lib triple + test; inherits check |
packages/ts/system-model/moon.yml | new | ts-lib triple; inherits check, no tests to declare |
packages/ts/vault-graph-core/moon.yml | new | ts-lib triple + test (delegating to the package’s node runner); inherits check |
Acceptance criteria
Section titled “Acceptance criteria”- AC-1:
moon run agent-call:check,system-model:checkandvault-graph-core:checkall resolve and pass, where all three previously answered “Unknown task check for project …”. - AC-2:
moon run agent-call:testandvault-graph-core:testrun their existing suites. - AC-3:
bun scripts/guard-ts-lib-checks.tsstill passes and its backend TS library count rises by exactly three. Stated as a delta because the absolute keeps moving as libraries land — it read 22 → 25 when this was written and 26 → 29 by the time it was verified against main. - AC-4: All three appear in the affected set for a change to
packages/ts/tsconfig/presets/*.json, proving the gate is wired to the shared bar and not just present.
Out of scope
Section titled “Out of scope”packages/ts/app-framehas notsconfig.jsonat all, so it cannot inherit atsc-based check. It is a Nuxt layer and needsvue-tsc; that is a separate question about frontend-tier gating.packages/ts/prettier-configalso has nomoon.yml. It ships JSON and has nothing to typecheck; if it ever gains a gate it belongs with thetsconfig-presetshape (layer: configuration), not this triple.
Dependencies
Section titled “Dependencies”- none
Discovery context
Section titled “Discovery context”Found while auditing what remained after the shared-config work merged
(#1644). Verified rather than
assumed: moon run <p>:check returns “Unknown task” for all three, and each
compiles clean under its own tsconfig.json, so wiring the gate costs nothing
but the three files.