skills/dasblueyeddevil/openspec-daem0n-bridge/SKILL.md
Bridges OpenSpec (spec-driven development) with Daem0n-MCP memory - auto-imports specs, informs proposals with past outcomes, converts archived changes to learnings
npx skillsauth add aiskillstore/marketplace openspec-daem0n-bridgeInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill creates a bidirectional bridge between:
The feedback loop:
OpenSpec specs ──────► Daem0n patterns/rules
▲ │
│ ▼
Future specs ◄────── Past outcomes/failures
On session start, after get_briefing():
Check if openspec/ directory exists in the project root:
ls openspec/specs/ 2>/dev/null
If OpenSpec detected AND specs not yet imported:
How to check if already imported:
recall(topic="openspec", tags=["spec"], limit=1)
If results exist with recent timestamps, skip import.
Triggers:
List all spec directories
ls openspec/specs/
For each spec, read the spec.md file
cat openspec/specs/[name]/spec.md
Parse requirements using these patterns:
| Pattern | Extract As |
|---------|------------|
| MUST, SHALL, REQUIRED | rule.must_do |
| MUST NOT, SHALL NOT, PROHIBITED | rule.must_not |
| SHOULD, RECOMMENDED | pattern |
| SHOULD NOT, NOT RECOMMENDED | warning |
| ## Purpose section | pattern (overview) |
Create memories via remember_batch
mcp__daem0nmcp__remember_batch(memories=[
{
"category": "pattern",
"content": "[spec-name]: [overview/purpose summary]",
"rationale": "OpenSpec specification - source of truth",
"tags": ["openspec", "spec", "[spec-name]"],
"file_path": "openspec/specs/[spec-name]/spec.md",
"context": {
"openspec_type": "spec",
"imported_at": "[ISO timestamp]"
}
}
// ... one per spec
])
Create rules from MUST/MUST NOT
mcp__daem0nmcp__add_rule(
trigger="implementing [spec-name] feature",
must_do=["[extracted MUST items]"],
must_not=["[extracted MUST NOT items]"],
ask_first=["Does this align with the spec?"]
)
Report summary
Imported [N] specs as patterns
Created [M] rules with [X] must_do and [Y] must_not constraints
Use recall("openspec") to query
| OpenSpec Element | Daem0n Category | Tags | |-----------------|-----------------|------| | spec.md overview | pattern | openspec, spec, [name] | | MUST requirements | rule.must_do | (in rule, not memory) | | MUST NOT constraints | rule.must_not | (in rule, not memory) | | Known limitations | warning | openspec, limitation, [name] | | Design rationale | learning | openspec, rationale, [name] |
Triggers:
Recall relevant memories
mcp__daem0nmcp__recall(
topic="[feature description]",
categories=["pattern", "warning", "decision"]
)
Check applicable rules
mcp__daem0nmcp__check_rules(
action="proposing change for [feature]"
)
Recall OpenSpec-specific context
mcp__daem0nmcp__recall(
topic="openspec [feature]",
tags=["openspec"]
)
If specific files are affected, check them
mcp__daem0nmcp__recall_for_file(
file_path="openspec/specs/[affected-spec]/spec.md"
)
Present findings to user in this format:
# Memory Context for Proposal: [feature]
## Relevant Specs
- [spec-name]: [summary]
## Patterns to Follow
- [pattern 1]
- [pattern 2]
## Warnings to Consider
- [warning 1] (from past failure)
## Past Decisions That May Apply
- [decision] - worked: [true/false]
## Rules to Follow
When implementing this:
- MUST: [list]
- MUST NOT: [list]
- ASK FIRST: [list]
If user proceeds, record the intent
mcp__daem0nmcp__remember(
category="decision",
content="Creating OpenSpec proposal for [feature]: [brief description]",
rationale="[user's stated rationale]",
tags=["openspec", "proposal", "pending"],
context={
"openspec_type": "proposal",
"feature": "[feature]",
"change_id": "[generated-id or TBD]"
}
)
SAVE THE MEMORY ID - needed for Workflow 3.
Triggers:
openspec archive [id] completesRead the archived change
cat openspec/changes/archive/[id]/proposal.md
cat openspec/changes/archive/[id]/tasks.md
ls openspec/changes/archive/[id]/specs/
Find the original decision memory
mcp__daem0nmcp__search_memories(
query="OpenSpec proposal [id]"
)
Or search by feature name if ID wasn't recorded.
Record the outcome
mcp__daem0nmcp__record_outcome(
memory_id=[found decision id],
outcome="Completed and archived. [summary of what was implemented]",
worked=true // or false if there were issues
)
Create learnings from the completed work
mcp__daem0nmcp__remember_batch(memories=[
{
"category": "learning",
"content": "[change-id]: [key lesson from implementation]",
"rationale": "Extracted from completed OpenSpec change",
"tags": ["openspec", "completed", "[feature-name]"],
"context": {
"openspec_type": "archived_change",
"change_id": "[id]",
"archived_at": "[timestamp]"
}
}
// ... one learning per significant insight
])
Link the memories to create causal chain
mcp__daem0nmcp__link_memories(
source_id=[proposal decision id],
target_id=[learning id],
relationship="led_to",
description="Proposal implementation led to these learnings"
)
If spec deltas were applied, update spec memories
For each delta in openspec/changes/archive/[id]/specs/:
| Tag | Meaning | When Used |
|-----|---------|-----------|
| openspec | Memory from OpenSpec integration | All OpenSpec memories |
| spec | From spec.md source of truth | Workflow 1 |
| proposal | From change proposal | Workflow 2 |
| pending | Proposal not yet archived | Workflow 2 |
| completed | From archived change | Workflow 3 |
| limitation | Known constraint | Workflow 1 |
| rationale | Design reasoning | Workflow 1 |
This skill respects the Daem0n's Sacred Covenant:
get_briefing() must be called first (auto-detection happens after)remember() records proposal decisionsrecord_outcome() closes the loop when changes are archivedEnforcement:
# [Spec Title]
## Purpose
[Description - extract as pattern overview]
## Requirements
### Requirement: [Name]
[Text containing MUST/MUST NOT/SHOULD]
#### Scenario: [Description]
- **GIVEN** [condition]
- **WHEN** [action]
- **THEN** [result]
MUST requirements: /(?:MUST|SHALL|REQUIRED):\s*(.+)/gi
MUST NOT constraints: /(?:MUST NOT|SHALL NOT|PROHIBITED):\s*(.+)/gi
SHOULD patterns: /(?:SHOULD|RECOMMENDED):\s*(.+)/gi
SHOULD NOT warnings: /(?:SHOULD NOT|NOT RECOMMENDED):\s*(.+)/gi
## ADDED
### Requirement: [New requirement]
## MODIFIED
### Requirement: [Changed requirement]
## REMOVED
- Requirement: [Removed name]
## RENAMED
FROM: ### Requirement: OldName
TO: ### Requirement: NewName
[Session starts]
User: Let's work on the authentication feature
Claude: [Calls get_briefing()]
[Detects openspec/ directory]
OpenSpec detected. Syncing specs to Daem0n memory...
Imported 5 specs as patterns:
- authentication (3 MUST, 2 MUST NOT)
- api-endpoints (5 MUST, 1 MUST NOT)
- error-handling (2 MUST)
- ...
Created 5 rules for spec enforcement.
User: I want to propose adding OAuth support
Claude: [Workflow 2: Inform]
Querying memory before proposal...
# Memory Context for Proposal: OAuth support
## Relevant Specs
- authentication: "All auth must be stateless for scaling"
## Warnings
- Previous session-based auth was rejected (worked=false)
## Rules
MUST: Use JWT tokens, Support token refresh
MUST NOT: Store sessions server-side
Shall I proceed with recording this proposal intent?
User: Yes, proceed
Claude: [Records decision with openspec/proposal/pending tags]
Recorded. Memory ID: 1847
Now create your proposal at openspec/changes/add-oauth-support/
[Later, after implementation]
User: I've archived the OAuth change, record it
Claude: [Workflow 3: Archive]
Reading openspec/changes/archive/add-oauth-support/...
Recording outcome for decision #1847...
- Outcome: Completed successfully with OAuth2 + PKCE
- Worked: true
Created 2 learnings:
- OAuth2 PKCE flow works well for SPAs
- Token refresh needs 5-minute buffer
Linked proposal -> learnings via "led_to"
The Daem0n will remember this for future auth work.
Check that openspec/specs/ directory exists and contains spec directories.
Use "refresh openspec" to force re-import. Old memories will be superseded.
Search with broader terms:
mcp__daem0nmcp__search_memories(query="[feature keywords]", tags=["openspec"])
Check rule triggers match your action descriptions:
mcp__daem0nmcp__list_rules()
development
Apple Human Interface Guidelines for content display components. Use this skill when the user asks about charts component, collection view, image view, web view, color well, image well, activity view, lockup, data visualization, content display, displaying images, rendering web content, color pickers, or presenting collections of items in Apple apps. Also use when the user says how should I display charts, what's the best way to show images, should I use a web view, how do I build a grid of items, what component shows media, or how do I present a share sheet. Cross-references: hig-foundations for color/typography/accessibility, hig-patterns for data visualization patterns, hig-components-layout for structural containers, hig-platforms for platform-specific component behavior.
tools
Automate HelpDesk tasks via Rube MCP (Composio): list tickets, manage views, use canned responses, and configure custom fields. Always search tools first for current schemas.
testing
Expert Haskell engineer specializing in advanced type systems, pure functional design, and high-reliability software. Use PROACTIVELY for type-level programming, concurrency, and architecture guidance.
tools
GraphQL gives clients exactly the data they need - no more, no less. One endpoint, typed schema, introspection. But the flexibility that makes it powerful also makes it dangerous. Without proper controls, clients can craft queries that bring down your server. This skill covers schema design, resolvers, DataLoader for N+1 prevention, federation for microservices, and client integration with Apollo/urql. Key insight: GraphQL is a contract. The schema is the API documentation. Design it carefully.