Files
myclaude/hooks/skill-activation-prompt.js
swe-agent[bot] 3ef288bfaa feat: implement enterprise workflow with multi-backend support
## Overview
Complete implementation of enterprise-level workflow features including
multi-backend execution (Codex/Claude/Gemini), GitHub issue-to-PR automation,
hooks system, and comprehensive documentation.

## Major Changes

### 1. Multi-Backend Support (codeagent-wrapper)
- Renamed codex-wrapper → codeagent-wrapper
- Backend interface with Codex/Claude/Gemini implementations
- Multi-format JSON stream parser (auto-detects backend)
- CLI flag: --backend codex|claude|gemini (default: codex)
- Test coverage: 89.2%

**Files:**
- codeagent-wrapper/backend.go - Backend interface
- codeagent-wrapper/parser.go - Multi-format parser
- codeagent-wrapper/config.go - CLI parsing with backend selection
- codeagent-wrapper/executor.go - Process execution
- codeagent-wrapper/logger.go - Async logging
- codeagent-wrapper/utils.go - Utilities

### 2. GitHub Workflow Commands
- /gh-create-issue - Create structured issues via guided dialogue
- /gh-implement - Issue-to-PR automation with full dev lifecycle

**Files:**
- github-workflow/commands/gh-create-issue.md
- github-workflow/commands/gh-implement.md
- skills/codeagent/SKILL.md

### 3. Hooks System
- UserPromptSubmit hook for skill activation
- Pre-commit example with code quality checks
- merge_json operation in install.py for settings.json merging

**Files:**
- hooks/skill-activation-prompt.sh|.js
- hooks/pre-commit.sh
- hooks/hooks-config.json
- hooks/test-skill-activation.sh

### 4. Skills System
- skill-rules.json for auto-activation
- codeagent skill for multi-backend wrapper

**Files:**
- skills/skill-rules.json
- skills/codeagent/SKILL.md
- skills/codex/SKILL.md (updated)

### 5. Installation System
- install.py: Added merge_json operation
- config.json: Added "gh" module
- config.schema.json: Added op_merge_json schema

### 6. CI/CD
- GitHub Actions workflow for testing and building

**Files:**
- .github/workflows/ci.yml

### 7. Comprehensive Documentation
- Architecture overview with ASCII diagrams
- Codeagent-wrapper complete usage guide
- GitHub workflow detailed examples
- Hooks customization guide

**Files:**
- docs/architecture.md (21KB)
- docs/CODEAGENT-WRAPPER.md (9KB)
- docs/GITHUB-WORKFLOW.md (9KB)
- docs/HOOKS.md (4KB)
- docs/enterprise-workflow-ideas.md
- README.md (updated with doc links)

## Test Results
- All tests passing 
- Coverage: 89.2%
- Security scan: 0 issues (gosec)

## Breaking Changes
- codex-wrapper renamed to codeagent-wrapper
- Default backend: codex (documented in README)

## Migration Guide
Users with codex-wrapper installed should:
1. Run: python3 install.py --module dev --force
2. Update shell aliases if any

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-09 15:53:31 +08:00

86 lines
1.9 KiB
JavaScript

#!/usr/bin/env node
const fs = require("fs");
const path = require("path");
function readInput() {
const raw = fs.readFileSync(0, "utf8").trim();
if (!raw) return {};
try {
return JSON.parse(raw);
} catch (_err) {
return {};
}
}
function extractPrompt(payload) {
return (
payload.prompt ||
payload.text ||
payload.userPrompt ||
(payload.data && payload.data.prompt) ||
""
).toString();
}
function loadRules() {
const rulesPath = path.resolve(__dirname, "../skills/skill-rules.json");
try {
const file = fs.readFileSync(rulesPath, "utf8");
return JSON.parse(file);
} catch (_err) {
return { skills: {} };
}
}
function matchSkill(prompt, rule, skillName) {
const triggers = (rule && rule.promptTriggers) || {};
const keywords = [...(triggers.keywords || []), skillName].filter(Boolean);
const patterns = triggers.intentPatterns || [];
const promptLower = prompt.toLowerCase();
const keyword = keywords.find((k) => promptLower.includes(k.toLowerCase()));
if (keyword) {
return `命中关键词 "${keyword}"`;
}
for (const pattern of patterns) {
try {
if (new RegExp(pattern, "i").test(prompt)) {
return `命中模式 /${pattern}/`;
}
} catch (_err) {
continue;
}
}
return null;
}
function main() {
const payload = readInput();
const prompt = extractPrompt(payload);
if (!prompt.trim()) {
console.log(JSON.stringify({ suggestedSkills: [] }, null, 2));
return;
}
const rules = loadRules();
const suggestions = [];
for (const [name, rule] of Object.entries(rules.skills || {})) {
const matchReason = matchSkill(prompt, rule, name);
if (matchReason) {
suggestions.push({
skill: name,
enforcement: rule.enforcement || "suggest",
priority: rule.priority || "normal",
reason: matchReason
});
}
}
console.log(JSON.stringify({ suggestedSkills: suggestions }, null, 2));
}
main();