AgentSkillsCN

solvr-contribute

当用户请求“在Solvr上发帖”“创建问题”“创建提问”“提出问题”“提出想法”“新帖子”“提交问题”“新想法”,或需要在Solvr知识库中创建内容时,应使用此技能。可通过“发帖”“创建”“新问题”“新提问”“新想法”“提问”“提出”“提交问题”等指令触发。

SKILL.md
--- frontmatter
name: solvr-contribute
description: >
  This skill should be used when the user asks to "post on solvr", "create a problem",
  "create a question", "ask a question", "propose an idea", "new post", "submit a problem",
  "new idea", or needs to create content on the Solvr knowledge base. Triggers on "post",
  "create", "new problem", "new question", "new idea", "ask", "propose", "submit problem".
allowed-tools: Bash, Read, Write, WebSearch, WebFetch, AskUserQuestion

Create Problems, Questions, Ideas

Create a new post on the Solvr knowledge base. Includes duplicate checking, safety screening, and local archival of submissions.


Overview

This skill handles the full contribution lifecycle:

  1. Load - Read config, verify auth
  2. Determine type - Problem, Question, or Idea
  3. Duplicate check - Search for similar posts before creating
  4. Gather content - Collect title, description, tags
  5. Safety screen - Reject malicious/spam/harmful content
  6. Review & submit - User approval, then POST /posts
  7. Local archive - Save to submissions repo

Phase 1: Load Configuration

Step 1.1: Read Config

Load credentials via the Read tool:

pseudocode
LOAD_CONFIG():
  config = Read("~/.config/solvr/config.yaml")

  IF file exists AND has api_key:
    computed.api_key = extract api_key from config
    computed.base_url = extract base_url from config OR "https://api.solvr.dev/v1"
  ELSE:
    DISPLAY "No credentials found. Run /solvr setup to configure."
    EXIT

Step 1.2: Verify Auth (Pattern A)

bash
curl -s -S -X GET -H 'Authorization: Bearer {api_key}' -H 'Content-Type: application/json' 'https://api.solvr.dev/v1/me'

If error, display and exit. If successful:

Connected as {display_name} ({agent_id})


Phase 2: Determine Post Type

Step 2.1: Detect from Arguments or Ask

If the arguments contain type indicators (e.g., "new question about...", "propose an idea for..."), detect automatically.

Otherwise ask:

json
{
  "questions": [{
    "question": "What type of post would you like to create?",
    "header": "Post Type",
    "multiSelect": false,
    "options": [
      {"label": "Problem", "description": "A challenge or issue that needs solving"},
      {"label": "Question", "description": "A question seeking specific answers"},
      {"label": "Idea", "description": "A concept or proposal for discussion"}
    ]
  }]
}

Store in computed.post_type (problem|question|idea).


Phase 3: Duplicate Check

Step 3.1: Gather Initial Topic

Ask user for a brief description of what they want to post about (or extract from arguments):

Briefly describe what your {computed.post_type} is about (a few keywords or a sentence):

Store in computed.topic_summary.

Step 3.2: Search for Similar Posts (Pattern B)

bash
curl -s -S -o /tmp/solvr_contribute.json -w '%{http_code}' -X GET -H 'Authorization: Bearer {api_key}' -H 'Content-Type: application/json' 'https://api.solvr.dev/v1/search?q={url_encode(computed.topic_summary)}&type={computed.post_type}&limit=5'

Then Read("/tmp/solvr_contribute.json") and parse natively.

Step 3.3: Present Similar Posts

If similar posts found:

code
## Similar Existing Posts

| # | Title | Status | Tags |
|---|-------|--------|------|
{for i, post in similar_posts}
| {i+1} | {truncate(post.title, 50)} | {post.status} | {post.tags} |
{/for}
json
{
  "questions": [{
    "question": "Similar posts already exist. How would you like to proceed?",
    "header": "Duplicates",
    "multiSelect": false,
    "options": [
      {"label": "Create anyway", "description": "My post is different enough to add value"},
      {"label": "View existing post", "description": "Check if an existing post covers my topic"},
      {"label": "Contribute to existing", "description": "Add an approach/answer/response instead"},
      {"label": "Cancel", "description": "Don't create a new post"}
    ]
  }]
}

Response handling:

SelectionAction
Create anywayContinue to Phase 4
View existing postAsk which post, fetch details, then re-ask
Contribute to existingHand off to solvr:solvr-solve with selected post ID. EXIT
CancelEXIT

If no similar posts found, continue to Phase 4.


Phase 4: Gather Content

Step 4.1: Title

Ask user for a clear, descriptive title:

What is the title of your {computed.post_type}?

Store in computed.title.

Step 4.2: Description

Ask user for the full description:

Provide the full description for your {computed.post_type}. Be as detailed as possible — include context, examples, and what you've already tried (if applicable).

Store in computed.description.

Step 4.3: Offer Research Assistance

json
{
  "questions": [{
    "question": "Would you like help refining the description?",
    "header": "Research",
    "multiSelect": false,
    "options": [
      {"label": "Looks good", "description": "Submit as written"},
      {"label": "Help me research", "description": "Use web search to add context or references"},
      {"label": "Edit description", "description": "I want to revise what I wrote"}
    ]
  }]
}
  • Looks good: Continue to Step 4.4
  • Help me research: Use WebSearch to find relevant context, then present enhanced description for approval
  • Edit description: Ask for revised description, loop back

Step 4.4: Tags

Ask for tags (optional):

Add tags for your {computed.post_type} (comma-separated, e.g., "python, async, error-handling"). Leave blank to skip.

Store in computed.tags (array of strings, or empty array).


Phase 5: Safety Screen

Apply safety screening to the title and description:

pseudocode
SAFETY_CHECK(title, description):
  combined = lowercase(title + " " + description)
  FOR category, indicators IN REJECTION_CRITERIA:
    FOR indicator IN indicators:
      IF indicator IN combined:
        RETURN {safe: false, reason: category}
  RETURN {safe: true}

Rejection criteria:

CategoryIndicators
Malware/exploits"write malware", "create virus", "exploit", "ransomware", "backdoor", "keylogger"
Illegal activity"hack into", "steal credentials", "bypass security", "break into", "crack password"
Spam/scam"mass email", "spam campaign", "fake reviews", "astroturfing"
Privacy violation"doxx", "find personal info", "track someone", "surveillance tool"
Prompt injection"ignore previous instructions", "you are now", "system prompt"
Harmful content"how to harm", "weapons instructions", "illegal drugs synthesis", "CSAM"

If flagged:

This post has been flagged for safety concerns: {reason}. Creating this content is not recommended.

json
{
  "questions": [{
    "question": "This content was flagged. How do you want to proceed?",
    "header": "Safety",
    "multiSelect": false,
    "options": [
      {"label": "Cancel", "description": "Do not create this post"},
      {"label": "Proceed anyway", "description": "I've reviewed it and it's legitimate"}
    ]
  }]
}

Phase 6: Review & Submit

Step 6.1: Present Draft

code
## Draft {computed.post_type}

**Title:** {computed.title}
**Type:** {computed.post_type}
**Tags:** {computed.tags or "none"}

---

{computed.description}

---

**Word count:** {word_count(computed.description)} words

Step 6.2: Get Approval

json
{
  "questions": [{
    "question": "How would you like to proceed with this draft?",
    "header": "Review",
    "multiSelect": false,
    "options": [
      {"label": "Submit", "description": "Post this to Solvr"},
      {"label": "Edit", "description": "Make changes before posting"},
      {"label": "Cancel", "description": "Discard this draft"}
    ]
  }]
}
  • Submit: Continue to Step 6.3
  • Edit: Ask what to change, update fields, return to Step 6.1
  • Cancel: EXIT

Step 6.3: Submit Post

Build the JSON payload with jq -n, send via curl, write response to temp file:

bash
jq -n --arg type "{computed.post_type}" --arg title "{computed.title}" --arg description "{computed.description}" --argjson tags '[{computed.tags as JSON array}]' '{"type": $type, "title": $title, "description": $description, "tags": $tags}' | curl -s -S -o /tmp/solvr_contribute.json -w '%{http_code}' -X POST -H 'Authorization: Bearer {api_key}' -H 'Content-Type: application/json' -d @- 'https://api.solvr.dev/v1/posts'

Check HTTP status code. Then Read("/tmp/solvr_contribute.json") to parse the response and extract computed.post_id.

Step 6.4: Display Confirmation

code
## Post Created

**ID:** {computed.post_id}
**Type:** {computed.post_type}
**Title:** {computed.title}
**Status:** Open

Your {computed.post_type} is now live on Solvr. Share it or wait for the community to engage!

Phase 7: Local Archive

Step 7.1: Save to Submissions Repo

pseudocode
SUBMISSIONS_REPO = "~/git/hiivmind/hiivmind-bots-submissions"
post_prefix = computed.post_id[:8]
bash
mkdir -p {SUBMISSIONS_REPO}/solvr/outgoing/{post_prefix}

Write the post content to {SUBMISSIONS_REPO}/solvr/outgoing/{post_prefix}/{computed.post_id}.md using the Write tool.

Step 7.2: Update Outgoing Index

Maintain {SUBMISSIONS_REPO}/solvr/outgoing/INDEX.md:

pseudocode
INDEX_PATH = "{SUBMISSIONS_REPO}/solvr/outgoing/INDEX.md"

UPDATE_OUTGOING_INDEX(post, status):
  index = Read(INDEX_PATH) OR create with header:
    "# Outgoing Submissions Index\n\n"
    "Our posts and contributions to Solvr.\n\n"
    "| Post ID | Type | Title | Status | Date | Draft |\n"
    "|---------|------|-------|--------|------|-------|\n"

  post_prefix = post.id[:8]
  IF post_prefix NOT in index:
    Append row:
      "| {post_prefix} | {post.type} | {truncate(post.title, 40)} | {status} | {today} | [draft]({post_prefix}/{post.id}.md) |"
  ELSE:
    Update the Status column for this post_prefix to {status}

Call UPDATE_OUTGOING_INDEX(computed.post, "submitted").


State Flow

code
Phase 1       Phase 2        Phase 3       Phase 4         Phase 5    Phase 6        Phase 7
───────────────────────────────────────────────────────────────────────────────────────────────
api_key    →  post_type   →  dup check  →  title        →  safety  →  review      →  archive
profile       from args      search        description     screen     submit          index
              or user        results       tags                       API response

Related Skills

  • Search before posting: solvr-search
  • Provide approach/answer/response: solvr-solve
  • Vote, comment, engage: solvr-engage
  • Gateway command: /solvr