-
Notifications
You must be signed in to change notification settings - Fork 1.3k
feat(resolver): add project-local schema support #522
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Add 3-level schema resolution: project-local → user override → package built-in. - Add `getProjectSchemasDir(projectRoot)` to resolve project schemas at `./openspec/schemas/<name>/` - Extend `SchemaInfo.source` type to include `'project'` - Update `getSchemaDir()`, `resolveSchema()`, `listSchemas()`, `listSchemasWithInfo()` with optional `projectRoot` parameter - Update CLI commands to display schema source labels (project/user/package) - Add `projectRoot` to `ChangeContext` interface for proper resolution throughout workflow - Add 17 new tests covering project-local schema resolution This enables projects to define custom schemas that override user and package schemas, while maintaining backward compatibility when projectRoot is not provided.
📝 WalkthroughWalkthroughThis pull request introduces project-local schemas as a new highest-priority resolution source in the OpenSpec system. It threads an optional Changes
Sequence Diagram(s)sequenceDiagram
participant Client as Client/CLI
participant Resolver as Schema Resolver
participant ProjectFS as Project FS
participant UserFS as User FS
participant PackageFS as Package FS
Client->>Resolver: getSchemaDir(name, projectRoot)
activate Resolver
Resolver->>ProjectFS: Check ./openspec/schemas/name/
alt Project Schema Exists
ProjectFS-->>Resolver: Schema found
else Project Schema Missing
Resolver->>UserFS: Check user overrides
alt User Override Exists
UserFS-->>Resolver: User schema found
else User Override Missing
Resolver->>PackageFS: Check package built-ins
PackageFS-->>Resolver: Package schema found
end
end
deactivate Resolver
Resolver-->>Client: Schema path + source
sequenceDiagram
participant CLI as CLI Command
participant Workflow as Artifact Workflow
participant Resolver as Resolver
participant Instruction as Instruction Loader
participant FS as File System
CLI->>Workflow: schemasCommand(projectRoot)
activate Workflow
Workflow->>Resolver: listSchemasWithInfo(projectRoot)
activate Resolver
Resolver->>FS: Scan project, user, package locations
FS-->>Resolver: Schema lists with locations
deactivate Resolver
Resolver-->>Workflow: Array<{name, source: 'project'|'user'|'package'}>
deactivate Workflow
Workflow->>CLI: Display schemas with source labels
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
Warning There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure. 🔧 markdownlint-cli2 (0.18.1)openspec/changes/project-local-schemas/specs/schema-resolution/spec.mdmarkdownlint-cli2 v0.18.1 (markdownlint v0.38.0) openspec/changes/project-local-schemas/design.mdmarkdownlint-cli2 v0.18.1 (markdownlint v0.38.0) openspec/changes/project-local-schemas/tasks.mdmarkdownlint-cli2 v0.18.1 (markdownlint v0.38.0) Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Greptile SummaryThis PR adds 3-level schema resolution to OpenSpec, enabling teams to define project-local schemas at Key Changes:
Implementation Quality:
Architecture: Confidence Score: 5/5
Important Files Changed
Sequence DiagramsequenceDiagram
participant CLI as CLI Command
participant Workflow as artifact-workflow.ts
participant Resolver as resolver.ts
participant Loader as instruction-loader.ts
participant Metadata as change-metadata.ts
CLI->>Workflow: openspec schemas
Workflow->>Workflow: projectRoot = process.cwd()
Workflow->>Resolver: listSchemasWithInfo(projectRoot)
Resolver->>Resolver: Check project dir (./openspec/schemas/)
Resolver->>Resolver: Check user dir (~/.local/share/openspec/schemas/)
Resolver->>Resolver: Check package dir (npm/schemas/)
Resolver-->>Workflow: SchemaInfo[] with source tags
Workflow-->>CLI: Display schemas with (project)/(user) labels
CLI->>Workflow: openspec status --change=my-change
Workflow->>Workflow: projectRoot = process.cwd()
Workflow->>Loader: loadChangeContext(projectRoot, changeName)
Loader->>Metadata: resolveSchemaForChange(changeDir)
Metadata->>Metadata: projectRoot from changeDir path
Metadata->>Resolver: resolveSchema(schemaName, projectRoot)
Resolver->>Resolver: getSchemaDir(name, projectRoot)
Note over Resolver: Priority: project → user → package
Resolver-->>Metadata: Schema YAML
Metadata-->>Loader: Schema name
Loader->>Resolver: resolveSchema(schemaName, projectRoot)
Resolver-->>Loader: SchemaYaml object
Loader-->>Workflow: ChangeContext with projectRoot
Workflow->>Loader: generateInstructions(context, artifactId)
Loader->>Loader: loadTemplate(schemaName, templatePath, context.projectRoot)
Loader->>Resolver: getSchemaDir(schemaName, projectRoot)
Resolver-->>Loader: Template directory path
Loader-->>Workflow: Instructions with enriched template
|
Review CompleteYour review story is ready! Comment !reviewfast on this PR to re-generate the story. |
…526) * docs: update workflow docs for schema management CLI Update documentation to reflect implemented schema management features: - Document schema CLI commands (which, validate, fork, init) - Update gap summary to show completed phases (PR #522, #525) - Improve custom schema examples with actual CLI usage - Update resolution order documentation * feat(cli): mark schema commands as experimental Add [experimental] tag to help description and runtime warning for schema management commands to indicate they may change.
Add 3-level schema resolution: project-local → user override → package built-in. - Add `getProjectSchemasDir(projectRoot)` to resolve project schemas at `./openspec/schemas/<name>/` - Extend `SchemaInfo.source` type to include `'project'` - Update `getSchemaDir()`, `resolveSchema()`, `listSchemas()`, `listSchemasWithInfo()` with optional `projectRoot` parameter - Update CLI commands to display schema source labels (project/user/package) - Add `projectRoot` to `ChangeContext` interface for proper resolution throughout workflow - Add 17 new tests covering project-local schema resolution This enables projects to define custom schemas that override user and package schemas, while maintaining backward compatibility when projectRoot is not provided.
…ission-AI#526) * docs: update workflow docs for schema management CLI Update documentation to reflect implemented schema management features: - Document schema CLI commands (which, validate, fork, init) - Update gap summary to show completed phases (PR Fission-AI#522, Fission-AI#525) - Improve custom schema examples with actual CLI usage - Update resolution order documentation * feat(cli): mark schema commands as experimental Add [experimental] tag to help description and runtime warning for schema management commands to indicate they may change.
# By Tabish Bidiwale (57) and others # Via GitHub * main: (67 commits) fix(ci): use workflow_dispatch for polish release notes (Fission-AI#533) fix(changelog): convert markdown headers to bold text for proper formatting (Fission-AI#532) Version Packages (Fission-AI#531) Add changeset for project config and schema commands (Fission-AI#530) fix(config): handle null rules field in project config (Fission-AI#529) docs: update workflow docs and mark schema commands as experimental (Fission-AI#526) feat(cli): add schema management commands (Fission-AI#525) fix: Windows path compatibility in resolver tests (Fission-AI#524) change(schema-management-cli): proposal for schema management commands (Fission-AI#523) feat(resolver): add project-local schema support (Fission-AI#522) docs: add project-config demo guide (Fission-AI#521) feat(config): add project-level configuration via openspec/config.yaml (Fission-AI#499) fix: auto-trigger polish release notes on release publish (Fission-AI#519) perf: add path filtering to Nix validation CI job (Fission-AI#518) Version Packages (Fission-AI#517) Add changeset for v0.21 release (Fission-AI#516) fix: prevent implementation during explore mode (Fission-AI#515) OPSX apply: infer target change (Fission-AI#513) Refine opsx archive sync assessment (Fission-AI#514) feat: add nix flake support (sorry for this duplicate) (Fission-AI#459) ... # Conflicts: # src/core/templates/slash-command-templates.ts
Summary
./openspec/schemas/<name>/SchemaInfo.sourcetype to include'project'alongside existing'user'and'package'projectRoottoChangeContextfor proper resolution throughout workflowTest plan
getProjectSchemasDir()listSchemas()andlistSchemasWithInfo()with project schemas🤖 Generated with Claude Code
Summary by CodeRabbit
Release Notes
✏️ Tip: You can customize this high-level summary in your review settings.