plugins/lisa/skills/setup-jira/SKILL.md
Configure JIRA as the destination tracker for this project. Writes `jira.project` into `.lisa.config.json` and offers to set top-level `tracker: "jira"`. Depends on /lisa:setup:atlassian — atlassian.cloudId must already be present, otherwise this skill stops and instructs the user to run setup-atlassian first. Idempotent.
npx skillsauth add codyswanngt/lisa setup-jiraInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Set the JIRA project key and (optionally) make JIRA this project's destination tracker.
cloudid=$(jq -r '.atlassian.cloudId // empty' .lisa.config.json 2>/dev/null)
if [ -z "$cloudid" ]; then
echo "Error: atlassian.cloudId not set. Run /lisa:setup:atlassian first." >&2
exit 1
fi
If atlassian is missing, invoke /lisa:setup-atlassian via the Skill tool first, then resume.
Honor any --project=KEY argument. Otherwise, list projects via the active access substrate:
acli jira project list --output jsonmcp__plugin_atlassian_atlassian__getVisibleJiraProjects with cloudId=$cloudidIf only one project is returned, pick it. If multiple, present them via AskUserQuestion (label = project key, description = project name) so the user picks the one this project should target.
Lisa's build lifecycle uses three role-keyed statuses (ready → claimed → done[env]). Defaults are Ready, In Progress, and {dev: "On Dev", staging: "On Stg", production: "Done"}. Probe the project's workflow to confirm these exist; prompt for overrides if not.
# Fetch a sample ticket's available transitions (or use a project-level workflow scheme query)
# via lisa:atlassian-access operation: transitions key: <SAMPLE-KEY>
# Collect the union of status names visible in the project.
For each role:
Resolved instead of Done) → present the project's status list via AskUserQuestion and let the user pick which maps to the role.Collect overrides as a partial workflow map. ONLY write keys that differ from defaults — don't bloat the config with redundant values.
jira.project + overrides# Always write project key.
jq --arg key "$PROJECT_KEY" \
'.jira = ((.jira // {}) | .project = $key)' \
.lisa.config.json > .lisa.config.json.tmp \
&& mv .lisa.config.json.tmp .lisa.config.json
# Conditionally write workflow overrides (only if any role differs from default).
if [ -n "$WORKFLOW_OVERRIDES_JSON" ]; then
jq --argjson wf "$WORKFLOW_OVERRIDES_JSON" \
'.jira.workflow = $wf' \
.lisa.config.json > .lisa.config.json.tmp \
&& mv .lisa.config.json.tmp .lisa.config.json
fi
Confirm every resolved role's status name is actually reachable in the JIRA workflow. acli has no non-destructive workflow inspector (the workitem view --json transitions key is always null because acli doesn't pass expand=transitions), so verification cascades through three modes, each more invasive than the last.
Hash the workflow-mapping object plus the project key:
WORKFLOW_HASH=$(jq -c '{project: .jira.project, workflow: .jira.workflow}' .lisa.config.json | shasum -a 256 | awk '{print $1}')
CACHED=$(jq -r '.jira.verified_workflow_hash // empty' .lisa.config.local.json 2>/dev/null)
if [ "$WORKFLOW_HASH" = "$CACHED" ]; then
echo "Workflow already verified; skipping probe."
# proceed to Step 6
fi
The verification cache key lives in .lisa.config.local.json (per-developer, gitignored) because the workflow on disk might be stale relative to the user's local view of it.
Aggregate every status name ever observed in the project's ticket histories:
acli jira workitem search --jql "project = $PROJECT" --paginate --json \
| jq -r '[.[].changelog.histories[]?.items[]? | select(.field == "status") | .fromString, .toString] | unique[]' \
| sort -u > /tmp/lisa-observed-statuses.txt
For each role (ready, claimed, blocked, each done.<env>), check whether the resolved status name appears in the observed set. Roles that match are verified. Roles that don't are unverified — but that doesn't yet mean they're missing; freshly-added statuses simply haven't accumulated history.
If every role is verified, cache the hash and proceed to Step 6.
For any role left unverified by Mode A, fall back to creating a throwaway ticket and walking it through.
Prompt via AskUserQuestion:
Mode A could not verify these roles:
<list>. Create a synthetic probe ticket to verify (recommended), or designate an existing ticket to use as the probe?
If user picks synthetic:
# Create a probe ticket. Title makes its purpose obvious so a teammate doesn't act on it.
PROBE_KEY=$(acli jira workitem create \
--project "$PROJECT" \
--type Task \
--summary "lisa-setup-probe (DELETE ME)" \
--description "Created by /lisa:setup:jira to verify workflow status reachability. Safe to delete." \
--json \
| jq -r '.key')
trap 'acli jira workitem delete --key "$PROBE_KEY" --yes 2>/dev/null || acli jira workitem archive --key "$PROBE_KEY" --yes 2>/dev/null' EXIT
# Walk through every unverified role's status in order.
for status in $UNVERIFIED_STATUSES; do
if ! acli jira workitem transition --key "$PROBE_KEY" --status "$status" --yes 2>/dev/null; then
echo "Error: status '$status' is not reachable in the workflow from the probe ticket's current state." >&2
# Mark this role as missing; continue with remaining roles where possible (skip if transition is from a state we couldn't reach).
break
fi
done
# trap handles cleanup
If acli jira workitem create fails because the project has required fields, surface the field list and instruct the user to either (a) fill them in via --field/--from-json, (b) temporarily relax the required-fields configuration, or (c) fall through to Mode C.
If Mode B can't create a probe (mandatory fields, permission, etc.), prompt the user to designate a low-stakes existing ticket:
Provide a ticket key in
To Do(or wherever you want to start the probe). I'll walk it through the unverified statuses and revert.
Capture the ticket's starting status; walk through the unverified chain; revert to the starting status at the end. Use trap to ensure revert runs even on error.
Once all roles are verified by some combination of A/B/C, cache the result:
jq --arg hash "$WORKFLOW_HASH" \
'.jira = ((.jira // {}) | .verified_workflow_hash = $hash)' \
.lisa.config.local.json > .lisa.config.local.json.tmp \
&& mv .lisa.config.local.json.tmp .lisa.config.local.json
If any role is unreachable after all three modes, stop and surface a concrete admin-task message (which transition needs to be added, between which two statuses, in which workflow). Do not write a config that points at unreachable transitions.
Independent of role reachability, confirm the lifecycle's required transition graph is intact: ready → claimed, claimed → done.<env> for each env. Mode A's changelog includes paired (fromString, toString) entries — count any pair that matches a required transition as verified. Modes B and C do this implicitly by walking the chain in order. If any required transition is missing (e.g., claimed → done.staging requires going through review first per the workflow), surface and stop with an admin remediation.
trackerIf .tracker is unset or differs from "jira", ask via AskUserQuestion:
JIRA project
<KEY>written. Set top-leveltracker: "jira"so all vendor-neutral skills target JIRA?
Recommend "Yes" unless the project is using a different destination (e.g., GitHub Issues for build-queue but JIRA for read-only mirror — rare).
If yes:
jq '.tracker = "jira"' .lisa.config.json > .lisa.config.json.tmp \
&& mv .lisa.config.json.tmp .lisa.config.json
jq -e '.jira.project' .lisa.config.json >/dev/null
jq -e '.tracker' .lisa.config.json >/dev/null # if user said yes in step 7
Report success with the resolved project key, the workflow mapping (defaults vs. overrides), and whether tracker was set.
jira.project cleanly (jq merge, not append).tracker if it's already "jira".verified_workflow_hash cache in .lisa.config.local.json. Editing any role name invalidates the cache and re-runs the probe.tracker without explicit user confirmation — tracker is project-wide and switching it changes every downstream skill's behavior..lisa.config.json.documentation
Onboard a user to the project via its LLM Wiki. Interviews the user about themselves in relation to the project, captures that to project-scoped memory only, then gives a guided tour of what the project is and sample questions they can ask. Use when someone is new to the project or asks to be onboarded. Read-mostly — it does not open PRs or write PII into the wiki.
documentation
Migrate an existing, hand-rolled wiki implementation onto the lisa-wiki kernel — phased and compatibility-first, with a strict no-loss guarantee. Use when adopting lisa-wiki in a repo that already has its own wiki/, ingest skills, docs, or roles. Renaming things into the canonical shape is fine; losing functionality or data is not. Ends by running /doctor.
development
Health-check the LLM Wiki. Reports orphan pages, contradictions, stale claims, broken internal links, missing index/log coverage, structure-manifest violations, and secret/tenant leaks. Use periodically or before hardening a wiki. Read-only — it reports findings, it does not fix them.
testing
Ingest source material into the LLM Wiki. With an argument (URL, file path, or prompt) it ingests that one source; with no argument it runs a full ingest across every enabled non-external-write source. Routes to the right connector, then runs the ordered pipeline (source note → synthesis → index → log → verify → state → commit/PR). Use whenever new knowledge should enter the wiki.