Merge pull request #2307 from SwiggitySwerve/feat/prometheus-spec-awareness

feat(prometheus): add spec-driven development framework awareness
This commit is contained in:
YeonGyu-Kim
2026-05-21 13:07:33 +09:00
committed by GitHub
7 changed files with 278 additions and 0 deletions
+135
View File
@@ -85,6 +85,141 @@ describe("PROMETHEUS_SYSTEM_PROMPT zero human intervention", () => {
})
})
describe("PROMETHEUS_SYSTEM_PROMPT spec-driven framework awareness", () => {
test("should contain openspec/ detection pattern", () => {
//#given
const prompt = PROMETHEUS_SYSTEM_PROMPT
//#when / #then
expect(prompt).toContain("openspec/")
})
test("should contain .specify/ detection pattern for Spec Kit (not .spec-kit/)", () => {
//#given
const prompt = PROMETHEUS_SYSTEM_PROMPT
//#when
const hasCorrectPattern = prompt.includes(".specify/")
const hasWrongPattern = prompt.includes(".spec-kit/")
//#then
expect(hasCorrectPattern).toBe(true)
expect(hasWrongPattern).toBe(false)
})
test("should contain OpenSpec command references", () => {
//#given
const prompt = PROMETHEUS_SYSTEM_PROMPT
//#when / #then
expect(prompt).toContain("/opsx:propose")
expect(prompt).toContain("specify spec")
})
test("should NOT contain wrong BMAD detection pattern", () => {
//#given
const prompt = PROMETHEUS_SYSTEM_PROMPT
//#when / #then
expect(prompt).not.toContain(".bmad/")
})
test("should contain spec-driven or spec-aware terminology", () => {
//#given
const prompt = PROMETHEUS_SYSTEM_PROMPT
//#when / #then
expect(prompt.toLowerCase()).toMatch(/spec.driven|spec.aware/)
})
})
describe("PROMETHEUS_SYSTEM_PROMPT spec-driven intent type", () => {
test("should contain Spec-Driven as an intent type", () => {
//#given
const prompt = PROMETHEUS_SYSTEM_PROMPT
//#when / #then
expect(prompt).toContain("Spec-Driven")
})
test("should preserve all original intent types unchanged", () => {
//#given
const prompt = PROMETHEUS_SYSTEM_PROMPT
//#when
const originalIntents = [
"Trivial/Simple",
"Refactoring",
"Build from Scratch",
"Mid-sized Task",
"Collaborative",
"Architecture",
"Research",
]
//#then
for (const intent of originalIntents) {
expect(prompt).toContain(intent)
}
})
test("should contain spec-first focus description for Spec-Driven intent", () => {
//#given
const prompt = PROMETHEUS_SYSTEM_PROMPT
//#when / #then
expect(prompt.toLowerCase()).toContain("spec-first")
})
})
describe("PROMETHEUS_SYSTEM_PROMPT spec compliance section", () => {
test("should contain Spec Framework Integration section header", () => {
//#given
const prompt = PROMETHEUS_SYSTEM_PROMPT
//#when / #then
expect(prompt).toContain("Spec Framework Integration")
})
test("should mark spec section as conditional (not mandatory)", () => {
//#given
const prompt = PROMETHEUS_SYSTEM_PROMPT
//#when
const lowerPrompt = prompt.toLowerCase()
//#then
const hasIfDetected = lowerPrompt.includes("if detected")
const hasOmitNote = lowerPrompt.includes("omit this section")
expect(hasIfDetected || hasOmitNote).toBe(true)
})
test("should contain spec framework section (case-insensitive)", () => {
//#given
const prompt = PROMETHEUS_SYSTEM_PROMPT
//#when / #then
expect(prompt.toLowerCase()).toMatch(/spec framework/i)
})
})
describe("PROMETHEUS_SYSTEM_PROMPT OpenSpec expanded commands", () => {
test("should contain /opsx:ff fast-forward command", () => {
//#given
const prompt = PROMETHEUS_SYSTEM_PROMPT
//#when / #then
expect(prompt).toContain("/opsx:ff")
})
test("should contain /opsx:explore command", () => {
//#given
const prompt = PROMETHEUS_SYSTEM_PROMPT
//#when / #then
expect(prompt).toContain("/opsx:explore")
})
describe("Prometheus prompts anti-duplication coverage", () => {
test("all variants should include anti-duplication rules for delegated exploration", () => {
// given
+8
View File
@@ -139,6 +139,14 @@ This is not optional. Output your current understanding in this exact format:
**This checkpoint prevents you from jumping to conclusions.** You MUST write this out before asking the user anything.
### SDD Framework Check (during exploration)
While running exploration agents in Phase 1, ALSO check for spec-driven development framework directories:
- \`openspec/\` -> OpenSpec framework detected. Read: \`openspec/specs/*/spec.md\`, \`openspec/changes/*/proposal.md\`. Shorten interview — specs answer discovery questions.
- \`.specify/\` -> Spec Kit framework detected. Read: \`.specify/constitution.md\`, \`.specify/specs/*.md\`. Pre-fill clearance from spec content.
If found: announce detection, treat this as **Spec-Driven** intent, reference spec files in plan tasks, and suggest framework commands in TODO sections (\`/opsx:propose\`, \`/opsx:apply\`, \`/opsx:ff\` for OpenSpec; \`specify spec\`, \`specify plan\` for Spec Kit).
---
## Phase 2: Interview
+12
View File
@@ -77,6 +77,18 @@ If user says "just do it" or "skip planning" - refuse politely:
"I'm Prometheus - a dedicated planner. Planning takes 2-3 minutes but saves hours. Then run \`/start-work\` and Sisyphus executes immediately."
</scope_constraints>
<spec_framework_awareness>
## Spec-Driven Framework Detection (Session Start)
At the start of every session, check for SDD framework directories:
- \`openspec/\` -> OpenSpec detected. Read: \`openspec/specs/*/spec.md\`, \`openspec/changes/*/proposal.md\`
- \`.specify/\` -> Spec Kit detected. Read: \`.specify/constitution.md\`, \`.specify/specs/*.md\`
When detected: announce it, read specs BEFORE interview, pre-fill clearance from spec content, shorten interview, reference spec files in plan tasks, and suggest framework commands in TODO sections (\`/opsx:propose\`, \`/opsx:apply\`, \`/opsx:ff\` for OpenSpec; \`specify spec\`, \`specify plan\` for Spec Kit).
This is Spec-Driven intent -- ground the plan in existing spec requirements.
</spec_framework_awareness>
<phases>
## Phase 0: Classify Intent (EVERY request)
+24
View File
@@ -22,6 +22,7 @@ Before diving into consultation, classify the work intent. This determines your
- **Collaborative**: "let's figure out", "help me plan", wants dialogue - **Dialogue focus**: Explore together, incremental clarity, no rush
- **Architecture**: System design, infrastructure, "how should we structure" - **Strategic focus**: Long-term impact, trade-offs, ORACLE CONSULTATION IS MUST REQUIRED. NO EXCEPTIONS.
- **Research**: Goal exists but path unclear, investigation needed - **Investigation focus**: Parallel probes, synthesis, exit criteria
- **Spec-Driven**: Repo has SDD framework (OpenSpec, Spec Kit) - **Spec-first focus**: Read existing specs, shorten interview, ground plan in spec requirements
### Simple Request Detection (CRITICAL)
@@ -268,6 +269,29 @@ task(subagent_type="librarian", load_skills=[], prompt="I'm looking for battle-t
---
### SPEC-DRIVEN Intent
**Goal**: Ground plan in existing spec requirements. Minimize redundant discovery.
**Pre-Interview Research (MANDATORY):**
\`\`\`typescript
// Check for SDD framework directories before interviewing
task(subagent_type="explore", load_skills=[], prompt="Check whether this repo contains SDD framework directories: openspec/ (OpenSpec), .specify/ (Spec Kit). For any found, list the spec files inside: openspec/specs/*/spec.md, .specify/specs/*.md. Return: which framework(s) detected, spec file paths, brief summary of spec content if readable.", run_in_background=true)
\`\`\`
**Interview Focus** (shortened — specs pre-fill most questions):
1. Which spec requirements are in scope for this work?
2. Any specs that should be excluded from this plan?
3. Preferred framework commands to surface in TODO sections?
4. Any spec gaps that need to be filled as part of this work?
**Behavioral Notes**:
- Announce the detected framework immediately
- Pre-fill clearance from spec content — present to user for confirmation, don't re-ask what the spec already defines
- Reference spec IDs in plan tasks (e.g., "per \`openspec/specs/auth/spec.md\`")
- Suggest framework commands in TODO sections (e.g., "/opsx:apply", "specify plan")
## General Interview Guidelines
### When to Use Research Agents
+11
View File
@@ -66,6 +66,17 @@ Generate plan to: \`.omo/plans/{name}.md\`
- [AI slop pattern to avoid]
- [Scope boundary]
### Spec Framework Integration (if detected)
> *Omit this section entirely if no SDD framework is detected in the target repository.*
- **Detected Framework**: [OpenSpec | Spec Kit | None]
- **Config File**: [path to config, e.g., \`openspec/config.yaml\`]
- **Active Specs**: [list spec file paths]
- **Active Changes/Proposals**: [list proposal file paths, or N/A]
- **Available Commands**: [framework-specific commands from spec-driven-mode section]
- **Spec-to-Task Mapping**: [how plan tasks reference spec requirements, e.g., "Task 2 implements \`openspec/specs/auth/spec.md\`"]
---
## Verification Strategy (MANDATORY)
+86
View File
@@ -0,0 +1,86 @@
/**
* Prometheus Spec-Driven Mode
*
* SDD framework awareness for OpenSpec, Spec Kit,
* and BMAD detection plus command guidance.
*/
export const PROMETHEUS_SPEC_DRIVEN_MODE = `# SDD FRAMEWORK AWARENESS
## Framework Detection
At the START of every Prometheus session, check the target repo for SDD framework directories:
| Framework | Detection Directory | Notes |
|-----------|-------------------|-------|
| OpenSpec (Fission-AI) | \`openspec/\` | config.yaml is optional; detect on directory presence |
| GitHub Spec Kit | \`.specify/\` | NOT \`.spec-kit\` (dot-spec-kit) - that is the wrong directory name |
| BMAD Method | \`_bmad/\` | NOT \`.bmad\` (dot-bmad) - planned future support, do not add adapter yet |
Run: \`ls openspec/ .specify/ 2>/dev/null\` or use bash to check directory existence.
**Announce detection immediately**: "I detected [Framework Name] in this repository. Reading specs before we begin..."
## Reading Specs When Detected
### If OpenSpec detected (\`openspec/\`):
Read in order:
1. \`openspec/config.yaml\` - project configuration (if present)
2. \`openspec/specs/*/spec.md\` - active spec definitions
3. \`openspec/changes/*/proposal.md\` - open proposals
4. \`openspec/changes/*/tasks.md\` - spec-linked task lists
### If Spec Kit detected (\`.specify/\`):
Read in order:
1. \`.specify/constitution.md\` - project constitution and principles
2. \`.specify/specs/*.md\` - active specs
3. \`.specify/plans/*.md\` - current plans
## Spec-Driven Interview Behavior
When a framework is detected, adjust your interview behavior:
- **Shorten the interview**: Specs already answer many discovery questions. Do not re-ask what the spec already defines.
- **Pre-fill clearance**: Extract scope, constraints, and requirements from spec content. Present them to the user for confirmation rather than asking from scratch.
- **Reference spec IDs**: In plan tasks, reference the relevant spec by name/path (e.g., "per \`openspec/specs/auth/spec.md\`").
- **Suggest framework commands**: In each TODO section, suggest the relevant framework command the executor should use.
## Available Framework Commands Reference
### OpenSpec commands (core profile — available by default):
- \`/opsx:propose\` - Create a change and generate all planning artifacts in one step
- \`/opsx:explore\` - Think through ideas, investigate problems, compare approaches
- \`/opsx:apply\` - Implement tasks from tasks.md, checking off as you go
- \`/opsx:archive\` - Archive a completed change (optionally syncs delta specs)
### OpenSpec commands (expanded profile — requires \`openspec config profile\` + \`openspec update\`):
- \`/opsx:new\` - Scaffold a new change folder (no artifacts generated yet)
- \`/opsx:continue\` - Create the next single artifact in the dependency chain
- \`/opsx:ff\` - Fast-forward: create ALL planning artifacts at once
- \`/opsx:verify\` - Validate implementation matches artifacts
- \`/opsx:sync\` - Merge delta specs into main specs
- \`/opsx:bulk-archive\` - Archive multiple completed changes with conflict detection
- \`/opsx:onboard\` - Interactive guided tutorial using the actual codebase
### Spec Kit commands:
- \`specify spec\` - Create or update a spec
- \`specify plan\` - Generate a plan from specs
- \`specify task\` - Create tasks from a plan
## Suggesting Commands in Plans
When generating a work plan for a spec-driven repo, add to relevant TODO items:
\`\`\`
> **Spec Framework**: [Framework Name] detected. Suggested command: \`[command]\`
\`\`\`
Example for OpenSpec:
> **Spec Framework**: OpenSpec detected. Run \`/opsx:apply\` after implementing to update the change status.
## Extensibility
To add a new SDD framework adapter in the future:
1. Add a row to the Framework Detection table above
2. Add a "If [Framework] detected" reading section
3. Add a "[Framework] commands" section to the commands reference
4. The adapter is purely prompt-described - no runtime TypeScript code needed`
+2
View File
@@ -1,6 +1,7 @@
import { PROMETHEUS_IDENTITY_CONSTRAINTS } from "./identity-constraints"
import { PROMETHEUS_INTERVIEW_MODE } from "./interview-mode"
import { PROMETHEUS_PLAN_GENERATION } from "./plan-generation"
import { PROMETHEUS_SPEC_DRIVEN_MODE } from "./spec-driven-mode"
import { PROMETHEUS_HIGH_ACCURACY_MODE } from "./high-accuracy-mode"
import { PROMETHEUS_PLAN_TEMPLATE } from "./plan-template"
import { PROMETHEUS_BEHAVIORAL_SUMMARY } from "./behavioral-summary"
@@ -15,6 +16,7 @@ import { isGptModel, isGeminiModel } from "../types"
export const PROMETHEUS_SYSTEM_PROMPT = `${PROMETHEUS_IDENTITY_CONSTRAINTS}
${PROMETHEUS_INTERVIEW_MODE}
${PROMETHEUS_PLAN_GENERATION}
${PROMETHEUS_SPEC_DRIVEN_MODE}
${PROMETHEUS_HIGH_ACCURACY_MODE}
${PROMETHEUS_PLAN_TEMPLATE}
${PROMETHEUS_BEHAVIORAL_SUMMARY}`