@softspark/ai-toolkit 1.3.2 → 1.3.3

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/CHANGELOG.md CHANGED
@@ -7,6 +7,13 @@ Versioning follows [Semantic Versioning](https://semver.org/).
7
7
 
8
8
  ---
9
9
 
10
+ ## v1.3.3 — Patch (2026-04-07)
11
+
12
+ ### Fixed
13
+ - **manifest.json missing from npm package**: Added `manifest.json` to `package.json` `files` array. Without it, `--auto-detect` and `--modules` could not read module definitions from installed package.
14
+
15
+ ---
16
+
10
17
  ## v1.3.2 — Patch (2026-04-07)
11
18
 
12
19
  ### Fixed
package/manifest.json ADDED
@@ -0,0 +1,159 @@
1
+ {
2
+ "version": "1.0.0",
3
+ "components": {
4
+ "agents": {
5
+ "description": "44 specialized agents (orchestrator, backend, frontend, security, devops, etc.)",
6
+ "path": "app/agents",
7
+ "target": ".claude/agents",
8
+ "type": "symlink",
9
+ "tags": ["core", "agents"]
10
+ },
11
+ "skills": {
12
+ "description": "90 skills (28 task + 30 hybrid + 32 knowledge)",
13
+ "path": "app/skills",
14
+ "target": ".claude/skills",
15
+ "type": "symlink",
16
+ "tags": ["core", "skills", "commands"]
17
+ },
18
+ "hooks": {
19
+ "description": "21 global hook entries across 12 lifecycle events + 5 skill-scoped lifecycle hooks",
20
+ "path": "app/hooks.json + app/hooks/*.sh",
21
+ "target": "~/.claude/settings.json (merge) + ~/.ai-toolkit/hooks/ (copy)",
22
+ "type": "merge+copy",
23
+ "tags": ["core", "hooks", "quality"]
24
+ },
25
+ "plugin-packs": {
26
+ "description": "Experimental domain plugin packs and optional hook/policy modules",
27
+ "path": "app/plugins",
28
+ "target": "opt-in / not installed by default",
29
+ "type": "experimental",
30
+ "tags": ["plugins", "packs", "experimental"]
31
+ },
32
+ "constitution": {
33
+ "description": "5-article machine-enforced safety constitution",
34
+ "path": "app/constitution.md",
35
+ "target": ".claude/constitution.md",
36
+ "type": "symlink",
37
+ "tags": ["core", "safety", "constitution"]
38
+ },
39
+ "architecture": {
40
+ "description": "System architecture documentation",
41
+ "path": "app/ARCHITECTURE.md",
42
+ "target": ".claude/ARCHITECTURE.md",
43
+ "type": "symlink",
44
+ "tags": ["docs"]
45
+ },
46
+ "output-styles": {
47
+ "description": "System prompt output style overrides (e.g. Golden Rules enforcement)",
48
+ "path": "app/output-styles",
49
+ "target": ".claude/output-styles",
50
+ "type": "symlink",
51
+ "tags": ["core", "output-styles"]
52
+ },
53
+ "rules": {
54
+ "description": "Auto-injected rules for CLAUDE.md (jira, quality-gates, etc.)",
55
+ "path": "app/rules",
56
+ "target": "CLAUDE.md (injected)",
57
+ "type": "injection",
58
+ "tags": ["core", "rules"]
59
+ }
60
+ },
61
+ "bundles": {
62
+ "minimal": {
63
+ "description": "Hooks and constitution only -- safety without agents",
64
+ "includes": ["hooks", "constitution"]
65
+ },
66
+ "standard": {
67
+ "description": "Full toolkit (recommended)",
68
+ "includes": ["agents", "skills", "hooks", "constitution", "rules"]
69
+ },
70
+ "agents-only": {
71
+ "description": "Agents without skills (for custom skill setup)",
72
+ "includes": ["agents", "hooks", "constitution"]
73
+ },
74
+ "skills-only": {
75
+ "description": "Skills without agents",
76
+ "includes": ["skills", "hooks", "constitution"]
77
+ },
78
+ "safety": {
79
+ "description": "Constitution + hooks only (zero agent overhead)",
80
+ "includes": ["hooks", "constitution"]
81
+ }
82
+ },
83
+ "modules": {
84
+ "core": {
85
+ "description": "Core hooks and essential skills",
86
+ "required": true
87
+ },
88
+ "agents": {
89
+ "description": "44 specialized agents",
90
+ "default": true
91
+ },
92
+ "skills": {
93
+ "description": "90 skills (task, hybrid, knowledge)",
94
+ "default": true
95
+ },
96
+ "rules-common": {
97
+ "description": "Common coding rules (5 files)",
98
+ "default": true
99
+ },
100
+ "rules-typescript": {
101
+ "description": "TypeScript-specific rules",
102
+ "auto_detect": ["package.json", "tsconfig.json"]
103
+ },
104
+ "rules-python": {
105
+ "description": "Python-specific rules",
106
+ "auto_detect": ["requirements.txt", "pyproject.toml", "setup.py", "Pipfile"]
107
+ },
108
+ "rules-golang": {
109
+ "description": "Go-specific rules",
110
+ "auto_detect": ["go.mod"]
111
+ },
112
+ "rules-rust": {
113
+ "description": "Rust-specific rules",
114
+ "auto_detect": ["Cargo.toml"]
115
+ },
116
+ "rules-java": {
117
+ "description": "Java-specific rules",
118
+ "auto_detect": ["pom.xml", "build.gradle", "build.gradle.kts"]
119
+ },
120
+ "rules-kotlin": {
121
+ "description": "Kotlin-specific rules",
122
+ "auto_detect": ["build.gradle.kts"]
123
+ },
124
+ "rules-swift": {
125
+ "description": "Swift-specific rules",
126
+ "auto_detect": ["Package.swift", "*.xcodeproj"]
127
+ },
128
+ "rules-dart": {
129
+ "description": "Dart/Flutter-specific rules",
130
+ "auto_detect": ["pubspec.yaml"]
131
+ },
132
+ "rules-csharp": {
133
+ "description": "C#/.NET-specific rules",
134
+ "auto_detect": ["*.csproj", "*.sln"]
135
+ },
136
+ "rules-php": {
137
+ "description": "PHP-specific rules",
138
+ "auto_detect": ["composer.json"]
139
+ },
140
+ "rules-cpp": {
141
+ "description": "C++-specific rules",
142
+ "auto_detect": ["CMakeLists.txt", "Makefile", "*.cpp"]
143
+ },
144
+ "rules-ruby": {
145
+ "description": "Ruby-specific rules",
146
+ "auto_detect": ["Gemfile", "*.gemspec"]
147
+ },
148
+ "mcp-templates": {
149
+ "description": "25 MCP server config templates",
150
+ "default": false
151
+ }
152
+ },
153
+ "profiles": {
154
+ "minimal": ["core"],
155
+ "standard": ["core", "agents", "skills", "rules-common"],
156
+ "strict": ["core", "agents", "skills", "rules-common", "mcp-templates"],
157
+ "full": ["core", "agents", "skills", "rules-common", "mcp-templates"]
158
+ }
159
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@softspark/ai-toolkit",
3
- "version": "1.3.2",
3
+ "version": "1.3.3",
4
4
  "description": "Professional-grade AI coding toolkit: 90 skills, 44 agents, multi-platform support (Claude, Cursor, Windsurf, Copilot, Gemini, Cline, Roo Code, Aider, Augment), machine-enforced safety constitution, persona presets, skill security auditor, expanded lifecycle hooks, 11 plugin packs, and benchmark tooling.",
5
5
  "keywords": [
6
6
  "claude",
@@ -62,6 +62,7 @@
62
62
  "kb/",
63
63
  "benchmarks/",
64
64
  "action.yml",
65
+ "manifest.json",
65
66
  "README.md",
66
67
  "CHANGELOG.md",
67
68
  "LICENSE",
package/scripts/stats.py CHANGED
@@ -59,7 +59,31 @@ def main() -> None:
59
59
  print("No invocations recorded.")
60
60
  return
61
61
 
62
- rows = sorted(data.items(), key=lambda x: x[1].get("count", 0), reverse=True)
62
+ # Handle both formats: {skill: {count, last_used}} and {loop_runs: [...]}
63
+ if "loop_runs" in data:
64
+ runs = data["loop_runs"]
65
+ if not runs:
66
+ print("No invocations recorded.")
67
+ return
68
+ # Aggregate loop_runs by command
69
+ agg: dict[str, dict] = {}
70
+ for run in runs:
71
+ cmd = run.get("command", "unknown")
72
+ iters = run.get("iterations", [])
73
+ if cmd not in agg:
74
+ agg[cmd] = {"count": 0, "last_used": "unknown"}
75
+ agg[cmd]["count"] += len(iters) if iters else 1
76
+ started = run.get("started_at", "")
77
+ if started > agg[cmd]["last_used"]:
78
+ agg[cmd]["last_used"] = started
79
+ rows = sorted(agg.items(), key=lambda x: x[1]["count"], reverse=True)
80
+ else:
81
+ # Original format: {skill_name: {count, last_used}}
82
+ skill_data = {k: v for k, v in data.items() if isinstance(v, dict)}
83
+ if not skill_data:
84
+ print("No invocations recorded.")
85
+ return
86
+ rows = sorted(skill_data.items(), key=lambda x: x[1].get("count", 0), reverse=True)
63
87
 
64
88
  print(f"{'Skill':<30} {'Count':>6} {'Last Used':<20}")
65
89
  print("-" * 60)
@@ -68,10 +92,10 @@ def main() -> None:
68
92
  last = info.get("last_used", "unknown")
69
93
  print(f"{name:<30} {count:>6} {last:<20}")
70
94
 
71
- total = sum(v.get("count", 0) for v in data.values())
95
+ total = sum(v.get("count", 0) for _, v in rows)
72
96
  print()
73
97
  print(f"Total invocations: {total}")
74
- print(f"Unique skills: {len(data)}")
98
+ print(f"Unique skills: {len(rows)}")
75
99
  print()
76
100
  print(f"File: {STATS_FILE}")
77
101
  print("Reset: ai-toolkit stats --reset")