From labyrinthe-acli
Manage multiple Atlassian site profiles for switching between Jira instances within a Claude Code session. Create, list, switch, show, and delete named profiles. WHEN: switch profile, change site, switch jira, switch atlassian, add profile, list profiles, which profile, current site, multi-site, multi-tenant, acli profile, add account, switch account.
How this skill is triggered — by the user, by Claude, or both
Slash command
/labyrinthe-acli:acli-profileThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Manages named profiles for multiple Atlassian sites/accounts, enabling seamless switching within a single Claude Code session.
Manages named profiles for multiple Atlassian sites/accounts, enabling seamless switching within a single Claude Code session.
$ACLI_SITE is not setProfiles are stored in ~/.config/acli-claude/profiles.json. The active profile's site and email are written to $CLAUDE_ENV_FILE so all subsequent ACLI commands automatically target the correct site.
See profile-schema.md for the JSON schema.
PYTHON=$(command -v python3 2>/dev/null || command -v python 2>/dev/null)
$PYTHON -c "
import json, os, sys
path = os.path.expanduser('~/.config/acli-claude/profiles.json')
try:
data = json.load(open(path))
except FileNotFoundError:
print('No profiles configured. Use /acli-profile to create one.')
sys.exit(0)
active = data.get('active', '')
if active and active in data.get('profiles', {}):
p = data['profiles'][active]
print(f'Active profile: {active}')
print(f' Site: {p[\"site\"]}')
print(f' Email: {p[\"email\"]}')
print(f' Desc: {p.get(\"description\", \"\")}')
else:
print('No active profile set.')
"
PYTHON=$(command -v python3 2>/dev/null || command -v python 2>/dev/null)
$PYTHON -c "
import json, os
path = os.path.expanduser('~/.config/acli-claude/profiles.json')
try:
data = json.load(open(path))
except FileNotFoundError:
print('No profiles configured.')
raise SystemExit(0)
active = data.get('active', '')
for name, p in data.get('profiles', {}).items():
marker = ' (active)' if name == active else ''
print(f'{name}{marker}: {p[\"site\"]} ({p[\"email\"]})')
"
Replace PROFILE_NAME, SITE, EMAIL, and DESCRIPTION with actual values from the user.
PYTHON=$(command -v python3 2>/dev/null || command -v python 2>/dev/null)
$PYTHON -c "
import json, os
path = os.path.expanduser('~/.config/acli-claude/profiles.json')
os.makedirs(os.path.dirname(path), exist_ok=True)
try:
data = json.load(open(path))
except (FileNotFoundError, json.JSONDecodeError):
data = {'active': '', 'profiles': {}}
data['profiles']['PROFILE_NAME'] = {
'site': 'SITE.atlassian.net',
'email': 'EMAIL',
'token': 'TOKEN',
'description': 'DESCRIPTION'
}
# Note: 'token' is optional. Omit the key or set to '' if the user does not provide one.
if not data['active']:
data['active'] = 'PROFILE_NAME'
json.dump(data, open(path, 'w'), indent=2)
print('Profile PROFILE_NAME created.')
"
After creating, if this is the first or active profile, update the session environment:
echo "export ACLI_ACTIVE_PROFILE=\"PROFILE_NAME\"" >> "$CLAUDE_ENV_FILE"
echo "export ACLI_SITE=\"SITE.atlassian.net\"" >> "$CLAUDE_ENV_FILE"
echo "export ACLI_EMAIL=\"EMAIL\"" >> "$CLAUDE_ENV_FILE"
# Only export ACLI_TOKEN if the user provided a token:
echo "export ACLI_TOKEN=\"TOKEN\"" >> "$CLAUDE_ENV_FILE"
Replace TARGET_PROFILE with the profile name.
PYTHON=$(command -v python3 2>/dev/null || command -v python 2>/dev/null)
$PYTHON -c "
import json, os, sys
path = os.path.expanduser('~/.config/acli-claude/profiles.json')
data = json.load(open(path))
target = 'TARGET_PROFILE'
if target not in data.get('profiles', {}):
print(f'Profile \"{target}\" not found. Available: {list(data[\"profiles\"].keys())}')
sys.exit(1)
data['active'] = target
json.dump(data, open(path, 'w'), indent=2)
p = data['profiles'][target]
print(f'Switched to {target}: {p[\"site\"]} ({p[\"email\"]})')
"
# Update session environment immediately
echo "export ACLI_ACTIVE_PROFILE=\"TARGET_PROFILE\"" >> "$CLAUDE_ENV_FILE"
echo "export ACLI_SITE=\"SITE\"" >> "$CLAUDE_ENV_FILE"
echo "export ACLI_EMAIL=\"EMAIL\"" >> "$CLAUDE_ENV_FILE"
# Only export ACLI_TOKEN if the profile has a token:
echo "export ACLI_TOKEN=\"TOKEN\"" >> "$CLAUDE_ENV_FILE"
Replace PROFILE_NAME with the profile to delete. Always confirm with the user first.
PYTHON=$(command -v python3 2>/dev/null || command -v python 2>/dev/null)
$PYTHON -c "
import json, os
path = os.path.expanduser('~/.config/acli-claude/profiles.json')
data = json.load(open(path))
name = 'PROFILE_NAME'
if name in data.get('profiles', {}):
del data['profiles'][name]
if data.get('active') == name:
data['active'] = next(iter(data['profiles']), '')
json.dump(data, open(path, 'w'), indent=2)
print(f'Profile \"{name}\" deleted.')
if data['active']:
print(f'Active profile is now: {data[\"active\"]}')
else:
print(f'Profile \"{name}\" not found.')
"
$CLAUDE_ENV_FILE so subsequent commands use the new sitesite field should be a valid Atlassian site (e.g., mysite.atlassian.net)$(command -v python3 2>/dev/null || command -v python 2>/dev/null)token field is optional. It is only needed for Confluence page create/update/delete and CQL search operations that use the REST API directly. If the user does not provide a token, omit the field or leave it empty.$ACLI_SITE automatically$ACLI_SITE and $ACLI_TOKENnpx claudepluginhub charlesmatte/atlassian-cli-skills --plugin labyrinthe-acliReferences Atlassian CLI (acli) commands for Jira: authenticate, create/view/edit issues, JQL searches, bulk operations, project/board/sprint management.
Manages Jira Cloud issues via jira CLI with JSON output: create, view, update, search issues, fetch hierarchies, manage sprints.
Interact with Atlassian Jira and Confluence via REST APIs. Create, edit, search, and transition Jira issues; read and write Confluence pages. No MCP server needed.