---
phase: 03-tier-3-9-providers
plan: 04
type: execute
wave: 1
depends_on: []
files_modified:
  - providers/github-copilot.yaml
  - providers/cursor.yaml
  - providers/tabnine.yaml
  - providers/codeium.yaml
  - providers/sourcegraph.yaml
  - providers/codewhisperer.yaml
  - providers/replit-ai.yaml
  - providers/codestral.yaml
  - providers/watsonx.yaml
  - providers/oracle-ai.yaml
  - pkg/providers/definitions/github-copilot.yaml
  - pkg/providers/definitions/cursor.yaml
  - pkg/providers/definitions/tabnine.yaml
  - pkg/providers/definitions/codeium.yaml
  - pkg/providers/definitions/sourcegraph.yaml
  - pkg/providers/definitions/codewhisperer.yaml
  - pkg/providers/definitions/replit-ai.yaml
  - pkg/providers/definitions/codestral.yaml
  - pkg/providers/definitions/watsonx.yaml
  - pkg/providers/definitions/oracle-ai.yaml
autonomous: true
requirements: [PROV-07]
must_haves:
  truths:
    - "10 Tier 7 Code/Dev Tools provider YAMLs load"
    - "Sourcegraph Cody uses documented sgp_ prefix pattern"
    - "GitHub Copilot uses ghu_/gho_ token patterns"
  artifacts:
    - path: "providers/github-copilot.yaml"
      provides: "GitHub Copilot token pattern"
      contains: "copilot"
    - path: "providers/sourcegraph.yaml"
      provides: "Sourcegraph Cody sgp_ pattern"
      contains: "sgp_"
    - path: "providers/codestral.yaml"
      provides: "Codestral (Mistral) keyword detection"
      contains: "codestral"
  key_links:
    - from: "provider keywords[]"
      to: "Registry Aho-Corasick automaton"
      via: "NewRegistry()"
      pattern: "keywords"
---

<objective>
Create 10 Tier 7 Code/Dev Tools provider YAMLs — AI coding assistants and IDE plugins (GitHub Copilot, Cursor, Tabnine, Codeium, Sourcegraph Cody, Amazon CodeWhisperer, Replit AI, Codestral, IBM watsonx, Oracle AI).

Purpose: Satisfy PROV-07 (10 Tier 7 Code/Dev Tools providers).

Output: 20 YAML files.

Addresses PROV-07.
</objective>

<execution_context>
@$HOME/.claude/get-shit-done/workflows/execute-plan.md
@$HOME/.claude/get-shit-done/templates/summary.md
</execution_context>

<context>
@.planning/ROADMAP.md
@.planning/phases/03-tier-3-9-providers/03-CONTEXT.md
@pkg/providers/schema.go

<interfaces>
Schema per pkg/providers/schema.go. Dual-location required. RE2 regex only.
GitHub Copilot uses standard GitHub token formats (ghu_, gho_) — keyword anchoring to "copilot" disambiguates from generic GitHub tokens.
</interfaces>
</context>

<tasks>

<task type="auto">
  <name>Task 1: GitHub Copilot, Cursor, Tabnine, Codeium, Sourcegraph YAMLs</name>
  <files>providers/github-copilot.yaml, providers/cursor.yaml, providers/tabnine.yaml, providers/codeium.yaml, providers/sourcegraph.yaml, pkg/providers/definitions/github-copilot.yaml, pkg/providers/definitions/cursor.yaml, pkg/providers/definitions/tabnine.yaml, pkg/providers/definitions/codeium.yaml, pkg/providers/definitions/sourcegraph.yaml</files>
  <read_first>
    - pkg/providers/schema.go
  </read_first>
  <action>
providers/github-copilot.yaml:

```yaml
format_version: 1
name: github-copilot
display_name: GitHub Copilot
tier: 7
last_verified: "2026-04-05"
keywords:
  - "copilot"
  - "github-copilot"
  - "GITHUB_COPILOT_TOKEN"
  - "api.githubcopilot.com"
  - "copilot-internal"
patterns:
  - regex: 'ghu_[A-Za-z0-9]{36}'
    entropy_min: 4.0
    confidence: medium
  - regex: 'gho_[A-Za-z0-9]{36}'
    entropy_min: 4.0
    confidence: medium
verify:
  method: GET
  url: https://api.github.com/user
  headers:
    Authorization: "token {KEY}"
  valid_status: [200]
  invalid_status: [401, 403]
```

providers/cursor.yaml:

```yaml
format_version: 1
name: cursor
display_name: Cursor AI
tier: 7
last_verified: "2026-04-05"
keywords:
  - "cursor"
  - "CURSOR_API_KEY"
  - "cursor.sh"
  - "cursor.com"
  - "cursor-ide"
verify:
  method: GET
  url: ""
  headers: {}
  valid_status: []
  invalid_status: []
```

providers/tabnine.yaml:

```yaml
format_version: 1
name: tabnine
display_name: Tabnine
tier: 7
last_verified: "2026-04-05"
keywords:
  - "tabnine"
  - "TABNINE_API_KEY"
  - "api.tabnine.com"
  - "tabnine-pro"
verify:
  method: GET
  url: ""
  headers: {}
  valid_status: []
  invalid_status: []
```

providers/codeium.yaml:

```yaml
format_version: 1
name: codeium
display_name: Codeium (Windsurf)
tier: 7
last_verified: "2026-04-05"
keywords:
  - "codeium"
  - "windsurf"
  - "CODEIUM_API_KEY"
  - "WINDSURF_API_KEY"
  - "codeium.com"
verify:
  method: GET
  url: ""
  headers: {}
  valid_status: []
  invalid_status: []
```

providers/sourcegraph.yaml:

```yaml
format_version: 1
name: sourcegraph
display_name: Sourcegraph Cody
tier: 7
last_verified: "2026-04-05"
keywords:
  - "sourcegraph"
  - "cody"
  - "SRC_ACCESS_TOKEN"
  - "SOURCEGRAPH_TOKEN"
  - "sourcegraph.com"
  - "sgp_"
patterns:
  - regex: 'sgp_[A-Fa-f0-9]{16,}_[A-Fa-f0-9]{40}'
    entropy_min: 4.0
    confidence: high
  - regex: 'sgp_[A-Fa-f0-9]{40}'
    entropy_min: 4.0
    confidence: medium
verify:
  method: GET
  url: https://sourcegraph.com/.api/graphql
  headers:
    Authorization: "token {KEY}"
  valid_status: [200]
  invalid_status: [401, 403]
```

Copy all 5 files verbatim to pkg/providers/definitions/.
  </action>
  <verify>
    <automated>cd /home/salva/Documents/apikey && for f in github-copilot cursor tabnine codeium sourcegraph; do diff providers/$f.yaml pkg/providers/definitions/$f.yaml || exit 1; done && go test ./pkg/providers/... -count=1 && go test ./pkg/engine/... -count=1</automated>
  </verify>
  <acceptance_criteria>
    - All 10 files exist
    - `grep -q 'ghu_' providers/github-copilot.yaml`
    - `grep -q 'sgp_' providers/sourcegraph.yaml`
    - `grep -q 'windsurf' providers/codeium.yaml`
    - `go test ./pkg/providers/... -count=1` passes
    - `go test ./pkg/engine/... -count=1` passes
  </acceptance_criteria>
  <done>5 code assistant providers dual-located.</done>
</task>

<task type="auto">
  <name>Task 2: CodeWhisperer, Replit AI, Codestral, watsonx, Oracle AI YAMLs</name>
  <files>providers/codewhisperer.yaml, providers/replit-ai.yaml, providers/codestral.yaml, providers/watsonx.yaml, providers/oracle-ai.yaml, pkg/providers/definitions/codewhisperer.yaml, pkg/providers/definitions/replit-ai.yaml, pkg/providers/definitions/codestral.yaml, pkg/providers/definitions/watsonx.yaml, pkg/providers/definitions/oracle-ai.yaml</files>
  <read_first>
    - pkg/providers/schema.go
  </read_first>
  <action>
providers/codewhisperer.yaml:

```yaml
format_version: 1
name: codewhisperer
display_name: Amazon CodeWhisperer / Q Developer
tier: 7
last_verified: "2026-04-05"
keywords:
  - "codewhisperer"
  - "q-developer"
  - "amazonq"
  - "codewhisperer.us-east-1.amazonaws.com"
  - "CODEWHISPERER_PROFILE_ARN"
verify:
  method: GET
  url: ""
  headers: {}
  valid_status: []
  invalid_status: []
```

providers/replit-ai.yaml:

```yaml
format_version: 1
name: replit-ai
display_name: Replit AI (Ghostwriter)
tier: 7
last_verified: "2026-04-05"
keywords:
  - "replit"
  - "ghostwriter"
  - "REPLIT_TOKEN"
  - "REPLIT_DB_URL"
  - "replit.com"
verify:
  method: GET
  url: ""
  headers: {}
  valid_status: []
  invalid_status: []
```

providers/codestral.yaml:

```yaml
format_version: 1
name: codestral
display_name: Codestral (Mistral Code)
tier: 7
last_verified: "2026-04-05"
keywords:
  - "codestral"
  - "CODESTRAL_API_KEY"
  - "codestral.mistral.ai"
  - "codestral-latest"
patterns:
  - regex: '[a-zA-Z0-9]{32}'
    entropy_min: 4.5
    confidence: low
verify:
  method: GET
  url: https://codestral.mistral.ai/v1/models
  headers:
    Authorization: "Bearer {KEY}"
  valid_status: [200]
  invalid_status: [401, 403]
```

providers/watsonx.yaml:

```yaml
format_version: 1
name: watsonx
display_name: IBM watsonx
tier: 7
last_verified: "2026-04-05"
keywords:
  - "watsonx"
  - "WATSONX_API_KEY"
  - "WATSONX_PROJECT_ID"
  - "IBM_CLOUD_API_KEY"
  - "us-south.ml.cloud.ibm.com"
  - "watsonx.ai"
verify:
  method: POST
  url: https://iam.cloud.ibm.com/identity/token
  headers: {}
  valid_status: [200]
  invalid_status: [400, 401]
```

providers/oracle-ai.yaml:

```yaml
format_version: 1
name: oracle-ai
display_name: Oracle Generative AI
tier: 7
last_verified: "2026-04-05"
keywords:
  - "oci-genai"
  - "oracle-genai"
  - "OCI_GENAI"
  - "generativeai.oci.oraclecloud.com"
  - "oraclecloud.com"
verify:
  method: GET
  url: ""
  headers: {}
  valid_status: []
  invalid_status: []
```

Copy all 5 files verbatim to pkg/providers/definitions/.
  </action>
  <verify>
    <automated>cd /home/salva/Documents/apikey && for f in codewhisperer replit-ai codestral watsonx oracle-ai; do diff providers/$f.yaml pkg/providers/definitions/$f.yaml || exit 1; done && go test ./pkg/providers/... -count=1 && go test ./pkg/engine/... -count=1 && test $(grep -l 'tier: 7' providers/*.yaml | wc -l) -eq 10</automated>
  </verify>
  <acceptance_criteria>
    - All 10 files exist
    - `grep -q 'codewhisperer' providers/codewhisperer.yaml`
    - `grep -q 'watsonx.ai' providers/watsonx.yaml`
    - `grep -q 'oraclecloud' providers/oracle-ai.yaml`
    - Total Tier 7 count = 10
    - `go test ./pkg/providers/... -count=1` passes
  </acceptance_criteria>
  <done>All 10 Tier 7 code/dev tools providers dual-located. PROV-07 satisfied.</done>
</task>

</tasks>

<verification>
`grep -l 'tier: 7' providers/*.yaml | wc -l` returns 10.
</verification>

<success_criteria>
- 10 Tier 7 code/dev tools providers created
- Sourcegraph uses documented sgp_ high-confidence pattern
- Undocumented providers (cursor, tabnine, codeium, codewhisperer, replit-ai, oracle-ai) use keyword-only
- No engine regression
</success_criteria>

<output>
After completion, create `.planning/phases/03-tier-3-9-providers/03-04-SUMMARY.md`
</output>
