@trendai-crem/claude-skills 0.1.0 → 0.4.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 (70) hide show
  1. package/README.md +38 -13
  2. package/cli.js +24 -3
  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/codex/SKILL.md +190 -0
  39. package/skills/codex/scripts/ask_codex.ps1 +499 -0
  40. package/skills/codex/scripts/ask_codex.sh +364 -0
  41. package/skills/cpp/SKILL.md +350 -0
  42. package/skills/cpp/references/best-practices.md +299 -0
  43. package/skills/cpp/references/formatting.md +298 -0
  44. package/skills/cpp/references/naming.md +280 -0
  45. package/skills/go/SKILL.md +337 -0
  46. package/skills/go/references/best-practices.md +262 -0
  47. package/skills/go/references/formatting.md +247 -0
  48. package/skills/go/references/naming.md +286 -0
  49. package/skills/java/SKILL.md +289 -0
  50. package/skills/java/references/best-practices.md +295 -0
  51. package/skills/java/references/formatting.md +315 -0
  52. package/skills/java/references/naming.md +211 -0
  53. package/skills/javascript/SKILL.md +246 -0
  54. package/skills/javascript/references/best-practices.md +289 -0
  55. package/skills/javascript/references/formatting.md +256 -0
  56. package/skills/javascript/references/naming.md +172 -0
  57. package/skills/python/SKILL.md +250 -0
  58. package/skills/python/references/best-practices.md +275 -0
  59. package/skills/python/references/formatting.md +230 -0
  60. package/skills/python/references/naming.md +218 -0
  61. package/skills/reviewing-prs/SKILL.md +91 -0
  62. package/skills/shell/SKILL.md +239 -0
  63. package/skills/shell/references/best-practices.md +256 -0
  64. package/skills/shell/references/formatting.md +287 -0
  65. package/skills/shell/references/naming.md +202 -0
  66. package/skills/typescript/SKILL.md +262 -0
  67. package/skills/typescript/references/best-practices.md +304 -0
  68. package/skills/typescript/references/formatting.md +218 -0
  69. package/skills/typescript/references/naming.md +198 -0
  70. package/skills/wiki-generation/SKILL.md +121 -0
package/README.md CHANGED
@@ -10,28 +10,51 @@ 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) (brainstorming, debugging, TDD, and more)
14
14
  2. **Team skills** — custom skills maintained in this repo (override same-named externals)
15
15
 
16
16
  ## Update
17
17
 
18
- Re-run the same command to update all skills to the latest version:
18
+ Re-run the same command to get the latest version. If an update is available, you'll be notified automatically.
19
19
 
20
20
  ```bash
21
- npx @trendai-crem/claude-skills
21
+ npx @trendai-crem/claude-skills@latest
22
22
  ```
23
23
 
24
24
  ## Team Skills
25
25
 
26
- | Skill | Description |
27
- |-------|-------------|
28
- | _(coming soon)_ | Add your team skills to `skills/` |
26
+ ### Engineering Quality
27
+
28
+ | Skill | Trigger | Description |
29
+ |-------|---------|-------------|
30
+ | **code-review** | "review my code", "code review" | Multi-perspective review — 5 reviewers + Codex baseline, enforces TM RDSec policy and Secure Coding Dojo checkpoints |
31
+ | **reviewing-prs** | "review this PR", "review pull request" | Structured PR review with 3 independent sub-agents covering correctness, security, and requirements |
32
+
33
+ ### Atlassian
34
+
35
+ | Skill | Trigger | Description |
36
+ |-------|---------|-------------|
37
+ | **atlassian-tools** | Any Confluence/Jira URL or mention | Confluence wiki and Jira issue management — create, update, search pages and tickets |
38
+ | **wiki-generation** | "create a wiki page", "generate Confluence docs" | Generate Confluence documentation with proper ADF format and Mermaid diagram support |
39
+
40
+ ### Google Style Guides
41
+
42
+ | Skill | Trigger | Description |
43
+ |-------|---------|-------------|
44
+ | **java** | "java style", "java coding standards" | Google Java Style Guide reference |
45
+ | **python** | "python style", "python coding standards" | Google Python Style Guide reference |
46
+ | **go** | "go style", "go coding standards" | Google Go Style Guide reference |
47
+ | **typescript** | "typescript style", "typescript coding standards" | Google TypeScript Style Guide reference |
48
+ | **javascript** | "javascript style", "javascript coding standards" | Google JavaScript Style Guide reference |
49
+ | **shell** | "shell style", "bash coding standards" | Google Shell Style Guide reference |
50
+ | **cpp** | "c++ style", "cpp coding standards" | Google C++ Style Guide reference |
29
51
 
30
52
  ## For Maintainers
31
53
 
32
54
  ### Adding a team skill
33
55
 
34
- 1. Create `skills/<skill-name>/SKILL.md` with frontmatter:
56
+ 1. Create a branch: `git checkout -b feat/add-<skill-name>`
57
+ 2. Add `skills/<skill-name>/SKILL.md` with frontmatter:
35
58
  ```markdown
36
59
  ---
37
60
  name: skill-name
@@ -40,21 +63,23 @@ npx @trendai-crem/claude-skills
40
63
 
41
64
  # Skill content here
42
65
  ```
43
- 2. Commit and push
44
- 3. Bump the npm version: `npm version patch && npm publish`
66
+ 3. Commit, push, and open a PR to `main`
67
+ 4. Bump version in PR: `npm version minor`
68
+ 5. Merging to `main` triggers automated publish via CI
45
69
 
46
- ### Updating the package version
70
+ ### Version bumping
47
71
 
48
72
  ```bash
49
- npm version patch # bug fixes
73
+ npm version patch # bug fixes / skill content updates
50
74
  npm version minor # new skills added
51
75
  npm version major # breaking changes
52
- npm publish
53
76
  ```
54
77
 
78
+ Push to `main` — CI handles the publish automatically.
79
+
55
80
  ### External skill sources
56
81
 
57
- Configured in `cli.js` under `EXTERNAL_SOURCES`. To add or remove external sources, edit that array and publish a new version.
82
+ Configured in `cli.js` under `EXTERNAL_SOURCES`. Edit the array and bump the version to add or remove external sources.
58
83
 
59
84
  ## Requirements
60
85
 
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, readdirSync } 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
 
@@ -28,12 +29,21 @@ const externalResults = EXTERNAL_SOURCES.map(({ repo, flags, label }) =>
28
29
  );
29
30
 
30
31
  // 2. Team skills — required, overrides same-named externals
32
+ const teamSkills = readdirSync(join(__dir, 'skills'), { withFileTypes: true })
33
+ .filter(e => e.isDirectory())
34
+ .map(e => e.name)
35
+ .sort();
36
+
31
37
  const teamOk = run(['skills', 'add', __dir, '--all', '-g', '-y'], 'team skills');
32
38
 
33
39
  // Summary
34
40
  console.log('\nResults:');
35
- [...externalResults, { label: 'team skills', ok: teamOk }]
36
- .forEach(({ label, ok }) => console.log(` ${ok ? '✓' : '✗'} ${label}`));
41
+ externalResults.forEach(({ label, ok }) => console.log(` ${ok ? '' : '✗'} ${label}`));
42
+ if (teamOk) {
43
+ teamSkills.forEach(name => console.log(` ✓ ${name}`));
44
+ } else {
45
+ console.log(` ✗ team skills`);
46
+ }
37
47
 
38
48
  if (!teamOk) {
39
49
  console.error('\nFATAL: Team skills installation failed.');
@@ -44,3 +54,14 @@ const externalFailed = externalResults.filter(r => !r.ok);
44
54
  if (externalFailed.length > 0) {
45
55
  console.warn(`\nWARN: ${externalFailed.length} external source(s) failed — team skills installed successfully.`);
46
56
  }
57
+
58
+ // Check for updates
59
+ try {
60
+ const { version: current } = JSON.parse(readFileSync(join(__dir, 'package.json'), 'utf8'));
61
+ const res = await fetch('https://registry.npmjs.org/@trendai-crem/claude-skills/latest');
62
+ const { version: latest } = await res.json();
63
+ if (current !== latest) {
64
+ console.log(`\nUpdate available: ${current} → ${latest}`);
65
+ console.log(`Run: npx @trendai-crem/claude-skills@latest`);
66
+ }
67
+ } 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.4.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