260304:1233 20260304:1200 update app to lcbp3
Some checks failed
Build and Deploy / deploy (push) Failing after 1m32s
Some checks failed
Build and Deploy / deploy (push) Failing after 1m32s
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: speckit.checklist
|
||||
description: Generate a custom checklist for the current feature based on user requirements.
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
## Checklist Purpose: "Unit Tests for English"
|
||||
@@ -212,7 +213,7 @@ You are the **Antigravity Quality Gatekeeper**. Your role is to validate the qua
|
||||
|
||||
b. **Structure Reference**: Generate the checklist following the canonical template in `templates/checklist-template.md` for title, meta section, category headings, and ID formatting. If template is unavailable, use: H1 title, purpose/created meta lines, `##` category sections containing `- [ ] CHK### <requirement item>` lines with globally incrementing IDs starting at CHK001.
|
||||
|
||||
7. **Report**: Output full path to created checklist, item count, and remind user that each run creates a new file. Summarize:
|
||||
6. **Report**: Output full path to created checklist, item count, and remind user that each run creates a new file. Summarize:
|
||||
- Focus areas selected
|
||||
- Depth level
|
||||
- Actor/timing
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: speckit.constitution
|
||||
description: Create or update the project constitution from interactive or provided principle inputs, ensuring all dependent templates stay in sync.
|
||||
handoffs:
|
||||
version: 1.0.0
|
||||
handoffs:
|
||||
- label: Build Specification
|
||||
agent: speckit.specify
|
||||
prompt: Implement the feature specification based on the updated constitution. I want to build...
|
||||
@@ -29,7 +30,7 @@ Follow this execution flow:
|
||||
|
||||
1. Load the existing constitution template at `memory/constitution.md`.
|
||||
- Identify every placeholder token of the form `[ALL_CAPS_IDENTIFIER]`.
|
||||
**IMPORTANT**: The user might require less or more principles than the ones used in the template. If a number is specified, respect that - follow the general template. You will update the doc accordingly.
|
||||
**IMPORTANT**: The user might require less or more principles than the ones used in the template. If a number is specified, respect that - follow the general template. You will update the doc accordingly.
|
||||
|
||||
2. Collect/derive values for placeholders:
|
||||
- If user input (conversation) supplies a value, use it.
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: speckit.quizme
|
||||
description: Challenge the specification with Socratic questioning to identify logical gaps, unhandled edge cases, and robustness issues.
|
||||
handoffs:
|
||||
version: 1.0.0
|
||||
handoffs:
|
||||
- label: Clarify Spec Requirements
|
||||
agent: speckit.clarify
|
||||
prompt: Clarify specification requirements
|
||||
@@ -38,8 +39,9 @@ Execution steps:
|
||||
- Challenge security (e.g., "You rely on client-side validation here, but what if I curl the API?").
|
||||
|
||||
4. **The Quiz Loop**:
|
||||
- Present 3-5 challenging scenarios *one by one*.
|
||||
- Present 3-5 challenging scenarios _one by one_.
|
||||
- Format:
|
||||
|
||||
> **Scenario**: [Describe a plausible edge case or failure]
|
||||
> **Current Spec**: [Quote where the spec implies behavior or is silent]
|
||||
> **The Quiz**: What should the system do here?
|
||||
@@ -62,4 +64,4 @@ Execution steps:
|
||||
|
||||
- **Be a Skeptic**: Don't assume the happy path works.
|
||||
- **Focus on "When" and "If"**: When high load, If network drops, When concurrent edits.
|
||||
- **Don't be annoying**: Focus on *critical* flaws, not nitpicks.
|
||||
- **Don't be annoying**: Focus on _critical_ flaws, not nitpicks.
|
||||
|
||||
199
.agents/skills/speckit.security-audit/SKILL.md
Normal file
199
.agents/skills/speckit.security-audit/SKILL.md
Normal file
@@ -0,0 +1,199 @@
|
||||
---
|
||||
name: speckit.security-audit
|
||||
description: Perform a security-focused audit of the codebase against OWASP Top 10, CASL authorization, and LCBP3-DMS security requirements.
|
||||
version: 1.0.0
|
||||
depends-on:
|
||||
- speckit.checker
|
||||
---
|
||||
|
||||
## Role
|
||||
|
||||
You are the **Antigravity Security Sentinel**. Your mission is to identify security vulnerabilities, authorization gaps, and compliance issues specific to the LCBP3-DMS project before they reach production.
|
||||
|
||||
## Task
|
||||
|
||||
Perform a comprehensive security audit covering OWASP Top 10, CASL permission enforcement, file upload safety, and project-specific security rules defined in `specs/06-Decision-Records/ADR-016-security.md`.
|
||||
|
||||
## Context Loading
|
||||
|
||||
Before auditing, load the security context:
|
||||
|
||||
1. Read `specs/06-Decision-Records/ADR-016-security.md` for project security decisions
|
||||
2. Read `specs/05-Engineering-Guidelines/05-02-backend-guidelines.md` for backend security patterns
|
||||
3. Read `specs/03-Data-and-Storage/lcbp3-v1.7.0-seed-permissions.sql` for CASL permission definitions
|
||||
4. Read `GEMINI.md` for security rules (Section: Security & Integrity Rules)
|
||||
|
||||
## Execution Steps
|
||||
|
||||
### Phase 1: OWASP Top 10 Scan
|
||||
|
||||
Scan the `backend/src/` directory for each OWASP category:
|
||||
|
||||
| # | OWASP Category | What to Check | Files to Scan |
|
||||
| --- | ------------------------- | ---------------------------------------------------------------------------------------- | ------------------------------------------------- |
|
||||
| A01 | Broken Access Control | Missing `@UseGuards(JwtAuthGuard, CaslAbilityGuard)` on controllers, unprotected routes | `**/*.controller.ts` |
|
||||
| A02 | Cryptographic Failures | Hardcoded secrets, weak hashing, missing HTTPS enforcement | `**/*.ts`, `docker-compose*.yml` |
|
||||
| A03 | Injection | Raw SQL queries, unsanitized user input in TypeORM queries, template literals in queries | `**/*.service.ts`, `**/*.repository.ts` |
|
||||
| A04 | Insecure Design | Missing rate limiting on auth endpoints, no idempotency checks on mutations | `**/*.controller.ts`, `**/*.guard.ts` |
|
||||
| A05 | Security Misconfiguration | Missing Helmet.js, CORS misconfiguration, debug mode in production | `main.ts`, `app.module.ts`, `docker-compose*.yml` |
|
||||
| A06 | Vulnerable Components | Outdated dependencies with known CVEs | `package.json`, `pnpm-lock.yaml` |
|
||||
| A07 | Auth Failures | Missing brute-force protection, weak password policy, JWT misconfiguration | `auth/`, `**/*.strategy.ts` |
|
||||
| A08 | Data Integrity | Missing input validation, unvalidated file types, missing CSRF protection | `**/*.dto.ts`, `**/*.interceptor.ts` |
|
||||
| A09 | Logging Failures | Missing audit logs for security events, sensitive data in logs | `**/*.service.ts`, `**/*.interceptor.ts` |
|
||||
| A10 | SSRF | Unrestricted outbound requests, user-controlled URLs | `**/*.service.ts` |
|
||||
|
||||
### Phase 2: CASL Authorization Audit
|
||||
|
||||
1. **Load permission matrix** from `specs/03-Data-and-Storage/lcbp3-v1.7.0-seed-permissions.sql`
|
||||
2. **Scan all controllers** for `@UseGuards(CaslAbilityGuard)` coverage:
|
||||
|
||||
```bash
|
||||
# Find controllers without CASL guard
|
||||
grep -rL "CaslAbilityGuard" backend/src/modules/*/\*.controller.ts
|
||||
```
|
||||
|
||||
3. **Verify 4-Level RBAC enforcement**:
|
||||
- Level 1: System Admin (full access)
|
||||
- Level 2: Project Admin (project-scoped)
|
||||
- Level 3: Department Lead (department-scoped)
|
||||
- Level 4: User (own-records only)
|
||||
|
||||
4. **Check ability definitions** — ensure every endpoint has:
|
||||
- `@CheckPolicies()` or `@Can()` decorator
|
||||
- Correct action (`read`, `create`, `update`, `delete`, `manage`)
|
||||
- Correct subject (entity class, not string)
|
||||
|
||||
5. **Cross-reference with routes** — verify:
|
||||
- No public endpoints that should be protected
|
||||
- No endpoints with broader permissions than required (principle of least privilege)
|
||||
- Query scoping: users can only query their own records (unless admin)
|
||||
|
||||
### Phase 3: File Upload Security (ClamAV)
|
||||
|
||||
Check LCBP3-DMS-specific file handling per ADR-016:
|
||||
|
||||
1. **Two-Phase Storage verification**:
|
||||
- Upload goes to temp directory first → scanned by ClamAV → moved to permanent
|
||||
- Check for direct writes to permanent storage (violation)
|
||||
|
||||
2. **ClamAV integration**:
|
||||
- Verify ClamAV service is configured in `docker-compose*.yml`
|
||||
- Check that file upload endpoints call ClamAV scan before commit
|
||||
- Verify rejection flow for infected files
|
||||
|
||||
3. **File type validation**:
|
||||
- Check allowed MIME types against whitelist
|
||||
- Verify file extension validation exists
|
||||
- Check for double-extension attacks (e.g., `file.pdf.exe`)
|
||||
|
||||
4. **File size limits**:
|
||||
- Verify upload size limits are enforced
|
||||
- Check for path traversal in filenames (`../`, `..\\`)
|
||||
|
||||
### Phase 4: LCBP3-DMS-Specific Checks
|
||||
|
||||
1. **Idempotency** — verify all POST/PUT/PATCH endpoints check `Idempotency-Key` header:
|
||||
|
||||
```bash
|
||||
# Find mutation endpoints without idempotency
|
||||
grep -rn "@Post\|@Put\|@Patch" backend/src/modules/*/\*.controller.ts
|
||||
# Cross-reference with idempotency guard usage
|
||||
grep -rn "IdempotencyGuard\|Idempotency-Key" backend/src/
|
||||
```
|
||||
|
||||
2. **Optimistic Locking** — verify document entities use `@VersionColumn()`:
|
||||
|
||||
```bash
|
||||
grep -rn "VersionColumn" backend/src/modules/*/entities/*.entity.ts
|
||||
```
|
||||
|
||||
3. **Redis Redlock** — verify document numbering uses distributed locks:
|
||||
|
||||
```bash
|
||||
grep -rn "Redlock\|redlock\|acquireLock" backend/src/
|
||||
```
|
||||
|
||||
4. **Password Security** — verify bcrypt with 12+ salt rounds:
|
||||
|
||||
```bash
|
||||
grep -rn "bcrypt\|saltRounds\|genSalt" backend/src/
|
||||
```
|
||||
|
||||
5. **Rate Limiting** — verify throttle guard on auth endpoints:
|
||||
|
||||
```bash
|
||||
grep -rn "ThrottlerGuard\|@Throttle" backend/src/modules/auth/
|
||||
```
|
||||
|
||||
6. **Environment Variables** — ensure no `.env` files for production:
|
||||
- Check for `.env` files committed to git
|
||||
- Verify Docker compose uses `environment:` section, not `env_file:`
|
||||
|
||||
## Severity Classification
|
||||
|
||||
| Severity | Description | Response |
|
||||
| -------------- | ----------------------------------------------------- | ----------------------- |
|
||||
| 🔴 **Critical** | Exploitable vulnerability, data exposure, auth bypass | Immediate fix required |
|
||||
| 🟠 **High** | Missing security control, potential escalation path | Fix before next release |
|
||||
| 🟡 **Medium** | Best practice violation, defense-in-depth gap | Plan fix in sprint |
|
||||
| 🟢 **Low** | Informational, minor hardening opportunity | Track in backlog |
|
||||
|
||||
## Report Format
|
||||
|
||||
Generate a structured report:
|
||||
|
||||
```markdown
|
||||
# 🔒 Security Audit Report
|
||||
|
||||
**Date**: <date>
|
||||
**Scope**: <backend/frontend/both>
|
||||
**Auditor**: Antigravity Security Sentinel
|
||||
|
||||
## Summary
|
||||
|
||||
| Severity | Count |
|
||||
| ---------- | ----- |
|
||||
| 🔴 Critical | X |
|
||||
| 🟠 High | X |
|
||||
| 🟡 Medium | X |
|
||||
| 🟢 Low | X |
|
||||
|
||||
## Findings
|
||||
|
||||
### [SEV-001] <Title> — 🔴 Critical
|
||||
|
||||
**Category**: OWASP A01 / CASL / ClamAV / LCBP3-Specific
|
||||
**File**: `<path>:<line>`
|
||||
**Description**: <what is wrong>
|
||||
**Impact**: <what could happen>
|
||||
**Recommendation**: <how to fix>
|
||||
**Code Example**:
|
||||
\`\`\`typescript
|
||||
// Before (vulnerable)
|
||||
...
|
||||
// After (fixed)
|
||||
...
|
||||
\`\`\`
|
||||
|
||||
## CASL Coverage Matrix
|
||||
|
||||
| Module | Controller | Guard? | Policies? | Level |
|
||||
| ------ | --------------- | ------ | --------- | ------------ |
|
||||
| auth | AuthController | ✅ | ✅ | N/A (public) |
|
||||
| users | UsersController | ✅ | ✅ | L1-L4 |
|
||||
| ... | ... | ... | ... | ... |
|
||||
|
||||
## Recommendations Priority
|
||||
|
||||
1. <Critical fix 1>
|
||||
2. <Critical fix 2>
|
||||
...
|
||||
```
|
||||
|
||||
## Operating Principles
|
||||
|
||||
- **Read-Only**: This skill only reads and reports. Never modify code.
|
||||
- **Evidence-Based**: Every finding must include the exact file path and line number.
|
||||
- **No False Confidence**: If a check is inconclusive, mark it as "⚠️ Needs Manual Review" rather than passing.
|
||||
- **LCBP3-Specific**: Prioritize project-specific rules (idempotency, ClamAV, Redlock) over generic checks.
|
||||
- **Frontend Too**: If scope includes frontend, also check for XSS in React components, unescaped user data, and exposed API keys.
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: speckit.specify
|
||||
description: Create or update the feature specification from a natural language feature description.
|
||||
handoffs:
|
||||
version: 1.0.0
|
||||
handoffs:
|
||||
- label: Build Technical Plan
|
||||
agent: speckit.plan
|
||||
prompt: Create a plan for the spec. I am building with...
|
||||
@@ -44,27 +45,28 @@ Given that feature description, do this:
|
||||
- "Fix payment processing timeout bug" → "fix-payment-timeout"
|
||||
|
||||
2. **Check for existing branches before creating new one**:
|
||||
|
||||
|
||||
a. First, fetch all remote branches to ensure we have the latest information:
|
||||
```bash
|
||||
git fetch --all --prune
|
||||
```
|
||||
|
||||
|
||||
```bash
|
||||
git fetch --all --prune
|
||||
```
|
||||
|
||||
b. Find the highest feature number across all sources for the short-name:
|
||||
- Remote branches: `git ls-remote --heads origin | grep -E 'refs/heads/[0-9]+-<short-name>$'`
|
||||
- Local branches: `git branch | grep -E '^[* ]*[0-9]+-<short-name>$'`
|
||||
- Specs directories: Check for directories matching `specs/[0-9]+-<short-name>`
|
||||
|
||||
- Remote branches: `git ls-remote --heads origin | grep -E 'refs/heads/[0-9]+-<short-name>$'`
|
||||
- Local branches: `git branch | grep -E '^[* ]*[0-9]+-<short-name>$'`
|
||||
- Specs directories: Check for directories matching `specs/[0-9]+-<short-name>`
|
||||
|
||||
c. Determine the next available number:
|
||||
- Extract all numbers from all three sources
|
||||
- Find the highest number N
|
||||
- Use N+1 for the new branch number
|
||||
|
||||
- Extract all numbers from all three sources
|
||||
- Find the highest number N
|
||||
- Use N+1 for the new branch number
|
||||
|
||||
d. Run the script `../scripts/bash/create-new-feature.sh --json "{{args}}"` with the calculated number and short-name:
|
||||
- Pass `--number N+1` and `--short-name "your-short-name"` along with the feature description
|
||||
- Bash example: `.specify/scripts/bash/create-new-feature.sh --json "{{args}}" --json --number 5 --short-name "user-auth" "Add user authentication"`
|
||||
- PowerShell example: `.specify/scripts/bash/create-new-feature.sh --json "{{args}}" -Json -Number 5 -ShortName "user-auth" "Add user authentication"`
|
||||
|
||||
- Pass `--number N+1` and `--short-name "your-short-name"` along with the feature description
|
||||
- Bash example: `.specify/scripts/bash/create-new-feature.sh --json "{{args}}" --json --number 5 --short-name "user-auth" "Add user authentication"`
|
||||
- PowerShell example: `.specify/scripts/bash/create-new-feature.sh --json "{{args}}" -Json -Number 5 -ShortName "user-auth" "Add user authentication"`
|
||||
|
||||
**IMPORTANT**:
|
||||
- Check all three sources (remote branches, local branches, specs directories) to find the highest number
|
||||
- Only match branches/directories with the exact short-name pattern
|
||||
@@ -77,30 +79,29 @@ Given that feature description, do this:
|
||||
3. Load `templates/spec-template.md` to understand required sections.
|
||||
|
||||
4. Follow this execution flow:
|
||||
|
||||
1. Parse user description from Input
|
||||
If empty: ERROR "No feature description provided"
|
||||
2. Extract key concepts from description
|
||||
Identify: actors, actions, data, constraints
|
||||
3. For unclear aspects:
|
||||
- Make informed guesses based on context and industry standards
|
||||
- Only mark with [NEEDS CLARIFICATION: specific question] if:
|
||||
- The choice significantly impacts feature scope or user experience
|
||||
- Multiple reasonable interpretations exist with different implications
|
||||
- No reasonable default exists
|
||||
- **LIMIT: Maximum 3 [NEEDS CLARIFICATION] markers total**
|
||||
- Prioritize clarifications by impact: scope > security/privacy > user experience > technical details
|
||||
4. Fill User Scenarios & Testing section
|
||||
If no clear user flow: ERROR "Cannot determine user scenarios"
|
||||
5. Generate Functional Requirements
|
||||
Each requirement must be testable
|
||||
Use reasonable defaults for unspecified details (document assumptions in Assumptions section)
|
||||
6. Define Success Criteria
|
||||
Create measurable, technology-agnostic outcomes
|
||||
Include both quantitative metrics (time, performance, volume) and qualitative measures (user satisfaction, task completion)
|
||||
Each criterion must be verifiable without implementation details
|
||||
7. Identify Key Entities (if data involved)
|
||||
8. Return: SUCCESS (spec ready for planning)
|
||||
1. Parse user description from Input
|
||||
If empty: ERROR "No feature description provided"
|
||||
2. Extract key concepts from description
|
||||
Identify: actors, actions, data, constraints
|
||||
3. For unclear aspects:
|
||||
- Make informed guesses based on context and industry standards
|
||||
- Only mark with [NEEDS CLARIFICATION: specific question] if:
|
||||
- The choice significantly impacts feature scope or user experience
|
||||
- Multiple reasonable interpretations exist with different implications
|
||||
- No reasonable default exists
|
||||
- **LIMIT: Maximum 3 [NEEDS CLARIFICATION] markers total**
|
||||
- Prioritize clarifications by impact: scope > security/privacy > user experience > technical details
|
||||
4. Fill User Scenarios & Testing section
|
||||
If no clear user flow: ERROR "Cannot determine user scenarios"
|
||||
5. Generate Functional Requirements
|
||||
Each requirement must be testable
|
||||
Use reasonable defaults for unspecified details (document assumptions in Assumptions section)
|
||||
6. Define Success Criteria
|
||||
Create measurable, technology-agnostic outcomes
|
||||
Include both quantitative metrics (time, performance, volume) and qualitative measures (user satisfaction, task completion)
|
||||
Each criterion must be verifiable without implementation details
|
||||
7. Identify Key Entities (if data involved)
|
||||
8. Return: SUCCESS (spec ready for planning)
|
||||
|
||||
5. Write the specification to SPEC_FILE using the template structure, replacing placeholders with concrete details derived from the feature description (arguments) while preserving section order and headings.
|
||||
|
||||
@@ -108,91 +109,90 @@ Given that feature description, do this:
|
||||
|
||||
a. **Create Spec Quality Checklist**: Generate a checklist file at `FEATURE_DIR/checklists/requirements.md` using the checklist template structure with these validation items:
|
||||
|
||||
```markdown
|
||||
# Specification Quality Checklist: [FEATURE NAME]
|
||||
|
||||
**Purpose**: Validate specification completeness and quality before proceeding to planning
|
||||
**Created**: [DATE]
|
||||
**Feature**: [Link to spec.md]
|
||||
|
||||
## Content Quality
|
||||
|
||||
- [ ] No implementation details (languages, frameworks, APIs)
|
||||
- [ ] Focused on user value and business needs
|
||||
- [ ] Written for non-technical stakeholders
|
||||
- [ ] All mandatory sections completed
|
||||
|
||||
## Requirement Completeness
|
||||
|
||||
- [ ] No [NEEDS CLARIFICATION] markers remain
|
||||
- [ ] Requirements are testable and unambiguous
|
||||
- [ ] Success criteria are measurable
|
||||
- [ ] Success criteria are technology-agnostic (no implementation details)
|
||||
- [ ] All acceptance scenarios are defined
|
||||
- [ ] Edge cases are identified
|
||||
- [ ] Scope is clearly bounded
|
||||
- [ ] Dependencies and assumptions identified
|
||||
|
||||
## Feature Readiness
|
||||
|
||||
- [ ] All functional requirements have clear acceptance criteria
|
||||
- [ ] User scenarios cover primary flows
|
||||
- [ ] Feature meets measurable outcomes defined in Success Criteria
|
||||
- [ ] No implementation details leak into specification
|
||||
|
||||
## Notes
|
||||
|
||||
- Items marked incomplete require spec updates before `/speckit.clarify` or `/speckit.plan`
|
||||
```
|
||||
```markdown
|
||||
# Specification Quality Checklist: [FEATURE NAME]
|
||||
|
||||
**Purpose**: Validate specification completeness and quality before proceeding to planning
|
||||
**Created**: [DATE]
|
||||
**Feature**: [Link to spec.md]
|
||||
|
||||
## Content Quality
|
||||
|
||||
- [ ] No implementation details (languages, frameworks, APIs)
|
||||
- [ ] Focused on user value and business needs
|
||||
- [ ] Written for non-technical stakeholders
|
||||
- [ ] All mandatory sections completed
|
||||
|
||||
## Requirement Completeness
|
||||
|
||||
- [ ] No [NEEDS CLARIFICATION] markers remain
|
||||
- [ ] Requirements are testable and unambiguous
|
||||
- [ ] Success criteria are measurable
|
||||
- [ ] Success criteria are technology-agnostic (no implementation details)
|
||||
- [ ] All acceptance scenarios are defined
|
||||
- [ ] Edge cases are identified
|
||||
- [ ] Scope is clearly bounded
|
||||
- [ ] Dependencies and assumptions identified
|
||||
|
||||
## Feature Readiness
|
||||
|
||||
- [ ] All functional requirements have clear acceptance criteria
|
||||
- [ ] User scenarios cover primary flows
|
||||
- [ ] Feature meets measurable outcomes defined in Success Criteria
|
||||
- [ ] No implementation details leak into specification
|
||||
|
||||
## Notes
|
||||
|
||||
- Items marked incomplete require spec updates before `/speckit.clarify` or `/speckit.plan`
|
||||
```
|
||||
|
||||
b. **Run Validation Check**: Review the spec against each checklist item:
|
||||
- For each item, determine if it passes or fails
|
||||
- Document specific issues found (quote relevant spec sections)
|
||||
- For each item, determine if it passes or fails
|
||||
- Document specific issues found (quote relevant spec sections)
|
||||
|
||||
c. **Handle Validation Results**:
|
||||
- **If all items pass**: Mark checklist complete and proceed to step 6
|
||||
|
||||
- **If all items pass**: Mark checklist complete and proceed to step 6
|
||||
- **If items fail (excluding [NEEDS CLARIFICATION])**:
|
||||
1. List the failing items and specific issues
|
||||
2. Update the spec to address each issue
|
||||
3. Re-run validation until all items pass (max 3 iterations)
|
||||
4. If still failing after 3 iterations, document remaining issues in checklist notes and warn user
|
||||
|
||||
- **If items fail (excluding [NEEDS CLARIFICATION])**:
|
||||
1. List the failing items and specific issues
|
||||
2. Update the spec to address each issue
|
||||
3. Re-run validation until all items pass (max 3 iterations)
|
||||
4. If still failing after 3 iterations, document remaining issues in checklist notes and warn user
|
||||
- **If [NEEDS CLARIFICATION] markers remain**:
|
||||
1. Extract all [NEEDS CLARIFICATION: ...] markers from the spec
|
||||
2. **LIMIT CHECK**: If more than 3 markers exist, keep only the 3 most critical (by scope/security/UX impact) and make informed guesses for the rest
|
||||
3. For each clarification needed (max 3), present options to user in this format:
|
||||
|
||||
- **If [NEEDS CLARIFICATION] markers remain**:
|
||||
1. Extract all [NEEDS CLARIFICATION: ...] markers from the spec
|
||||
2. **LIMIT CHECK**: If more than 3 markers exist, keep only the 3 most critical (by scope/security/UX impact) and make informed guesses for the rest
|
||||
3. For each clarification needed (max 3), present options to user in this format:
|
||||
```markdown
|
||||
## Question [N]: [Topic]
|
||||
|
||||
```markdown
|
||||
## Question [N]: [Topic]
|
||||
|
||||
**Context**: [Quote relevant spec section]
|
||||
|
||||
**What we need to know**: [Specific question from NEEDS CLARIFICATION marker]
|
||||
|
||||
**Suggested Answers**:
|
||||
|
||||
| Option | Answer | Implications |
|
||||
|--------|--------|--------------|
|
||||
| A | [First suggested answer] | [What this means for the feature] |
|
||||
| B | [Second suggested answer] | [What this means for the feature] |
|
||||
| C | [Third suggested answer] | [What this means for the feature] |
|
||||
| Custom | Provide your own answer | [Explain how to provide custom input] |
|
||||
|
||||
**Your choice**: _[Wait for user response]_
|
||||
```
|
||||
**Context**: [Quote relevant spec section]
|
||||
|
||||
4. **CRITICAL - Table Formatting**: Ensure markdown tables are properly formatted:
|
||||
- Use consistent spacing with pipes aligned
|
||||
- Each cell should have spaces around content: `| Content |` not `|Content|`
|
||||
- Header separator must have at least 3 dashes: `|--------|`
|
||||
- Test that the table renders correctly in markdown preview
|
||||
5. Number questions sequentially (Q1, Q2, Q3 - max 3 total)
|
||||
6. Present all questions together before waiting for responses
|
||||
7. Wait for user to respond with their choices for all questions (e.g., "Q1: A, Q2: Custom - [details], Q3: B")
|
||||
8. Update the spec by replacing each [NEEDS CLARIFICATION] marker with the user's selected or provided answer
|
||||
9. Re-run validation after all clarifications are resolved
|
||||
**What we need to know**: [Specific question from NEEDS CLARIFICATION marker]
|
||||
|
||||
**Suggested Answers**:
|
||||
|
||||
| Option | Answer | Implications |
|
||||
| ------ | ------------------------- | ------------------------------------- |
|
||||
| A | [First suggested answer] | [What this means for the feature] |
|
||||
| B | [Second suggested answer] | [What this means for the feature] |
|
||||
| C | [Third suggested answer] | [What this means for the feature] |
|
||||
| Custom | Provide your own answer | [Explain how to provide custom input] |
|
||||
|
||||
**Your choice**: _[Wait for user response]_
|
||||
```
|
||||
|
||||
4. **CRITICAL - Table Formatting**: Ensure markdown tables are properly formatted:
|
||||
- Use consistent spacing with pipes aligned
|
||||
- Each cell should have spaces around content: `| Content |` not `|Content|`
|
||||
- Header separator must have at least 3 dashes: `|--------|`
|
||||
- Test that the table renders correctly in markdown preview
|
||||
5. Number questions sequentially (Q1, Q2, Q3 - max 3 total)
|
||||
6. Present all questions together before waiting for responses
|
||||
7. Wait for user to respond with their choices for all questions (e.g., "Q1: A, Q2: Custom - [details], Q3: B")
|
||||
8. Update the spec by replacing each [NEEDS CLARIFICATION] marker with the user's selected or provided answer
|
||||
9. Re-run validation after all clarifications are resolved
|
||||
|
||||
d. **Update Checklist**: After each validation iteration, update the checklist file with current pass/fail status
|
||||
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
---
|
||||
name: speckit.taskstoissues
|
||||
description: Convert existing tasks into actionable, dependency-ordered GitHub issues for the feature based on available design artifacts.
|
||||
description: Convert existing tasks into actionable, dependency-ordered issues for the feature based on available design artifacts.
|
||||
version: 1.1.0
|
||||
depends-on:
|
||||
- speckit.tasks
|
||||
tools: ['github/github-mcp-server/issue_write']
|
||||
---
|
||||
|
||||
@@ -14,22 +17,190 @@ You **MUST** consider the user input before proceeding (if not empty).
|
||||
|
||||
## Role
|
||||
|
||||
You are the **Antigravity Tracker Integrator**. Your role is to synchronize technical tasks with external project management systems like GitHub Issues. You ensure that every piece of work has a clear, tracked identity for collaborative execution.
|
||||
You are the **Antigravity Tracker Integrator**. Your role is to synchronize technical tasks with external project management systems (GitHub Issues or Gitea Issues). You ensure that every piece of work has a clear, tracked identity for collaborative execution.
|
||||
|
||||
## Task
|
||||
|
||||
### Outline
|
||||
|
||||
1. Run `../scripts/bash/check-prerequisites.sh --json --require-tasks --include-tasks` from repo root and parse FEATURE_DIR and AVAILABLE_DOCS list. All paths must be absolute. For single quotes in args like "I'm Groot", use escape syntax: e.g 'I'\\''m Groot' (or double-quote if possible: "I'm Groot").
|
||||
1. From the executed script, extract the path to **tasks**.
|
||||
1. Get the Git remote by running:
|
||||
Convert all tasks from `tasks.md` into well-structured issues on the appropriate platform (GitHub or Gitea), preserving dependency order, phase grouping, and labels.
|
||||
|
||||
```bash
|
||||
git config --get remote.origin.url
|
||||
```
|
||||
### Execution Steps
|
||||
|
||||
**ONLY PROCEED TO NEXT STEPS IF THE REMOTE IS A GITHUB URL**
|
||||
1. **Load Task Data**:
|
||||
Run `../scripts/bash/check-prerequisites.sh --json --require-tasks --include-tasks` from repo root and parse FEATURE_DIR and AVAILABLE_DOCS list. All paths must be absolute.
|
||||
For single quotes in args like "I'm Groot", use escape syntax: e.g 'I'\\''m Groot' (or double-quote if possible: "I'm Groot").
|
||||
|
||||
1. For each task in the list, use the GitHub MCP server to create a new issue in the repository that is representative of the Git remote.
|
||||
2. **Extract tasks path** from the executed script output.
|
||||
|
||||
**UNDER NO CIRCUMSTANCES EVER CREATE ISSUES IN REPOSITORIES THAT DO NOT MATCH THE REMOTE URL**
|
||||
3. **Detect Platform** — Get the Git remote and determine the platform:
|
||||
|
||||
```bash
|
||||
git config --get remote.origin.url
|
||||
```
|
||||
|
||||
| Remote URL Pattern | Platform | API |
|
||||
| ---------------------------------------- | ----------- | --------------------------- |
|
||||
| `github.com` | GitHub | GitHub MCP or REST API |
|
||||
| `gitea.*`, custom domain with `/api/v1/` | Gitea | Gitea REST API |
|
||||
| Other | Unsupported | **STOP** with error message |
|
||||
|
||||
**Platform Detection Rules**:
|
||||
- If URL contains `github.com` → GitHub
|
||||
- If URL contains a known Gitea domain (check `$ARGUMENTS` for hints, or try `<host>/api/v1/version`) → Gitea
|
||||
- If `$ARGUMENTS` explicitly specifies platform (e.g., `--platform gitea`) → use that
|
||||
- If uncertain → **ASK** the user which platform to use
|
||||
|
||||
> **UNDER NO CIRCUMSTANCES EVER CREATE ISSUES IN REPOSITORIES THAT DO NOT MATCH THE REMOTE URL**
|
||||
|
||||
4. **Parse `tasks.md`** — Extract structured data for each task:
|
||||
|
||||
| Field | Source | Example |
|
||||
| --------------- | ---------------------------- | -------------------------- |
|
||||
| Task ID | `T001`, `T002`, etc. | `T001` |
|
||||
| Phase | Phase heading | `Phase 1: Setup` |
|
||||
| Description | Task text after ID | `Create project structure` |
|
||||
| File paths | Paths in description | `src/models/user.py` |
|
||||
| Parallel marker | `[P]` flag | `true`/`false` |
|
||||
| User Story | `[US1]`, `[US2]`, etc. | `US1` |
|
||||
| Dependencies | Sequential ordering in phase | `T001 → T002` |
|
||||
|
||||
5. **Load Feature Context** (for issue body enrichment):
|
||||
- Read `spec.md` for requirement references
|
||||
- Read `plan.md` for architecture context (if exists)
|
||||
- Map tasks to requirements where possible
|
||||
|
||||
6. **Generate Issue Data** — For each task, create an issue with:
|
||||
|
||||
### Issue Title Format
|
||||
|
||||
```
|
||||
[<TaskID>] <Description>
|
||||
```
|
||||
|
||||
Example: `[T001] Create project structure per implementation plan`
|
||||
|
||||
### Issue Body Template
|
||||
|
||||
```markdown
|
||||
## Task Details
|
||||
|
||||
**Task ID**: <TaskID>
|
||||
**Phase**: <Phase Name>
|
||||
**Parallel**: <Yes/No>
|
||||
**User Story**: <Story reference, if any>
|
||||
|
||||
## Description
|
||||
|
||||
<Full task description from tasks.md>
|
||||
|
||||
## File Paths
|
||||
|
||||
- `<file path 1>`
|
||||
- `<file path 2>`
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
- [ ] Implementation complete per task description
|
||||
- [ ] Relevant tests pass (if applicable)
|
||||
- [ ] No regressions introduced
|
||||
|
||||
## Context
|
||||
|
||||
**Feature**: <Feature name from spec.md>
|
||||
**Spec Reference**: <Requirement ID if mapped>
|
||||
|
||||
---
|
||||
|
||||
_Auto-generated by speckit.taskstoissues from `tasks.md`_
|
||||
```
|
||||
|
||||
7. **Apply Labels** — Assign labels based on task metadata:
|
||||
|
||||
| Condition | Label |
|
||||
| ---------------------------------- | ------------------ |
|
||||
| Phase 1 (Setup) | `phase:setup` |
|
||||
| Phase 2 (Foundation) | `phase:foundation` |
|
||||
| Phase 3+ (User Stories) | `phase:story` |
|
||||
| Final Phase (Polish) | `phase:polish` |
|
||||
| Has `[P]` marker | `parallel` |
|
||||
| Has `[US1]` marker | `story:US1` |
|
||||
| Task creates test files | `type:test` |
|
||||
| Task creates models/entities | `type:model` |
|
||||
| Task creates services | `type:service` |
|
||||
| Task creates controllers/endpoints | `type:api` |
|
||||
| Task creates UI components | `type:ui` |
|
||||
|
||||
**Label Creation**: If labels don't exist on the repo, create them first before assigning.
|
||||
|
||||
8. **Set Milestone** (optional):
|
||||
- If `$ARGUMENTS` includes `--milestone "<name>"`, assign all issues to that milestone
|
||||
- If milestone doesn't exist, create it with the feature name as the title
|
||||
|
||||
9. **Create Issues** — Execute in dependency order:
|
||||
|
||||
**For GitHub**: Use the GitHub MCP server tool `issue_write` to create issues.
|
||||
|
||||
**For Gitea**: Use the Gitea REST API:
|
||||
|
||||
```bash
|
||||
# Create issue
|
||||
curl -s -X POST "https://<gitea-host>/api/v1/repos/<owner>/<repo>/issues" \
|
||||
-H "Authorization: token <GITEA_TOKEN>" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"title": "[T001] Create project structure",
|
||||
"body": "<issue body>",
|
||||
"labels": [<label_ids>]
|
||||
}'
|
||||
```
|
||||
|
||||
**Authentication**:
|
||||
- GitHub: Uses MCP server (pre-authenticated)
|
||||
- Gitea: Requires `GITEA_TOKEN` environment variable. If not set, **STOP** and ask user to provide it.
|
||||
|
||||
**Rate Limiting**:
|
||||
- Create issues sequentially with a 500ms delay between requests
|
||||
- If rate limited (HTTP 429), wait and retry with exponential backoff
|
||||
|
||||
10. **Track Created Issues** — Maintain a mapping of `TaskID → IssueNumber`:
|
||||
|
||||
```markdown
|
||||
| Task ID | Issue # | Title | URL |
|
||||
| ------- | ------- | ----------------------------- | ----- |
|
||||
| T001 | #42 | Create project structure | <url> |
|
||||
| T002 | #43 | Configure database connection | <url> |
|
||||
```
|
||||
|
||||
11. **Update `tasks.md`** (optional — ask user first):
|
||||
- Append issue references to each task line:
|
||||
```
|
||||
- [ ] T001 Create project structure (#42)
|
||||
```
|
||||
|
||||
12. **Report Completion**:
|
||||
- Total issues created
|
||||
- Issues by phase
|
||||
- Issues by label
|
||||
- Any failures (with retry suggestions)
|
||||
- Link to issue board/project
|
||||
- Mapping table (Task ID → Issue #)
|
||||
|
||||
## Arguments
|
||||
|
||||
| Argument | Description | Default |
|
||||
| ---------------------------- | --------------------------------------- | ------------- |
|
||||
| `--platform <github\|gitea>` | Force platform detection | Auto-detect |
|
||||
| `--milestone "<name>"` | Assign issues to milestone | None |
|
||||
| `--dry-run` | Preview issues without creating | `false` |
|
||||
| `--labels-only` | Only create labels, don't create issues | `false` |
|
||||
| `--update-tasks` | Auto-update tasks.md with issue refs | `false` (ask) |
|
||||
|
||||
## Operating Principles
|
||||
|
||||
- **Idempotency**: Check if an issue with the same title already exists before creating duplicates
|
||||
- **Dependency Order**: Create issues in task execution order so dependencies are naturally numbered
|
||||
- **Rich Context**: Include enough context in each issue body that it can be understood standalone
|
||||
- **Label Consistency**: Use a consistent label taxonomy across all issues
|
||||
- **Platform Safety**: Never create issues on repos that don't match the git remote
|
||||
- **Dry Run Support**: Always support `--dry-run` to preview before creating
|
||||
|
||||
Reference in New Issue
Block a user