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.
@@ -12,5 +12,6 @@
12
12
  "architecture",
13
13
  "quality-gates",
14
14
  "workflows"
15
- ]
15
+ ],
16
+ "hooks": "./hooks/hooks.json"
16
17
  }
@@ -15,5 +15,5 @@
15
15
  "workflows"
16
16
  ],
17
17
  "skills": "./skills/",
18
- "agents": "./agents/"
18
+ "hooks": "./hooks/hooks-cursor.json"
19
19
  }
package/AGENTS.md CHANGED
@@ -1 +1,22 @@
1
- CLAUDE.md
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
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "ironweave",
3
+ "description": "Agentic skills framework for software development: orchestration, requirements, architecture, TDD, and quality gates",
4
+ "version": "1.0.0",
5
+ "contextFileName": "GEMINI.md"
6
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 1,
3
+ "hooks": {
4
+ "sessionStart": [
5
+ {
6
+ "command": "./hooks/session-start"
7
+ }
8
+ ]
9
+ }
10
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "matcher": "startup|clear|compact",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/hooks/run-hook.cmd\" session-start",
10
+ "async": false
11
+ }
12
+ ]
13
+ }
14
+ ]
15
+ }
16
+ }
@@ -0,0 +1,5 @@
1
+ @echo off
2
+ setlocal
3
+ set "SCRIPT_DIR=%~dp0"
4
+ set "PLUGIN_ROOT=%SCRIPT_DIR%.."
5
+ call "%PLUGIN_ROOT%\hooks\session-start"
@@ -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.0.0",
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",