Skip to content

feat: add provider-specific ignore file support#159

Merged
soorya-u merged 3 commits into
mainfrom
t3code/97b3ad23
May 26, 2026
Merged

feat: add provider-specific ignore file support#159
soorya-u merged 3 commits into
mainfrom
t3code/97b3ad23

Conversation

@soorya-u
Copy link
Copy Markdown
Owner

@soorya-u soorya-u commented May 26, 2026

Summary

  • Adds ignore feature type to deploy pipeline alongside commands, instructions, MCP, and skills
  • Introduces IgnoreFeature implementing FeatureTrait — loads patterns from .dotagents/.agentignore (newline-separated glob patterns, gitignore-like)
  • Supports per-provider [providers.<name>.ignore] config with disabled toggle and template/target paths
  • Creates ignore.hbs templates and updated provider.toml for 11 providers: opencode, auggie, autohand, cline, cursor, gemini, goose, junie, kilocode, pi, qwen
  • Integrates ignore into init CLI (--features agent-ignore) and TUI wizard ("Ignore Patterns" pre-selected option)
  • Scaffolds default .agentignore with common patterns (node_modules/, .git/, target/, .env)
  • Uses single-phase rendering (no frontmatter) and includes ignore file paths in .gitignore fence tracking
  • Adds strum/strum_macros for derive macros on Feature enum

Testing

  • Unit tests for IgnoreFeature roundtrip, pattern parsing, and edge cases (empty/missing .agentignore)
  • Unit tests for config parsing and merging (Features::merge with ignore field)
  • Unit tests for init with ignore feature selected/deselected
  • E2E tests for ignore feature deploy flow (writes correct provider-specific files, respects disabled flag)
  • E2E tests for init with --features agent-ignore flag
  • mise check (cargo fmt + clippy) passes
  • mise tests (unit + integration + e2e) passes

Summary by CodeRabbit

Release Notes

  • New Features

    • Added ignore patterns feature to exclude files and directories from AI tools during initialization and deployment
    • Enabled support for generating provider-specific ignore files (.agentignore, .cursorignore, .augmentignore, etc.) across 11+ AI providers
  • Chores

    • Updated CLI feature naming conventions for consistency and clarity

Review Change Stack

- Add Ignore variant to Feature enum and IgnoreFeature implementing FeatureTrait
- Load patterns from .dotagents/.agentignore (newline-separated globs)
- Deploy ignore.hbs templates for 11 providers (auggie, autohand, cline, cursor, gemini, goose, junie, kilocode, opencode, pi, qwen)
- Single-phase rendering: no frontmatter content pre-render needed
- Track deployed ignore files in gitignore fence for undeploy cleanup
- Add agent-ignore to init CLI --features flag and TUI wizard multiselect
- Scaffold default .agentignore mock during init
- Archive add-deploy-e2e-coverage and add-provider-ignore-files OpenSpec changes
- Add strum/sturm_macros for kebab-case Feature enum serialization
- Sync main specs: deploy-pipeline, ignore-feature, ignore-init-scaffold, ignore-provider-templates
@vercel
Copy link
Copy Markdown

vercel Bot commented May 26, 2026

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

Project Deployment Actions Updated (UTC)
dotagents Ready Ready Preview, Comment May 26, 2026 4:16pm

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 26, 2026

Warning

Review limit reached

@soorya-u, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 37 minutes and 6 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 062808a3-3d7b-475c-ae47-3824c68bcdaf

📥 Commits

Reviewing files that changed from the base of the PR and between 7d1e42e and 9769d18.

📒 Files selected for processing (31)
  • openspec/specs/ignore-feature/spec.md
  • openspec/specs/ignore-provider-templates/spec.md
  • public/v1/templates/auggie/agent-ignore.hbs
  • public/v1/templates/auggie/provider.toml
  • public/v1/templates/autohand/agent-ignore.hbs
  • public/v1/templates/autohand/provider.toml
  • public/v1/templates/cline/agent-ignore.hbs
  • public/v1/templates/cline/provider.toml
  • public/v1/templates/cursor/agent-ignore.hbs
  • public/v1/templates/cursor/provider.toml
  • public/v1/templates/gemini/agent-ignore.hbs
  • public/v1/templates/gemini/provider.toml
  • public/v1/templates/goose/agent-ignore.hbs
  • public/v1/templates/goose/provider.toml
  • public/v1/templates/junie/agent-ignore.hbs
  • public/v1/templates/junie/provider.toml
  • public/v1/templates/kilocode/agent-ignore.hbs
  • public/v1/templates/kilocode/provider.toml
  • public/v1/templates/opencode/agent-ignore.hbs
  • public/v1/templates/opencode/provider.toml
  • public/v1/templates/pi/agent-ignore.hbs
  • public/v1/templates/pi/provider.toml
  • public/v1/templates/qwen/agent-ignore.hbs
  • public/v1/templates/qwen/provider.toml
  • public/v1/templates/registry.json
  • src/cli/config.rs
  • src/cli/init.rs
  • src/cli/options.rs
  • src/cli/skills.rs
  • src/constants/mocks.rs
  • src/templates/remote.rs
📝 Walkthrough

Walkthrough

This PR introduces a new ignore feature for managing ignore patterns across AI tools, modernizes the Feature enum using strum macros with kebab-case serialization, renames feature variants to singular form, and adds provider-specific ignore templates for all twelve providers.

Changes

Ignore feature implementation

Layer / File(s) Summary
Feature enum refactoring with strum macros
Cargo.toml, src/cli/options.rs, src/core/features/common.rs
Feature enum replaces manual string mapping with strum-derived Display/EnumString/AsRefStr traits, applies kebab-case serialization, renames Commands/Instructions/Skills to singular Command/Instruction/Skill, adds AgentIgnore variant, and updates feature_filename to return String.
IgnoreFeature type and serialization
src/core/features.rs, src/core/features/ignore.rs, src/constants/file.rs, src/constants/mocks.rs
New IgnoreFeature struct with patterns vector loads patterns from .agentignore file, implements FeatureTrait for newline-separated text and JSON serialization with get_file_name() returning None, includes mock pattern and file constants.
Config infrastructure for ignore feature
src/core/config/app.rs, src/core/config/common.rs, src/core/config/global.rs, src/core/config/local.rs
Features struct adds optional ignore field with TOML merge/get_config support, global and local config validation updated to use strum VARIANTS and from_str() for error checking, AppConfig::has_feature switches to as_ref().
Init and deploy pipeline integration
src/cli/init.rs, src/cli/ui/init.rs, src/cli/deploy.rs, src/cli/ui/deploy.rs, src/cli/config.rs
Init updated to use singular Feature variants and gate .agentignore mock scaffolding; UI init refactored to build feature selection from Feature enum and parse via from_str; deploy extended to deploy IgnoreFeature and iterate features via strum; config editors switch to Feature::VARIANTS.
Undeploy and command updates
src/cli/commands.rs, src/cli/skills.rs, src/cli/undeploy.rs
Commands and skills updated to use Feature enum for undeploy targeting (Feature::Command.as_ref() and singular "skill"), undeploy tests updated to expect "command" cache key instead of "commands".
Remote template resolution
src/templates/remote.rs
Template resolution updated to use feature.as_ref() for logging and cache path handling, adds AgentIgnore match arm in set_feature_settings to persist resolved ignore configuration.
Provider ignore templates
public/v1/templates/*/ignore.hbs, public/v1/templates/*/provider.toml
All twelve providers (auggie, autohand, cline, cursor, gemini, goose, junie, kilocode, opencode, pi, qwen) gain ignore.hbs templates rendering newline-separated patterns and [providers.*.ignore] config blocks with template URL and workspace target path.
E2E and integration test updates
tests/e2e/*.test.ts, tests/integration/*.rs
All test suites updated to use singular feature identifiers (command,instruction,mcp,skill) and cache key expectations; init assertions updated for feature config keys and feature inclusion/exclusion logic.
Specification documents
openspec/specs/ignore-*.md, openspec/specs/deploy-pipeline/spec.md, openspec/changes/archive/2026-05-26-add-provider-ignore-files/tasks.md
Specifications define ignore feature enum behavior, IgnoreFeature trait implementation, init scaffolding requirements, deploy pipeline rendering and per-provider enable/disable logic, and provider template configuration including registry checksums.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • soorya-u/dotagents#35: Updates deploy feature dispatch logic in src/cli/deploy.rs to use typed Feature enum, directly related to the deploy pipeline changes.
  • soorya-u/dotagents#112: Modifies src/cli/init.rs unit tests for initialize_agents_dir with explicit feature variants, overlaps with the feature enum refactoring.
  • soorya-u/dotagents#147: Modifies init scaffolding and config building logic in src/cli/init.rs, directly related to the feature variant updates and config content generation.

Poem

🐰 A rabbit hops through ignore files with glee,
Strum macros dance from plural to singular spree,
Feature AgentIgnore now leads the way,
Patterns flow new through each provider's display! 🌿

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title accurately describes the main change: adding provider-specific ignore file support is the central feature being implemented across the codebase.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/97b3ad23

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 15

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/templates/remote.rs (1)

89-94: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

agent-ignore defaults are never resolved in provider-default hydration.

resolve_provider_defaults omits Feature::AgentIgnore from all_features, so ignore template/target defaults are skipped even though set_feature_settings supports them. This can prevent ignore deployment for providers relying on defaults.

Suggested fix
     let all_features = [
         Feature::Command,
         Feature::Instruction,
         Feature::Mcp,
         Feature::Skill,
+        Feature::AgentIgnore,
     ];
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/templates/remote.rs` around lines 89 - 94, resolve_provider_defaults
currently builds all_features without including Feature::AgentIgnore, so
provider-default hydration skips ignore/template defaults even though
set_feature_settings supports them; update the all_features array in
resolve_provider_defaults to include Feature::AgentIgnore (alongside
Feature::Command, Feature::Instruction, Feature::Mcp, Feature::Skill) so that
ignore defaults are resolved during provider-default hydration and propagate
into set_feature_settings.
🧹 Nitpick comments (3)
src/cli/options.rs (1)

449-496: ⚡ Quick win

Add AgentIgnore coverage to has_feature tests.

The new enum variant is introduced, but these tests still only assert Command/Instruction/Mcp/Skill paths. Add one negative case and one positive case for Feature::AgentIgnore to lock behavior.

✅ Suggested test additions
@@
     fn has_feature_returns_false_when_features_absent() {
@@
         assert!(!opts.has_feature(Feature::Skill));
+        assert!(!opts.has_feature(Feature::AgentIgnore));
     }
@@
     fn has_feature_returns_false_for_unlisted_feature() {
@@
         assert!(!opts.has_feature(Feature::Instruction));
         assert!(!opts.has_feature(Feature::Skill));
+        assert!(!opts.has_feature(Feature::AgentIgnore));
     }
@@
     fn has_feature_returns_true_for_all_listed() {
@@
                 Feature::Mcp,
                 Feature::Skill,
+                Feature::AgentIgnore,
             ]),
@@
         assert!(opts.has_feature(Feature::Mcp));
         assert!(opts.has_feature(Feature::Skill));
+        assert!(opts.has_feature(Feature::AgentIgnore));
     }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/cli/options.rs` around lines 449 - 496, Update the unit tests for
InitOptions::has_feature to cover the newly added Feature::AgentIgnore: in the
test has_feature_returns_false_when_features_absent add
assert!(!opts.has_feature(Feature::AgentIgnore)); and in
has_feature_returns_true_for_all_listed include Feature::AgentIgnore in the
features vector and assert!(opts.has_feature(Feature::AgentIgnore)); so both a
negative and a positive path for has_feature (the method on InitOptions) are
asserted.
openspec/specs/ignore-feature/spec.md (1)

50-54: ⚡ Quick win

Add language specifier to fenced code block.

The fenced code block showing .agentignore content should specify a language (or leave it empty for plain text) to satisfy markdown linting requirements.

📝 Proposed fix
 #### Scenario: Load patterns from .agentignore
 - **WHEN** `.dotagents/.agentignore` contains:
-  ```
+  ```text
   node_modules/
   *.log
   .env
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@openspec/specs/ignore-feature/spec.md` around lines 50 - 54, Update the
fenced code block that displays the .agentignore content so it includes a
language specifier (e.g., use ```text or ```plain) instead of bare backticks;
locate the fenced block containing "node_modules/", "*.log", ".env" in spec.md
and change the opening fence to include the language to satisfy markdown linting
rules.
src/cli/skills.rs (1)

238-238: ⚡ Quick win

Use enum-derived feature key here to avoid future key drift.

Prefer Feature::Skill.as_ref() instead of hardcoding "skill" so cleanup stays aligned with feature serialization changes.

Suggested fix
-                if let Err(e) =
-                    super::undeploy::undeploy_item("skill", &opts.name, &mut cache, &workspace_dir)
+                if let Err(e) = super::undeploy::undeploy_item(
+                    crate::core::features::Feature::Skill.as_ref(),
+                    &opts.name,
+                    &mut cache,
+                    &workspace_dir,
+                )
                 {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/cli/skills.rs` at line 238, Replace the hardcoded "skill" feature key
with the enum-derived key to prevent drift: call super::undeploy::undeploy_item
with Feature::Skill.as_ref() (or Feature::Skill.to_string().as_str() if needed)
instead of the literal "skill", updating the invocation at the site that
currently calls super::undeploy::undeploy_item("skill", &opts.name, &mut cache,
&workspace_dir) so the cleanup uses the canonical Feature::Skill representation.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@openspec/changes/archive/2026-05-26-add-provider-ignore-files/tasks.md`:
- Line 3: The task doc has inconsistent Feature variant names (Feature::Ignore
vs Feature::AgentIgnore) and string mappings ("ignore" vs "agent-ignore"); pick
the canonical variant (use Feature::Ignore with string "ignore"), update all
mentions in this document (sections 1.1, 4.1, 4.2 and checklist) to
Feature::Ignore and the mapping to "ignore", and ensure the implementation in
src/core/features/common.rs defines the enum variant Feature::Ignore and its
serialization/deserialization mapping to "ignore" so all specs
(ignore-feature/spec.md and ignore-init-scaffold/spec.md) and the codebase
consistently reference Feature::Ignore/"ignore".

In `@openspec/specs/ignore-provider-templates/spec.md`:
- Around line 65-96: Remove the nine unsupported provider scenarios for claude,
copilot, codex, factory-droid, deepagents, kimi, mistral-vibe, qoder-cli and amp
from the spec (the blocks that start with "Scenario: <provider> provider has
ignore config") and add a short note in the spec explaining that only providers
with documented ignore-file support receive ignore.hbs templates (list the
supported providers: opencode, auggie, autohand, cline, cursor, gemini, goose,
junie, kilocode, pi, qwen) so the spec matches tasks.md and the actual
implementation.

In `@public/v1/templates/auggie/ignore.hbs`:
- Line 1: The rendered ignore patterns are concatenated with no separators;
update the Handlebars template (public/v1/templates/auggie/ignore.hbs) so each
item in ignore.patterns is emitted on its own line by adding a newline delimiter
between rendered items (use the each block over ignore.patterns and
conditionally insert a newline after each {{this}} — e.g., add a newline except
for the last item using the `@last` built-in — so entries become separate lines
and produce valid ignore rules).

In `@public/v1/templates/autohand/ignore.hbs`:
- Line 1: The current Handlebars loop {{`#each` ignore.patterns}}{{this}}{{/each}}
concatenates patterns without separators; update the loop in
public/v1/templates/autohand/ignore.hbs to emit a newline after each pattern so
each entry from ignore.patterns is rendered on its own line (i.e., inside the
{{`#each` ignore.patterns}}...{{/each}} block write the pattern then a newline
separator). Ensure you only modify that each block to add the separator and
avoid introducing extra blank lines.

In `@public/v1/templates/cline/ignore.hbs`:
- Line 1: The template currently concatenates all entries because the each block
outputs patterns back-to-back; update the ignore.hbs each block (the {{`#each`
ignore.patterns}} ... {{/each}} surrounding {{this}}) to emit a newline after
each pattern by placing a literal line break after {{this}} inside the loop so
each pattern is rendered on its own line.

In `@public/v1/templates/cursor/ignore.hbs`:
- Line 1: The Handlebars loop over ignore.patterns is rendering patterns
back-to-back; update the template (public/v1/templates/cursor/ignore.hbs) so
that each iteration appends a newline after the rendered pattern (i.e., ensure
the {{`#each` ignore.patterns}} block writes a line break after {{this}}) so
output is newline-separated entries rather than concatenated text.

In `@public/v1/templates/gemini/ignore.hbs`:
- Line 1: The ignore template currently renders all patterns inline using the
block "{{`#each` ignore.patterns}}{{this}}{{/each}}"; change it so each pattern is
emitted on its own line by outputting a newline separator after each "{{this}}"
within the same "{{`#each` ignore.patterns}}...{{/each}}" block (so generated
ignore files preserve individual rules).

In `@public/v1/templates/goose/ignore.hbs`:
- Line 1: The template public/v1/templates/goose/ignore.hbs currently emits all
ignore.patterns back-to-back via {{`#each` ignore.patterns}}{{this}}{{/each}},
collapsing entries into a single pattern; update the {{`#each` ignore.patterns}}
loop in ignore.hbs to emit one pattern per line by appending a newline or
line-break after each {{this}} (ensure you handle the final element correctly,
e.g., only add the separator when not `@last`) so each ignore rule appears on its
own line for ignore engines to parse.

In `@public/v1/templates/junie/ignore.hbs`:
- Line 1: The template currently concatenates all ignore.patterns into a single
string; update the Handlebars loop in public/v1/templates/junie/ignore.hbs (the
{{`#each` ignore.patterns}} ... {{this}} ... {{/each}} block) so each pattern is
emitted on its own line by appending a newline after each {{this}} output,
producing line-based ignore patterns instead of one combined pattern.

In `@public/v1/templates/kilocode/ignore.hbs`:
- Line 1: The template public/v1/templates/kilocode/ignore.hbs is concatenating
ignore.patterns into one line; change the {{`#each`
ignore.patterns}}{{this}}{{/each}} rendering so each pattern is emitted on its
own line (i.e., output a newline after each {{this}} inside the {{`#each`}} block)
to preserve per-rule semantics when generating the ignore file.

In `@public/v1/templates/opencode/ignore.hbs`:
- Line 1: The template currently renders ignore.patterns with {{`#each`
ignore.patterns}}{{this}}{{/each}} which concatenates entries without
separators; update the loop in the ignore.hbs template to output each pattern
followed by a newline (e.g., render {{this}} then a newline or use Handlebars'
block/whitespace to produce line breaks) so each pattern becomes its own line;
apply the same change to other public/v1/templates/*/ignore.hbs instances that
use ignore.patterns to ensure multi-pattern ignores are emitted as separate
lines.

In `@public/v1/templates/pi/ignore.hbs`:
- Line 1: The template currently concatenates ignore.patterns with no
separators; update the Handlebars template in ignore.hbs so each entry of
ignore.patterns renders on its own line by emitting a newline between items
(e.g., change the {{`#each` ignore.patterns}}...{{/each}} loop to insert a line
break after each pattern, or conditionally between items using `@last` to avoid an
extra blank line), ensuring each pattern renders as a separate line.

In `@public/v1/templates/qwen/ignore.hbs`:
- Line 1: The template public/v1/templates/qwen/ignore.hbs is concatenating
ignore.patterns without delimiters ({{`#each` ignore.patterns}}{{this}}{{/each}}),
which squashes multiple patterns into one line; update the each loop for
ignore.patterns in the ignore.hbs (and mirror the same change across the other
providers' public/v1/templates/*/ignore.hbs) to emit a newline between entries
so patterns become newline-delimited (e.g., ensure each iteration appends a line
break after {{this}} or use a join-with-newline approach).

In `@src/cli/config.rs`:
- Around line 544-545: The pruning logic is dropping providers whose only
override is the new agent-ignore feature because Feature::VARIANTS (assigned to
all_features) and the check in features_has_overrides ignore feats.ignore;
update features_has_overrides (or the code that iterates
Feature::VARIANTS/all_features) to consider feats.ignore as a valid override (or
explicitly check for Feature::AgentIgnore) so providers with only an ignore
override are treated as having overrides and are not pruned; locate uses of
Feature::VARIANTS, the all_features binding, and the features_has_overrides
function and ensure feats.ignore (or Feature::AgentIgnore) is included in the
override detection logic.

In `@src/constants/mocks.rs`:
- Around line 73-74: AGENTIGNORE_MOCK currently only contains ".env.prod";
update the AGENTIGNORE_MOCK constant to seed a richer default .agentignore
scaffold containing common ignore patterns (e.g., *.env and .env.*,
node_modules, dist, build, target, __pycache__, *.log, .git, .venv, .idea) so
new agents get a useful baseline; keep the constant name AGENTIGNORE_MOCK and
replace the string value with a multi-line string containing those entries
separated by newlines.

---

Outside diff comments:
In `@src/templates/remote.rs`:
- Around line 89-94: resolve_provider_defaults currently builds all_features
without including Feature::AgentIgnore, so provider-default hydration skips
ignore/template defaults even though set_feature_settings supports them; update
the all_features array in resolve_provider_defaults to include
Feature::AgentIgnore (alongside Feature::Command, Feature::Instruction,
Feature::Mcp, Feature::Skill) so that ignore defaults are resolved during
provider-default hydration and propagate into set_feature_settings.

---

Nitpick comments:
In `@openspec/specs/ignore-feature/spec.md`:
- Around line 50-54: Update the fenced code block that displays the .agentignore
content so it includes a language specifier (e.g., use ```text or ```plain)
instead of bare backticks; locate the fenced block containing "node_modules/",
"*.log", ".env" in spec.md and change the opening fence to include the language
to satisfy markdown linting rules.

In `@src/cli/options.rs`:
- Around line 449-496: Update the unit tests for InitOptions::has_feature to
cover the newly added Feature::AgentIgnore: in the test
has_feature_returns_false_when_features_absent add
assert!(!opts.has_feature(Feature::AgentIgnore)); and in
has_feature_returns_true_for_all_listed include Feature::AgentIgnore in the
features vector and assert!(opts.has_feature(Feature::AgentIgnore)); so both a
negative and a positive path for has_feature (the method on InitOptions) are
asserted.

In `@src/cli/skills.rs`:
- Line 238: Replace the hardcoded "skill" feature key with the enum-derived key
to prevent drift: call super::undeploy::undeploy_item with
Feature::Skill.as_ref() (or Feature::Skill.to_string().as_str() if needed)
instead of the literal "skill", updating the invocation at the site that
currently calls super::undeploy::undeploy_item("skill", &opts.name, &mut cache,
&workspace_dir) so the cleanup uses the canonical Feature::Skill representation.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 44eb2759-d4c4-4858-9897-8f36506874a8

📥 Commits

Reviewing files that changed from the base of the PR and between a4e1435 and 7d1e42e.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (75)
  • Cargo.toml
  • openspec/changes/add-provider-ignore-files/tasks.md
  • openspec/changes/archive/2026-05-17-add-deploy-e2e-coverage/.openspec.yaml
  • openspec/changes/archive/2026-05-17-add-deploy-e2e-coverage/design.md
  • openspec/changes/archive/2026-05-17-add-deploy-e2e-coverage/proposal.md
  • openspec/changes/archive/2026-05-17-add-deploy-e2e-coverage/specs/deploy-flag-coverage-e2e/spec.md
  • openspec/changes/archive/2026-05-17-add-deploy-e2e-coverage/specs/deploy-tui-prompts-e2e/spec.md
  • openspec/changes/archive/2026-05-17-add-deploy-e2e-coverage/specs/deploy-user-edit-protection-e2e/spec.md
  • openspec/changes/archive/2026-05-17-add-deploy-e2e-coverage/specs/undeploy-edge-cases-e2e/spec.md
  • openspec/changes/archive/2026-05-17-add-deploy-e2e-coverage/tasks.md
  • openspec/changes/archive/2026-05-26-add-provider-ignore-files/.openspec.yaml
  • openspec/changes/archive/2026-05-26-add-provider-ignore-files/design.md
  • openspec/changes/archive/2026-05-26-add-provider-ignore-files/proposal.md
  • openspec/changes/archive/2026-05-26-add-provider-ignore-files/specs/deploy-pipeline/spec.md
  • openspec/changes/archive/2026-05-26-add-provider-ignore-files/specs/ignore-feature/spec.md
  • openspec/changes/archive/2026-05-26-add-provider-ignore-files/specs/ignore-init-scaffold/spec.md
  • openspec/changes/archive/2026-05-26-add-provider-ignore-files/specs/ignore-provider-templates/spec.md
  • openspec/changes/archive/2026-05-26-add-provider-ignore-files/tasks.md
  • openspec/specs/deploy-pipeline/spec.md
  • openspec/specs/ignore-feature/spec.md
  • openspec/specs/ignore-init-scaffold/spec.md
  • openspec/specs/ignore-provider-templates/spec.md
  • public/v1/templates/auggie/ignore.hbs
  • public/v1/templates/auggie/provider.toml
  • public/v1/templates/autohand/ignore.hbs
  • public/v1/templates/autohand/provider.toml
  • public/v1/templates/cline/ignore.hbs
  • public/v1/templates/cline/provider.toml
  • public/v1/templates/cursor/ignore.hbs
  • public/v1/templates/cursor/provider.toml
  • public/v1/templates/gemini/ignore.hbs
  • public/v1/templates/gemini/provider.toml
  • public/v1/templates/goose/ignore.hbs
  • public/v1/templates/goose/provider.toml
  • public/v1/templates/junie/ignore.hbs
  • public/v1/templates/junie/provider.toml
  • public/v1/templates/kilocode/ignore.hbs
  • public/v1/templates/kilocode/provider.toml
  • public/v1/templates/opencode/ignore.hbs
  • public/v1/templates/opencode/provider.toml
  • public/v1/templates/pi/ignore.hbs
  • public/v1/templates/pi/provider.toml
  • public/v1/templates/qwen/ignore.hbs
  • public/v1/templates/qwen/provider.toml
  • src/cli/commands.rs
  • src/cli/config.rs
  • src/cli/deploy.rs
  • src/cli/init.rs
  • src/cli/options.rs
  • src/cli/skills.rs
  • src/cli/ui/deploy.rs
  • src/cli/ui/init.rs
  • src/cli/ui/undeploy.rs
  • src/cli/undeploy.rs
  • src/constants/file.rs
  • src/constants/mocks.rs
  • src/core/config/app.rs
  • src/core/config/common.rs
  • src/core/config/global.rs
  • src/core/config/local.rs
  • src/core/features.rs
  • src/core/features/common.rs
  • src/core/features/ignore.rs
  • src/templates/remote.rs
  • tests/e2e/commands.test.ts
  • tests/e2e/config.test.ts
  • tests/e2e/errors.test.ts
  • tests/e2e/helpers.ts
  • tests/e2e/init.test.ts
  • tests/e2e/skills.test.ts
  • tests/e2e/workflow.test.ts
  • tests/integration/config.rs
  • tests/integration/dedup.rs
  • tests/integration/features.rs
  • tests/integration/main.rs
💤 Files with no reviewable changes (2)
  • openspec/changes/add-provider-ignore-files/tasks.md
  • src/cli/ui/deploy.rs

Comment thread openspec/specs/ignore-provider-templates/spec.md Outdated
Comment thread public/v1/templates/auggie/agent-ignore.hbs Outdated
Comment thread public/v1/templates/autohand/agent-ignore.hbs Outdated
Comment thread public/v1/templates/cline/agent-ignore.hbs Outdated
Comment thread public/v1/templates/opencode/agent-ignore.hbs Outdated
Comment thread public/v1/templates/pi/agent-ignore.hbs Outdated
Comment thread public/v1/templates/qwen/agent-ignore.hbs Outdated
Comment thread src/cli/config.rs
Comment thread src/constants/mocks.rs
- Update registry.json checksums
- Add init scaffold and mock for mycode agent-ignore template
- Restrict ignore templates to 11 supported providers (opencode, cursor, gemini, etc.)
- Wire AgentIgnore feature into CLI config overrides and init options
- Use Feature::Skill.as_ref() in undeploy_item instead of hardcoded string
- Update ignore-provider-templates spec to document supported providers only
@soorya-u soorya-u merged commit a562077 into main May 26, 2026
8 checks passed
@soorya-u soorya-u deleted the t3code/97b3ad23 branch May 26, 2026 16:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Feature: deploy agent-specific ignore files (.clineignore, .gooseignore)

1 participant