基于 SOC 职业分类
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/fabioc-aloha/ChessCoach --skill sidebar-customization命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
End-to-end academic paper drafting for CHI, HBR, journals, and conferences with venue-specific templates, drafting workflows, and revision strategies.
Detect, create, and manage the AI-Memory fleet communication channel. Fires on bootstrap, session start (announcements), and feedback writes.
Generate on-brand Alex — ACT Edition SVG banners for documents (READMEs, plans, notes, release artifacts)
| name | sidebar-customization |
| description | Customize the Alex sidebar — Loop tab buttons, Autopilot tasks, and project-specific workflows |
| tier | standard |
| applyTo | **/.github/config/loop-menu.json,**/.github/config/scheduled-tasks.json,**/*sidebar*config* |
Customize the Alex sidebar tabs for your project — add buttons, create scheduled tasks, and tailor workflows to your team's needs.
| Tab | Config File | What It Controls |
|---|---|---|
| Loop | .github/config/loop-menu.json | Workflow buttons, creative loop phases |
| Autopilot | .github/config/scheduled-tasks.json | Scheduled automation tasks |
| Setup | Built-in | No customization (core Alex features) |
The Loop tab displays workflow buttons organized into collapsible groups. Everything is config-driven.
.github/config/loop-menu.json
{
"$schema": "../../../heir/.github/config/loop-config.schema.json",
"version": "1.0",
"projectType": "generic",
"projectPhase": "active-development",
"groups": [
{
"id": "my-workflows",
"label": "My Workflows",
"icon": "rocket",
"collapsed": false,
"buttons": [
{
"icon": "lightbulb",
"label": "Brainstorm",
"command": "openChat",
"prompt": "Help me brainstorm ideas for this feature"
}
]
}
]
}
| Field | Required | Description |
|---|---|---|
id | Yes | Unique identifier (lowercase, hyphens) |
label | Yes | Display text in sidebar |
icon | No | Codicon name (e.g., rocket, tools, beaker) |
accent | No | CSS hex color for accent bar (e.g., #14b8a6) |
collapsed | No | Start collapsed? Default: true |
phase | No | Array of phases when visible: planning, active-development, testing, release, maintenance |
buttons | Yes | Array of button definitions |
| Field | Required | Description |
|---|---|---|
icon | Yes | Codicon name |
label | Yes | Button text |
command | Yes | Action type: openChat, openExternal, runCommand |
prompt | No | Inline prompt text for openChat |
promptFile | No | Path to .prompt.md file (overrides prompt) |
file | No | URL or path for openExternal/runCommand |
tooltip | No | Hover text |
phase | No | Phases when visible |
| Command | Behavior |
|---|---|
openChat | Opens Copilot Chat with the prompt |
openExternal | Opens URL in browser or file in VS Code |
runCommand | Executes a VS Code command |
For complex prompts, use external .prompt.md files:
{
"icon": "beaker",
"label": "Run Tests",
"command": "openChat",
"promptFile": "test.prompt.md"
}
The file is loaded from .github/prompts/loop/{promptFile}.
Show buttons only during specific project phases:
{
"icon": "rocket",
"label": "Release",
"command": "openChat",
"prompt": "@alex /release",
"phase": ["testing", "release"]
}
The sidebar watches loop-menu.json for changes. Save the file and buttons update immediately — no reload needed.
The Autopilot tab manages scheduled tasks that run via GitHub Actions. You can create tasks that run daily, weekly, or on custom cron schedules.
| Requirement | Agent Mode | Direct Mode |
|---|---|---|
| GitHub Actions enabled | Yes | Yes |
| Copilot enabled on repo | Yes | No |
COPILOT_PAT secret | Yes | No |
Setting up COPILOT_PAT (required for agent tasks):
COPILOT_PAT, Value: your token.github/config/scheduled-tasks.json
| Mode | How It Works | Best For |
|---|---|---|
| agent | Creates GitHub issue → Copilot reads it → Copilot opens PR | Creative tasks (writing, analysis, reviews) |
| direct | Runs script → Commits to branch → Opens PR | Mechanical tasks (audits, linting, builds) |
scheduled-tasks.json (starts disabled).github/config/scheduled-tasks/weekly-summary.md.github/workflows/scheduled-*.ymlAdd to .github/config/scheduled-tasks.json:
{
"version": "1.0",
"tasks": [
{
"id": "weekly-summary",
"name": "Weekly Summary",
"description": "Generate a weekly project summary",
"enabled": false,
"mode": "agent",
"schedule": "0 8 * * 1",
"promptFile": ".github/config/scheduled-tasks/weekly-summary.md",
"target": "docs/summaries"
}
]
}
Create the prompt template, enable, generate workflows, commit, push.
| Field | Required | Description |
|---|---|---|
id | Yes | Unique identifier (lowercase, hyphens) — used in workflow filename |
name | Yes | Display name in sidebar |
description | Yes | What the task does |
enabled | Yes | Toggle on/off (true/false) |
mode | Yes | "agent" or "direct" |
schedule | Yes | Cron expression (5 fields) |
promptFile | Agent only | Path to prompt template |
muscle | Direct only | Path to script (.cjs or .js) |
muscleArgs | Direct only | Array of arguments for script |
skill | No | Associated skill name |
target | No | Output directory (shown as badge) |
| Cron | When |
|---|---|
0 * * * * | Every hour |
0 */6 * * * | Every 6 hours |
0 8 * * * | Daily 8 AM UTC |
0 8 * * 1-5 | Weekdays 8 AM UTC |
0 8 * * 1 | Mondays 8 AM UTC |
0 8 1 * * | 1st of month 8 AM UTC |
Note: GitHub Actions uses UTC. Factor in your timezone.
Prompt templates are markdown files that become the issue body for agent tasks. Copilot reads them as instructions.
.github/config/scheduled-tasks/{task-id}.md
# Task Name
## Task
One-paragraph description of what to accomplish.
## Instructions
1. Step-by-step procedure
2. Be specific about file paths and commands
3. Specify exactly where to save output
4. Say how to name the PR
## Quality Standards
- What "done right" looks like
- Style guidelines
- Constraints
## Context
- Relevant files: `src/`, `docs/`
- Conventions to follow
docs/weekly/YYYY-MM-DD.md" is actionable.docs/" prevents scope creep.docs: weekly summary YYYY-MM-DD" gives clear output.# Weekly Changelog
## Task
Generate a changelog entry from PRs merged this week.
## Instructions
1. List merged PRs since last Monday using git log
2. Group by category: Features, Fixes, Maintenance
3. Write entry in Keep a Changelog format
4. Append to CHANGELOG.md under [Unreleased]
5. Create PR titled "docs: weekly changelog YYYY-MM-DD"
## Quality Standards
- Use present tense ("Add feature" not "Added feature")
- Include PR numbers as links
- Skip dependabot/automated PRs
## Context
- Follow existing CHANGELOG.md format
- Reference: https://keepachangelog.com
Direct tasks run scripts instead of prompting Copilot. Best for deterministic, mechanical work.
Create .github/muscles/my-audit.cjs:
#!/usr/bin/env node
const fs = require("fs");
// Your audit logic here
const report = `# Audit Report — ${new Date().toISOString().slice(0, 10)}
- Checked: 42 files
- Issues: 3
`;
fs.writeFileSync("docs/audit-report.md", report, "utf-8");
console.log("Audit complete.");
{
"id": "daily-audit",
"name": "Daily Audit",
"description": "Run daily code audit",
"enabled": false,
"mode": "direct",
"schedule": "0 8 * * *",
"muscle": ".github/muscles/my-audit.cjs",
"target": "docs/"
}
{
"id": "blog-writer",
"name": "Blog Writer",
"description": "Write blog posts from recent commits",
"enabled": true,
"mode": "agent",
"schedule": "0 */6 * * *",
"promptFile": ".github/config/scheduled-tasks/blog-writer.md",
"skill": "blog-writer",
"target": "blog/"
}
{
"id": "doc-lint",
"name": "Documentation Lint",
"description": "Lint markdown docs weekly",
"enabled": true,
"mode": "direct",
"schedule": "0 8 * * 1",
"muscle": ".github/muscles/lint-docs.cjs",
"target": "docs/"
}
{
"id": "dep-check",
"name": "Dependency Check",
"description": "Run npm audit weekly",
"enabled": true,
"mode": "direct",
"schedule": "0 9 * * 1",
"muscle": ".github/muscles/dependency-check.cjs",
"target": "docs/security/"
}
.github/workflows/scheduled-*.ymlnode .github/muscles/generate-scheduled-workflows.cjs
Preview without writing:
node .github/muscles/generate-scheduled-workflows.cjs --dry-run
For each enabled task, a workflow file at .github/workflows/scheduled-{id}.yml:
automatedautomatedworkflow_dispatch for manual triggering{
"id": "health-research",
"label": "Health Research",
"icon": "heart",
"accent": "#ef4444",
"collapsed": false,
"source": "type",
"buttons": [
{
"icon": "search",
"label": "Literature Search",
"command": "openChat",
"prompt": "@Health Researcher Search for recent studies on {topic}"
},
{
"icon": "note",
"label": "Summarize Paper",
"command"
{
"id": "daily-standup",
"name": "Daily Standup",
"description": "Generate standup notes from recent commits",
"enabled": true,
"mode": "agent",
"schedule": "0 9 * * 1-5",
"promptFile": ".github/config/scheduled-tasks/daily-standup.md"
}
Route to specific Alex agents:
{
"icon": "beaker",
"label": "Test Plan",
"command": "openChat",
"prompt": "@Validator Create a test plan for the current feature"
}
Available agents: @Alex, @Builder, @Researcher, @Validator, @Planner, @Documentarian, @Presenter, @Frontend, @Backend, @Infrastructure, etc.
Beyond cron-based scheduling, autopilots can react to signals from your application — user behavior, search patterns, error rates, or any metric worth tracking.
SessionStart hooks have a 5-second timeout and run synchronously. Network calls to external services (Azure Table Storage, APIs, databases) are unreliable within this window. The solution is two-phase execution:
| Phase | Component | Timing | What It Does |
|---|---|---|---|
| 1. Collect | Scheduled task | Daily/hourly | Queries signal source, writes local cache |
| 2. Surface | SessionStart hook | Every session | Reads local cache, surfaces suggestions |
This separation keeps hooks fast (local file read) while still enabling external signal sources.
Signals are events worth tracking. Define what you're capturing:
// Example: Search quality signals
{
"partitionKey": "2026-04-19",
"rowKey": "2026-04-19T10:30:00Z-x7k2",
"type": "search",
"query": "testosterone guidelines",
"sourceCount": 2, // Poor results signal
"topScore": 0.42, // Low relevance signal
"userId": "user@example.com",
"timestamp": "2026-04-19T10:30:00Z"
}
Common signal types:
| Signal | Trigger | Autopilot Action |
|---|---|---|
| Poor search results | sourceCount < 3 or topScore < 0.5 | Research and add content |
| Repeated queries | Same query 3+ times/week | Deep dive on topic |
| Question patterns | Detected question marks | FAQ generation |
| Error spikes | Error rate > threshold | Incident investigation |
| Stale content | No updates > 30 days | Content refresh |
Your app writes signals to a queryable store. This happens in your application code, not in Alex:
// Example: Azure Table Storage logging (in your app)
async function logSearchSignal(query, results, userId) {
await tableClient.createEntity({
partitionKey: new Date().toISOString().slice(0, 10),
rowKey: `${new Date().toISOString()}-${randomId()}`,
type: "search",
query,
sourceCount: results.length,
topScore: results[0]?.score || 0,
userId,
});
}
Signal sources can be:
A scheduled direct task queries the signal source and writes a local cache:
Task definition (.github/config/scheduled-tasks.json):
{
"id": "signal-collector",
"name": "Signal Collector",
"description": "Collect signals for session advisor",
"enabled": true,
"mode": "direct",
"schedule": "0 6 * * *",
"muscle": ".github/muscles/collect-signals.cjs"
}
Collector script (.github/muscles/collect-signals.cjs):
#!/usr/bin/env node
/**
* Signal Collector — Queries signal source, writes local cache
* Runs daily via scheduled task.
*/
const fs = require("fs");
const path = require("path");
// TODO: Replace with your signal source
async function querySignals() {
// Example: Azure Table Storage, API call, database query
// Return array of signal objects
return [
{ query: "testosterone guidelines", count: 5, avgScore: 0.38 },
{ query: "sleep apnea treatment", count: 3, avgScore: 0.45 },
];
}
async function main() {
const signals = await querySignals();
// Filter to actionable signals
const suggestions = signals
.filter(s => s.avgScore < 0.5 || s.count >= 3)
.map(s => ({
topic: s.query,
reason: s. < ? : ,
: ,
}));
cacheDir = path.(__dirname, , );
fs.(cacheDir, { : });
fs.(
path.(cacheDir, ),
.({ : ().(), suggestions }, , )
);
.();
}
().(.);
A SessionStart hook reads the cache and surfaces suggestions:
Hook (.github/muscles/hooks/signal-advisor.cjs):
#!/usr/bin/env node
/**
* Signal Advisor — Reads signal cache, surfaces suggestions at session start.
* Timeout: 5 seconds. Must be fast — local file read only.
*/
const fs = require("fs");
const path = require("path");
let input = {};
try {
input = JSON.parse(fs.readFileSync(0, "utf8"));
} catch { /* no stdin */ }
const workspaceRoot = input.cwd || path.resolve(__dirname, "../../..");
const cacheFile = path.join(workspaceRoot, ".github", "signals", "suggestions.json");
let context = "";
try {
if (fs.existsSync(cacheFile)) {
const cache = JSON.parse(fs.readFileSync(cacheFile, "utf8"));
const age = Date.now() - new Date(cache.updated).getTime();
const maxAge = 48 * 60 * 60 * 1000; // 48 hours
(age < maxAge && cache.?. > ) {
context = ;
context += ;
( s cache..(, )) {
context += ;
}
context += ;
}
}
} { }
output = {
: {
: context,
},
};
.(.(output));
Register the hook (.github/hooks.json):
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "node .github/muscles/hooks/signal-advisor.cjs",
"timeout": 5
}
]
}
]
}
}
When a suggestion is acted on, route to a dedicated autopilot:
{
"id": "research-writer",
"name": "Research Writer",
"description": "Research and write content for a topic",
"enabled": true,
"mode": "agent",
"schedule": "workflow_dispatch",
"promptFile": ".github/config/scheduled-tasks/research-writer.md"
}
The user triggers it manually via the Autopilot tab or by asking Alex.
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Application │────▶│ Signal Source │────▶│ Collector Task │
│ (your code) │ │ (Table Storage, │ │ (daily cron) │
│ │ │ API, logs, etc) │ │ │
└─────────────────┘ └──────────────────┘ └────────┬────────┘
│
▼
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Session Start │◀────│ Local Cache │◀────│ suggestions. │
│ Hook (fast) │ │ (.github/ │ │ json │
│ │ │ signals/) │ │ │
└────────┬────────┘ └──────────────────┘ └─────────────────┘
│
▼
┌─────────────────┐ ┌──────────────────┐
│ User sees │────▶│ Autopilot Task │
│ suggestions │ │ (on demand) │
│ │ │ │
└─────────────────┘ └──────────────────┘
@ agent dropdown (built-in feature)To hide agents from the @ dropdown, delete or rename their .github/agents/*.agent.md files.
| Problem | Cause | Fix |
|---|---|---|
| Buttons don't appear | Invalid JSON | Check for syntax errors, validate against schema |
| Changes not showing | File not saved | Save loop-menu.json |
| Wrong icon | Typo in codicon name | Check codicon reference |
| Problem | Cause | Fix |
|---|---|---|
| Workflow not running | Not committed/pushed | Commit .github/workflows/scheduled-*.yml and push |
| Agent task creates issue but Copilot doesn't respond | Missing COPILOT_PAT secret | Add secret in repo Settings → Secrets → Actions |
| Agent task creates issue but Copilot doesn't respond | Copilot not enabled | Enable Copilot for repo in Settings → Copilot |
| Direct task fails | Script error | Check workflow run logs in GitHub Actions |
| Duplicate issues created | Issue already open | The workflow checks for duplicates; close stale issues |
| Wrong schedule time | Timezone mismatch | Cron uses UTC; adjust for your timezone |
The schema is at .github/config/loop-config.schema.json. Most editors provide validation when $schema is set:
{
"$schema": "./../loop-config.schema.json",
...
}
For scheduled tasks, use .github/config/scheduled-tasks.schema.json.