openclacky 1.0.5 → 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.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.clacky/skills/gem-release/SKILL.md +99 -356
  3. data/.clacky/skills/gem-release/scripts/release.sh +304 -0
  4. data/CHANGELOG.md +25 -0
  5. data/docs/system-skill-authoring-guide.md +1 -1
  6. data/lib/clacky/agent/tool_executor.rb +3 -1
  7. data/lib/clacky/agent.rb +12 -7
  8. data/lib/clacky/agent_config.rb +9 -3
  9. data/lib/clacky/brand_config.rb +19 -4
  10. data/lib/clacky/cli.rb +1 -1
  11. data/lib/clacky/default_skills/{channel-setup → channel-manager}/SKILL.md +56 -16
  12. data/lib/clacky/default_skills/channel-manager/dingtalk_setup.rb +191 -0
  13. data/lib/clacky/default_skills/channel-manager/install_feishu_skills.rb +105 -0
  14. data/lib/clacky/default_skills/onboard/SKILL.md +2 -2
  15. data/lib/clacky/default_skills/onboard/scripts/import_external_skills.rb +2 -4
  16. data/lib/clacky/default_skills/onboard/scripts/install_builtin_skills.rb +18 -96
  17. data/lib/clacky/default_skills/product-help/SKILL.md +10 -2
  18. data/lib/clacky/message_history.rb +26 -1
  19. data/lib/clacky/server/channel/adapters/dingtalk/adapter.rb +177 -0
  20. data/lib/clacky/server/channel/adapters/dingtalk/api_client.rb +82 -0
  21. data/lib/clacky/server/channel/adapters/dingtalk/stream_client.rb +205 -0
  22. data/lib/clacky/server/channel/adapters/discord/api_client.rb +1 -0
  23. data/lib/clacky/server/channel/channel_config.rb +15 -0
  24. data/lib/clacky/server/channel.rb +1 -0
  25. data/lib/clacky/server/http_server.rb +47 -2
  26. data/lib/clacky/server/server_master.rb +35 -13
  27. data/lib/clacky/server/session_registry.rb +54 -3
  28. data/lib/clacky/server/web_ui_controller.rb +7 -1
  29. data/lib/clacky/telemetry.rb +1 -16
  30. data/lib/clacky/tools/browser.rb +8 -5
  31. data/lib/clacky/tools/glob.rb +11 -38
  32. data/lib/clacky/tools/grep.rb +7 -16
  33. data/lib/clacky/ui2/markdown_renderer.rb +1 -1
  34. data/lib/clacky/utils/file_ignore_helper.rb +49 -0
  35. data/lib/clacky/utils/gitignore_parser.rb +27 -0
  36. data/lib/clacky/version.rb +1 -1
  37. data/lib/clacky/web/app.css +204 -31
  38. data/lib/clacky/web/app.js +51 -1
  39. data/lib/clacky/web/channels.js +88 -34
  40. data/lib/clacky/web/datepicker.js +205 -0
  41. data/lib/clacky/web/i18n.js +26 -9
  42. data/lib/clacky/web/index.html +27 -5
  43. data/lib/clacky/web/onboard.js +46 -4
  44. data/lib/clacky/web/sessions.js +33 -72
  45. data/lib/clacky/web/settings.js +38 -4
  46. metadata +16 -11
  47. data/docs/proposals/2026-05-11-system-prompt-alignment.md +0 -325
  48. data/docs/proposals/2026-05-12-memory-mechanism-optimization.md +0 -89
  49. /data/lib/clacky/default_skills/{channel-setup → channel-manager}/discord_setup.rb +0 -0
  50. /data/lib/clacky/default_skills/{channel-setup → channel-manager}/feishu_setup.rb +0 -0
  51. /data/lib/clacky/default_skills/{channel-setup → channel-manager}/import_lark_skills.rb +0 -0
  52. /data/lib/clacky/default_skills/{channel-setup → channel-manager}/weixin_setup.rb +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 597ea8fc84ca69641339dbacf724e114d4fc7c5c43bcafb81767bcb83da89edd
4
- data.tar.gz: 23f576f36023978f37dfe68e12ec942e3cedd591bec1cd098a5829a8d9057a24
3
+ metadata.gz: e897a7568d8b457d317c56ff402a76c1907b4a158e0e7382586e2b66115ee0f7
4
+ data.tar.gz: 5fbeb452695441035d7f7d4f7ba1f0ef63dbb198daebb17600eb6e9f9fb72c46
5
5
  SHA512:
6
- metadata.gz: 0fed807f559eee7d3df5508bbef61d45f75a0943c5d76ac17cbf9a334bfc75be729ad6ab03485211c532de186b1f41aa27c54267f2e36efa7c191699e3fcca2e
7
- data.tar.gz: c8943553c4cd0f721515e0ffad5aa554dcdffc0305aca6d7ac403a02762b59db63273415d452965767b0bd2157ab835c946b081e99b0ce5a8574a3bf622e6aa1
6
+ metadata.gz: 64d4764470f2f8bac52e7e8233afbf441336c8a81238def9800cf6735a90798435cc8d43e9056aa4c6e53f51760067e57b5b2670263339590b7f9fd744cc6920
7
+ data.tar.gz: c27a2313d3595adcb48a66e396c9eec8947550132a74bb5b8535b11d93e639b240bc1dafeab0a7bf9b4af665c2fa6a22630f8b23ab0061b2de4ebbfcae1f3299
@@ -1,5 +1,4 @@
1
1
  ---
2
- ---
3
2
  name: gem-release
4
3
  description: >-
5
4
  Automates the complete process of releasing a new version of the openclacky Ruby
@@ -12,237 +11,66 @@ user-invocable: true
12
11
 
13
12
  # Gem Release Skill
14
13
 
15
- This skill automates the complete process of releasing a new version of the openclacky Ruby gem.
16
-
17
- ## Overview
18
-
19
- This skill handles the entire gem release workflow from version bumping to publishing on RubyGems and creating GitHub releases.
14
+ Automates the complete openclacky gem release workflow via `SKILL_DIR/scripts/release.sh`.
20
15
 
21
16
  ## Usage
22
17
 
23
- To use this skill, simply say:
24
18
  - "Release a new version"
25
19
  - "Publish a new gem version"
26
20
  - "Release version 1.0.0.beta.1" (pre-release with explicit version)
27
- - Use the command: `/gem-release`
28
-
29
- ## Process Steps
30
-
31
- ### 1. Pre-Release Checks
32
- - Check for uncommitted changes in the working directory
33
- - Verify all tests pass before proceeding
34
- - Ensure the repository is in a clean state
35
-
36
- ### 2. Version Management
37
-
38
- **Stable releases (default):**
39
- - Read current version from `lib/clacky/version.rb`
40
- - Increment version number (typically patch version: x.y.z → x.y.z+1)
41
- - Update the VERSION constant in the version file
42
-
43
- **Pre-release versions (when user specifies a version like `1.0.0.beta.1`):**
44
- - Accept the user-provided version string directly — do NOT auto-increment
45
- - The version must follow semver pre-release format: `X.Y.Z-<identifier>` or `X.Y.Z.<identifier>` (e.g., `1.0.0.beta.1`, `2.0.0-alpha`, `1.5.0-rc1`)
46
- - Before proceeding, warn the user about pre-release caveats (see Pre-Release Caveats below)
47
-
48
- ### 2a. Pre-Release Caveats
49
-
50
- When releasing a pre-release version, inform the user of these known behaviors in the Clacky ecosystem:
51
-
52
- | Concern | Behavior | Impact |
53
- |---------|----------|--------|
54
- | **Version check notification** | RubyGems API returns the highest version number, including prereleases. `Gem::Version("0.9.38") < Gem::Version("1.0.0.beta.1")` → `true`. | ✅ The upgrade dot WILL appear in the Web UI for most users. |
55
- | **`gem update` (official source)** | `gem update openclacky --no-document` does NOT install prereleases without `--pre`. | ❌ Users on official RubyGems source who click "Upgrade" will see the notification but the upgrade will silently do nothing. |
56
- | **OSS CDN upgrade (mirror users)** | `upgrade_via_oss_cdn` downloads the exact `.gem` from `latest.txt` on OSS. | ⚠️ If you update `latest.txt` to point to the prerelease, mirror users WILL get the beta. |
57
- | **OSS `latest.txt`** | Stable users fetching `latest.txt` for fresh installs would get the beta. | ⚠️ By default, do NOT update `latest.txt` for pre-releases. Only update if this is intentional (e.g., a release candidate for broad testing). |
58
-
59
- **Action**: Ask the user whether to update `latest.txt` on OSS before proceeding. For internal testing, the answer is usually "no".
60
-
61
- ### 3. Quality Assurance
62
- - Run the full test suite with `bundle exec rspec`
63
- - Ensure all 167+ tests pass
64
- - Verify no regressions introduced
65
-
66
- ### 4. Build Process
67
- - Build the gem using `gem build openclacky.gemspec`
68
- - Generate the `.gem` file for distribution
69
- - Handle any build warnings appropriately
70
-
71
- ### 5. Update Gemfile.lock and Verify CI
72
-
73
- 1. **Update Gemfile.lock**
74
- ```bash
75
- bundle install
76
- ```
77
- This ensures Gemfile.lock reflects the new version.
78
-
79
- 2. **Commit Gemfile.lock Changes**
80
- ```bash
81
- git add Gemfile.lock
82
- git commit -m "chore: update Gemfile.lock to v{version}"
83
- ```
84
-
85
- 3. **Push and Verify CI**
86
- ```bash
87
- git push origin main
88
- ```
89
- - Wait for CI pipeline to complete successfully
90
- - Verify all tests pass
91
- - If CI fails, fix issues before proceeding
92
-
93
- 4. **Proceed Only After CI Success**
94
- - If CI fails: stop, fix issues, and restart the release process
95
- - If CI passes: continue to build and publish
21
+ - `/gem-release`
96
22
 
97
- ### 6. Build and Publish Gem
23
+ ## Workflow
98
24
 
99
- 1. **Build the Gem**
100
- ```bash
101
- gem build openclacky.gemspec
102
- ```
103
- Generates `openclacky-{version}.gem` file.
104
-
105
- 2. **Publish to RubyGems.org**
106
- ```bash
107
- gem push openclacky-{version}.gem
108
- ```
109
- Verify successful publication.
110
-
111
- 3. **Create Git Tag and Push**
112
- ```bash
113
- git tag v{version}
114
- git push origin main --tags
115
- ```
25
+ The release script (`SKILL_DIR/scripts/release.sh`) handles everything end-to-end:
116
26
 
117
- 4. **Create GitHub Release and Upload gem**
27
+ 1. Pre-release checks (clean working directory, required tools)
28
+ 2. Run test suite (`bundle exec rspec`)
29
+ 3. Bump version in `lib/clacky/version.rb`
30
+ 4. Update `Gemfile.lock` via `bundle install`
31
+ 5. Commit and push to origin, wait for CI
32
+ 6. Build gem (`gem build openclacky.gemspec`)
33
+ 7. Publish to RubyGems (`gem push`)
34
+ 8. Create git tag and push
35
+ 9. Create GitHub Release with .gem asset (uses CHANGELOG.md for notes)
36
+ 10. Upload .gem to Tencent Cloud OSS CDN
37
+ 11. Update `latest.txt` on OSS (stable only, unless `--update-latest`)
38
+ 12. Rebuild and sync `scripts/` to OSS
39
+ 13. Cleanup build artifacts
118
40
 
119
- Extract the release notes for this version from CHANGELOG.md, then create a GitHub Release with the .gem file attached.
41
+ ## Agent Instructions
120
42
 
121
- **For stable releases:**
122
- ```bash
123
- gh release create v{version} \
124
- --title "v{version}" \
125
- --notes-file /tmp/release_notes_{version}.md \
126
- --latest \
127
- openclacky-{version}.gem
128
- ```
43
+ ### 1. Determine version and release type
129
44
 
130
- **For pre-release versions (e.g., `1.0.0.beta.1`):** use `--prerelease` instead of `--latest`:
131
- ```bash
132
- gh release create v{version} \
133
- --title "v{version}" \
134
- --notes-file /tmp/release_notes_{version}.md \
135
- --prerelease \
136
- openclacky-{version}.gem
137
- ```
138
-
139
- Steps:
140
- - Parse the CHANGELOG.md section for `[{version}]`
141
- - Write it to a temp file (e.g., `/tmp/release_notes_{version}.md`) to avoid shell escaping issues
142
- - Run `gh release create` with `--notes-file` **and the .gem file as an asset**
143
- - Verify the release appears at: `https://github.com/clacky-ai/openclacky/releases`
45
+ Read current version:
46
+ ```bash
47
+ grep 'VERSION =' lib/clacky/version.rb
48
+ ```
144
49
 
145
- > **Prerequisite**: `gh` CLI must be installed (`brew install gh`) and authenticated (`gh auth login`)
50
+ **Stable release (default):** Increment patch version (e.g., `1.0.5` `1.0.6`). Confirm with user if unsure which part to bump (major/minor/patch).
146
51
 
147
- 5. **Sync to Tencent Cloud OSS (CN mirror)**
52
+ **Pre-release:** Use the exact version the user specified (e.g., `2.0.0.beta.1`). Before proceeding, warn about pre-release caveats (see section below).
148
53
 
149
- After GitHub Release is created, upload the .gem file to OSS so Chinese users can install without hitting GitHub directly.
54
+ ### 2. Write CHANGELOG
150
55
 
151
- ```bash
152
- # Upload .gem file (always do this for any release)
153
- coscli cp openclacky-{version}.gem cos://clackyai-1258723534/openclacky/openclacky-{version}.gem
154
- ```
56
+ This is the one step the agent handles manually — the script does not write changelog entries because it requires reviewing git history and exercising judgment.
155
57
 
156
- **For stable releases only** — update `latest.txt` so fresh installs and mirror users pick up the new version:
58
+ 1. Find the previous version tag:
157
59
  ```bash
158
- echo "{version}" > /tmp/latest.txt
159
- coscli cp /tmp/latest.txt cos://clackyai-1258723534/openclacky/latest.txt
160
-
161
- # Verify
162
- curl -fsSL https://oss.1024code.com/openclacky/latest.txt
60
+ git describe --tags --abbrev=0
163
61
  ```
164
- Expected output of verify: `{version}`
165
-
166
- **For pre-release versions** — do NOT update `latest.txt` unless the user explicitly requested it. Updating `latest.txt` to a prerelease would cause:
167
- - Mirror users clicking "Upgrade" to get the beta via `upgrade_via_oss_cdn`
168
- - Fresh installs via the install script to get the beta
169
- - Only skip this if the user explicitly wants broad beta distribution
170
-
171
- > **Prerequisite**: `coscli` installed at `/usr/local/bin/coscli` and configured at `~/.cos.yaml`
172
-
173
- 6. **Sync scripts/ to OSS**
174
-
175
- After updating latest.txt, first rebuild all shell scripts from templates, then sync to OSS:
176
62
 
63
+ 2. Gather commits since last release:
177
64
  ```bash
178
- # Step 1: Rebuild .sh files from .sh.cc templates
179
- bash scripts/build/build.sh
180
-
181
- # Step 2: Upload each script file to OSS
182
- for script in scripts/*; do
183
- coscli cp "$script" cos://clackyai-1258723534/clacky-ai/openclacky/main/scripts/$(basename "$script")
184
- done
185
-
186
- # Verify one of the key scripts
187
- curl -fsSL https://oss.1024code.com/clacky-ai/openclacky/main/scripts/install.sh | head -5
65
+ git log <previous_tag>..HEAD --oneline
188
66
  ```
189
67
 
190
- This ensures `scripts/install.sh`, `scripts/install_simple.sh`, `scripts/install.ps1`, `scripts/uninstall.sh` and any future scripts are compiled from latest templates and mirrored on OSS.
191
-
192
- > **Prerequisite**: Same `coscli` setup as above
193
-
194
- 5. **Verify Publication**
195
- - Check gem appears on RubyGems.org
196
- - Verify version information is correct
197
- - Confirm GitHub Release is visible at the releases page
198
-
199
- ### 6. Documentation - CHANGELOG Writing Process
200
-
201
- **Critical Step: Review Commits Before Writing CHANGELOG**
202
-
203
- 1. **Find Previous Version Tag**
204
- - Get the latest version tag (e.g., v0.6.3)
205
- - Use `git describe --tags --abbrev=0` or manually identify
206
-
207
- 2. **Gather All Commits Since Last Release**
208
- ```bash
209
- git log {previous_tag}..HEAD --oneline
210
- git diff {previous_tag}..HEAD --stat
211
- ```
212
-
213
- 3. **Analyze and Categorize Commits**
214
- - Review each commit message AND its diff (`git show <hash> --stat`) to understand the actual change
215
- - Categorize into:
216
- - **Major Features**: User-visible functionality additions
217
- - **Improvements**: Performance, UX, architecture enhancements
218
- - **Bug Fixes**: Error corrections and issue resolutions
219
- - **Changes**: Breaking changes or significant refactoring
220
- - **Minor Details**: Small fixes, style changes, trivial updates
221
-
222
- **⚠️ Critical: Do NOT over-merge commits on the same topic**
223
-
224
- It is tempting to group multiple commits under one bullet because they share a theme (e.g., "all about memory"). Resist this — each commit with **independent user-facing value** deserves its own bullet.
225
-
226
- Ask for every commit: *"Does this enable something the user couldn't do before, separate from other commits on this topic?"*
227
- - YES → write a separate CHANGELOG bullet
228
- - NO (pure refactor, stability fix, threshold tweak) → merge into a related bullet or put in "More"
229
-
230
- **Example of the mistake to avoid:**
231
- - `feat: add long-term memory update system` and `feat: skill template context and recall-memory meta injection` are both "about memory", but they describe distinct capabilities:
232
- - First: agent writes memories after sessions
233
- - Second: skills receive a pre-built index so agent can selectively load only relevant memories
234
- - These must be two separate bullets, not one.
235
-
236
- **Sanity check after writing:** Count your `### Added` bullets vs the number of `feat:` commits. If `feat` commits > bullets, you likely merged too aggressively — revisit.
237
-
238
- 4. **Write CHANGELOG Entries**
239
-
240
- **Format for Significant Items:**
241
- ```
242
- ## [Version] - Date
68
+ 3. Write a new section in `CHANGELOG.md` following this format:
69
+ ```markdown
70
+ ## [X.Y.Z] - YYYY-MM-DD
243
71
 
244
72
  ### Added
245
- - Feature description (link to related commits)
73
+ - Feature description
246
74
 
247
75
  ### Improved
248
76
  - Enhancement description
@@ -250,56 +78,55 @@ When releasing a pre-release version, inform the user of these known behaviors i
250
78
  ### Fixed
251
79
  - Bug fix description
252
80
 
253
- ### Changed
254
- - Breaking change description
255
- ```
256
-
257
- **Format for Minor Items (group under "More"):**
258
- ```
259
81
  ### More
260
- - Minor fix 1
261
- - Minor fix 2
82
+ - Minor items
262
83
  ```
263
84
 
264
- 5. **Prioritization Rules**:
265
- - Place user-facing value at the top
266
- - Group related commits together
267
- - Skip very trivial commits (typos, minor formatting)
85
+ 4. Categorization rules:
86
+ - Each commit with **independent user-facing value** gets its own bullet — don't over-merge commits sharing a theme
268
87
  - Use imperative mood ("Add" not "Added")
88
+ - Place user-facing value at the top
89
+ - Skip trivial commits (typos, minor formatting)
90
+ - Sanity check: count `### Added` bullets vs `feat:` commits — if commits > bullets, you likely merged too aggressively
269
91
 
270
- 6. **Example CHANGELOG Section**:
271
- ```markdown
272
- ## [0.6.4] - 2026-02-03
92
+ 5. Commit the changelog:
93
+ ```bash
94
+ git add CHANGELOG.md
95
+ git commit -m "docs: update CHANGELOG for v<version>"
96
+ ```
273
97
 
274
- ### Added
275
- - Anthropic API support with full Claude model integration
276
- - ClaudeCode environment compatibility (ANTHROPIC_API_KEY support)
98
+ ### 3. Run the release script
277
99
 
278
- ### Improved
279
- - API client architecture for multi-provider support
280
- - Config loading with source tracking
100
+ **Stable release:**
101
+ ```bash
102
+ bash "SKILL_DIR/scripts/release.sh" <version>
103
+ ```
281
104
 
282
- ### Fixed
283
- - Handle absolute paths correctly in glob tool
105
+ **Pre-release (skip latest.txt):**
106
+ ```bash
107
+ bash "SKILL_DIR/scripts/release.sh" <version> --prerelease
108
+ ```
284
109
 
285
- ### More
286
- - Update dependencies
287
- - Minor style adjustments
288
- ```
110
+ **Pre-release (update latest.txt — only if user explicitly requested):**
111
+ ```bash
112
+ bash "SKILL_DIR/scripts/release.sh" <version> --prerelease --update-latest
113
+ ```
289
114
 
290
- 7. **Commit and Push Documentation Updates**
291
- - Commit CHANGELOG.md changes
292
- - Push to remote repository
115
+ **Dry run (preview only):**
116
+ ```bash
117
+ bash "SKILL_DIR/scripts/release.sh" <version> --dry-run
118
+ ```
119
+
120
+ The script runs all steps sequentially and stops on any failure. Monitor the output — if a step fails, diagnose and fix before retrying.
293
121
 
294
- ### 7. Final Summary
122
+ ### 4. Present release summary
295
123
 
296
- Present a clear, user-facing release summary after all steps complete:
124
+ After the script completes successfully, present this summary:
297
125
 
298
- **Format:**
299
126
  ```
300
127
  🎉 v{version} released successfully!
301
128
 
302
- ✨ Highlight: [One sentence summarizing the biggest user-visible change in this release — use "verb + value" phrasing]
129
+ ✨ Highlight: [One sentence the biggest user-visible change, verb + value phrasing]
303
130
 
304
131
  📦 What's new for users:
305
132
 
@@ -316,7 +143,6 @@ Present a clear, user-facing release summary after all steps complete:
316
143
  | Feature | How to verify |
317
144
  |---------|--------------|
318
145
  | [key new feature] | [concrete steps to test] |
319
- ...
320
146
 
321
147
  🔗 Links:
322
148
  - RubyGems: https://rubygems.org/gems/openclacky/versions/{version}
@@ -324,137 +150,54 @@ Present a clear, user-facing release summary after all steps complete:
324
150
 
325
151
  ⬆️ Upgrade:
326
152
  - In the Clacky UI, click "Upgrade" in the bottom-left → detect new version → click upgrade → done
327
- - Manual upgrade (CLI): `gem update openclacky`
153
+ - Manual upgrade (CLI): gem update openclacky
328
154
 
329
155
  🆕 Fresh install:
330
156
  /bin/bash -c "$(curl -sSL https://raw.githubusercontent.com/clacky-ai/openclacky/main/scripts/install.sh)"
331
157
  ```
332
158
 
333
- **Rules for writing the summary:**
334
- - Highlight: pick the single most impactful user-visible change, use "verb + value" phrasing, e.g. "Real browser control + WeChat channel support — agents can now navigate pages and chat via WeChat"
335
- - Write from the user's perspective — what can they now do, or what problem is now fixed
336
- - Avoid technical jargon (no "cursor-paginated", "frontmatter", "REST API" — explain what it means instead)
159
+ Summary writing rules:
160
+ - Write from the user's perspective what they can now do, or what problem is fixed
161
+ - Avoid technical jargon; explain what things mean
337
162
  - Skip "More" / chore items unless they directly affect users
338
163
  - Keep each bullet to one sentence, action-oriented
339
- - Example translation: `fix: expand ~ in file system tools path arguments` → "File paths starting with `~` (home directory) now work correctly in all file tools"
340
- - Testing suggestions: list only significant new features (3–8 items), each with concrete, actionable verification steps
164
+ - Testing suggestions: 3–8 items with concrete, actionable verification steps
341
165
 
342
- ## Commands Used
166
+ ## Pre-Release Caveats
343
167
 
344
- ```bash
345
- # Pre-release checks
346
- git status --porcelain
347
-
348
- # Run tests
349
- bundle exec rspec
350
-
351
- # Update Gemfile.lock
352
- bundle install
353
- git add Gemfile.lock
354
- git commit -m "chore: update Gemfile.lock to vX.Y.Z"
355
- git push origin main
356
-
357
- # Build and publish gem
358
- gem build openclacky.gemspec
359
- gem push openclacky-X.Y.Z.gem
360
-
361
- # Git operations
362
- git add lib/clacky/version.rb
363
- git commit -m "chore: bump version to X.Y.Z"
364
- git tag vX.Y.Z
365
- git push origin main
366
- git push origin --tags
367
-
368
- # ── GitHub Release ──────────────────────────────────────────────────────
369
-
370
- # Stable release:
371
- gh release create vX.Y.Z \
372
- --title "vX.Y.Z" \
373
- --notes-file /tmp/release_notes_X.Y.Z.md \
374
- --latest \
375
- openclacky-X.Y.Z.gem
376
-
377
- # Pre-release (use --prerelease instead of --latest):
378
- gh release create vX.Y.Z-beta.1 \
379
- --title "vX.Y.Z-beta.1" \
380
- --notes-file /tmp/release_notes_X.Y.Z-beta.1.md \
381
- --prerelease \
382
- openclacky-X.Y.Z.beta.1.gem
383
-
384
- # ── OSS CDN (CN mirror) ─────────────────────────────────────────────────
385
-
386
- # Always upload the .gem file:
387
- coscli cp openclacky-X.Y.Z.gem cos://clackyai-1258723534/openclacky/openclacky-X.Y.Z.gem
388
-
389
- # Stable releases ONLY — update latest.txt:
390
- echo "X.Y.Z" > /tmp/latest.txt
391
- coscli cp /tmp/latest.txt cos://clackyai-1258723534/openclacky/latest.txt
392
- curl -fsSL https://oss.1024code.com/openclacky/latest.txt # verify
393
-
394
- # Pre-releases — skip latest.txt update unless user explicitly requests it
395
-
396
- # Sync scripts/ to OSS (build from templates first)
397
- bash scripts/build/build.sh
398
- for script in scripts/*; do
399
- coscli cp "$script" cos://clackyai-1258723534/clacky-ai/openclacky/main/scripts/$(basename "$script")
400
- done
401
- curl -fsSL https://oss.1024code.com/clacky-ai/openclacky/main/scripts/install.sh | head -5 # verify
402
- ```
168
+ When releasing a pre-release version, inform the user of these behaviors:
403
169
 
404
- ## File Locations
170
+ | Concern | Behavior | Impact |
171
+ |---------|----------|--------|
172
+ | **Version check notification** | `Gem::Version("0.9.38") < Gem::Version("1.0.0.beta.1")` is true | The upgrade dot WILL appear in the Web UI for most users |
173
+ | **`gem update` (official source)** | Does NOT install prereleases without `--pre` | Users who click "Upgrade" will see notification but upgrade silently does nothing |
174
+ | **OSS CDN upgrade (mirror users)** | Downloads exact `.gem` from `latest.txt` | If latest.txt points to prerelease, mirror users WILL get the beta |
175
+ | **OSS `latest.txt`** | Fresh installs fetch latest.txt | By default, do NOT update latest.txt for pre-releases |
405
176
 
406
- - Version file: `lib/clacky/version.rb`
407
- - Gem specification: `openclacky.gemspec`
408
- - Changelog: `CHANGELOG.md`
409
- - Built gem: `openclacky-{version}.gem`
410
-
411
- ## Success Criteria
412
-
413
- - All tests pass
414
- - CI pipeline completes successfully
415
- - Gemfile.lock updated and committed
416
- - New version successfully published to RubyGems
417
- - Git repository updated with version tag
418
- - CHANGELOG.md updated with release notes
419
- - GitHub Release created with .gem file attached at https://github.com/clacky-ai/openclacky/releases
420
- - Use `--latest` for stable releases, `--prerelease` for pre-releases
421
- - .gem file uploaded to OSS: https://oss.1024code.com/openclacky/openclacky-{version}.gem
422
- - For stable releases: `latest.txt` updated on OSS: https://oss.1024code.com/openclacky/latest.txt returns the new version
423
- - For pre-releases: `latest.txt` NOT updated (unless user explicitly opts in)
424
- - No build or deployment errors
425
- - User-facing release summary presented at the end
177
+ Ask the user whether to use `--update-latest` before running the script.
426
178
 
427
179
  ## Error Handling
428
180
 
429
- - If tests fail, stop the process and report issues
430
- - If CI fails after Gemfile.lock update, fix issues before proceeding
431
- - If gem build fails, check gemspec configuration
432
- - If git push fails, verify repository permissions
433
- - If gem push fails, check RubyGems credentials
434
- - If `gh release create` fails, ensure `gh` CLI is installed (`brew install gh`) and authenticated (`gh auth login`)
435
- - If GitHub Release notes look wrong, check CHANGELOG.md formatting for the version section
436
-
437
- ## Notes
181
+ The script uses `set -euo pipefail` and stops on any failure. Common issues:
438
182
 
439
- - This skill follows semantic versioning
440
- - Always update CHANGELOG.md as part of the release
441
- - Verify RubyGems.org shows the new version after publication
442
- - The search index on RubyGems may take a few minutes to update
183
+ - **Tests fail** fix tests before re-running
184
+ - **CI fails** script pushes then watches CI; fix and re-push if needed
185
+ - **gem push fails** check RubyGems credentials (`gem signin`)
186
+ - **gh release fails** check `gh auth status`
187
+ - **coscli fails** → check `~/.cos.yaml` config
443
188
 
444
- ## Dependencies
189
+ After fixing an issue, you can re-run the script — it's safe to retry. If a partial release happened (e.g., gem pushed but tag not created), handle remaining steps manually.
445
190
 
446
- - Ruby development environment
447
- - Git repository access
448
- - RubyGems account with push permissions
449
- - Bundle and RSpec for testing
450
- - `gh` CLI installed and authenticated (`brew install gh && gh auth login`)
451
-
452
- ## Version History
191
+ ## File Locations
453
192
 
454
- - Created: 2026-01-18
455
- - Used for: openclacky gem releases
456
- - Compatible with: Ruby gems following standard conventions
193
+ - Release script: `SKILL_DIR/scripts/release.sh`
194
+ - Version file: `lib/clacky/version.rb`
195
+ - Gem specification: `openclacky.gemspec`
196
+ - Changelog: `CHANGELOG.md`
457
197
 
458
- ## User Experience Summary
198
+ ## Dependencies
459
199
 
460
- This skill takes the complexity out of gem releases. Instead of remembering 8+ different commands and worrying about the correct order, you just say "release a new version" and the AI handles everything - from running tests to publishing on RubyGems. It's like having an experienced release engineer on your team who never forgets a step, always runs the tests first, and makes sure your changelog is updated. The whole process that used to take 15-20 minutes and multiple terminal windows now happens smoothly in one conversation, with clear feedback at each step so you know exactly what's happening.
200
+ - Ruby >= 3.1.0, Bundler, RSpec
201
+ - `gh` CLI installed and authenticated
202
+ - `coscli` installed at `/usr/local/bin/coscli` with `~/.cos.yaml`
203
+ - RubyGems push credentials