aiwg 2026.2.9 → 2026.2.11

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.md CHANGED
@@ -450,9 +450,9 @@ Before pushing a version tag:
450
450
  - Migration notes (if applicable)
451
451
  - Links to relevant documentation
452
452
  4. **Commit and tag** - `git tag -m "vX.X.X" vX.X.X`
453
- 5. **Push to both remotes** - `git push origin main --tags && git push github main --tags`
454
- 6. **Update GitHub Release** - Add proper release notes via `gh release edit`
455
- 7. **Create Gitea Release** - Via MCP tool or web UI
453
+ 5. **Push tag to Gitea** - `git push origin main --tags` (automatically creates Gitea Release)
454
+ 6. **Optionally mirror to GitHub** - `git push github main --tags`
455
+ 7. **Update/Create GitHub Release manually** - via `gh release create|edit`
456
456
 
457
457
  ### Version Format
458
458
 
@@ -1,3 +1,8 @@
1
+ ---
2
+ name: issue-driven-ralph
3
+ description: Orchestrates issue-driven Ralph loops that post cycle status to issue threads and incorporate human feedback in each cycle.
4
+ ---
5
+
1
6
  # Issue-Driven Ralph Loop Skill
2
7
 
3
8
  ## Triggers
@@ -85,14 +85,24 @@ grep '"version"' package.json | grep -E '\.[0-9]{2}\.' && echo "ERROR: Leading z
85
85
  ### 3. Create and Push Tag
86
86
 
87
87
  ```bash
88
+ # Create signed release commit (if not already committed)
89
+ git commit -S -m "release: v2026.1.5 \"Release Name\""
90
+
88
91
  # Create annotated tag
89
- git tag -a v2026.1.5 -m "v2026.1.5 - Release Name"
92
+ git tag -s v2026.1.5 -m "v2026.1.5 - Release Name"
90
93
 
91
- # Push to both remotes
94
+ # Push to Gitea (triggers automatic Gitea release + publish workflows)
92
95
  git push origin main --tags
96
+
97
+ # Optional: mirror tag/commit to GitHub
93
98
  git push github main --tags
99
+
100
+ # GitHub release remains manual
101
+ gh release create v2026.1.5 --repo jmagly/aiwg --title "v2026.1.5 - Release Name" --generate-notes
94
102
  ```
95
103
 
104
+ **Sandboxed agent note**: If release operations run inside a filesystem/network sandbox, request **escalated execution** for signed `git commit`/`git tag` commands so GPG can access `~/.gnupg` and the local gpg-agent socket.
105
+
96
106
  ### 4. Verify Published Version
97
107
 
98
108
  After CI/CD completes:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aiwg",
3
- "version": "2026.2.9",
3
+ "version": "2026.2.11",
4
4
  "description": "Cognitive architecture for AI-augmented software development with structured memory, ensemble validation, and closed-loop correction. FAIR-aligned artifacts, 84% cost reduction via human-in-the-loop, standards adopted by 100+ organizations.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -56,6 +56,25 @@ function ensureDir(d) {
56
56
  if (!fs.existsSync(d)) fs.mkdirSync(d, { recursive: true });
57
57
  }
58
58
 
59
+ function stripWrappingQuotes(value) {
60
+ const trimmed = String(value ?? '').trim();
61
+ if (
62
+ (trimmed.startsWith('"') && trimmed.endsWith('"')) ||
63
+ (trimmed.startsWith("'") && trimmed.endsWith("'"))
64
+ ) {
65
+ return trimmed.slice(1, -1);
66
+ }
67
+ return trimmed;
68
+ }
69
+
70
+ function yamlDoubleQuoted(value) {
71
+ return String(value ?? '')
72
+ .replace(/\\/g, '\\\\')
73
+ .replace(/"/g, '\\"')
74
+ .replace(/\r?\n/g, ' ')
75
+ .trim();
76
+ }
77
+
59
78
  /**
60
79
  * Find skill directories containing SKILL.md
61
80
  */
@@ -93,7 +112,7 @@ function parseSkillContent(content, skillName) {
93
112
  if (colonIdx > 0) {
94
113
  const key = line.slice(0, colonIdx).trim();
95
114
  const value = line.slice(colonIdx + 1).trim();
96
- metadata[key] = value;
115
+ metadata[key] = stripWrappingQuotes(value);
97
116
  }
98
117
  }
99
118
 
@@ -119,7 +138,13 @@ function parseSkillContent(content, skillName) {
119
138
  // Look for first paragraph as description (skip empty lines)
120
139
  for (let i = bodyStartIdx; i < lines.length; i++) {
121
140
  const line = lines[i].trim();
122
- if (line && !line.startsWith('#') && !line.startsWith('-') && !line.startsWith('|')) {
141
+ if (
142
+ line &&
143
+ !line.endsWith(':') &&
144
+ !line.startsWith('#') &&
145
+ !line.startsWith('-') &&
146
+ !line.startsWith('|')
147
+ ) {
123
148
  description = line;
124
149
  break;
125
150
  }
@@ -181,8 +206,8 @@ function transformToCodexSkill(skillDir) {
181
206
 
182
207
  // Build Codex skill format
183
208
  const codexContent = `---
184
- name: ${name}
185
- description: ${description}
209
+ name: "${yamlDoubleQuoted(name)}"
210
+ description: "${yamlDoubleQuoted(description)}"
186
211
  ---
187
212
 
188
213
  ${body.trim()}