Skip to content

fix(spec): resolve multi-line and .js imports in skill-reference resolver (#3139)#3155

Merged
os-zhuang merged 1 commit into
mainfrom
claude/build-skill-references-multiline-imports-y4xv6o
Jul 18, 2026
Merged

fix(spec): resolve multi-line and .js imports in skill-reference resolver (#3139)#3155
os-zhuang merged 1 commit into
mainfrom
claude/build-skill-references-multiline-imports-y4xv6o

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes #3139.

Problem

extractLocalImports in packages/spec/scripts/build-skill-references.ts builds each skill's transitive Zod-schema closure by scanning import … from statements. It had two blind spots that silently under-reported dependencies:

  1. Multi-line imports — the pattern /^import\s+.*\s+from\s+…/gm uses ., which does not match newlines, so a named import that wraps across lines was never seen:
    import {
      FooSchema,
    } from './foo.zod';   // invisible to the resolver
  2. .js ESM specifiers — the resolver appended .ts unconditionally, so ./types.js became a non-existent ./types.js.ts, failed fs.existsSync, and was dropped.

Both failure modes drop the dep with no warning — the file simply never enters the queue, and skills/*/references/_index.md (shipped to third parties via npx skills add) ends up advertising an incomplete schema graph.

Fix

  • Replace the regex with a multi-line-tolerant scan: /^import\b[^;'"()]*?\bfrom\s*['"](\.[^'"]+)['"]/gm. Excluding ;, quotes, and ( between import and from keeps the non-greedy span from bridging across a statement boundary, a side-effect import (import './x'), or a dynamic import(...) into the wrong specifier.
  • Normalize .js specifiers to .ts before resolving (./types.js./types.ts), instead of blindly appending .ts.

The regex was validated against single-line, multi-line, type-only, namespace, default+named, .js, side-effect, dynamic-import, commented-out, and bare-module ('zod') cases — only the genuine relative imports are captured.

Regenerated output

Ran gen:skill-refs with the fix in place. Exactly one new dependency surfaces across all skills: the platform skill now lists system/tenant.zod.ts, reached through the previously-invisible .js import in kernel/context.zod.ts (import { TenantQuotaSchema } from '../system/tenant.zod.js') — confirming real reachability from a SKILL_MAP closure, which the issue flagged as worth checking. The other multi-line imports the issue enumerated are real but not reachable from any SKILL_MAP entry, so they produce no drift.

The check:skill-refs gate added in #3138 passes (8 generated files in sync with packages/spec).

Notes

Per AGENTS.md, no changeset is included — this is a pure bug fix (the sibling #3138 in the same area likewise carried none).

🤖 Generated with Claude Code

https://claude.ai/code/session_01YTjm38Bo2xUv1UUPWu4mC5


Generated by Claude Code

…lver (#3139)

`extractLocalImports` in build-skill-references.ts under-reported a skill's
transitive schema deps because of two blind spots in the import scan:

- The regex `/^import\s+.*\s+from\s+.../` used `.`, which does not cross
  newlines, so any multi-line named import (`import {\n … \n} from './x'`)
  was silently dropped and never queued into the closure.
- `.js`-suffixed ESM specifiers were mangled: the resolver appended `.ts`
  unconditionally, turning `./types.js` into a non-existent `./types.js.ts`
  that then failed the `fs.existsSync` check and was discarded.

Replace the pattern with a multi-line-tolerant scan that excludes `;`,
quotes, and `(` between `import` and `from` — this keeps the non-greedy
span from bridging across statement boundaries, side-effect imports, or a
dynamic `import(...)`. Normalize `.js` specifiers to `.ts` before resolving.

Regenerated the indexes with the fix in place: the platform skill now
surfaces `system/tenant.zod.ts`, reached through the previously-invisible
`.js` import in `kernel/context.zod.ts`. The `check:skill-refs` gate added
in #3138 passes with the regenerated output.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YTjm38Bo2xUv1UUPWu4mC5
@vercel

vercel Bot commented Jul 18, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jul 18, 2026 1:18am

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tooling size/s labels Jul 18, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

102 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via packages/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/cli.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via packages/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@os-zhuang
os-zhuang marked this pull request as ready for review July 18, 2026 02:28
@os-zhuang
os-zhuang merged commit d7a6758 into main Jul 18, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the claude/build-skill-references-multiline-imports-y4xv6o branch July 18, 2026 02:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

build-skill-references.ts: import regex is blind to multi-line imports, under-reporting skill schema deps

2 participants