@trendai-crem/claude-skills 0.1.0 → 0.3.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 (67) hide show
  1. package/README.md +1 -1
  2. package/cli.js +13 -1
  3. package/package.json +2 -2
  4. package/skills/atlassian-tools/SKILL.md +361 -0
  5. package/skills/atlassian-tools/__pycache__/storage_utils.cpython-313.pyc +0 -0
  6. package/skills/atlassian-tools/confluence_cli.py +796 -0
  7. package/skills/atlassian-tools/confluence_client/README.md +154 -0
  8. package/skills/atlassian-tools/confluence_client/__init__.py +44 -0
  9. package/skills/atlassian-tools/confluence_client/__pycache__/__init__.cpython-313.pyc +0 -0
  10. package/skills/atlassian-tools/confluence_client/__pycache__/client.cpython-313.pyc +0 -0
  11. package/skills/atlassian-tools/confluence_client/__pycache__/commands.cpython-313.pyc +0 -0
  12. package/skills/atlassian-tools/confluence_client/__pycache__/converter.cpython-313.pyc +0 -0
  13. package/skills/atlassian-tools/confluence_client/__pycache__/exceptions.cpython-313.pyc +0 -0
  14. package/skills/atlassian-tools/confluence_client/__pycache__/storage.cpython-313.pyc +0 -0
  15. package/skills/atlassian-tools/confluence_client/client.py +577 -0
  16. package/skills/atlassian-tools/confluence_client/commands.py +613 -0
  17. package/skills/atlassian-tools/confluence_client/converter.py +892 -0
  18. package/skills/atlassian-tools/confluence_client/exceptions.py +52 -0
  19. package/skills/atlassian-tools/confluence_client/storage.py +718 -0
  20. package/skills/atlassian-tools/jira_cli.py +891 -0
  21. package/skills/atlassian-tools/jira_client/README.md +235 -0
  22. package/skills/atlassian-tools/jira_client/__init__.py +34 -0
  23. package/skills/atlassian-tools/jira_client/adf_converter.py +845 -0
  24. package/skills/atlassian-tools/jira_client/client.py +366 -0
  25. package/skills/atlassian-tools/jira_client/commands.py +792 -0
  26. package/skills/atlassian-tools/jira_client/exceptions.py +48 -0
  27. package/skills/atlassian-tools/jira_client/storage.py +701 -0
  28. package/skills/atlassian-tools/pyproject.toml +20 -0
  29. package/skills/atlassian-tools/references/reference.md +473 -0
  30. package/skills/atlassian-tools/storage_utils.py +29 -0
  31. package/skills/atlassian-tools/tests/__init__.py +1 -0
  32. package/skills/atlassian-tools/tests/test_adf_converter.py +1521 -0
  33. package/skills/atlassian-tools/tests/test_converter.py +1243 -0
  34. package/skills/atlassian-tools/tests/test_storage_path.py +125 -0
  35. package/skills/code-review/README.md +215 -0
  36. package/skills/code-review/SKILL.md +870 -0
  37. package/skills/code-review/TEST_PLAN.md +378 -0
  38. package/skills/cpp/SKILL.md +350 -0
  39. package/skills/cpp/references/best-practices.md +299 -0
  40. package/skills/cpp/references/formatting.md +298 -0
  41. package/skills/cpp/references/naming.md +280 -0
  42. package/skills/go/SKILL.md +337 -0
  43. package/skills/go/references/best-practices.md +262 -0
  44. package/skills/go/references/formatting.md +247 -0
  45. package/skills/go/references/naming.md +286 -0
  46. package/skills/java/SKILL.md +289 -0
  47. package/skills/java/references/best-practices.md +295 -0
  48. package/skills/java/references/formatting.md +315 -0
  49. package/skills/java/references/naming.md +211 -0
  50. package/skills/javascript/SKILL.md +246 -0
  51. package/skills/javascript/references/best-practices.md +289 -0
  52. package/skills/javascript/references/formatting.md +256 -0
  53. package/skills/javascript/references/naming.md +172 -0
  54. package/skills/python/SKILL.md +250 -0
  55. package/skills/python/references/best-practices.md +275 -0
  56. package/skills/python/references/formatting.md +230 -0
  57. package/skills/python/references/naming.md +218 -0
  58. package/skills/reviewing-prs/SKILL.md +91 -0
  59. package/skills/shell/SKILL.md +239 -0
  60. package/skills/shell/references/best-practices.md +256 -0
  61. package/skills/shell/references/formatting.md +287 -0
  62. package/skills/shell/references/naming.md +202 -0
  63. package/skills/typescript/SKILL.md +262 -0
  64. package/skills/typescript/references/best-practices.md +304 -0
  65. package/skills/typescript/references/formatting.md +218 -0
  66. package/skills/typescript/references/naming.md +198 -0
  67. package/skills/wiki-generation/SKILL.md +121 -0
package/README.md CHANGED
@@ -10,7 +10,7 @@ npx @trendai-crem/claude-skills
10
10
 
11
11
  That's it. The command installs:
12
12
 
13
- 1. **External skills** — [superpowers](https://github.com/obra/superpowers), [codex](https://github.com/oil-oil/codex)
13
+ 1. **External skills** — [superpowers](https://github.com/obra/superpowers))
14
14
  2. **Team skills** — custom skills maintained in this repo (override same-named externals)
15
15
 
16
16
  ## Update
package/cli.js CHANGED
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { execFileSync } from 'child_process';
4
+ import { readFileSync } from 'fs';
4
5
  import { fileURLToPath } from 'url';
5
- import { dirname } from 'path';
6
+ import { dirname, join } from 'path';
6
7
 
7
8
  const __dir = dirname(fileURLToPath(import.meta.url));
8
9
 
@@ -44,3 +45,14 @@ const externalFailed = externalResults.filter(r => !r.ok);
44
45
  if (externalFailed.length > 0) {
45
46
  console.warn(`\nWARN: ${externalFailed.length} external source(s) failed — team skills installed successfully.`);
46
47
  }
48
+
49
+ // Check for updates
50
+ try {
51
+ const { version: current } = JSON.parse(readFileSync(join(__dir, 'package.json'), 'utf8'));
52
+ const res = await fetch('https://registry.npmjs.org/@trendai-crem/claude-skills/latest');
53
+ const { version: latest } = await res.json();
54
+ if (current !== latest) {
55
+ console.log(`\nUpdate available: ${current} → ${latest}`);
56
+ console.log(`Run: npx @trendai-crem/claude-skills@latest`);
57
+ }
58
+ } catch { /* ignore update check failures */ }
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@trendai-crem/claude-skills",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "Claude Code skills installer for the trendai-crem team",
5
5
  "license": "UNLICENSED",
6
6
  "repository": {
7
7
  "type": "git",
8
- "url": "git+https://github.com/daniel-tian_tmemu/claude-skills.git"
8
+ "url": "git+https://adc.github.trendmicro.com/CoreTech-SASEDL/claude-skills.git"
9
9
  },
10
10
  "bin": {
11
11
  "claude-skills": "cli.js"
@@ -0,0 +1,361 @@
1
+ ---
2
+ name: atlassian-tools
3
+ description: |
4
+ Confluence wiki and Jira issue management. ALWAYS use this skill (not WebFetch)
5
+ for any atlassian.net URL, Confluence page, or Jira issue. Use for: wiki pages,
6
+ documentation, search/find wiki pages, retrieve wiki, create/update/delete pages,
7
+ Jira tickets, issues, bugs, sprints.
8
+ allowed-tools: [Bash, Read, Write, Glob]
9
+ metadata:
10
+ short-description: Confluence and Jira CLI tools with bidirectional sync
11
+ version: "1.5.1"
12
+ author: Hank Liao
13
+ license: MIT
14
+ ---
15
+
16
+ # Atlassian Tools
17
+
18
+ ## RULES (MUST FOLLOW)
19
+
20
+ 1. Run all commands from the skill directory (where this SKILL.md is located)
21
+ 2. ALWAYS use `-o <USER_CWD>/.atlassian` BEFORE the subcommand (not after)
22
+ 3. Replace `<USER_CWD>` with the user's working directory (where they invoked the skill)
23
+ 4. **UPDATE WORKFLOW: Always check local storage first before updating**
24
+ - Before updating any wiki page or Jira issue, check if it exists in local storage
25
+ - If found locally: Edit the local `.md` file, then use `update --file` with that file
26
+ - If not found locally: First `retrieve`/`get` it, then edit the local file, then update
27
+ - **NEVER use inline `-d` or description arguments when a local file exists**
28
+
29
+ Correct: `uv run python confluence_cli.py -o /user/project/.atlassian retrieve 123456`
30
+ Wrong: `uv run python confluence_cli.py retrieve 123456 -o /path` (will fail)
31
+
32
+ ## TRIGGERS (When to Use This Skill)
33
+
34
+ ALWAYS use this skill (never WebFetch) when you see:
35
+ - URLs containing `atlassian.net` or `/wiki/`
36
+ - Jira issue keys like `PROJ-123`
37
+ - Keywords: Confluence, wiki, Jira, Atlassian, ticket, issue
38
+
39
+ User intent mapping:
40
+ - "get/download/retrieve wiki/page" → `confluence_cli.py retrieve`
41
+ - "get all child pages" → `confluence_cli.py retrieve -r`
42
+ - "search/find wiki pages" → `confluence_cli.py search`
43
+ - "create wiki page" → `confluence_cli.py create`
44
+ - "update/edit wiki" → **check local first**, then `confluence_cli.py update --file`
45
+ - "get issue/ticket" → `jira_cli.py get`
46
+ - "get epic with children" → `jira_cli.py get -r`
47
+ - "create ticket/issue" → `jira_cli.py create`
48
+ - "update issue" → **check local first**, then `jira_cli.py update --description-file`
49
+ - "add comment" → `jira_cli.py comment`
50
+ - "change status" → `jira_cli.py transition`
51
+
52
+ ## UPDATE WORKFLOW (CRITICAL)
53
+
54
+ **Always prefer editing local files over inline arguments.** This ensures content integrity and proper version tracking.
55
+
56
+ ### Confluence Page Update
57
+
58
+ 1. **Check local storage**: `ls <USER_CWD>/.atlassian/confluence/pages/`
59
+ 2. **If page exists locally**:
60
+ - Read: `<USER_CWD>/.atlassian/confluence/pages/<page-title>/<page-title>.md`
61
+ - Edit the markdown file with requested changes
62
+ - Update: `confluence_cli.py update <page_id> --file <USER_CWD>/.atlassian/confluence/pages/<page-title>/<page-title>.md`
63
+ 3. **If page NOT found locally**:
64
+ - First retrieve: `confluence_cli.py retrieve <page_id_or_url>`
65
+ - Then follow step 2 (page will now exist at `<USER_CWD>/.atlassian/confluence/pages/<page-title>/`)
66
+
67
+ ### Jira Issue Update
68
+
69
+ 1. **Check local storage**: `ls <USER_CWD>/.atlassian/jira/issues/`
70
+ 2. **If issue exists locally**:
71
+ - Read: `<USER_CWD>/.atlassian/jira/issues/<ISSUE-KEY>/description.md`
72
+ - Edit the markdown file with requested changes
73
+ - Update: `jira_cli.py update <ISSUE-KEY> --description-file <USER_CWD>/.atlassian/jira/issues/<ISSUE-KEY>/description.md`
74
+ 3. **If issue NOT found locally**:
75
+ - First retrieve: `jira_cli.py get <issue_key>`
76
+ - Then follow step 2 (issue will now exist at `<USER_CWD>/.atlassian/jira/issues/<ISSUE-KEY>/`)
77
+
78
+ ### Why This Matters
79
+
80
+ - Preserves full document context (macros, formatting, images)
81
+ - Enables accurate incremental edits
82
+ - Maintains sync between local cache and remote
83
+ - Avoids data loss from partial inline updates
84
+
85
+ ## CONFLUENCE CLI
86
+
87
+ Base: `uv run python confluence_cli.py -o <USER_CWD>/.atlassian <command>`
88
+
89
+ ### Commands
90
+
91
+ **retrieve** `<page_id_or_url>` `[-r]` `[-f]`
92
+ Download page to local storage. Accepts page ID or full URL.
93
+ - `-r` recursive (include all child pages)
94
+ - `-f` force re-fetch even if cached
95
+
96
+ **create** `<file>` `-s <space_key>` `[-t <title>]` `[-p <parent_id>]` `[-f markdown|html]`
97
+ Create new page from .md or .html file.
98
+ - `-s` space key (required, or set CONFLUENCE_SPACE_KEY env var)
99
+ - `-t` page title (defaults to filename)
100
+ - `-p` parent page ID (for subpages)
101
+ - `-f` force format (auto-detected from extension)
102
+
103
+ **update** `<page_id>` `--file <file>` `[-t <title>]` `[-m <message>]` `[-f markdown|html]`
104
+ Update existing page. Auto-syncs local cache after update.
105
+ - `--file` source file with new content
106
+ - `-t` new title
107
+ - `-m` version message
108
+ - `-f` force format
109
+
110
+ **sync** `[<page_id>]` `[--all]` — Fetch latest from remote to local cache
111
+ - `<page_id>` page ID or URL (required unless --all is used)
112
+ - `--all` sync all locally cached pages
113
+ **list** — List locally cached pages
114
+ **info** `<page_id>` — Show local page metadata
115
+ **delete** `<page_id>` — Remove from local storage only
116
+ **delete-from-confluence** `<page_id>` `[--local-only]` — Delete from Confluence (and local)
117
+ **storage** — Show storage stats
118
+
119
+ **search** `<query>` `[--limit N]` `[--space KEY]` `[--cursor TOKEN]` `[--retrieve N]` `[--json]`
120
+ Search Confluence pages by keyword using CQL full-text search.
121
+ - `<query>` search text (required)
122
+ - `--limit` results per page (1-50, default: 10)
123
+ - `--space` filter by space key (e.g., DEV, DOCS)
124
+ - `--cursor` pagination cursor from previous search
125
+ - `--retrieve` auto-retrieve top N results to local storage (1-20)
126
+ - `--json` output JSON format instead of table
127
+
128
+ ### Examples
129
+
130
+ ```bash
131
+ # Get page by URL
132
+ uv run python confluence_cli.py -o /project/.atlassian retrieve "https://domain.atlassian.net/wiki/spaces/SPACE/pages/123456"
133
+
134
+ # Get page and all children
135
+ uv run python confluence_cli.py -o /project/.atlassian retrieve 123456 -r
136
+
137
+ # Create page from markdown
138
+ uv run python confluence_cli.py -o /project/.atlassian create doc.md -s DDIT -t "API Docs"
139
+
140
+ # Create subpage
141
+ uv run python confluence_cli.py -o /project/.atlassian create doc.md -s DDIT -t "API Docs" -p 789012
142
+
143
+ # Update page (preferred: edit local file first)
144
+ # 1. Check if exists: ls /project/.atlassian/confluence/pages/
145
+ # 2. Edit the local markdown file
146
+ # 3. Update from file:
147
+ uv run python confluence_cli.py -o /project/.atlassian update 123456 --file /project/.atlassian/confluence/pages/API-Docs/API-Docs.md -m "Fixed typos"
148
+
149
+ # Sync all cached pages with latest from Confluence
150
+ uv run python confluence_cli.py -o /project/.atlassian sync --all
151
+
152
+ # Search for pages containing "OAuth"
153
+ uv run python confluence_cli.py -o /project/.atlassian search "OAuth"
154
+
155
+ # Search with limit and space filter
156
+ uv run python confluence_cli.py -o /project/.atlassian search "API documentation" --limit 20 --space DEV
157
+
158
+ # Search and auto-retrieve top 3 results
159
+ uv run python confluence_cli.py -o /project/.atlassian search "deployment guide" --retrieve 3
160
+
161
+ # Search with JSON output for scripting
162
+ uv run python confluence_cli.py -o /project/.atlassian search "testing" --json
163
+ ```
164
+
165
+ ## JIRA CLI
166
+
167
+ Base: `uv run python jira_cli.py -o <USER_CWD>/.atlassian <command>`
168
+
169
+ ### Commands
170
+
171
+ **get** `<issue_key>` `[-r]` `[-f]`
172
+ Download issue to local storage.
173
+ - `-r` recursive (include all child issues)
174
+ - `-f` force re-fetch even if cached
175
+
176
+ **create** `<project>` `<type>` `<summary>` `[-d <desc>]` `[--description-file <file>]` `[--parent <key>]` `[-p <priority>]` `[-l <labels>]` `[--no-sprint]`
177
+ Create new issue. Auto-saves to local storage. Auto-adds to sprint and applies default labels if configured.
178
+ - `<project>` project key (e.g., PROJ)
179
+ - `<type>` issue type (Task, Bug, Story, Epic)
180
+ - `<summary>` issue title
181
+ - `-d` description text
182
+ - `--description-file` markdown file for description
183
+ - `--parent` parent issue key
184
+ - `-p` priority (Highest, High, Medium, Low, Lowest)
185
+ - `-l` comma-separated labels (merged with JIRA_DEFAULT_LABELS)
186
+ - `--no-sprint` skip auto-adding to sprint
187
+
188
+ **update** `<issue_key>` `[-s <summary>]` `[-d <desc>]` `[--description-file <file>]` `[-p <priority>]` `[-l <labels>]`
189
+ Update issue fields. Auto-syncs local cache.
190
+ - `--description-file` markdown file for description (**preferred over -d**)
191
+
192
+ **comment** `<issue_key>` `<text>` — Add comment. Auto-syncs local cache.
193
+
194
+ **transition** `<issue_key>` `<status>` — Change status (e.g., "In Progress", "Done"). Auto-syncs local cache.
195
+
196
+ **assign-to-me** `<issue_key>` — Assign to current user. Auto-syncs local cache.
197
+
198
+ **set-parent** `<issue_key>` `[parent_key]` `[--clear]` — Set or clear parent relationship
199
+
200
+ **search** `<jql>` `[-l <limit>]` — Search with JQL query
201
+ - `-l` max results (default 50)
202
+
203
+ **types** `<project>` — List available issue types for project
204
+
205
+ **add-to-sprint** `<issue_keys>` `[-s <sprint_name>]` `[-p <project>]`
206
+ Add issues to a sprint.
207
+ - `<issue_keys>` comma-separated issue keys (e.g., PROJ-1,PROJ-2)
208
+ - `-s` sprint name (uses JIRA_SPRINT_NAME_PATTERN if not specified)
209
+ - `-p` project key (defaults to JIRA_PROJECT_KEY)
210
+
211
+ **add-label** `<issue_keys>` `<labels>`
212
+ Add labels to multiple issues.
213
+ - `<issue_keys>` comma-separated issue keys
214
+ - `<labels>` comma-separated labels to add
215
+
216
+ **delete-issue** `<issue_key>` — Delete from Jira (and local if present)
217
+ **list** — List locally cached issues
218
+ **info** `<issue_key>` — Show local issue details
219
+ **sync** `[<issue_key>]` `[--all]` — Fetch latest from remote
220
+ - `<issue_key>` issue key (required unless --all is used)
221
+ - `--all` sync all locally cached issues
222
+ **delete** `<issue_key>` — Remove from local storage only
223
+ **storage** — Show storage stats
224
+
225
+ ### Examples
226
+
227
+ ```bash
228
+ # Get single issue
229
+ uv run python jira_cli.py -o /project/.atlassian get PROJ-123
230
+
231
+ # Get epic with all children
232
+ uv run python jira_cli.py -o /project/.atlassian get PROJ-100 -r
233
+
234
+ # Create task
235
+ uv run python jira_cli.py create PROJ Task "Implement feature" -d "Description here"
236
+
237
+ # Create from spec file
238
+ uv run python jira_cli.py create PROJ Story "User auth" --description-file spec.md --parent PROJ-100
239
+
240
+ # Update issue (preferred: edit local file first)
241
+ # 1. Check if exists: ls /project/.atlassian/jira/issues/PROJ-123/
242
+ # 2. Edit: /project/.atlassian/jira/issues/PROJ-123/description.md
243
+ # 3. Update from file:
244
+ uv run python jira_cli.py -o /project/.atlassian update PROJ-123 --description-file /project/.atlassian/jira/issues/PROJ-123/description.md
245
+
246
+ # Update issue (simple field changes only)
247
+ uv run python jira_cli.py -o /project/.atlassian update PROJ-123 -s "New title" -p High
248
+
249
+ # Add comment
250
+ uv run python jira_cli.py comment PROJ-123 "Fixed in commit abc123"
251
+
252
+ # Change status
253
+ uv run python jira_cli.py transition PROJ-123 "In Progress"
254
+
255
+ # Search
256
+ uv run python jira_cli.py search "project = PROJ AND status = 'To Do'" -l 20
257
+
258
+ # Sync all cached issues with latest from Jira
259
+ uv run python jira_cli.py -o /project/.atlassian sync --all
260
+ ```
261
+
262
+ ## REFERENCE
263
+
264
+ ### Format Support
265
+ - Input: Markdown (.md) or HTML (.html), auto-detected by extension
266
+ - Output: Pages saved as both .html and .md
267
+ - Supported: headings, lists, tables, code blocks, links, bold/italic, Mermaid diagrams
268
+
269
+ ### Confluence Macros & Elements
270
+
271
+ **Fully Converted (lossless round-trip):**
272
+ - Code blocks → markdown fenced blocks (```language)
273
+ - Mermaid diagrams → ```mermaid blocks
274
+ - Status macros → `<!-- status: TITLE ;; colour: COLOR -->`
275
+ - Jira macros → `<!-- jira: KEY ;; server: NAME ;; serverId: ID -->`
276
+ - Expand macros → `<details data-confluence-expand="true"><summary>Title</summary>content</details>`
277
+ - User mentions → `<!-- @user:ACCOUNT_ID -->`
278
+ - Page links → `<!-- @page:SPACE|TITLE|DISPLAY_TEXT -->`
279
+ - Emoticons → `<!-- @emoji:NAME|ID|SHORTNAME -->`
280
+ - Images → `<!-- confluence-image filename: NAME ac:width: N ... -->`
281
+
282
+ **Preserved as Comments:**
283
+ - TOC, Children, Info, Warning, Note, and other macros
284
+ - Format: `<!-- confluence-macro: toc\nstyle: none\ncontent:\n-->`
285
+
286
+ **Special Handling:**
287
+ - Pipe characters in link text auto-escaped for markdown table compatibility
288
+ - Code blocks inside expand macros preserved and restored
289
+
290
+ ### Storage Structure
291
+
292
+ ```text
293
+ <USER_CWD>/.atlassian/
294
+ ├── confluence/pages/<page-title>/
295
+ │ ├── metadata.json
296
+ │ ├── <page-title>.html
297
+ │ └── <page-title>.md
298
+ └── jira/issues/<ISSUE-KEY>/
299
+ ├── metadata.json
300
+ ├── full_data.json
301
+ └── description.md
302
+ ```
303
+
304
+ Recursive retrieval creates nested folders for parent/child relationships.
305
+
306
+ ### Credentials
307
+
308
+ Configure in `~/.claude/settings.json`:
309
+
310
+ ```json
311
+ {
312
+ "env": {
313
+ "ATLASSIAN_DOMAIN": "trendmicro.atlassian.net",
314
+ "ATLASSIAN_EMAIL": "your-email@trendmicro.com",
315
+ "ATLASSIAN_API_TOKEN": "your_api_token",
316
+ "CONFLUENCE_SPACE_KEY": "MYSPACE",
317
+ "JIRA_PROJECT_KEY": "PROJ",
318
+ "JIRA_SPRINT_NAME_PATTERN": "📜 TLC Sprint *",
319
+ "JIRA_DEFAULT_LABELS": "tpa,backend"
320
+ }
321
+ }
322
+ ```
323
+
324
+ Get API token: <https://id.atlassian.com/manage-profile/security/api-tokens>
325
+
326
+ ## Version History
327
+
328
+ ### v1.5.0 (2025-12-24)
329
+ - **Enhanced**: Lossless round-trip conversion for Confluence elements
330
+ - Status macros (with colour parameter)
331
+ - Jira issue macros (with server/serverId)
332
+ - Expand/collapse macros (full content preservation)
333
+ - User mentions (@user)
334
+ - Page links (cross-space supported)
335
+ - Emoticons (with emoji-id and shortname)
336
+ - Image attachments (all attributes preserved)
337
+ - **Fixed**: Pipe characters in link text breaking markdown tables
338
+ - **Fixed**: Code blocks inside expand macros now properly restored
339
+ - **Fixed**: Image restoration pattern for single-line format
340
+
341
+ ### v1.4.0 (2025-12-23)
342
+ - **Added**: `search` command for Confluence pages using CQL full-text search
343
+ - Search by keyword with ranked results
344
+ - Pagination support via `--cursor`
345
+ - Filter by space with `--space`
346
+ - Auto-retrieve top N results with `--retrieve`
347
+ - JSON output format with `--json`
348
+
349
+ ### v1.3.0 (2025-12-22)
350
+ - **Added**: `--all` flag to `sync` command for batch operations
351
+
352
+ ### v1.2.0
353
+ - **Added**: Project-level storage with configurable `-o` flag
354
+ - **Added**: Hierarchical Jira issue storage
355
+
356
+ ### v1.1.0
357
+ - **Added**: Recursive page retrieval with `-r` flag
358
+ - **Added**: HTML/Markdown conversion with macro preservation
359
+
360
+ ### v1.0.0
361
+ - Initial release with Confluence and Jira CLI tools