openclacky 1.3.8 → 1.3.10

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 589d52edb2af8ec7ebea8d596a4b342791230009666a8757f4391b95df22d667
4
- data.tar.gz: 07c80f79e8a9df57b4232a1317b1a6f8b4557cf136289f7ea1b7a9e93caba5aa
3
+ metadata.gz: de09b43a446d08c592e1cd49deb914a3ff8c70375cf653f130d2aef9a1cd460e
4
+ data.tar.gz: 8030ce355abbe973c9b8294995744b5d4a96e3e38bfc494cb081621172619085
5
5
  SHA512:
6
- metadata.gz: e474dff0d682c03bbd9756a37e9c64a29d13f51c35b73a76440e62eeac4b92d5ce6251e7357493531ce0669a770607a37a17ceb8715eadf5f849a7b04a6f373a
7
- data.tar.gz: 8863d9a310224162b3fc0dad4513c933ebafcc74be5d2157d890d7a4f2dd667f66c9f658e61d289c078fdf39c5961bb5c0895317553c0f25b5054142f2c127b9
6
+ metadata.gz: bd57f31e2d97f1a98b10a775017e2c42ce6354e3fab4a87f9392e884ecca3a2ca3c3ec19d30e8adcb7d8498330446b3d80be787c3594e26b63d07a3e2349f9a7
7
+ data.tar.gz: 4b18ae8839c6bd9ab319c7077dca1bc61ea836d38152438215c61a524099c7e17213b0b76f37f8157621a7b168325042fe3137bf7d0b5e257a3609c58ca7c8fc
data/CHANGELOG.md CHANGED
@@ -3,6 +3,46 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+
7
+ ## [1.3.10] - 2026-07-09
8
+
9
+ ### Added
10
+ - Extension author shown inline in title row on extension cards
11
+ - Version input in publish modal — writes back to `ext.yml`, shows friendly Chinese error on version conflict
12
+ - Local extensions now included in the installed extensions list
13
+
14
+ ### Improved
15
+ - Published extensions list in publish panel — better style and UX
16
+ - Publishing state, success label, and done button added to publish modal flow
17
+ - OSS CDN prioritized for latest version check (faster upgrade detection)
18
+
19
+ ### Fixed
20
+ - Agent card description clamped to 2 lines; author hidden for built-in agents
21
+ - New-session scrollbar centering — use padding calc instead of max-width
22
+ - `file://` links with spaces and non-ASCII paths now render correctly (#350)
23
+ - Invalid API key error message improved to cover expired key case
24
+ - Local extension card in ext-studio now correctly appends action buttons
25
+ - Navigate back to list when extension detail fails to load
26
+ - Page reloads correctly after install/enable/disable/uninstall extension
27
+ - Enriched installed extensions with market data; shows unlisted badge
28
+
29
+ ## [1.3.9] - 2026-07-08
30
+
31
+ ### Added
32
+ - Installed filter tab in extension marketplace toolbar — quickly view only installed extensions
33
+ - Extension detail page UI improvements with better uninstall behavior
34
+ - `send_data` helper for API extensions to return binary file responses
35
+
36
+ ### Improved
37
+ - Extension marketplace upload flow reworked — `origin` field removed, cleaner package structure
38
+ - Publish modal redesigned with meta block, improved layout, size, and animation
39
+ - Debug panel verify result now shown inline in action bar with auto-hide and friendly hint
40
+
41
+ ### Fixed
42
+ - Zero-byte zip download when exporting extensions — binary responses now handled correctly
43
+ - Filter tab bottom padding adjusted for better underline spacing
44
+ - New-session advanced panel margin-top adjusted
45
+ - Debug panel detail no longer shows origin field
6
46
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
47
 
8
48
  ## [1.3.8] - 2026-07-07
@@ -596,7 +596,7 @@ module Clacky
596
596
  #
597
597
  # Returns { success: true, extension: {...} } or
598
598
  # { success: false, error: "...", already_exists: Boolean }.
599
- def upload_extension!(ext_id, zip_data, force: false, status: nil, changelog: nil)
599
+ def upload_extension!(ext_id, zip_data, force: false, status: nil, changelog: nil, origin: 'marketplace')
600
600
  identity = Clacky::Identity.load
601
601
  return { success: false, error: "Device not bound to a platform account" } unless identity.bound?
602
602
 
@@ -607,6 +607,7 @@ module Clacky
607
607
  end
608
608
 
609
609
  fields = { "device_token" => identity.device_token }
610
+ fields["origin"] = origin.to_s if origin
610
611
  fields["status"] = status.to_s if status
611
612
  fields["changelog"] = changelog.to_s if changelog
612
613
 
@@ -5,7 +5,6 @@ version: "0.1.0"
5
5
  author: OpenClacky
6
6
  homepage: https://www.openclacky.com
7
7
  license: MIT
8
- origin: self
9
8
  contributes:
10
9
  agents:
11
10
  - id: coding
@@ -40,7 +40,6 @@ id: my-ext
40
40
  name: My Extension
41
41
  description: what it does
42
42
  version: "0.1.0"
43
- origin: self
44
43
  contributes:
45
44
  api: api/handler.rb
46
45
  panels:
@@ -48,12 +48,13 @@ class ExtStudioExt < Clacky::ApiExtension
48
48
 
49
49
  # POST /api/ext/ext-studio/pack
50
50
  # body: { ext_id }
51
- # Packs a local container into a zip (into a temp dir) and reports its path.
51
+ # Packs a local container and streams the zip back as a file download.
52
52
  post "/pack" do
53
53
  ext_id = require_ext_id!
54
54
  Dir.mktmpdir("clacky-ext-studio-pack") do |tmp|
55
- res = Clacky::ExtensionPackager.pack(ext_id, out_dir: tmp)
56
- json(ok: true, ext_id: res.ext_id, path: res.path)
55
+ res = Clacky::ExtensionPackager.pack(ext_id, out_dir: tmp)
56
+ zip_data = File.binread(res.path)
57
+ send_data(zip_data, content_type: "application/zip", filename: "#{res.ext_id}.zip")
57
58
  end
58
59
  rescue Clacky::ExtensionPackager::Error => e
59
60
  error!(e.message, status: 422)
@@ -128,7 +129,33 @@ class ExtStudioExt < Clacky::ApiExtension
128
129
  json(ok: true, ext_id: ext_id)
129
130
  end
130
131
 
131
- # POST /api/ext/ext-studio/develop
132
+ # POST /api/ext/ext-studio/set_version
133
+ # body: { ext_id, version }
134
+ # Writes the new version string back to the local ext.yml.
135
+ post "/set_version" do
136
+ ext_id = require_ext_id!
137
+ version = presence(json_body["version"])
138
+ error!("version required", status: 422) unless version
139
+
140
+ result = Clacky::ExtensionLoader.load_all(force: false)
141
+ container = Array(result.containers).find { |id, _| id == ext_id }&.last
142
+ error!("extension not found: #{ext_id}", status: 404) unless container
143
+
144
+ yml_path = File.join(container[:dir], "ext.yml")
145
+ error!("ext.yml not found", status: 404) unless File.exist?(yml_path)
146
+
147
+ content = File.read(yml_path)
148
+ if content =~ /^version:/
149
+ content = content.sub(/^version:.*$/, "version: #{version}")
150
+ else
151
+ content = content.rstrip + "\nversion: #{version}\n"
152
+ end
153
+ File.write(yml_path, content)
154
+
155
+ json(ok: true, ext_id: ext_id, version: version)
156
+ end
157
+
158
+
132
159
  # body: { idea? }
133
160
  # Spawns a session bound to the ext-developer agent, optionally seeded with
134
161
  # the user's idea as the first task — the "let AI build it for me" entry.
@@ -5,7 +5,6 @@ version: "0.1.0"
5
5
  author: OpenClacky
6
6
  homepage: https://www.openclacky.com
7
7
  license: MIT
8
- origin: self
9
8
  contributes:
10
9
  api: api/handler.rb
11
10
  panels:
@@ -20,8 +19,8 @@ contributes:
20
19
  - id: ext-developer
21
20
  title: Extension Developer
22
21
  title_zh: 扩展开发
23
- description: AI expert that helps you build, debug, and publish OpenClacky extensions
24
- description_zh: 帮你开发、调试、发布 OpenClacky 扩展的 AI 专家
22
+ description: AI expert that helps you build, debug, and publish extensions
23
+ description_zh: 帮你开发、调试、发布扩展的 AI 专家
25
24
  order: 5
26
25
  prompt: agents/ext-developer/system_prompt.md
27
26
  avatar: agents/ext-developer/avatar.png