ironweave 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +2 -1
- package/.cursor-plugin/plugin.json +1 -1
- package/AGENTS.md +22 -1
- package/bin/cli.js +133 -0
- package/gemini-extension.json +6 -0
- package/hooks/hooks-cursor.json +10 -0
- package/hooks/hooks.json +16 -0
- package/hooks/run-hook.cmd +5 -0
- package/hooks/session-start +39 -0
- package/package.json +7 -1
package/AGENTS.md
CHANGED
|
@@ -1 +1,22 @@
|
|
|
1
|
-
|
|
1
|
+
# Ironweave
|
|
2
|
+
|
|
3
|
+
You have access to the Ironweave skills library — a complete software development workflow with built-in quality gates.
|
|
4
|
+
|
|
5
|
+
## How to use
|
|
6
|
+
|
|
7
|
+
The **orchestrator** skill (`skills/orchestrator/SKILL.md`) is the main entry point. It automatically:
|
|
8
|
+
- Senses project context and scores task difficulty
|
|
9
|
+
- Selects the right route (new project / new feature / bug fix / refactoring)
|
|
10
|
+
- Runs Plan → Execute → Validate → Deliver with quality gates per slice
|
|
11
|
+
|
|
12
|
+
For any development task, start by reading the orchestrator skill. It will guide which other skills to invoke.
|
|
13
|
+
|
|
14
|
+
## Skills available
|
|
15
|
+
|
|
16
|
+
All skills are in `skills/`. Each has a `SKILL.md` with YAML frontmatter (`name`, `description`).
|
|
17
|
+
|
|
18
|
+
Key skills: `orchestrator`, `requirement-qa`, `brainstorm`, `spec-writing`, `tech-stack`, `engineering-principles`, `api-contract-design`, `code-scaffold`, `error-handling-strategy`, `performance-arch-design`, `observability-design`, `integration-test-design`, `implementation-complexity-analysis`, `task-difficulty`, `project-context`, `docs-output`, `skill-creator`.
|
|
19
|
+
|
|
20
|
+
## Contributing
|
|
21
|
+
|
|
22
|
+
See [CONTRIBUTING.md](./CONTRIBUTING.md).
|
package/bin/cli.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
|
|
6
|
+
const args = process.argv.slice(2);
|
|
7
|
+
const command = args[0] || 'init';
|
|
8
|
+
|
|
9
|
+
if (command === '--help' || command === '-h') {
|
|
10
|
+
console.log(`
|
|
11
|
+
ironweave - Agentic skills framework for AI coding agents
|
|
12
|
+
|
|
13
|
+
Usage:
|
|
14
|
+
npx ironweave init [options] Install skills into current project
|
|
15
|
+
npx ironweave list List all available skills
|
|
16
|
+
|
|
17
|
+
Options:
|
|
18
|
+
--agent <name> Only install config for specific agent
|
|
19
|
+
(claude, copilot, cursor, windsurf, cline, codex, gemini, all)
|
|
20
|
+
Default: all
|
|
21
|
+
--skills-only Only copy skills/, skip agent config files
|
|
22
|
+
--force Overwrite existing files (default: skip existing)
|
|
23
|
+
--help Show this help message
|
|
24
|
+
`);
|
|
25
|
+
process.exit(0);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (command === 'list') {
|
|
29
|
+
const skillsDir = path.join(__dirname, '..', 'skills');
|
|
30
|
+
const skills = fs.readdirSync(skillsDir).filter(f => {
|
|
31
|
+
return fs.statSync(path.join(skillsDir, f)).isDirectory();
|
|
32
|
+
});
|
|
33
|
+
console.log(`\nIronweave Skills (${skills.length}):\n`);
|
|
34
|
+
skills.forEach(s => console.log(` - ${s}`));
|
|
35
|
+
console.log('');
|
|
36
|
+
process.exit(0);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (command === 'init') {
|
|
40
|
+
const targetDir = process.cwd();
|
|
41
|
+
const pkgDir = path.join(__dirname, '..');
|
|
42
|
+
|
|
43
|
+
const agentFlag = args.indexOf('--agent');
|
|
44
|
+
const agent = agentFlag !== -1 ? args[agentFlag + 1] : 'all';
|
|
45
|
+
const skillsOnly = args.includes('--skills-only');
|
|
46
|
+
const force = args.includes('--force');
|
|
47
|
+
|
|
48
|
+
// Copy skills/ and hooks/
|
|
49
|
+
const srcSkills = path.join(pkgDir, 'skills');
|
|
50
|
+
const dstSkills = path.join(targetDir, 'skills');
|
|
51
|
+
copyDirRecursive(srcSkills, dstSkills, force);
|
|
52
|
+
console.log('✓ skills/ copied');
|
|
53
|
+
|
|
54
|
+
const srcHooks = path.join(pkgDir, 'hooks');
|
|
55
|
+
const dstHooks = path.join(targetDir, 'hooks');
|
|
56
|
+
copyDirRecursive(srcHooks, dstHooks, force);
|
|
57
|
+
console.log('✓ hooks/ copied');
|
|
58
|
+
|
|
59
|
+
if (!skillsOnly) {
|
|
60
|
+
const agentFiles = {
|
|
61
|
+
claude: [
|
|
62
|
+
{ src: 'CLAUDE.md', dst: 'CLAUDE.md' },
|
|
63
|
+
{ src: '.claude-plugin', dst: '.claude-plugin', dir: true }
|
|
64
|
+
],
|
|
65
|
+
copilot: [
|
|
66
|
+
{ src: '.github/copilot-instructions.md', dst: '.github/copilot-instructions.md' }
|
|
67
|
+
],
|
|
68
|
+
cursor: [
|
|
69
|
+
{ src: '.cursorrules', dst: '.cursorrules' },
|
|
70
|
+
{ src: '.cursor-plugin', dst: '.cursor-plugin', dir: true }
|
|
71
|
+
],
|
|
72
|
+
windsurf: [
|
|
73
|
+
{ src: '.windsurfrules', dst: '.windsurfrules' }
|
|
74
|
+
],
|
|
75
|
+
cline: [
|
|
76
|
+
{ src: '.clinerules', dst: '.clinerules' }
|
|
77
|
+
],
|
|
78
|
+
codex: [
|
|
79
|
+
{ src: 'AGENTS.md', dst: 'AGENTS.md' },
|
|
80
|
+
{ src: '.codex', dst: '.codex', dir: true }
|
|
81
|
+
],
|
|
82
|
+
gemini: [
|
|
83
|
+
{ src: 'GEMINI.md', dst: 'GEMINI.md' },
|
|
84
|
+
{ src: 'gemini-extension.json', dst: 'gemini-extension.json' }
|
|
85
|
+
]
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
const agents = agent === 'all' ? Object.keys(agentFiles) : [agent];
|
|
89
|
+
|
|
90
|
+
agents.forEach(a => {
|
|
91
|
+
const files = agentFiles[a];
|
|
92
|
+
if (!files) {
|
|
93
|
+
console.log(`✗ Unknown agent: ${a}`);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
files.forEach(f => {
|
|
97
|
+
const srcPath = path.join(pkgDir, f.src);
|
|
98
|
+
const dstPath = path.join(targetDir, f.dst);
|
|
99
|
+
if (f.dir) {
|
|
100
|
+
copyDirRecursive(srcPath, dstPath, force);
|
|
101
|
+
} else {
|
|
102
|
+
const dstDir = path.dirname(dstPath);
|
|
103
|
+
if (!fs.existsSync(dstDir)) fs.mkdirSync(dstDir, { recursive: true });
|
|
104
|
+
if (force || !fs.existsSync(dstPath)) {
|
|
105
|
+
fs.copyFileSync(srcPath, dstPath);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
console.log(`✓ ${a} config installed`);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
console.log('\n🎉 Ironweave installed! Your agent will auto-discover the skills.\n');
|
|
114
|
+
process.exit(0);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
console.error(`Unknown command: ${command}. Run "npx ironweave --help" for usage.`);
|
|
118
|
+
process.exit(1);
|
|
119
|
+
|
|
120
|
+
function copyDirRecursive(src, dst, force) {
|
|
121
|
+
if (!fs.existsSync(src)) return;
|
|
122
|
+
if (!fs.existsSync(dst)) fs.mkdirSync(dst, { recursive: true });
|
|
123
|
+
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
124
|
+
for (const entry of entries) {
|
|
125
|
+
const srcPath = path.join(src, entry.name);
|
|
126
|
+
const dstPath = path.join(dst, entry.name);
|
|
127
|
+
if (entry.isDirectory()) {
|
|
128
|
+
copyDirRecursive(srcPath, dstPath, force);
|
|
129
|
+
} else if (force || !fs.existsSync(dstPath)) {
|
|
130
|
+
fs.copyFileSync(srcPath, dstPath);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
package/hooks/hooks.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# SessionStart hook for Ironweave plugin
|
|
3
|
+
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
# Determine plugin root directory
|
|
7
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
8
|
+
PLUGIN_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
9
|
+
|
|
10
|
+
# Read orchestrator skill content
|
|
11
|
+
orchestrator_content=$(cat "${PLUGIN_ROOT}/skills/orchestrator/SKILL.md" 2>&1 || echo "Error reading orchestrator skill")
|
|
12
|
+
|
|
13
|
+
# Escape string for JSON embedding
|
|
14
|
+
escape_for_json() {
|
|
15
|
+
local s="$1"
|
|
16
|
+
s="${s//\\/\\\\}"
|
|
17
|
+
s="${s//\"/\\\"}"
|
|
18
|
+
s="${s//$'\n'/\\n}"
|
|
19
|
+
s="${s//$'\r'/\\r}"
|
|
20
|
+
s="${s//$'\t'/\\t}"
|
|
21
|
+
printf '%s' "$s"
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
orchestrator_escaped=$(escape_for_json "$orchestrator_content")
|
|
25
|
+
session_context="<IMPORTANT>\nYou have Ironweave skills.\n\nIronweave is a complete software development workflow with built-in quality gates. The orchestrator skill is your main entry point — it auto-senses context, scores difficulty, selects the right route, and runs Plan > Execute > Validate > Deliver.\n\nAll skills are in the skills/ directory, each with a SKILL.md. For any development task, start by reading skills/orchestrator/SKILL.md.\n\nKey skills: orchestrator, requirement-qa, brainstorm, spec-writing, tech-stack, engineering-principles, api-contract-design, code-scaffold, error-handling-strategy, performance-arch-design, observability-design, integration-test-design, implementation-complexity-analysis, task-difficulty, project-context, docs-output, skill-creator.\n</IMPORTANT>"
|
|
26
|
+
|
|
27
|
+
# Output context injection as JSON.
|
|
28
|
+
# Cursor hooks expect additional_context (snake_case).
|
|
29
|
+
# Claude Code hooks expect hookSpecificOutput.additionalContext (nested).
|
|
30
|
+
# Copilot CLI and others expect additionalContext (top-level, SDK standard).
|
|
31
|
+
if [ -n "${CURSOR_PLUGIN_ROOT:-}" ]; then
|
|
32
|
+
printf '{\n "additional_context": "%s"\n}\n' "$session_context"
|
|
33
|
+
elif [ -n "${CLAUDE_PLUGIN_ROOT:-}" ] && [ -z "${COPILOT_CLI:-}" ]; then
|
|
34
|
+
printf '{\n "hookSpecificOutput": {\n "hookEventName": "SessionStart",\n "additionalContext": "%s"\n }\n}\n' "$session_context"
|
|
35
|
+
else
|
|
36
|
+
printf '{\n "additionalContext": "%s"\n}\n' "$session_context"
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
exit 0
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ironweave",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Agentic skills framework for AI coding agents — orchestrated workflows with adaptive routing, quality gates, and 17 composable skills.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent-skills",
|
|
@@ -27,11 +27,17 @@
|
|
|
27
27
|
},
|
|
28
28
|
"license": "MIT",
|
|
29
29
|
"author": "YuluoY",
|
|
30
|
+
"bin": {
|
|
31
|
+
"ironweave": "./bin/cli.js"
|
|
32
|
+
},
|
|
30
33
|
"files": [
|
|
31
34
|
"skills/",
|
|
35
|
+
"hooks/",
|
|
36
|
+
"bin/",
|
|
32
37
|
"CLAUDE.md",
|
|
33
38
|
"AGENTS.md",
|
|
34
39
|
"GEMINI.md",
|
|
40
|
+
"gemini-extension.json",
|
|
35
41
|
".cursorrules",
|
|
36
42
|
".windsurfrules",
|
|
37
43
|
".clinerules",
|