Skip to content

Ai Assistants

Feature: AI Assistant Configuration Files
  As a software engineer
  I want AI assistant configuration files generated for the tools I use
  So that each assistant is pre-configured with project-specific coding guidelines

  Background:
    Given a project for any language or artifact type is to be generated

  Scenario: Claude Code files are always generated
    When the project is initialized without the --assistant flag
    Then the following files are generated:
      | File      |
      | CLAUDE.md |
      | .claude/  |

  # ---------------------------------------------------------------------------
  # Process-discipline SessionStart hook — reminds the assistant to check
  # .claude/skills/ before acting; settings.json.tmpl wires it via `bash <path>`
  # since generated files are always written 0644 (no executable bit to rely on).
  # ---------------------------------------------------------------------------

  Scenario: SessionStart hook is generated and wired into settings.json
    When the project is initialized without the --assistant flag
    Then the following files are generated:
      | File                           |
      | .claude/hooks/session-start.sh |
    And the file ".claude/settings.json" contains "SessionStart"

  Scenario Outline: Each AI assistant generates its own configuration file
    When the project is initialized with "--assistant <assistant>"
    Then the file "<file>" is generated
    And the following Claude Code files are generated in any case:
      | File      |
      | CLAUDE.md |
      | .claude/  |

    Examples:
      | assistant | file                             |
      | copilot   | .github/copilot-instructions.md  |
      | cursor    | .cursor/rules/guidelines.md      |
      | duo       | .gitlab/duo_instructions.md      |

  Scenario: Multiple AI assistants generate all their configuration files
    When the project is initialized with "--assistant copilot --assistant cursor --assistant duo"
    Then the following files are generated:
      | File                             |
      | .github/copilot-instructions.md  |
      | .cursor/rules/guidelines.md      |
      | .gitlab/duo_instructions.md      |
      | CLAUDE.md                        |
      | .claude/                         |

  Scenario: An unrecognized assistant value is rejected
    When the project is initialized with "--assistant unknown"
    Then initialization fails with an error indicating the valid values

  # ---------------------------------------------------------------------------
  # Per-guideline scoped rule files (ADR-008) — Copilot and Cursor each get one
  # native rule file per applicable guideline, extracted from that guideline's
  # "## Directives" section, in addition to Claude Code's own .claude/rules/ copy.
  # ---------------------------------------------------------------------------

  Scenario: Copilot generates one scoped instructions file per applicable guideline
    When the project is initialized with "--assistant copilot"
    Then the following files are generated:
      | File                                                    |
      | .github/instructions/general_coding.instructions.md     |
      | .github/instructions/error_handling.instructions.md     |
      | .github/instructions/testing.instructions.md             |

  Scenario: Cursor generates one scoped rule file per applicable guideline
    When the project is initialized with "--assistant cursor"
    Then the following files are generated:
      | File                                     |
      | .cursor/rules/general_coding.mdc         |
      | .cursor/rules/error_handling.mdc         |
      | .cursor/rules/testing.mdc                |

  # ---------------------------------------------------------------------------
  # Copilot prompt translation (ADR-008) — every applicable Claude Code command
  # and skill is translated into a .github/prompts/*.prompt.md file.
  # ---------------------------------------------------------------------------

  Scenario: Copilot translates Claude Code commands and skills into prompt files
    When the project is initialized with "--assistant copilot"
    Then the following files are generated:
      | File                                                     |
      | .github/prompts/new-domain-object.prompt.md              |
      | .github/prompts/commit.prompt.md                         |
      | .github/prompts/update-versions.prompt.md                |
      | .github/prompts/test-coverage.prompt.md                  |
      | .github/prompts/arch-check.prompt.md                     |
      | .github/prompts/adr.prompt.md                            |
      | .github/prompts/review.prompt.md                         |
      | .github/prompts/security-review.prompt.md                |
      | .github/prompts/tdd.prompt.md                            |
      | .github/prompts/systematic-debugging.prompt.md           |
      | .github/prompts/verification-before-completion.prompt.md |

  Scenario: Copilot generates chat modes approximating the code-reviewer and security-auditor Claude agents
    When the project is initialized with "--assistant copilot"
    Then the following files are generated:
      | File                                        |
      | .github/chatmodes/code-reviewer.chatmode.md |
      | .github/chatmodes/security-auditor.chatmode.md |

  # ---------------------------------------------------------------------------
  # Cursor command translation (ADR-008) — every applicable Claude Code command
  # and skill is translated into a .cursor/commands/*.md file. Cursor has no
  # confirmed subagent equivalent, so it gets no chat-mode-style file.
  # ---------------------------------------------------------------------------

  Scenario: Cursor translates Claude Code commands and skills into command files
    When the project is initialized with "--assistant cursor"
    Then the following files are generated:
      | File                                                |
      | .cursor/commands/new-domain-object.md              |
      | .cursor/commands/commit.md                         |
      | .cursor/commands/update-versions.md                |
      | .cursor/commands/test-coverage.md                  |
      | .cursor/commands/arch-check.md                     |
      | .cursor/commands/adr.md                            |
      | .cursor/commands/review.md                         |
      | .cursor/commands/security-review.md                |
      | .cursor/commands/tdd.md                            |
      | .cursor/commands/systematic-debugging.md           |
      | .cursor/commands/verification-before-completion.md |

  # ---------------------------------------------------------------------------
  # review/security-review are degraded, never omitted (ADR-008): both Copilot
  # prompts and Cursor commands for these two skills still get generated, since
  # neither tool has a confirmed subagent-isolation equivalent to fall back on
  # silently dropping them would remove the two highest-value skills instead.
  # ---------------------------------------------------------------------------

  Scenario Outline: Degraded skills are still generated for assistants without subagent isolation
    When the project is initialized with "--assistant <assistant>"
    Then the file "<file>" is generated

    Examples:
      | assistant | file                                       |
      | copilot   | .github/prompts/review.prompt.md          |
      | copilot   | .github/prompts/security-review.prompt.md |
      | cursor    | .cursor/commands/review.md                |
      | cursor    | .cursor/commands/security-review.md       |

  # ---------------------------------------------------------------------------
  # MCP config duplication (undocumented in ADR-008 beyond the always-on root
  # .mcp.json) — Copilot and Cursor each get their own copy of the MCP config in
  # the directory their tooling actually reads it from.
  # ---------------------------------------------------------------------------

  Scenario Outline: Assistant-specific MCP config is duplicated alongside the always-on root config
    When the project is initialized with "--assistant <assistant>"
    Then the following files are generated:
      | File          |
      | .mcp.json     |
      | <mcp_copy>    |

    Examples:
      | assistant | mcp_copy          |
      | copilot   | .vscode/mcp.json  |
      | cursor    | .cursor/mcp.json  |

  # ---------------------------------------------------------------------------
  # Duo intentionally stays on the single condensed digest file only (ADR-008
  # scopes the richer, per-guideline/prompt/chatmode treatment to Copilot and
  # Cursor) — no .gitlab/instructions/*, no prompt or command translation.
  # ---------------------------------------------------------------------------

  Scenario: Duo does not receive per-guideline, prompt, or command files
    When the project is initialized with "--assistant duo"
    Then the following files are generated:
      | File                          |
      | .gitlab/duo_instructions.md   |