claude-flow-novice 2.11.0 → 2.12.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/skills/cfn-changelog-management/SKILL.md +349 -0
- package/.claude/skills/cfn-changelog-management/add-changelog-entry.sh +200 -0
- package/claude-assets/skills/cfn-changelog-management/SKILL.md +349 -0
- package/claude-assets/skills/cfn-changelog-management/add-changelog-entry.sh +200 -0
- package/dist/cli/config-manager.js +91 -109
- package/package.json +2 -1
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
---
|
|
2
|
+
skill_id: cfn-changelog-management
|
|
3
|
+
name: CFN Changelog Management
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
category: documentation
|
|
6
|
+
tags: [changelog, versioning, release-notes, sparse-logging]
|
|
7
|
+
dependencies: []
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# CFN Changelog Management Skill
|
|
11
|
+
|
|
12
|
+
## Purpose
|
|
13
|
+
Systematically track implementation changes with sparse, structured entries appended to project changelog. Enables quick visibility into what changed, when, and why without verbose commit-style messages.
|
|
14
|
+
|
|
15
|
+
## Problem Solved
|
|
16
|
+
Traditional changelogs require manual curation and often become stale or inconsistent. Agents completing features, fixing bugs, or making architectural changes need a lightweight way to document impact without context-switching to git commits or detailed documentation.
|
|
17
|
+
|
|
18
|
+
## When to Use
|
|
19
|
+
|
|
20
|
+
### ✅ REQUIRED Usage Scenarios
|
|
21
|
+
- **After feature implementation** - Agent completes feature work
|
|
22
|
+
- **After bug fix** - Agent resolves issue with code changes
|
|
23
|
+
- **After breaking change** - API/interface modifications that affect consumers
|
|
24
|
+
- **After dependency update** - Major version bumps or security patches
|
|
25
|
+
- **After architectural change** - Coordination pattern modifications, skill refactors
|
|
26
|
+
|
|
27
|
+
### ⚠️ OPTIONAL Usage Scenarios
|
|
28
|
+
- **After performance optimization** - Measurable improvements (>10% speedup)
|
|
29
|
+
- **After security enhancement** - Hardening, vulnerability fixes
|
|
30
|
+
- **Internal refactoring** - Code cleanup without behavioral changes (use judgment)
|
|
31
|
+
|
|
32
|
+
### ❌ DO NOT USE For
|
|
33
|
+
- **Routine maintenance** - Formatting, linting, comment updates
|
|
34
|
+
- **Work-in-progress** - Incomplete features or experimental changes
|
|
35
|
+
- **Test-only changes** - Adding tests without production code changes
|
|
36
|
+
- **Documentation-only updates** - README edits, comment clarifications
|
|
37
|
+
|
|
38
|
+
## Interface
|
|
39
|
+
|
|
40
|
+
### Primary Script: `add-changelog-entry.sh`
|
|
41
|
+
|
|
42
|
+
**Required Parameters:**
|
|
43
|
+
- `--type`: Entry type (feature|bugfix|breaking|dependency|architecture|performance|security)
|
|
44
|
+
- `--summary`: One-line description (10-100 chars)
|
|
45
|
+
- `--impact`: What changed and why it matters
|
|
46
|
+
|
|
47
|
+
**Optional Parameters:**
|
|
48
|
+
- `--version`: Target version (default: auto-increment patch)
|
|
49
|
+
- `--issue`: Related issue/bug number (e.g., "BUG-123", "#456")
|
|
50
|
+
- `--files`: Key files affected (comma-separated, max 5)
|
|
51
|
+
- `--migration`: Migration notes for breaking changes
|
|
52
|
+
|
|
53
|
+
**Usage:**
|
|
54
|
+
```bash
|
|
55
|
+
./.claude/skills/cfn-changelog-management/add-changelog-entry.sh \
|
|
56
|
+
--type "feature" \
|
|
57
|
+
--summary "Add backlog management skill for deferred work tracking" \
|
|
58
|
+
--impact "Agents can now systematically capture deferred items with structured metadata instead of losing context in chat history" \
|
|
59
|
+
--files ".claude/skills/cfn-backlog-management/SKILL.md,readme/BACKLOG.md"
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Output Location
|
|
63
|
+
All entries appended to: `readme/CHANGELOG.md`
|
|
64
|
+
|
|
65
|
+
## Changelog File Structure
|
|
66
|
+
|
|
67
|
+
```markdown
|
|
68
|
+
# Claude Flow Novice Changelog
|
|
69
|
+
|
|
70
|
+
## [Unreleased]
|
|
71
|
+
|
|
72
|
+
### Features
|
|
73
|
+
- Add backlog management skill (2025-10-31)
|
|
74
|
+
- Impact: Systematic deferred work tracking with priority/tag organization
|
|
75
|
+
- Files: `.claude/skills/cfn-backlog-management/`
|
|
76
|
+
|
|
77
|
+
### Bug Fixes
|
|
78
|
+
|
|
79
|
+
### Breaking Changes
|
|
80
|
+
|
|
81
|
+
### Dependencies
|
|
82
|
+
|
|
83
|
+
### Architecture
|
|
84
|
+
|
|
85
|
+
### Performance
|
|
86
|
+
|
|
87
|
+
### Security
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## [2.11.0] - 2025-10-31
|
|
92
|
+
|
|
93
|
+
### Features
|
|
94
|
+
- Backlog management skill implementation
|
|
95
|
+
- Impact: Centralized tracking of deferred work items
|
|
96
|
+
- Files: `.claude/skills/cfn-backlog-management/add-backlog-item.sh`
|
|
97
|
+
|
|
98
|
+
...
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Entry Types
|
|
102
|
+
|
|
103
|
+
### Feature
|
|
104
|
+
New functionality, skills, commands, or capabilities.
|
|
105
|
+
```bash
|
|
106
|
+
--type "feature"
|
|
107
|
+
--summary "Implement Redis pub/sub coordination for zero-token waiting"
|
|
108
|
+
--impact "Agents block on BLPOP instead of polling, eliminating API calls during wait cycles"
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Bug Fix
|
|
112
|
+
Defect resolution, error handling improvements.
|
|
113
|
+
```bash
|
|
114
|
+
--type "bugfix"
|
|
115
|
+
--summary "Fix race condition in Loop 3 confidence collection"
|
|
116
|
+
--impact "Orchestrator now uses synchronous temp file capture instead of polling Redis keys"
|
|
117
|
+
--issue "BUG-10"
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Breaking Change
|
|
121
|
+
Incompatible changes requiring user/agent migration.
|
|
122
|
+
```bash
|
|
123
|
+
--type "breaking"
|
|
124
|
+
--summary "Rename skill cfn-redis-coordination → cfn-swarm-coordination"
|
|
125
|
+
--impact "All agent spawn commands must update skill references"
|
|
126
|
+
--migration "Run: sed -i 's/cfn-redis-coordination/cfn-swarm-coordination/g' .claude/agents/**/*.md"
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Dependency
|
|
130
|
+
Package updates, version bumps, security patches.
|
|
131
|
+
```bash
|
|
132
|
+
--type "dependency"
|
|
133
|
+
--summary "Upgrade redis 5.0.0 → 5.8.3"
|
|
134
|
+
--impact "Fixes CVE-2024-1234, adds BLPOP timeout parameter support"
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Architecture
|
|
138
|
+
Coordination pattern changes, skill refactors, system design updates.
|
|
139
|
+
```bash
|
|
140
|
+
--type "architecture"
|
|
141
|
+
--summary "Extract output processing into dedicated skill"
|
|
142
|
+
--impact "95% code reuse between Loop 3 and Loop 2 consensus collection"
|
|
143
|
+
--files ".claude/skills/cfn-agent-output-processing/SKILL.md"
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Performance
|
|
147
|
+
Optimizations with measurable impact.
|
|
148
|
+
```bash
|
|
149
|
+
--type "performance"
|
|
150
|
+
--summary "Parallel agent spawning with background processes"
|
|
151
|
+
--impact "3x speedup for 3-agent coordination (sequential: 15s → parallel: 5s max latency)"
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Security
|
|
155
|
+
Hardening, vulnerability fixes, audit improvements.
|
|
156
|
+
```bash
|
|
157
|
+
--type "security"
|
|
158
|
+
--summary "Add pre-edit backup hook for safe file revert"
|
|
159
|
+
--impact "Prevents git conflicts in parallel sessions, 24h backup retention"
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Validation Rules
|
|
163
|
+
|
|
164
|
+
1. **Type validation**: Must be one of 7 defined types
|
|
165
|
+
2. **Summary length**: 10-100 characters (enforces brevity)
|
|
166
|
+
3. **Impact required**: Cannot be empty (enforces "why it matters")
|
|
167
|
+
4. **File limit**: Max 5 files (prevents noise)
|
|
168
|
+
5. **Version format**: Semantic versioning (X.Y.Z)
|
|
169
|
+
|
|
170
|
+
## Sparse Language Guidelines
|
|
171
|
+
|
|
172
|
+
### ✅ Good Examples
|
|
173
|
+
```
|
|
174
|
+
Summary: "Add Redis coordination skill"
|
|
175
|
+
Impact: "Zero-token agent waiting via BLPOP"
|
|
176
|
+
|
|
177
|
+
Summary: "Fix confidence parsing edge case"
|
|
178
|
+
Impact: "Handles percentage format (85%) in addition to decimal (0.85)"
|
|
179
|
+
|
|
180
|
+
Summary: "Upgrade better-sqlite3 to v12.4.1"
|
|
181
|
+
Impact: "Node 22 compatibility, fixes installation errors on WSL2"
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### ❌ Bad Examples (Too Verbose)
|
|
185
|
+
```
|
|
186
|
+
Summary: "We have implemented a comprehensive Redis-based coordination system..."
|
|
187
|
+
Impact: "This change allows agents to coordinate more efficiently by using a blocking..."
|
|
188
|
+
|
|
189
|
+
Summary: "Fixed a bug"
|
|
190
|
+
Impact: "There was an issue that has been resolved"
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Sparse Pattern Rules
|
|
194
|
+
- **Active voice**: "Add feature" not "Feature added"
|
|
195
|
+
- **No articles**: "Fix bug" not "Fix the bug"
|
|
196
|
+
- **No fluff**: "Enables X" not "This change enables X"
|
|
197
|
+
- **Measurable impact**: Include numbers when relevant (3x speedup, 95% reduction)
|
|
198
|
+
|
|
199
|
+
## Integration Examples
|
|
200
|
+
|
|
201
|
+
### Loop 3 Agent (After Feature Implementation)
|
|
202
|
+
```bash
|
|
203
|
+
# Agent completes feature work
|
|
204
|
+
Edit: file_path="src/new-feature.ts" ...
|
|
205
|
+
|
|
206
|
+
# Document change
|
|
207
|
+
./.claude/skills/cfn-changelog-management/add-changelog-entry.sh \
|
|
208
|
+
--type "feature" \
|
|
209
|
+
--summary "JWT authentication middleware" \
|
|
210
|
+
--impact "Stateless auth reduces session storage by 80%" \
|
|
211
|
+
--files "src/middleware/auth.ts,src/types/jwt.ts"
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Loop 2 Validator (After Identifying Bug Fix)
|
|
215
|
+
```bash
|
|
216
|
+
# Validator reviews fix
|
|
217
|
+
./.claude/skills/cfn-changelog-management/add-changelog-entry.sh \
|
|
218
|
+
--type "bugfix" \
|
|
219
|
+
--summary "Prevent null pointer in Redis connection retry" \
|
|
220
|
+
--impact "Eliminates crashes during Redis unavailability" \
|
|
221
|
+
--issue "BUG-42" \
|
|
222
|
+
--files "src/redis/client.ts"
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Product Owner (After Architectural Decision)
|
|
226
|
+
```bash
|
|
227
|
+
# Product Owner approves design change
|
|
228
|
+
./.claude/skills/cfn-changelog-management/add-changelog-entry.sh \
|
|
229
|
+
--type "architecture" \
|
|
230
|
+
--summary "Split orchestrator into modular helper scripts" \
|
|
231
|
+
--impact "78% code reduction, improved testability" \
|
|
232
|
+
--files ".claude/skills/cfn-loop-orchestration/helpers/"
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## Versioning Strategy
|
|
236
|
+
|
|
237
|
+
### Auto-Increment (Default)
|
|
238
|
+
Script reads current version from `package.json`, increments patch:
|
|
239
|
+
- Current: `2.11.0` → Entry added to: `[Unreleased]`
|
|
240
|
+
- On release: Move `[Unreleased]` → `[2.11.1] - YYYY-MM-DD`
|
|
241
|
+
|
|
242
|
+
### Manual Version (Override)
|
|
243
|
+
```bash
|
|
244
|
+
--version "3.0.0" # Specify major/minor bump explicitly
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### Release Workflow
|
|
248
|
+
1. Agents add entries to `[Unreleased]` section
|
|
249
|
+
2. On release trigger (manual or automated):
|
|
250
|
+
- Rename `[Unreleased]` → `[X.Y.Z] - DATE`
|
|
251
|
+
- Create new empty `[Unreleased]` section
|
|
252
|
+
- Update `package.json` version
|
|
253
|
+
|
|
254
|
+
## Query Interface
|
|
255
|
+
|
|
256
|
+
**Filter by type:**
|
|
257
|
+
```bash
|
|
258
|
+
sed -n '/### Features/,/### Bug Fixes/p' readme/CHANGELOG.md
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
**Recent entries (last 10):**
|
|
262
|
+
```bash
|
|
263
|
+
grep -A 2 "^- " readme/CHANGELOG.md | head -30
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
**Search by keyword:**
|
|
267
|
+
```bash
|
|
268
|
+
grep -i "redis" readme/CHANGELOG.md
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
**Entries for specific version:**
|
|
272
|
+
```bash
|
|
273
|
+
sed -n '/## \[2.11.0\]/,/## \[2.10.0\]/p' readme/CHANGELOG.md
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
## Best Practices
|
|
277
|
+
|
|
278
|
+
1. **Immediate logging**: Add entry immediately after completing work, not batched
|
|
279
|
+
2. **User perspective**: Describe impact from user/agent consumer viewpoint
|
|
280
|
+
3. **File references**: Include key files for context (not exhaustive list)
|
|
281
|
+
4. **Link issues**: Reference bug numbers or GitHub issues when applicable
|
|
282
|
+
5. **Migration notes**: Always include for breaking changes
|
|
283
|
+
|
|
284
|
+
## Anti-Patterns
|
|
285
|
+
|
|
286
|
+
❌ **Verbose commit messages**: "This commit implements a new feature that..."
|
|
287
|
+
❌ **Generic summaries**: "Fixed bugs", "Updated code", "Improvements"
|
|
288
|
+
❌ **Missing impact**: "Added function X" (Why does it matter?)
|
|
289
|
+
❌ **Duplicate entries**: Check existing changelog before adding
|
|
290
|
+
❌ **Version conflicts**: Don't manually edit version, use --version flag
|
|
291
|
+
|
|
292
|
+
## Example Entry Lifecycle
|
|
293
|
+
|
|
294
|
+
**Step 1: Agent completes feature**
|
|
295
|
+
```bash
|
|
296
|
+
add-changelog-entry.sh \
|
|
297
|
+
--type "feature" \
|
|
298
|
+
--summary "Multi-pattern confidence parsing" \
|
|
299
|
+
--impact "100% extraction success, supports explicit/percentage/qualitative formats"
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
**Result in CHANGELOG.md:**
|
|
303
|
+
```markdown
|
|
304
|
+
## [Unreleased]
|
|
305
|
+
|
|
306
|
+
### Features
|
|
307
|
+
- Multi-pattern confidence parsing (2025-10-31)
|
|
308
|
+
- Impact: 100% extraction success, supports explicit/percentage/qualitative formats
|
|
309
|
+
- Files: `.claude/skills/cfn-agent-output-processing/parse-confidence.sh`
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
**Step 2: Release triggered**
|
|
313
|
+
```bash
|
|
314
|
+
# Manual or automated
|
|
315
|
+
npm version minor # 2.11.0 → 2.12.0
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
**Result:**
|
|
319
|
+
```markdown
|
|
320
|
+
## [2.12.0] - 2025-11-01
|
|
321
|
+
|
|
322
|
+
### Features
|
|
323
|
+
- Multi-pattern confidence parsing (2025-10-31)
|
|
324
|
+
- Impact: 100% extraction success, supports explicit/percentage/qualitative formats
|
|
325
|
+
- Files: `.claude/skills/cfn-agent-output-processing/parse-confidence.sh`
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
## [Unreleased]
|
|
330
|
+
|
|
331
|
+
### Features
|
|
332
|
+
|
|
333
|
+
### Bug Fixes
|
|
334
|
+
...
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
## Success Metrics
|
|
338
|
+
|
|
339
|
+
- **Entry quality**: ≥90% of entries include measurable impact
|
|
340
|
+
- **Sparse language**: Average summary length ≤60 characters
|
|
341
|
+
- **Timeliness**: ≥80% of entries added within same sprint as implementation
|
|
342
|
+
- **Coverage**: 100% of features/breaking changes documented
|
|
343
|
+
- **Queryability**: Users can find relevant changes in <30 seconds
|
|
344
|
+
|
|
345
|
+
## References
|
|
346
|
+
|
|
347
|
+
- **Sparse Language**: readme/CLAUDE.md - Documentation Guidelines
|
|
348
|
+
- **Backlog Management**: `.claude/skills/cfn-backlog-management/SKILL.md`
|
|
349
|
+
- **Versioning**: `package.json` - Single source of truth
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
# cfn-changelog-management/add-changelog-entry.sh
|
|
5
|
+
# Adds sparse, structured entries to readme/CHANGELOG.md
|
|
6
|
+
|
|
7
|
+
# Default values
|
|
8
|
+
TYPE=""
|
|
9
|
+
SUMMARY=""
|
|
10
|
+
IMPACT=""
|
|
11
|
+
VERSION=""
|
|
12
|
+
ISSUE=""
|
|
13
|
+
FILES=""
|
|
14
|
+
MIGRATION=""
|
|
15
|
+
|
|
16
|
+
# Parse arguments
|
|
17
|
+
while [[ $# -gt 0 ]]; do
|
|
18
|
+
case $1 in
|
|
19
|
+
--type)
|
|
20
|
+
TYPE="$2"
|
|
21
|
+
shift 2
|
|
22
|
+
;;
|
|
23
|
+
--summary)
|
|
24
|
+
SUMMARY="$2"
|
|
25
|
+
shift 2
|
|
26
|
+
;;
|
|
27
|
+
--impact)
|
|
28
|
+
IMPACT="$2"
|
|
29
|
+
shift 2
|
|
30
|
+
;;
|
|
31
|
+
--version)
|
|
32
|
+
VERSION="$2"
|
|
33
|
+
shift 2
|
|
34
|
+
;;
|
|
35
|
+
--issue)
|
|
36
|
+
ISSUE="$2"
|
|
37
|
+
shift 2
|
|
38
|
+
;;
|
|
39
|
+
--files)
|
|
40
|
+
FILES="$2"
|
|
41
|
+
shift 2
|
|
42
|
+
;;
|
|
43
|
+
--migration)
|
|
44
|
+
MIGRATION="$2"
|
|
45
|
+
shift 2
|
|
46
|
+
;;
|
|
47
|
+
*)
|
|
48
|
+
echo "Unknown argument: $1" >&2
|
|
49
|
+
exit 1
|
|
50
|
+
;;
|
|
51
|
+
esac
|
|
52
|
+
done
|
|
53
|
+
|
|
54
|
+
# Validation
|
|
55
|
+
if [[ -z "$TYPE" ]]; then
|
|
56
|
+
echo "Error: --type is required" >&2
|
|
57
|
+
echo "Valid types: feature, bugfix, breaking, dependency, architecture, performance, security" >&2
|
|
58
|
+
exit 1
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
if [[ -z "$SUMMARY" ]]; then
|
|
62
|
+
echo "Error: --summary is required" >&2
|
|
63
|
+
exit 1
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
if [[ -z "$IMPACT" ]]; then
|
|
67
|
+
echo "Error: --impact is required" >&2
|
|
68
|
+
exit 1
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
# Validate type
|
|
72
|
+
VALID_TYPES="feature|bugfix|breaking|dependency|architecture|performance|security"
|
|
73
|
+
if [[ ! "$TYPE" =~ ^($VALID_TYPES)$ ]]; then
|
|
74
|
+
echo "Error: --type must be one of: feature, bugfix, breaking, dependency, architecture, performance, security (got: $TYPE)" >&2
|
|
75
|
+
exit 1
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
# Validate summary length
|
|
79
|
+
SUMMARY_LENGTH=${#SUMMARY}
|
|
80
|
+
if (( SUMMARY_LENGTH < 10 )); then
|
|
81
|
+
echo "Error: --summary must be at least 10 characters (got $SUMMARY_LENGTH)" >&2
|
|
82
|
+
exit 1
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
if (( SUMMARY_LENGTH > 100 )); then
|
|
86
|
+
echo "Error: --summary must be at most 100 characters (got $SUMMARY_LENGTH)" >&2
|
|
87
|
+
exit 1
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
# Validate file limit
|
|
91
|
+
if [[ -n "$FILES" ]]; then
|
|
92
|
+
FILE_COUNT=$(echo "$FILES" | tr ',' '\n' | wc -l)
|
|
93
|
+
if (( FILE_COUNT > 5 )); then
|
|
94
|
+
echo "Error: --files can contain at most 5 files (got $FILE_COUNT)" >&2
|
|
95
|
+
exit 1
|
|
96
|
+
fi
|
|
97
|
+
fi
|
|
98
|
+
|
|
99
|
+
# Path to changelog
|
|
100
|
+
CHANGELOG_FILE="readme/CHANGELOG.md"
|
|
101
|
+
PROJECT_ROOT="/mnt/c/Users/masha/Documents/claude-flow-novice"
|
|
102
|
+
CHANGELOG_PATH="$PROJECT_ROOT/$CHANGELOG_FILE"
|
|
103
|
+
|
|
104
|
+
# Check if changelog exists
|
|
105
|
+
if [[ ! -f "$CHANGELOG_PATH" ]]; then
|
|
106
|
+
echo "Error: Changelog not found at $CHANGELOG_PATH" >&2
|
|
107
|
+
echo "Expected format: readme/CHANGELOG.md" >&2
|
|
108
|
+
exit 1
|
|
109
|
+
fi
|
|
110
|
+
|
|
111
|
+
# Map type to section header
|
|
112
|
+
case "$TYPE" in
|
|
113
|
+
feature)
|
|
114
|
+
SECTION="### Features"
|
|
115
|
+
;;
|
|
116
|
+
bugfix)
|
|
117
|
+
SECTION="### Bug Fixes"
|
|
118
|
+
;;
|
|
119
|
+
breaking)
|
|
120
|
+
SECTION="### Breaking Changes"
|
|
121
|
+
;;
|
|
122
|
+
dependency)
|
|
123
|
+
SECTION="### Dependencies"
|
|
124
|
+
;;
|
|
125
|
+
architecture)
|
|
126
|
+
SECTION="### Architecture"
|
|
127
|
+
;;
|
|
128
|
+
performance)
|
|
129
|
+
SECTION="### Performance"
|
|
130
|
+
;;
|
|
131
|
+
security)
|
|
132
|
+
SECTION="### Security"
|
|
133
|
+
;;
|
|
134
|
+
esac
|
|
135
|
+
|
|
136
|
+
# Current date
|
|
137
|
+
CURRENT_DATE=$(date +%Y-%m-%d)
|
|
138
|
+
|
|
139
|
+
# Build entry
|
|
140
|
+
ENTRY="- $SUMMARY ($CURRENT_DATE)"
|
|
141
|
+
ENTRY="$ENTRY\n - Impact: $IMPACT"
|
|
142
|
+
|
|
143
|
+
if [[ -n "$FILES" ]]; then
|
|
144
|
+
ENTRY="$ENTRY\n - Files: \`$FILES\`"
|
|
145
|
+
fi
|
|
146
|
+
|
|
147
|
+
if [[ -n "$ISSUE" ]]; then
|
|
148
|
+
ENTRY="$ENTRY\n - Issue: $ISSUE"
|
|
149
|
+
fi
|
|
150
|
+
|
|
151
|
+
if [[ -n "$MIGRATION" ]]; then
|
|
152
|
+
ENTRY="$ENTRY\n - Migration: $MIGRATION"
|
|
153
|
+
fi
|
|
154
|
+
|
|
155
|
+
# Find [Unreleased] section and appropriate subsection
|
|
156
|
+
# Insert entry after section header
|
|
157
|
+
|
|
158
|
+
# Check if [Unreleased] section exists
|
|
159
|
+
if ! grep -q "## \[Unreleased\]" "$CHANGELOG_PATH"; then
|
|
160
|
+
echo "Error: [Unreleased] section not found in changelog" >&2
|
|
161
|
+
echo "Expected format:" >&2
|
|
162
|
+
echo "## [Unreleased]" >&2
|
|
163
|
+
echo "" >&2
|
|
164
|
+
echo "### Features" >&2
|
|
165
|
+
exit 1
|
|
166
|
+
fi
|
|
167
|
+
|
|
168
|
+
# Check if section exists within [Unreleased]
|
|
169
|
+
if ! awk '/## \[Unreleased\]/,/^---$/ { if (/'"$SECTION"'/) found=1 } END { exit !found }' "$CHANGELOG_PATH"; then
|
|
170
|
+
echo "Error: $SECTION not found within [Unreleased] section" >&2
|
|
171
|
+
exit 1
|
|
172
|
+
fi
|
|
173
|
+
|
|
174
|
+
# Insert entry after section header (first blank line or entry)
|
|
175
|
+
awk -v section="$SECTION" -v entry="$ENTRY" '
|
|
176
|
+
# Track if we are in [Unreleased] section
|
|
177
|
+
/## \[Unreleased\]/ { in_unreleased=1 }
|
|
178
|
+
/^## \[/ && !/## \[Unreleased\]/ { in_unreleased=0 }
|
|
179
|
+
|
|
180
|
+
# When we find the target section within [Unreleased]
|
|
181
|
+
in_unreleased && $0 ~ section {
|
|
182
|
+
print
|
|
183
|
+
getline # Read next line
|
|
184
|
+
print # Print it (usually blank line)
|
|
185
|
+
print entry
|
|
186
|
+
next
|
|
187
|
+
}
|
|
188
|
+
{print}
|
|
189
|
+
' "$CHANGELOG_PATH" > "${CHANGELOG_PATH}.tmp"
|
|
190
|
+
|
|
191
|
+
mv "${CHANGELOG_PATH}.tmp" "$CHANGELOG_PATH"
|
|
192
|
+
|
|
193
|
+
echo "✅ Changelog entry added successfully"
|
|
194
|
+
echo " Type: $TYPE"
|
|
195
|
+
echo " Summary: $SUMMARY"
|
|
196
|
+
echo " Section: $SECTION"
|
|
197
|
+
echo " Location: $CHANGELOG_FILE"
|
|
198
|
+
|
|
199
|
+
# Output path for scripting
|
|
200
|
+
echo "$CHANGELOG_PATH"
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
---
|
|
2
|
+
skill_id: cfn-changelog-management
|
|
3
|
+
name: CFN Changelog Management
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
category: documentation
|
|
6
|
+
tags: [changelog, versioning, release-notes, sparse-logging]
|
|
7
|
+
dependencies: []
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# CFN Changelog Management Skill
|
|
11
|
+
|
|
12
|
+
## Purpose
|
|
13
|
+
Systematically track implementation changes with sparse, structured entries appended to project changelog. Enables quick visibility into what changed, when, and why without verbose commit-style messages.
|
|
14
|
+
|
|
15
|
+
## Problem Solved
|
|
16
|
+
Traditional changelogs require manual curation and often become stale or inconsistent. Agents completing features, fixing bugs, or making architectural changes need a lightweight way to document impact without context-switching to git commits or detailed documentation.
|
|
17
|
+
|
|
18
|
+
## When to Use
|
|
19
|
+
|
|
20
|
+
### ✅ REQUIRED Usage Scenarios
|
|
21
|
+
- **After feature implementation** - Agent completes feature work
|
|
22
|
+
- **After bug fix** - Agent resolves issue with code changes
|
|
23
|
+
- **After breaking change** - API/interface modifications that affect consumers
|
|
24
|
+
- **After dependency update** - Major version bumps or security patches
|
|
25
|
+
- **After architectural change** - Coordination pattern modifications, skill refactors
|
|
26
|
+
|
|
27
|
+
### ⚠️ OPTIONAL Usage Scenarios
|
|
28
|
+
- **After performance optimization** - Measurable improvements (>10% speedup)
|
|
29
|
+
- **After security enhancement** - Hardening, vulnerability fixes
|
|
30
|
+
- **Internal refactoring** - Code cleanup without behavioral changes (use judgment)
|
|
31
|
+
|
|
32
|
+
### ❌ DO NOT USE For
|
|
33
|
+
- **Routine maintenance** - Formatting, linting, comment updates
|
|
34
|
+
- **Work-in-progress** - Incomplete features or experimental changes
|
|
35
|
+
- **Test-only changes** - Adding tests without production code changes
|
|
36
|
+
- **Documentation-only updates** - README edits, comment clarifications
|
|
37
|
+
|
|
38
|
+
## Interface
|
|
39
|
+
|
|
40
|
+
### Primary Script: `add-changelog-entry.sh`
|
|
41
|
+
|
|
42
|
+
**Required Parameters:**
|
|
43
|
+
- `--type`: Entry type (feature|bugfix|breaking|dependency|architecture|performance|security)
|
|
44
|
+
- `--summary`: One-line description (10-100 chars)
|
|
45
|
+
- `--impact`: What changed and why it matters
|
|
46
|
+
|
|
47
|
+
**Optional Parameters:**
|
|
48
|
+
- `--version`: Target version (default: auto-increment patch)
|
|
49
|
+
- `--issue`: Related issue/bug number (e.g., "BUG-123", "#456")
|
|
50
|
+
- `--files`: Key files affected (comma-separated, max 5)
|
|
51
|
+
- `--migration`: Migration notes for breaking changes
|
|
52
|
+
|
|
53
|
+
**Usage:**
|
|
54
|
+
```bash
|
|
55
|
+
./.claude/skills/cfn-changelog-management/add-changelog-entry.sh \
|
|
56
|
+
--type "feature" \
|
|
57
|
+
--summary "Add backlog management skill for deferred work tracking" \
|
|
58
|
+
--impact "Agents can now systematically capture deferred items with structured metadata instead of losing context in chat history" \
|
|
59
|
+
--files ".claude/skills/cfn-backlog-management/SKILL.md,readme/BACKLOG.md"
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Output Location
|
|
63
|
+
All entries appended to: `readme/CHANGELOG.md`
|
|
64
|
+
|
|
65
|
+
## Changelog File Structure
|
|
66
|
+
|
|
67
|
+
```markdown
|
|
68
|
+
# Claude Flow Novice Changelog
|
|
69
|
+
|
|
70
|
+
## [Unreleased]
|
|
71
|
+
|
|
72
|
+
### Features
|
|
73
|
+
- Add backlog management skill (2025-10-31)
|
|
74
|
+
- Impact: Systematic deferred work tracking with priority/tag organization
|
|
75
|
+
- Files: `.claude/skills/cfn-backlog-management/`
|
|
76
|
+
|
|
77
|
+
### Bug Fixes
|
|
78
|
+
|
|
79
|
+
### Breaking Changes
|
|
80
|
+
|
|
81
|
+
### Dependencies
|
|
82
|
+
|
|
83
|
+
### Architecture
|
|
84
|
+
|
|
85
|
+
### Performance
|
|
86
|
+
|
|
87
|
+
### Security
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## [2.11.0] - 2025-10-31
|
|
92
|
+
|
|
93
|
+
### Features
|
|
94
|
+
- Backlog management skill implementation
|
|
95
|
+
- Impact: Centralized tracking of deferred work items
|
|
96
|
+
- Files: `.claude/skills/cfn-backlog-management/add-backlog-item.sh`
|
|
97
|
+
|
|
98
|
+
...
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Entry Types
|
|
102
|
+
|
|
103
|
+
### Feature
|
|
104
|
+
New functionality, skills, commands, or capabilities.
|
|
105
|
+
```bash
|
|
106
|
+
--type "feature"
|
|
107
|
+
--summary "Implement Redis pub/sub coordination for zero-token waiting"
|
|
108
|
+
--impact "Agents block on BLPOP instead of polling, eliminating API calls during wait cycles"
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Bug Fix
|
|
112
|
+
Defect resolution, error handling improvements.
|
|
113
|
+
```bash
|
|
114
|
+
--type "bugfix"
|
|
115
|
+
--summary "Fix race condition in Loop 3 confidence collection"
|
|
116
|
+
--impact "Orchestrator now uses synchronous temp file capture instead of polling Redis keys"
|
|
117
|
+
--issue "BUG-10"
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Breaking Change
|
|
121
|
+
Incompatible changes requiring user/agent migration.
|
|
122
|
+
```bash
|
|
123
|
+
--type "breaking"
|
|
124
|
+
--summary "Rename skill cfn-redis-coordination → cfn-swarm-coordination"
|
|
125
|
+
--impact "All agent spawn commands must update skill references"
|
|
126
|
+
--migration "Run: sed -i 's/cfn-redis-coordination/cfn-swarm-coordination/g' .claude/agents/**/*.md"
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Dependency
|
|
130
|
+
Package updates, version bumps, security patches.
|
|
131
|
+
```bash
|
|
132
|
+
--type "dependency"
|
|
133
|
+
--summary "Upgrade redis 5.0.0 → 5.8.3"
|
|
134
|
+
--impact "Fixes CVE-2024-1234, adds BLPOP timeout parameter support"
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Architecture
|
|
138
|
+
Coordination pattern changes, skill refactors, system design updates.
|
|
139
|
+
```bash
|
|
140
|
+
--type "architecture"
|
|
141
|
+
--summary "Extract output processing into dedicated skill"
|
|
142
|
+
--impact "95% code reuse between Loop 3 and Loop 2 consensus collection"
|
|
143
|
+
--files ".claude/skills/cfn-agent-output-processing/SKILL.md"
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Performance
|
|
147
|
+
Optimizations with measurable impact.
|
|
148
|
+
```bash
|
|
149
|
+
--type "performance"
|
|
150
|
+
--summary "Parallel agent spawning with background processes"
|
|
151
|
+
--impact "3x speedup for 3-agent coordination (sequential: 15s → parallel: 5s max latency)"
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Security
|
|
155
|
+
Hardening, vulnerability fixes, audit improvements.
|
|
156
|
+
```bash
|
|
157
|
+
--type "security"
|
|
158
|
+
--summary "Add pre-edit backup hook for safe file revert"
|
|
159
|
+
--impact "Prevents git conflicts in parallel sessions, 24h backup retention"
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Validation Rules
|
|
163
|
+
|
|
164
|
+
1. **Type validation**: Must be one of 7 defined types
|
|
165
|
+
2. **Summary length**: 10-100 characters (enforces brevity)
|
|
166
|
+
3. **Impact required**: Cannot be empty (enforces "why it matters")
|
|
167
|
+
4. **File limit**: Max 5 files (prevents noise)
|
|
168
|
+
5. **Version format**: Semantic versioning (X.Y.Z)
|
|
169
|
+
|
|
170
|
+
## Sparse Language Guidelines
|
|
171
|
+
|
|
172
|
+
### ✅ Good Examples
|
|
173
|
+
```
|
|
174
|
+
Summary: "Add Redis coordination skill"
|
|
175
|
+
Impact: "Zero-token agent waiting via BLPOP"
|
|
176
|
+
|
|
177
|
+
Summary: "Fix confidence parsing edge case"
|
|
178
|
+
Impact: "Handles percentage format (85%) in addition to decimal (0.85)"
|
|
179
|
+
|
|
180
|
+
Summary: "Upgrade better-sqlite3 to v12.4.1"
|
|
181
|
+
Impact: "Node 22 compatibility, fixes installation errors on WSL2"
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### ❌ Bad Examples (Too Verbose)
|
|
185
|
+
```
|
|
186
|
+
Summary: "We have implemented a comprehensive Redis-based coordination system..."
|
|
187
|
+
Impact: "This change allows agents to coordinate more efficiently by using a blocking..."
|
|
188
|
+
|
|
189
|
+
Summary: "Fixed a bug"
|
|
190
|
+
Impact: "There was an issue that has been resolved"
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Sparse Pattern Rules
|
|
194
|
+
- **Active voice**: "Add feature" not "Feature added"
|
|
195
|
+
- **No articles**: "Fix bug" not "Fix the bug"
|
|
196
|
+
- **No fluff**: "Enables X" not "This change enables X"
|
|
197
|
+
- **Measurable impact**: Include numbers when relevant (3x speedup, 95% reduction)
|
|
198
|
+
|
|
199
|
+
## Integration Examples
|
|
200
|
+
|
|
201
|
+
### Loop 3 Agent (After Feature Implementation)
|
|
202
|
+
```bash
|
|
203
|
+
# Agent completes feature work
|
|
204
|
+
Edit: file_path="src/new-feature.ts" ...
|
|
205
|
+
|
|
206
|
+
# Document change
|
|
207
|
+
./.claude/skills/cfn-changelog-management/add-changelog-entry.sh \
|
|
208
|
+
--type "feature" \
|
|
209
|
+
--summary "JWT authentication middleware" \
|
|
210
|
+
--impact "Stateless auth reduces session storage by 80%" \
|
|
211
|
+
--files "src/middleware/auth.ts,src/types/jwt.ts"
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Loop 2 Validator (After Identifying Bug Fix)
|
|
215
|
+
```bash
|
|
216
|
+
# Validator reviews fix
|
|
217
|
+
./.claude/skills/cfn-changelog-management/add-changelog-entry.sh \
|
|
218
|
+
--type "bugfix" \
|
|
219
|
+
--summary "Prevent null pointer in Redis connection retry" \
|
|
220
|
+
--impact "Eliminates crashes during Redis unavailability" \
|
|
221
|
+
--issue "BUG-42" \
|
|
222
|
+
--files "src/redis/client.ts"
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Product Owner (After Architectural Decision)
|
|
226
|
+
```bash
|
|
227
|
+
# Product Owner approves design change
|
|
228
|
+
./.claude/skills/cfn-changelog-management/add-changelog-entry.sh \
|
|
229
|
+
--type "architecture" \
|
|
230
|
+
--summary "Split orchestrator into modular helper scripts" \
|
|
231
|
+
--impact "78% code reduction, improved testability" \
|
|
232
|
+
--files ".claude/skills/cfn-loop-orchestration/helpers/"
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## Versioning Strategy
|
|
236
|
+
|
|
237
|
+
### Auto-Increment (Default)
|
|
238
|
+
Script reads current version from `package.json`, increments patch:
|
|
239
|
+
- Current: `2.11.0` → Entry added to: `[Unreleased]`
|
|
240
|
+
- On release: Move `[Unreleased]` → `[2.11.1] - YYYY-MM-DD`
|
|
241
|
+
|
|
242
|
+
### Manual Version (Override)
|
|
243
|
+
```bash
|
|
244
|
+
--version "3.0.0" # Specify major/minor bump explicitly
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### Release Workflow
|
|
248
|
+
1. Agents add entries to `[Unreleased]` section
|
|
249
|
+
2. On release trigger (manual or automated):
|
|
250
|
+
- Rename `[Unreleased]` → `[X.Y.Z] - DATE`
|
|
251
|
+
- Create new empty `[Unreleased]` section
|
|
252
|
+
- Update `package.json` version
|
|
253
|
+
|
|
254
|
+
## Query Interface
|
|
255
|
+
|
|
256
|
+
**Filter by type:**
|
|
257
|
+
```bash
|
|
258
|
+
sed -n '/### Features/,/### Bug Fixes/p' readme/CHANGELOG.md
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
**Recent entries (last 10):**
|
|
262
|
+
```bash
|
|
263
|
+
grep -A 2 "^- " readme/CHANGELOG.md | head -30
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
**Search by keyword:**
|
|
267
|
+
```bash
|
|
268
|
+
grep -i "redis" readme/CHANGELOG.md
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
**Entries for specific version:**
|
|
272
|
+
```bash
|
|
273
|
+
sed -n '/## \[2.11.0\]/,/## \[2.10.0\]/p' readme/CHANGELOG.md
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
## Best Practices
|
|
277
|
+
|
|
278
|
+
1. **Immediate logging**: Add entry immediately after completing work, not batched
|
|
279
|
+
2. **User perspective**: Describe impact from user/agent consumer viewpoint
|
|
280
|
+
3. **File references**: Include key files for context (not exhaustive list)
|
|
281
|
+
4. **Link issues**: Reference bug numbers or GitHub issues when applicable
|
|
282
|
+
5. **Migration notes**: Always include for breaking changes
|
|
283
|
+
|
|
284
|
+
## Anti-Patterns
|
|
285
|
+
|
|
286
|
+
❌ **Verbose commit messages**: "This commit implements a new feature that..."
|
|
287
|
+
❌ **Generic summaries**: "Fixed bugs", "Updated code", "Improvements"
|
|
288
|
+
❌ **Missing impact**: "Added function X" (Why does it matter?)
|
|
289
|
+
❌ **Duplicate entries**: Check existing changelog before adding
|
|
290
|
+
❌ **Version conflicts**: Don't manually edit version, use --version flag
|
|
291
|
+
|
|
292
|
+
## Example Entry Lifecycle
|
|
293
|
+
|
|
294
|
+
**Step 1: Agent completes feature**
|
|
295
|
+
```bash
|
|
296
|
+
add-changelog-entry.sh \
|
|
297
|
+
--type "feature" \
|
|
298
|
+
--summary "Multi-pattern confidence parsing" \
|
|
299
|
+
--impact "100% extraction success, supports explicit/percentage/qualitative formats"
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
**Result in CHANGELOG.md:**
|
|
303
|
+
```markdown
|
|
304
|
+
## [Unreleased]
|
|
305
|
+
|
|
306
|
+
### Features
|
|
307
|
+
- Multi-pattern confidence parsing (2025-10-31)
|
|
308
|
+
- Impact: 100% extraction success, supports explicit/percentage/qualitative formats
|
|
309
|
+
- Files: `.claude/skills/cfn-agent-output-processing/parse-confidence.sh`
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
**Step 2: Release triggered**
|
|
313
|
+
```bash
|
|
314
|
+
# Manual or automated
|
|
315
|
+
npm version minor # 2.11.0 → 2.12.0
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
**Result:**
|
|
319
|
+
```markdown
|
|
320
|
+
## [2.12.0] - 2025-11-01
|
|
321
|
+
|
|
322
|
+
### Features
|
|
323
|
+
- Multi-pattern confidence parsing (2025-10-31)
|
|
324
|
+
- Impact: 100% extraction success, supports explicit/percentage/qualitative formats
|
|
325
|
+
- Files: `.claude/skills/cfn-agent-output-processing/parse-confidence.sh`
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
## [Unreleased]
|
|
330
|
+
|
|
331
|
+
### Features
|
|
332
|
+
|
|
333
|
+
### Bug Fixes
|
|
334
|
+
...
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
## Success Metrics
|
|
338
|
+
|
|
339
|
+
- **Entry quality**: ≥90% of entries include measurable impact
|
|
340
|
+
- **Sparse language**: Average summary length ≤60 characters
|
|
341
|
+
- **Timeliness**: ≥80% of entries added within same sprint as implementation
|
|
342
|
+
- **Coverage**: 100% of features/breaking changes documented
|
|
343
|
+
- **Queryability**: Users can find relevant changes in <30 seconds
|
|
344
|
+
|
|
345
|
+
## References
|
|
346
|
+
|
|
347
|
+
- **Sparse Language**: readme/CLAUDE.md - Documentation Guidelines
|
|
348
|
+
- **Backlog Management**: `.claude/skills/cfn-backlog-management/SKILL.md`
|
|
349
|
+
- **Versioning**: `package.json` - Single source of truth
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
# cfn-changelog-management/add-changelog-entry.sh
|
|
5
|
+
# Adds sparse, structured entries to readme/CHANGELOG.md
|
|
6
|
+
|
|
7
|
+
# Default values
|
|
8
|
+
TYPE=""
|
|
9
|
+
SUMMARY=""
|
|
10
|
+
IMPACT=""
|
|
11
|
+
VERSION=""
|
|
12
|
+
ISSUE=""
|
|
13
|
+
FILES=""
|
|
14
|
+
MIGRATION=""
|
|
15
|
+
|
|
16
|
+
# Parse arguments
|
|
17
|
+
while [[ $# -gt 0 ]]; do
|
|
18
|
+
case $1 in
|
|
19
|
+
--type)
|
|
20
|
+
TYPE="$2"
|
|
21
|
+
shift 2
|
|
22
|
+
;;
|
|
23
|
+
--summary)
|
|
24
|
+
SUMMARY="$2"
|
|
25
|
+
shift 2
|
|
26
|
+
;;
|
|
27
|
+
--impact)
|
|
28
|
+
IMPACT="$2"
|
|
29
|
+
shift 2
|
|
30
|
+
;;
|
|
31
|
+
--version)
|
|
32
|
+
VERSION="$2"
|
|
33
|
+
shift 2
|
|
34
|
+
;;
|
|
35
|
+
--issue)
|
|
36
|
+
ISSUE="$2"
|
|
37
|
+
shift 2
|
|
38
|
+
;;
|
|
39
|
+
--files)
|
|
40
|
+
FILES="$2"
|
|
41
|
+
shift 2
|
|
42
|
+
;;
|
|
43
|
+
--migration)
|
|
44
|
+
MIGRATION="$2"
|
|
45
|
+
shift 2
|
|
46
|
+
;;
|
|
47
|
+
*)
|
|
48
|
+
echo "Unknown argument: $1" >&2
|
|
49
|
+
exit 1
|
|
50
|
+
;;
|
|
51
|
+
esac
|
|
52
|
+
done
|
|
53
|
+
|
|
54
|
+
# Validation
|
|
55
|
+
if [[ -z "$TYPE" ]]; then
|
|
56
|
+
echo "Error: --type is required" >&2
|
|
57
|
+
echo "Valid types: feature, bugfix, breaking, dependency, architecture, performance, security" >&2
|
|
58
|
+
exit 1
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
if [[ -z "$SUMMARY" ]]; then
|
|
62
|
+
echo "Error: --summary is required" >&2
|
|
63
|
+
exit 1
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
if [[ -z "$IMPACT" ]]; then
|
|
67
|
+
echo "Error: --impact is required" >&2
|
|
68
|
+
exit 1
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
# Validate type
|
|
72
|
+
VALID_TYPES="feature|bugfix|breaking|dependency|architecture|performance|security"
|
|
73
|
+
if [[ ! "$TYPE" =~ ^($VALID_TYPES)$ ]]; then
|
|
74
|
+
echo "Error: --type must be one of: feature, bugfix, breaking, dependency, architecture, performance, security (got: $TYPE)" >&2
|
|
75
|
+
exit 1
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
# Validate summary length
|
|
79
|
+
SUMMARY_LENGTH=${#SUMMARY}
|
|
80
|
+
if (( SUMMARY_LENGTH < 10 )); then
|
|
81
|
+
echo "Error: --summary must be at least 10 characters (got $SUMMARY_LENGTH)" >&2
|
|
82
|
+
exit 1
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
if (( SUMMARY_LENGTH > 100 )); then
|
|
86
|
+
echo "Error: --summary must be at most 100 characters (got $SUMMARY_LENGTH)" >&2
|
|
87
|
+
exit 1
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
# Validate file limit
|
|
91
|
+
if [[ -n "$FILES" ]]; then
|
|
92
|
+
FILE_COUNT=$(echo "$FILES" | tr ',' '\n' | wc -l)
|
|
93
|
+
if (( FILE_COUNT > 5 )); then
|
|
94
|
+
echo "Error: --files can contain at most 5 files (got $FILE_COUNT)" >&2
|
|
95
|
+
exit 1
|
|
96
|
+
fi
|
|
97
|
+
fi
|
|
98
|
+
|
|
99
|
+
# Path to changelog
|
|
100
|
+
CHANGELOG_FILE="readme/CHANGELOG.md"
|
|
101
|
+
PROJECT_ROOT="/mnt/c/Users/masha/Documents/claude-flow-novice"
|
|
102
|
+
CHANGELOG_PATH="$PROJECT_ROOT/$CHANGELOG_FILE"
|
|
103
|
+
|
|
104
|
+
# Check if changelog exists
|
|
105
|
+
if [[ ! -f "$CHANGELOG_PATH" ]]; then
|
|
106
|
+
echo "Error: Changelog not found at $CHANGELOG_PATH" >&2
|
|
107
|
+
echo "Expected format: readme/CHANGELOG.md" >&2
|
|
108
|
+
exit 1
|
|
109
|
+
fi
|
|
110
|
+
|
|
111
|
+
# Map type to section header
|
|
112
|
+
case "$TYPE" in
|
|
113
|
+
feature)
|
|
114
|
+
SECTION="### Features"
|
|
115
|
+
;;
|
|
116
|
+
bugfix)
|
|
117
|
+
SECTION="### Bug Fixes"
|
|
118
|
+
;;
|
|
119
|
+
breaking)
|
|
120
|
+
SECTION="### Breaking Changes"
|
|
121
|
+
;;
|
|
122
|
+
dependency)
|
|
123
|
+
SECTION="### Dependencies"
|
|
124
|
+
;;
|
|
125
|
+
architecture)
|
|
126
|
+
SECTION="### Architecture"
|
|
127
|
+
;;
|
|
128
|
+
performance)
|
|
129
|
+
SECTION="### Performance"
|
|
130
|
+
;;
|
|
131
|
+
security)
|
|
132
|
+
SECTION="### Security"
|
|
133
|
+
;;
|
|
134
|
+
esac
|
|
135
|
+
|
|
136
|
+
# Current date
|
|
137
|
+
CURRENT_DATE=$(date +%Y-%m-%d)
|
|
138
|
+
|
|
139
|
+
# Build entry
|
|
140
|
+
ENTRY="- $SUMMARY ($CURRENT_DATE)"
|
|
141
|
+
ENTRY="$ENTRY\n - Impact: $IMPACT"
|
|
142
|
+
|
|
143
|
+
if [[ -n "$FILES" ]]; then
|
|
144
|
+
ENTRY="$ENTRY\n - Files: \`$FILES\`"
|
|
145
|
+
fi
|
|
146
|
+
|
|
147
|
+
if [[ -n "$ISSUE" ]]; then
|
|
148
|
+
ENTRY="$ENTRY\n - Issue: $ISSUE"
|
|
149
|
+
fi
|
|
150
|
+
|
|
151
|
+
if [[ -n "$MIGRATION" ]]; then
|
|
152
|
+
ENTRY="$ENTRY\n - Migration: $MIGRATION"
|
|
153
|
+
fi
|
|
154
|
+
|
|
155
|
+
# Find [Unreleased] section and appropriate subsection
|
|
156
|
+
# Insert entry after section header
|
|
157
|
+
|
|
158
|
+
# Check if [Unreleased] section exists
|
|
159
|
+
if ! grep -q "## \[Unreleased\]" "$CHANGELOG_PATH"; then
|
|
160
|
+
echo "Error: [Unreleased] section not found in changelog" >&2
|
|
161
|
+
echo "Expected format:" >&2
|
|
162
|
+
echo "## [Unreleased]" >&2
|
|
163
|
+
echo "" >&2
|
|
164
|
+
echo "### Features" >&2
|
|
165
|
+
exit 1
|
|
166
|
+
fi
|
|
167
|
+
|
|
168
|
+
# Check if section exists within [Unreleased]
|
|
169
|
+
if ! awk '/## \[Unreleased\]/,/^---$/ { if (/'"$SECTION"'/) found=1 } END { exit !found }' "$CHANGELOG_PATH"; then
|
|
170
|
+
echo "Error: $SECTION not found within [Unreleased] section" >&2
|
|
171
|
+
exit 1
|
|
172
|
+
fi
|
|
173
|
+
|
|
174
|
+
# Insert entry after section header (first blank line or entry)
|
|
175
|
+
awk -v section="$SECTION" -v entry="$ENTRY" '
|
|
176
|
+
# Track if we are in [Unreleased] section
|
|
177
|
+
/## \[Unreleased\]/ { in_unreleased=1 }
|
|
178
|
+
/^## \[/ && !/## \[Unreleased\]/ { in_unreleased=0 }
|
|
179
|
+
|
|
180
|
+
# When we find the target section within [Unreleased]
|
|
181
|
+
in_unreleased && $0 ~ section {
|
|
182
|
+
print
|
|
183
|
+
getline # Read next line
|
|
184
|
+
print # Print it (usually blank line)
|
|
185
|
+
print entry
|
|
186
|
+
next
|
|
187
|
+
}
|
|
188
|
+
{print}
|
|
189
|
+
' "$CHANGELOG_PATH" > "${CHANGELOG_PATH}.tmp"
|
|
190
|
+
|
|
191
|
+
mv "${CHANGELOG_PATH}.tmp" "$CHANGELOG_PATH"
|
|
192
|
+
|
|
193
|
+
echo "✅ Changelog entry added successfully"
|
|
194
|
+
echo " Type: $TYPE"
|
|
195
|
+
echo " Summary: $SUMMARY"
|
|
196
|
+
echo " Section: $SECTION"
|
|
197
|
+
echo " Location: $CHANGELOG_FILE"
|
|
198
|
+
|
|
199
|
+
# Output path for scripting
|
|
200
|
+
echo "$CHANGELOG_PATH"
|
|
@@ -1,118 +1,100 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import * as fs from "fs/promises";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import Ajv from "ajv";
|
|
4
|
+
import * as lodash from "lodash";
|
|
5
|
+
let ConfigManager = class ConfigManager {
|
|
6
|
+
static _instance = null;
|
|
7
|
+
configPath;
|
|
8
|
+
schemaPath;
|
|
9
|
+
ajv;
|
|
10
|
+
constructor(){
|
|
11
|
+
this.configPath = path.join(process.env.HOME || "", ".claude-flow-config.json");
|
|
12
|
+
this.schemaPath = path.join(__dirname, "../../.claude/skills/config-management/config.json");
|
|
13
|
+
this.ajv = new Ajv();
|
|
7
14
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
step(generator.next(value));
|
|
12
|
-
} catch (e) {
|
|
13
|
-
reject(e);
|
|
14
|
-
}
|
|
15
|
+
static getInstance() {
|
|
16
|
+
if (!ConfigManager._instance) {
|
|
17
|
+
ConfigManager._instance = new ConfigManager();
|
|
15
18
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
return ConfigManager._instance;
|
|
20
|
+
}
|
|
21
|
+
async readConfig() {
|
|
22
|
+
try {
|
|
23
|
+
const configContent = await fs.readFile(this.configPath, "utf-8");
|
|
24
|
+
return JSON.parse(configContent);
|
|
25
|
+
} catch (error) {
|
|
26
|
+
// If config doesn't exist, create from schema
|
|
27
|
+
return this.resetToDefaults();
|
|
22
28
|
}
|
|
23
|
-
|
|
24
|
-
|
|
29
|
+
}
|
|
30
|
+
async writeConfig(config) {
|
|
31
|
+
const schemaContent = await fs.readFile(this.schemaPath, "utf-8");
|
|
32
|
+
const schema = JSON.parse(schemaContent);
|
|
33
|
+
const validate = this.ajv.compile(schema);
|
|
34
|
+
if (!validate(config)) {
|
|
35
|
+
throw new Error("Invalid configuration: " + this.ajv.errorsText(validate.errors));
|
|
25
36
|
}
|
|
26
|
-
|
|
27
|
-
});
|
|
28
|
-
};
|
|
29
|
-
var __generator = this && this.__generator || function(thisArg, body) {
|
|
30
|
-
var _ = {
|
|
31
|
-
label: 0,
|
|
32
|
-
sent: function() {
|
|
33
|
-
if (t[0] & 1) throw t[1];
|
|
34
|
-
return t[1];
|
|
35
|
-
},
|
|
36
|
-
trys: [],
|
|
37
|
-
ops: []
|
|
38
|
-
}, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
39
|
-
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
|
|
40
|
-
return this;
|
|
41
|
-
}), g;
|
|
42
|
-
function verb(n) {
|
|
43
|
-
return function(v) {
|
|
44
|
-
return step([
|
|
45
|
-
n,
|
|
46
|
-
v
|
|
47
|
-
]);
|
|
48
|
-
};
|
|
37
|
+
await fs.writeFile(this.configPath, JSON.stringify(config, null, 2), "utf-8");
|
|
49
38
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
if
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
];
|
|
58
|
-
switch(op[0]){
|
|
59
|
-
case 0:
|
|
60
|
-
case 1:
|
|
61
|
-
t = op;
|
|
62
|
-
break;
|
|
63
|
-
case 4:
|
|
64
|
-
_.label++;
|
|
65
|
-
return {
|
|
66
|
-
value: op[1],
|
|
67
|
-
done: false
|
|
68
|
-
};
|
|
69
|
-
case 5:
|
|
70
|
-
_.label++;
|
|
71
|
-
y = op[1];
|
|
72
|
-
op = [
|
|
73
|
-
0
|
|
74
|
-
];
|
|
75
|
-
continue;
|
|
76
|
-
case 7:
|
|
77
|
-
op = _.ops.pop();
|
|
78
|
-
_.trys.pop();
|
|
79
|
-
continue;
|
|
80
|
-
default:
|
|
81
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
82
|
-
_ = 0;
|
|
83
|
-
continue;
|
|
84
|
-
}
|
|
85
|
-
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
86
|
-
_.label = op[1];
|
|
87
|
-
break;
|
|
88
|
-
}
|
|
89
|
-
if (op[0] === 6 && _.label < t[1]) {
|
|
90
|
-
_.label = t[1];
|
|
91
|
-
t = op;
|
|
92
|
-
break;
|
|
93
|
-
}
|
|
94
|
-
if (t && _.label < t[2]) {
|
|
95
|
-
_.label = t[2];
|
|
96
|
-
_.ops.push(op);
|
|
97
|
-
break;
|
|
98
|
-
}
|
|
99
|
-
if (t[2]) _.ops.pop();
|
|
100
|
-
_.trys.pop();
|
|
101
|
-
continue;
|
|
102
|
-
}
|
|
103
|
-
op = body.call(thisArg, _);
|
|
104
|
-
} catch (e) {
|
|
105
|
-
op = [
|
|
106
|
-
6,
|
|
107
|
-
e
|
|
108
|
-
];
|
|
109
|
-
y = 0;
|
|
110
|
-
} finally{
|
|
111
|
-
f = t = 0;
|
|
39
|
+
async getValue(keyPath) {
|
|
40
|
+
const config = await this.readConfig();
|
|
41
|
+
const value = lodash.get(config, keyPath);
|
|
42
|
+
if (value === undefined) {
|
|
43
|
+
// Check if it's a custom key path not in the schema
|
|
44
|
+
const customConfig = await this.readCustomConfig();
|
|
45
|
+
return lodash.get(customConfig, keyPath);
|
|
112
46
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
async readCustomConfig() {
|
|
50
|
+
try {
|
|
51
|
+
const customConfigPath = path.join(process.env.HOME || "", ".claude-flow-custom-config.json");
|
|
52
|
+
const customConfigContent = await fs.readFile(customConfigPath, "utf-8");
|
|
53
|
+
return JSON.parse(customConfigContent);
|
|
54
|
+
} catch (error) {
|
|
55
|
+
// If custom config doesn't exist or can't be read, return empty object
|
|
56
|
+
return {};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async set(key, value) {
|
|
60
|
+
const config = await this.readConfig();
|
|
61
|
+
// Type assertion to handle full object
|
|
62
|
+
if (typeof value === "object" && value !== null) {
|
|
63
|
+
config[key] = value;
|
|
64
|
+
} else {
|
|
65
|
+
throw new Error("Invalid configuration value");
|
|
66
|
+
}
|
|
67
|
+
await this.writeConfig(config);
|
|
68
|
+
}
|
|
69
|
+
async getAll() {
|
|
70
|
+
return this.readConfig();
|
|
71
|
+
}
|
|
72
|
+
async resetToDefaults() {
|
|
73
|
+
const schemaContent = await fs.readFile(this.schemaPath, "utf-8");
|
|
74
|
+
const schema = JSON.parse(schemaContent);
|
|
75
|
+
// Extract default values from the schema
|
|
76
|
+
const defaultConfig = {
|
|
77
|
+
redis: {
|
|
78
|
+
host: schema.properties.redis.properties.host.default,
|
|
79
|
+
port: schema.properties.redis.properties.port.default
|
|
80
|
+
},
|
|
81
|
+
agent: {
|
|
82
|
+
default_strategy: schema.properties.agent.properties.default_strategy.default,
|
|
83
|
+
max_concurrent_agents: schema.properties.agent.properties.max_concurrent_agents.default,
|
|
84
|
+
log_level: schema.properties.agent.properties.log_level.default
|
|
85
|
+
},
|
|
86
|
+
security: {
|
|
87
|
+
enabled: schema.properties.security.properties.enabled.default,
|
|
88
|
+
max_retry_attempts: schema.properties.security.properties.max_retry_attempts.default
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
await this.writeConfig(defaultConfig);
|
|
92
|
+
return defaultConfig;
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
export default ConfigManager;
|
|
96
|
+
|
|
97
|
+
//# sourceMappingURL=config-manager.js.mapop[1] : void 0,
|
|
116
98
|
done: true
|
|
117
99
|
};
|
|
118
100
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-flow-novice",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.12.0",
|
|
4
4
|
"description": "AI agent orchestration framework with namespace-isolated skills, agents, and CFN Loop validation. Safe installation with ~0.01% collision risk.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
".claude/skills/cfn-agent-spawning/",
|
|
27
27
|
".claude/skills/cfn-analytics/",
|
|
28
28
|
".claude/skills/cfn-backlog-management/",
|
|
29
|
+
".claude/skills/cfn-changelog-management/",
|
|
29
30
|
".claude/skills/cfn-checkpoint-state/",
|
|
30
31
|
".claude/skills/cfn-config-management/",
|
|
31
32
|
".claude/skills/cfn-event-bus/",
|