@codyswann/lisa 1.56.0 → 1.56.2
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.
- package/.claude-plugin/marketplace.json +11 -5
- package/all/merge/.claude/settings.json +7 -0
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +148 -0
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +3 -159
- package/plugins/lisa-expo/.claude-plugin/plugin.json +2 -146
- package/plugins/lisa-expo/commands/jira/add-journey.md +1 -1
- package/plugins/lisa-expo/commands/jira/create.md +1 -1
- package/plugins/lisa-expo/commands/jira/evidence.md +1 -1
- package/plugins/lisa-expo/commands/jira/journey.md +1 -1
- package/plugins/lisa-expo/commands/jira/verify.md +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +3 -159
- package/plugins/lisa-rails/.claude-plugin/plugin.json +2 -120
- package/plugins/lisa-rails/commands/jira/add-journey.md +1 -1
- package/plugins/lisa-rails/commands/jira/create.md +1 -1
- package/plugins/lisa-rails/commands/jira/evidence.md +1 -1
- package/plugins/lisa-rails/commands/jira/journey.md +1 -1
- package/plugins/lisa-rails/commands/jira/verify.md +1 -1
- package/plugins/lisa-rails/commands/plan/add-test-coverage.md +1 -1
- package/plugins/lisa-rails/commands/plan/fix-linter-error.md +1 -1
- package/plugins/lisa-rails/commands/plan/lower-code-complexity.md +1 -1
- package/plugins/lisa-rails/commands/plan/reduce-max-lines-per-function.md +1 -1
- package/plugins/lisa-rails/commands/plan/reduce-max-lines.md +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +2 -127
- package/plugins/src/base/.claude-plugin/plugin.json +78 -0
- package/plugins/src/cdk/.claude-plugin/plugin.json +2 -81
- package/plugins/src/expo/.claude-plugin/plugin.json +1 -68
- package/plugins/{lisa-typescript → src/expo}/commands/jira/add-journey.md +1 -1
- package/plugins/{lisa-nestjs → src/expo}/commands/jira/create.md +1 -1
- package/plugins/{lisa-nestjs → src/expo}/commands/jira/evidence.md +1 -1
- package/plugins/{lisa-nestjs → src/expo}/commands/jira/journey.md +1 -1
- package/plugins/{lisa-nestjs → src/expo}/commands/jira/verify.md +1 -1
- package/plugins/src/nestjs/.claude-plugin/plugin.json +2 -81
- package/plugins/src/rails/.claude-plugin/plugin.json +1 -59
- package/plugins/{lisa-nestjs → src/rails}/commands/jira/add-journey.md +1 -1
- package/plugins/{lisa-typescript → src/rails}/commands/jira/create.md +1 -1
- package/plugins/{lisa-typescript → src/rails}/commands/jira/evidence.md +1 -1
- package/plugins/{lisa-typescript → src/rails}/commands/jira/journey.md +1 -1
- package/plugins/{lisa-typescript → src/rails}/commands/jira/verify.md +1 -1
- package/plugins/{lisa-expo → src/rails}/commands/plan/add-test-coverage.md +1 -1
- package/plugins/{lisa-expo → src/rails}/commands/plan/fix-linter-error.md +1 -1
- package/plugins/{lisa-expo → src/rails}/commands/plan/lower-code-complexity.md +1 -1
- package/plugins/{lisa-expo → src/rails}/commands/plan/reduce-max-lines-per-function.md +1 -1
- package/plugins/{lisa-expo → src/rails}/commands/plan/reduce-max-lines.md +1 -1
- package/plugins/src/typescript/.claude-plugin/plugin.json +1 -58
- package/scripts/build-plugins.sh +30 -17
- package/scripts/install-claude-plugins.sh +28 -11
- package/typescript/merge/.claude/settings.json +2 -2
- package/typescript/package-lisa/package.lisa.json +2 -1
- package/plugins/lisa-expo/agents/agent-architect.md +0 -310
- package/plugins/lisa-expo/agents/architecture-specialist.md +0 -53
- package/plugins/lisa-expo/agents/debug-specialist.md +0 -204
- package/plugins/lisa-expo/agents/git-history-analyzer.md +0 -183
- package/plugins/lisa-expo/agents/hooks-expert.md +0 -74
- package/plugins/lisa-expo/agents/implementer.md +0 -54
- package/plugins/lisa-expo/agents/learner.md +0 -44
- package/plugins/lisa-expo/agents/performance-specialist.md +0 -95
- package/plugins/lisa-expo/agents/product-specialist.md +0 -72
- package/plugins/lisa-expo/agents/quality-specialist.md +0 -55
- package/plugins/lisa-expo/agents/security-specialist.md +0 -58
- package/plugins/lisa-expo/agents/skill-evaluator.md +0 -246
- package/plugins/lisa-expo/agents/slash-command-architect.md +0 -87
- package/plugins/lisa-expo/agents/test-specialist.md +0 -64
- package/plugins/lisa-expo/agents/verification-specialist.md +0 -189
- package/plugins/lisa-expo/agents/web-search-researcher.md +0 -112
- package/plugins/lisa-expo/commands/git/commit-and-submit-pr.md +0 -7
- package/plugins/lisa-expo/commands/git/commit-submit-pr-and-verify.md +0 -7
- package/plugins/lisa-expo/commands/git/commit-submit-pr-deploy-and-verify.md +0 -7
- package/plugins/lisa-expo/commands/git/commit.md +0 -7
- package/plugins/lisa-expo/commands/git/prune.md +0 -6
- package/plugins/lisa-expo/commands/git/submit-pr.md +0 -7
- package/plugins/lisa-expo/commands/jira/fix.md +0 -7
- package/plugins/lisa-expo/commands/jira/implement.md +0 -7
- package/plugins/lisa-expo/commands/jira/sync.md +0 -7
- package/plugins/lisa-expo/commands/plan/create.md +0 -6
- package/plugins/lisa-expo/commands/plan/execute.md +0 -7
- package/plugins/lisa-expo/commands/plan/local-code-review.md +0 -6
- package/plugins/lisa-expo/commands/pull-request/review.md +0 -7
- package/plugins/lisa-expo/commands/review/implementation.md +0 -7
- package/plugins/lisa-expo/commands/security/zap-scan.md +0 -6
- package/plugins/lisa-expo/commands/sonarqube/check.md +0 -6
- package/plugins/lisa-expo/commands/sonarqube/fix.md +0 -6
- package/plugins/lisa-expo/commands/tasks/load.md +0 -7
- package/plugins/lisa-expo/commands/tasks/sync.md +0 -7
- package/plugins/lisa-expo/hooks/debug-hook.sh +0 -47
- package/plugins/lisa-expo/hooks/enforce-plan-rules.sh +0 -15
- package/plugins/lisa-expo/hooks/format-on-edit.sh +0 -76
- package/plugins/lisa-expo/hooks/install-pkgs.sh +0 -64
- package/plugins/lisa-expo/hooks/lint-on-edit.sh +0 -81
- package/plugins/lisa-expo/hooks/notify-ntfy.sh +0 -183
- package/plugins/lisa-expo/hooks/setup-jira-cli.sh +0 -52
- package/plugins/lisa-expo/hooks/sg-scan-on-edit.sh +0 -68
- package/plugins/lisa-expo/hooks/sync-tasks.sh +0 -107
- package/plugins/lisa-expo/hooks/ticket-sync-reminder.sh +0 -23
- package/plugins/lisa-expo/hooks/track-plan-sessions.sh +0 -164
- package/plugins/lisa-expo/hooks/verify-completion.sh +0 -77
- package/plugins/lisa-expo/rules/README.md +0 -240
- package/plugins/lisa-expo/rules/coding-philosophy.md +0 -428
- package/plugins/lisa-expo/rules/lisa.md +0 -37
- package/plugins/lisa-expo/rules/verfication.md +0 -596
- package/plugins/lisa-expo/skills/agent-design-best-practices/SKILL.md +0 -219
- package/plugins/lisa-expo/skills/git-commit/SKILL.md +0 -48
- package/plugins/lisa-expo/skills/git-commit-and-submit-pr/SKILL.md +0 -8
- package/plugins/lisa-expo/skills/git-commit-submit-pr-and-verify/SKILL.md +0 -7
- package/plugins/lisa-expo/skills/git-commit-submit-pr-deploy-and-verify/SKILL.md +0 -7
- package/plugins/lisa-expo/skills/git-prune/SKILL.md +0 -35
- package/plugins/lisa-expo/skills/git-submit-pr/SKILL.md +0 -44
- package/plugins/lisa-expo/skills/jira-fix/SKILL.md +0 -16
- package/plugins/lisa-expo/skills/jira-implement/SKILL.md +0 -18
- package/plugins/lisa-expo/skills/jira-sync/SKILL.md +0 -63
- package/plugins/lisa-expo/skills/jsdoc-best-practices/SKILL.md +0 -432
- package/plugins/lisa-expo/skills/lisa-review-implementation/SKILL.md +0 -209
- package/plugins/lisa-expo/skills/plan-add-test-coverage/SKILL.md +0 -44
- package/plugins/lisa-expo/skills/plan-execute/SKILL.md +0 -89
- package/plugins/lisa-expo/skills/plan-fix-linter-error/SKILL.md +0 -45
- package/plugins/lisa-expo/skills/plan-local-code-review/SKILL.md +0 -88
- package/plugins/lisa-expo/skills/plan-lower-code-complexity/SKILL.md +0 -44
- package/plugins/lisa-expo/skills/plan-reduce-max-lines/SKILL.md +0 -45
- package/plugins/lisa-expo/skills/plan-reduce-max-lines-per-function/SKILL.md +0 -46
- package/plugins/lisa-expo/skills/pull-request-review/SKILL.md +0 -68
- package/plugins/lisa-expo/skills/security-zap-scan/SKILL.md +0 -33
- package/plugins/lisa-expo/skills/sonarqube-check/SKILL.md +0 -11
- package/plugins/lisa-expo/skills/sonarqube-fix/SKILL.md +0 -8
- package/plugins/lisa-expo/skills/tasks-load/SKILL.md +0 -88
- package/plugins/lisa-expo/skills/tasks-sync/SKILL.md +0 -108
- package/plugins/lisa-nestjs/agents/agent-architect.md +0 -310
- package/plugins/lisa-nestjs/agents/architecture-specialist.md +0 -53
- package/plugins/lisa-nestjs/agents/debug-specialist.md +0 -204
- package/plugins/lisa-nestjs/agents/git-history-analyzer.md +0 -183
- package/plugins/lisa-nestjs/agents/hooks-expert.md +0 -74
- package/plugins/lisa-nestjs/agents/implementer.md +0 -54
- package/plugins/lisa-nestjs/agents/learner.md +0 -44
- package/plugins/lisa-nestjs/agents/performance-specialist.md +0 -95
- package/plugins/lisa-nestjs/agents/product-specialist.md +0 -72
- package/plugins/lisa-nestjs/agents/quality-specialist.md +0 -55
- package/plugins/lisa-nestjs/agents/security-specialist.md +0 -58
- package/plugins/lisa-nestjs/agents/skill-evaluator.md +0 -246
- package/plugins/lisa-nestjs/agents/slash-command-architect.md +0 -87
- package/plugins/lisa-nestjs/agents/test-specialist.md +0 -64
- package/plugins/lisa-nestjs/agents/verification-specialist.md +0 -189
- package/plugins/lisa-nestjs/agents/web-search-researcher.md +0 -112
- package/plugins/lisa-nestjs/commands/git/commit-and-submit-pr.md +0 -7
- package/plugins/lisa-nestjs/commands/git/commit-submit-pr-and-verify.md +0 -7
- package/plugins/lisa-nestjs/commands/git/commit-submit-pr-deploy-and-verify.md +0 -7
- package/plugins/lisa-nestjs/commands/git/commit.md +0 -7
- package/plugins/lisa-nestjs/commands/git/prune.md +0 -6
- package/plugins/lisa-nestjs/commands/git/submit-pr.md +0 -7
- package/plugins/lisa-nestjs/commands/jira/fix.md +0 -7
- package/plugins/lisa-nestjs/commands/jira/implement.md +0 -7
- package/plugins/lisa-nestjs/commands/jira/sync.md +0 -7
- package/plugins/lisa-nestjs/commands/plan/add-test-coverage.md +0 -7
- package/plugins/lisa-nestjs/commands/plan/create.md +0 -6
- package/plugins/lisa-nestjs/commands/plan/execute.md +0 -7
- package/plugins/lisa-nestjs/commands/plan/fix-linter-error.md +0 -7
- package/plugins/lisa-nestjs/commands/plan/local-code-review.md +0 -6
- package/plugins/lisa-nestjs/commands/plan/lower-code-complexity.md +0 -6
- package/plugins/lisa-nestjs/commands/plan/reduce-max-lines-per-function.md +0 -7
- package/plugins/lisa-nestjs/commands/plan/reduce-max-lines.md +0 -7
- package/plugins/lisa-nestjs/commands/pull-request/review.md +0 -7
- package/plugins/lisa-nestjs/commands/review/implementation.md +0 -7
- package/plugins/lisa-nestjs/commands/security/zap-scan.md +0 -6
- package/plugins/lisa-nestjs/commands/sonarqube/check.md +0 -6
- package/plugins/lisa-nestjs/commands/sonarqube/fix.md +0 -6
- package/plugins/lisa-nestjs/commands/tasks/load.md +0 -7
- package/plugins/lisa-nestjs/commands/tasks/sync.md +0 -7
- package/plugins/lisa-nestjs/hooks/debug-hook.sh +0 -47
- package/plugins/lisa-nestjs/hooks/enforce-plan-rules.sh +0 -15
- package/plugins/lisa-nestjs/hooks/format-on-edit.sh +0 -76
- package/plugins/lisa-nestjs/hooks/install-pkgs.sh +0 -64
- package/plugins/lisa-nestjs/hooks/lint-on-edit.sh +0 -81
- package/plugins/lisa-nestjs/hooks/notify-ntfy.sh +0 -183
- package/plugins/lisa-nestjs/hooks/setup-jira-cli.sh +0 -52
- package/plugins/lisa-nestjs/hooks/sg-scan-on-edit.sh +0 -68
- package/plugins/lisa-nestjs/hooks/sync-tasks.sh +0 -107
- package/plugins/lisa-nestjs/hooks/ticket-sync-reminder.sh +0 -23
- package/plugins/lisa-nestjs/hooks/track-plan-sessions.sh +0 -164
- package/plugins/lisa-nestjs/hooks/verify-completion.sh +0 -77
- package/plugins/lisa-nestjs/rules/README.md +0 -240
- package/plugins/lisa-nestjs/rules/coding-philosophy.md +0 -428
- package/plugins/lisa-nestjs/rules/lisa.md +0 -37
- package/plugins/lisa-nestjs/rules/verfication.md +0 -596
- package/plugins/lisa-nestjs/skills/agent-design-best-practices/SKILL.md +0 -219
- package/plugins/lisa-nestjs/skills/git-commit/SKILL.md +0 -48
- package/plugins/lisa-nestjs/skills/git-commit-and-submit-pr/SKILL.md +0 -8
- package/plugins/lisa-nestjs/skills/git-commit-submit-pr-and-verify/SKILL.md +0 -7
- package/plugins/lisa-nestjs/skills/git-commit-submit-pr-deploy-and-verify/SKILL.md +0 -7
- package/plugins/lisa-nestjs/skills/git-prune/SKILL.md +0 -35
- package/plugins/lisa-nestjs/skills/git-submit-pr/SKILL.md +0 -44
- package/plugins/lisa-nestjs/skills/jira-add-journey/SKILL.md +0 -120
- package/plugins/lisa-nestjs/skills/jira-create/SKILL.md +0 -95
- package/plugins/lisa-nestjs/skills/jira-evidence/SKILL.md +0 -73
- package/plugins/lisa-nestjs/skills/jira-evidence/scripts/post-evidence.sh +0 -163
- package/plugins/lisa-nestjs/skills/jira-fix/SKILL.md +0 -16
- package/plugins/lisa-nestjs/skills/jira-implement/SKILL.md +0 -18
- package/plugins/lisa-nestjs/skills/jira-journey/SKILL.md +0 -125
- package/plugins/lisa-nestjs/skills/jira-journey/scripts/generate-templates.py +0 -233
- package/plugins/lisa-nestjs/skills/jira-journey/scripts/parse-plan.py +0 -368
- package/plugins/lisa-nestjs/skills/jira-sync/SKILL.md +0 -63
- package/plugins/lisa-nestjs/skills/jira-verify/SKILL.md +0 -48
- package/plugins/lisa-nestjs/skills/jsdoc-best-practices/SKILL.md +0 -432
- package/plugins/lisa-nestjs/skills/lisa-review-implementation/SKILL.md +0 -209
- package/plugins/lisa-nestjs/skills/plan-add-test-coverage/SKILL.md +0 -44
- package/plugins/lisa-nestjs/skills/plan-execute/SKILL.md +0 -89
- package/plugins/lisa-nestjs/skills/plan-fix-linter-error/SKILL.md +0 -45
- package/plugins/lisa-nestjs/skills/plan-local-code-review/SKILL.md +0 -88
- package/plugins/lisa-nestjs/skills/plan-lower-code-complexity/SKILL.md +0 -44
- package/plugins/lisa-nestjs/skills/plan-reduce-max-lines/SKILL.md +0 -45
- package/plugins/lisa-nestjs/skills/plan-reduce-max-lines-per-function/SKILL.md +0 -46
- package/plugins/lisa-nestjs/skills/pull-request-review/SKILL.md +0 -68
- package/plugins/lisa-nestjs/skills/security-zap-scan/SKILL.md +0 -33
- package/plugins/lisa-nestjs/skills/sonarqube-check/SKILL.md +0 -11
- package/plugins/lisa-nestjs/skills/sonarqube-fix/SKILL.md +0 -8
- package/plugins/lisa-nestjs/skills/tasks-load/SKILL.md +0 -88
- package/plugins/lisa-nestjs/skills/tasks-sync/SKILL.md +0 -108
- package/plugins/lisa-rails/agents/agent-architect.md +0 -310
- package/plugins/lisa-rails/agents/architecture-specialist.md +0 -53
- package/plugins/lisa-rails/agents/debug-specialist.md +0 -204
- package/plugins/lisa-rails/agents/git-history-analyzer.md +0 -183
- package/plugins/lisa-rails/agents/hooks-expert.md +0 -74
- package/plugins/lisa-rails/agents/implementer.md +0 -54
- package/plugins/lisa-rails/agents/learner.md +0 -44
- package/plugins/lisa-rails/agents/performance-specialist.md +0 -95
- package/plugins/lisa-rails/agents/product-specialist.md +0 -72
- package/plugins/lisa-rails/agents/quality-specialist.md +0 -55
- package/plugins/lisa-rails/agents/security-specialist.md +0 -58
- package/plugins/lisa-rails/agents/skill-evaluator.md +0 -246
- package/plugins/lisa-rails/agents/slash-command-architect.md +0 -87
- package/plugins/lisa-rails/agents/test-specialist.md +0 -64
- package/plugins/lisa-rails/agents/verification-specialist.md +0 -189
- package/plugins/lisa-rails/agents/web-search-researcher.md +0 -112
- package/plugins/lisa-rails/commands/git/commit-and-submit-pr.md +0 -7
- package/plugins/lisa-rails/commands/git/commit-submit-pr-and-verify.md +0 -7
- package/plugins/lisa-rails/commands/git/commit-submit-pr-deploy-and-verify.md +0 -7
- package/plugins/lisa-rails/commands/git/commit.md +0 -7
- package/plugins/lisa-rails/commands/git/prune.md +0 -6
- package/plugins/lisa-rails/commands/git/submit-pr.md +0 -7
- package/plugins/lisa-rails/commands/jira/fix.md +0 -7
- package/plugins/lisa-rails/commands/jira/implement.md +0 -7
- package/plugins/lisa-rails/commands/jira/sync.md +0 -7
- package/plugins/lisa-rails/commands/plan/create.md +0 -6
- package/plugins/lisa-rails/commands/plan/execute.md +0 -7
- package/plugins/lisa-rails/commands/plan/local-code-review.md +0 -6
- package/plugins/lisa-rails/commands/pull-request/review.md +0 -7
- package/plugins/lisa-rails/commands/review/implementation.md +0 -7
- package/plugins/lisa-rails/commands/security/zap-scan.md +0 -6
- package/plugins/lisa-rails/commands/sonarqube/check.md +0 -6
- package/plugins/lisa-rails/commands/sonarqube/fix.md +0 -6
- package/plugins/lisa-rails/commands/tasks/load.md +0 -7
- package/plugins/lisa-rails/commands/tasks/sync.md +0 -7
- package/plugins/lisa-rails/hooks/debug-hook.sh +0 -47
- package/plugins/lisa-rails/hooks/enforce-plan-rules.sh +0 -15
- package/plugins/lisa-rails/hooks/format-on-edit.sh +0 -76
- package/plugins/lisa-rails/hooks/install-pkgs.sh +0 -64
- package/plugins/lisa-rails/hooks/lint-on-edit.sh +0 -81
- package/plugins/lisa-rails/hooks/notify-ntfy.sh +0 -183
- package/plugins/lisa-rails/hooks/setup-jira-cli.sh +0 -52
- package/plugins/lisa-rails/hooks/sg-scan-on-edit.sh +0 -68
- package/plugins/lisa-rails/hooks/sync-tasks.sh +0 -107
- package/plugins/lisa-rails/hooks/ticket-sync-reminder.sh +0 -23
- package/plugins/lisa-rails/hooks/track-plan-sessions.sh +0 -164
- package/plugins/lisa-rails/hooks/verify-completion.sh +0 -77
- package/plugins/lisa-rails/rules/README.md +0 -240
- package/plugins/lisa-rails/rules/coding-philosophy.md +0 -428
- package/plugins/lisa-rails/rules/verfication.md +0 -596
- package/plugins/lisa-rails/skills/agent-design-best-practices/SKILL.md +0 -219
- package/plugins/lisa-rails/skills/git-commit/SKILL.md +0 -48
- package/plugins/lisa-rails/skills/git-commit-and-submit-pr/SKILL.md +0 -8
- package/plugins/lisa-rails/skills/git-commit-submit-pr-and-verify/SKILL.md +0 -7
- package/plugins/lisa-rails/skills/git-commit-submit-pr-deploy-and-verify/SKILL.md +0 -7
- package/plugins/lisa-rails/skills/git-prune/SKILL.md +0 -35
- package/plugins/lisa-rails/skills/git-submit-pr/SKILL.md +0 -44
- package/plugins/lisa-rails/skills/jira-fix/SKILL.md +0 -16
- package/plugins/lisa-rails/skills/jira-implement/SKILL.md +0 -18
- package/plugins/lisa-rails/skills/jira-journey/scripts/generate-templates.py +0 -233
- package/plugins/lisa-rails/skills/jira-journey/scripts/parse-plan.py +0 -368
- package/plugins/lisa-rails/skills/jira-sync/SKILL.md +0 -63
- package/plugins/lisa-rails/skills/jsdoc-best-practices/SKILL.md +0 -432
- package/plugins/lisa-rails/skills/lisa-review-implementation/SKILL.md +0 -209
- package/plugins/lisa-rails/skills/plan-execute/SKILL.md +0 -89
- package/plugins/lisa-rails/skills/plan-local-code-review/SKILL.md +0 -88
- package/plugins/lisa-rails/skills/pull-request-review/SKILL.md +0 -68
- package/plugins/lisa-rails/skills/security-zap-scan/SKILL.md +0 -33
- package/plugins/lisa-rails/skills/sonarqube-check/SKILL.md +0 -11
- package/plugins/lisa-rails/skills/sonarqube-fix/SKILL.md +0 -8
- package/plugins/lisa-rails/skills/tasks-load/SKILL.md +0 -88
- package/plugins/lisa-rails/skills/tasks-sync/SKILL.md +0 -108
- package/plugins/lisa-typescript/agents/agent-architect.md +0 -310
- package/plugins/lisa-typescript/agents/architecture-specialist.md +0 -53
- package/plugins/lisa-typescript/agents/debug-specialist.md +0 -204
- package/plugins/lisa-typescript/agents/git-history-analyzer.md +0 -183
- package/plugins/lisa-typescript/agents/hooks-expert.md +0 -74
- package/plugins/lisa-typescript/agents/implementer.md +0 -54
- package/plugins/lisa-typescript/agents/learner.md +0 -44
- package/plugins/lisa-typescript/agents/performance-specialist.md +0 -95
- package/plugins/lisa-typescript/agents/product-specialist.md +0 -72
- package/plugins/lisa-typescript/agents/quality-specialist.md +0 -55
- package/plugins/lisa-typescript/agents/security-specialist.md +0 -58
- package/plugins/lisa-typescript/agents/skill-evaluator.md +0 -246
- package/plugins/lisa-typescript/agents/slash-command-architect.md +0 -87
- package/plugins/lisa-typescript/agents/test-specialist.md +0 -64
- package/plugins/lisa-typescript/agents/verification-specialist.md +0 -189
- package/plugins/lisa-typescript/agents/web-search-researcher.md +0 -112
- package/plugins/lisa-typescript/commands/git/commit-and-submit-pr.md +0 -7
- package/plugins/lisa-typescript/commands/git/commit-submit-pr-and-verify.md +0 -7
- package/plugins/lisa-typescript/commands/git/commit-submit-pr-deploy-and-verify.md +0 -7
- package/plugins/lisa-typescript/commands/git/commit.md +0 -7
- package/plugins/lisa-typescript/commands/git/prune.md +0 -6
- package/plugins/lisa-typescript/commands/git/submit-pr.md +0 -7
- package/plugins/lisa-typescript/commands/jira/fix.md +0 -7
- package/plugins/lisa-typescript/commands/jira/implement.md +0 -7
- package/plugins/lisa-typescript/commands/jira/sync.md +0 -7
- package/plugins/lisa-typescript/commands/plan/add-test-coverage.md +0 -7
- package/plugins/lisa-typescript/commands/plan/create.md +0 -6
- package/plugins/lisa-typescript/commands/plan/execute.md +0 -7
- package/plugins/lisa-typescript/commands/plan/fix-linter-error.md +0 -7
- package/plugins/lisa-typescript/commands/plan/local-code-review.md +0 -6
- package/plugins/lisa-typescript/commands/plan/lower-code-complexity.md +0 -6
- package/plugins/lisa-typescript/commands/plan/reduce-max-lines-per-function.md +0 -7
- package/plugins/lisa-typescript/commands/plan/reduce-max-lines.md +0 -7
- package/plugins/lisa-typescript/commands/pull-request/review.md +0 -7
- package/plugins/lisa-typescript/commands/review/implementation.md +0 -7
- package/plugins/lisa-typescript/commands/security/zap-scan.md +0 -6
- package/plugins/lisa-typescript/commands/sonarqube/check.md +0 -6
- package/plugins/lisa-typescript/commands/sonarqube/fix.md +0 -6
- package/plugins/lisa-typescript/commands/tasks/load.md +0 -7
- package/plugins/lisa-typescript/commands/tasks/sync.md +0 -7
- package/plugins/lisa-typescript/hooks/debug-hook.sh +0 -47
- package/plugins/lisa-typescript/hooks/enforce-plan-rules.sh +0 -15
- package/plugins/lisa-typescript/hooks/install-pkgs.sh +0 -64
- package/plugins/lisa-typescript/hooks/notify-ntfy.sh +0 -183
- package/plugins/lisa-typescript/hooks/setup-jira-cli.sh +0 -52
- package/plugins/lisa-typescript/hooks/sync-tasks.sh +0 -107
- package/plugins/lisa-typescript/hooks/ticket-sync-reminder.sh +0 -23
- package/plugins/lisa-typescript/hooks/track-plan-sessions.sh +0 -164
- package/plugins/lisa-typescript/hooks/verify-completion.sh +0 -77
- package/plugins/lisa-typescript/rules/README.md +0 -240
- package/plugins/lisa-typescript/rules/coding-philosophy.md +0 -428
- package/plugins/lisa-typescript/rules/verfication.md +0 -596
- package/plugins/lisa-typescript/skills/agent-design-best-practices/SKILL.md +0 -219
- package/plugins/lisa-typescript/skills/git-commit/SKILL.md +0 -48
- package/plugins/lisa-typescript/skills/git-commit-and-submit-pr/SKILL.md +0 -8
- package/plugins/lisa-typescript/skills/git-commit-submit-pr-and-verify/SKILL.md +0 -7
- package/plugins/lisa-typescript/skills/git-commit-submit-pr-deploy-and-verify/SKILL.md +0 -7
- package/plugins/lisa-typescript/skills/git-prune/SKILL.md +0 -35
- package/plugins/lisa-typescript/skills/git-submit-pr/SKILL.md +0 -44
- package/plugins/lisa-typescript/skills/jira-add-journey/SKILL.md +0 -120
- package/plugins/lisa-typescript/skills/jira-create/SKILL.md +0 -95
- package/plugins/lisa-typescript/skills/jira-evidence/SKILL.md +0 -73
- package/plugins/lisa-typescript/skills/jira-evidence/scripts/post-evidence.sh +0 -163
- package/plugins/lisa-typescript/skills/jira-fix/SKILL.md +0 -16
- package/plugins/lisa-typescript/skills/jira-implement/SKILL.md +0 -18
- package/plugins/lisa-typescript/skills/jira-journey/SKILL.md +0 -125
- package/plugins/lisa-typescript/skills/jira-journey/scripts/generate-templates.py +0 -233
- package/plugins/lisa-typescript/skills/jira-journey/scripts/parse-plan.py +0 -368
- package/plugins/lisa-typescript/skills/jira-sync/SKILL.md +0 -63
- package/plugins/lisa-typescript/skills/jira-verify/SKILL.md +0 -48
- package/plugins/lisa-typescript/skills/jsdoc-best-practices/SKILL.md +0 -432
- package/plugins/lisa-typescript/skills/lisa-review-implementation/SKILL.md +0 -209
- package/plugins/lisa-typescript/skills/plan-add-test-coverage/SKILL.md +0 -44
- package/plugins/lisa-typescript/skills/plan-execute/SKILL.md +0 -89
- package/plugins/lisa-typescript/skills/plan-fix-linter-error/SKILL.md +0 -45
- package/plugins/lisa-typescript/skills/plan-local-code-review/SKILL.md +0 -88
- package/plugins/lisa-typescript/skills/plan-lower-code-complexity/SKILL.md +0 -44
- package/plugins/lisa-typescript/skills/plan-reduce-max-lines/SKILL.md +0 -45
- package/plugins/lisa-typescript/skills/plan-reduce-max-lines-per-function/SKILL.md +0 -46
- package/plugins/lisa-typescript/skills/pull-request-review/SKILL.md +0 -68
- package/plugins/lisa-typescript/skills/security-zap-scan/SKILL.md +0 -33
- package/plugins/lisa-typescript/skills/sonarqube-check/SKILL.md +0 -11
- package/plugins/lisa-typescript/skills/sonarqube-fix/SKILL.md +0 -8
- package/plugins/lisa-typescript/skills/tasks-load/SKILL.md +0 -88
- package/plugins/lisa-typescript/skills/tasks-sync/SKILL.md +0 -108
- package/plugins/src/base/hooks/format-on-edit.sh +0 -76
- package/plugins/src/base/hooks/lint-on-edit.sh +0 -81
- package/plugins/src/base/hooks/sg-scan-on-edit.sh +0 -68
- package/plugins/src/base/rules/lisa.md +0 -37
- /package/plugins/{lisa-cdk → lisa}/agents/agent-architect.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/agents/architecture-specialist.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/agents/debug-specialist.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/agents/git-history-analyzer.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/agents/hooks-expert.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/agents/implementer.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/agents/learner.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/agents/performance-specialist.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/agents/product-specialist.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/agents/quality-specialist.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/agents/security-specialist.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/agents/skill-evaluator.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/agents/slash-command-architect.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/agents/test-specialist.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/agents/verification-specialist.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/agents/web-search-researcher.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/git/commit-and-submit-pr.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/git/commit-submit-pr-and-verify.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/git/commit-submit-pr-deploy-and-verify.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/git/commit.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/git/prune.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/git/submit-pr.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/jira/add-journey.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/jira/create.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/jira/evidence.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/jira/fix.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/jira/implement.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/jira/journey.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/jira/sync.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/jira/verify.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/plan/add-test-coverage.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/plan/create.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/plan/execute.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/plan/fix-linter-error.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/plan/local-code-review.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/plan/lower-code-complexity.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/plan/reduce-max-lines-per-function.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/plan/reduce-max-lines.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/pull-request/review.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/review/implementation.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/security/zap-scan.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/sonarqube/check.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/sonarqube/fix.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/tasks/load.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/commands/tasks/sync.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/hooks/debug-hook.sh +0 -0
- /package/plugins/{lisa-cdk → lisa}/hooks/enforce-plan-rules.sh +0 -0
- /package/plugins/{lisa-cdk → lisa}/hooks/install-pkgs.sh +0 -0
- /package/plugins/{lisa-cdk → lisa}/hooks/notify-ntfy.sh +0 -0
- /package/plugins/{lisa-cdk → lisa}/hooks/setup-jira-cli.sh +0 -0
- /package/plugins/{lisa-cdk → lisa}/hooks/sync-tasks.sh +0 -0
- /package/plugins/{lisa-cdk → lisa}/hooks/ticket-sync-reminder.sh +0 -0
- /package/plugins/{lisa-cdk → lisa}/hooks/track-plan-sessions.sh +0 -0
- /package/plugins/{lisa-cdk → lisa}/hooks/verify-completion.sh +0 -0
- /package/plugins/{lisa-cdk → lisa}/rules/README.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/rules/coding-philosophy.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/rules/verfication.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/agent-design-best-practices/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/git-commit/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/git-commit-and-submit-pr/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/git-commit-submit-pr-and-verify/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/git-commit-submit-pr-deploy-and-verify/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/git-prune/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/git-submit-pr/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/jira-add-journey/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/jira-create/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/jira-evidence/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/jira-evidence/scripts/post-evidence.sh +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/jira-fix/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/jira-implement/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/jira-journey/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/jira-journey/scripts/generate-templates.py +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/jira-journey/scripts/parse-plan.py +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/jira-sync/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/jira-verify/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/jsdoc-best-practices/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/lisa-review-implementation/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/plan-add-test-coverage/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/plan-execute/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/plan-fix-linter-error/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/plan-local-code-review/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/plan-lower-code-complexity/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/plan-reduce-max-lines/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/plan-reduce-max-lines-per-function/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/pull-request-review/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/security-zap-scan/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/sonarqube-check/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/sonarqube-fix/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/tasks-load/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → lisa}/skills/tasks-sync/SKILL.md +0 -0
- /package/plugins/{lisa-cdk → src/typescript}/hooks/format-on-edit.sh +0 -0
- /package/plugins/{lisa-cdk → src/typescript}/hooks/lint-on-edit.sh +0 -0
- /package/plugins/{lisa-cdk → src/typescript}/hooks/sg-scan-on-edit.sh +0 -0
- /package/plugins/{lisa-cdk → src/typescript}/rules/lisa.md +0 -0
|
@@ -1,368 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""Parse the Validation Journey section from a JIRA ticket description.
|
|
3
|
-
|
|
4
|
-
Fetches the ticket via REST API, extracts the Validation Journey section
|
|
5
|
-
(ADF or wiki markup), and outputs structured JSON to stdout.
|
|
6
|
-
|
|
7
|
-
Usage:
|
|
8
|
-
python3 parse-plan.py <TICKET_ID>
|
|
9
|
-
|
|
10
|
-
Example:
|
|
11
|
-
python3 parse-plan.py SE-3820
|
|
12
|
-
|
|
13
|
-
Output (JSON):
|
|
14
|
-
{
|
|
15
|
-
"ticket": "SE-3820",
|
|
16
|
-
"prerequisites": ["Backend running", "Admin user"],
|
|
17
|
-
"steps": [
|
|
18
|
-
{"number": 1, "text": "Navigate to page", "screenshot": null},
|
|
19
|
-
{"number": 2, "text": "Click button [EVIDENCE: btn]", "screenshot": "btn"}
|
|
20
|
-
],
|
|
21
|
-
"viewports": [
|
|
22
|
-
{"name": "Desktop", "width": 1512, "height": 768}
|
|
23
|
-
],
|
|
24
|
-
"assertions": ["Modal fills screen"]
|
|
25
|
-
}
|
|
26
|
-
"""
|
|
27
|
-
|
|
28
|
-
import json
|
|
29
|
-
import os
|
|
30
|
-
import re
|
|
31
|
-
import subprocess
|
|
32
|
-
import sys
|
|
33
|
-
import urllib.request
|
|
34
|
-
from base64 import b64encode
|
|
35
|
-
from pathlib import Path
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def get_jira_config():
|
|
39
|
-
"""Read JIRA server and login from jira-cli config."""
|
|
40
|
-
config_path = Path.home() / ".config" / ".jira" / ".config.yml"
|
|
41
|
-
if not config_path.exists():
|
|
42
|
-
print(f"ERROR: jira-cli config not found at {config_path}", file=sys.stderr)
|
|
43
|
-
sys.exit(1)
|
|
44
|
-
|
|
45
|
-
server = ""
|
|
46
|
-
login = ""
|
|
47
|
-
with open(config_path) as f:
|
|
48
|
-
for line in f:
|
|
49
|
-
if line.startswith("server:"):
|
|
50
|
-
server = line.split(":", 1)[1].strip()
|
|
51
|
-
elif line.startswith("login:"):
|
|
52
|
-
login = line.split(":", 1)[1].strip()
|
|
53
|
-
|
|
54
|
-
token = os.environ.get("JIRA_API_TOKEN", "")
|
|
55
|
-
if not token:
|
|
56
|
-
print("ERROR: JIRA_API_TOKEN env var not set", file=sys.stderr)
|
|
57
|
-
sys.exit(1)
|
|
58
|
-
|
|
59
|
-
return server, login, token
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
def fetch_ticket(server, login, token, ticket_id):
|
|
63
|
-
"""Fetch JIRA ticket via REST API v3 (returns ADF description)."""
|
|
64
|
-
url = f"{server}/rest/api/3/issue/{ticket_id}?fields=description"
|
|
65
|
-
auth = b64encode(f"{login}:{token}".encode()).decode()
|
|
66
|
-
|
|
67
|
-
req = urllib.request.Request(url, headers={
|
|
68
|
-
"Authorization": f"Basic {auth}",
|
|
69
|
-
"Accept": "application/json",
|
|
70
|
-
})
|
|
71
|
-
|
|
72
|
-
try:
|
|
73
|
-
with urllib.request.urlopen(req) as resp:
|
|
74
|
-
return json.loads(resp.read().decode())
|
|
75
|
-
except urllib.error.HTTPError as e:
|
|
76
|
-
print(f"ERROR: JIRA API returned {e.code} for {ticket_id}", file=sys.stderr)
|
|
77
|
-
sys.exit(1)
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
def extract_text_from_adf(node):
|
|
81
|
-
"""Recursively extract plain text from an ADF node."""
|
|
82
|
-
if isinstance(node, str):
|
|
83
|
-
return node
|
|
84
|
-
|
|
85
|
-
if isinstance(node, dict):
|
|
86
|
-
node_type = node.get("type", "")
|
|
87
|
-
|
|
88
|
-
if node_type == "text":
|
|
89
|
-
return node.get("text", "")
|
|
90
|
-
|
|
91
|
-
if node_type == "hardBreak":
|
|
92
|
-
return "\n"
|
|
93
|
-
|
|
94
|
-
parts = []
|
|
95
|
-
for child in node.get("content", []):
|
|
96
|
-
parts.append(extract_text_from_adf(child))
|
|
97
|
-
return "".join(parts)
|
|
98
|
-
|
|
99
|
-
if isinstance(node, list):
|
|
100
|
-
return "".join(extract_text_from_adf(item) for item in node)
|
|
101
|
-
|
|
102
|
-
return ""
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
def find_heading_index(content, heading_text, level=None):
|
|
106
|
-
"""Find the index of a heading node matching the given text."""
|
|
107
|
-
for i, node in enumerate(content):
|
|
108
|
-
if node.get("type") != "heading":
|
|
109
|
-
continue
|
|
110
|
-
if level is not None and node.get("attrs", {}).get("level") != level:
|
|
111
|
-
continue
|
|
112
|
-
text = extract_text_from_adf(node).strip().lower()
|
|
113
|
-
if heading_text.lower() in text:
|
|
114
|
-
return i
|
|
115
|
-
return -1
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
def extract_section_content(content, start_idx, same_level=True):
|
|
119
|
-
"""Extract all nodes between a heading and the next heading of same or higher level."""
|
|
120
|
-
if start_idx < 0 or start_idx >= len(content):
|
|
121
|
-
return []
|
|
122
|
-
|
|
123
|
-
heading_level = content[start_idx].get("attrs", {}).get("level", 2)
|
|
124
|
-
nodes = []
|
|
125
|
-
|
|
126
|
-
for i in range(start_idx + 1, len(content)):
|
|
127
|
-
node = content[i]
|
|
128
|
-
if node.get("type") == "heading":
|
|
129
|
-
node_level = node.get("attrs", {}).get("level", 2)
|
|
130
|
-
if same_level and node_level <= heading_level:
|
|
131
|
-
break
|
|
132
|
-
nodes.append(node)
|
|
133
|
-
|
|
134
|
-
return nodes
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
def parse_prerequisites(nodes):
|
|
138
|
-
"""Extract prerequisite strings from ADF nodes (bullet lists or paragraphs)."""
|
|
139
|
-
prerequisites = []
|
|
140
|
-
for node in nodes:
|
|
141
|
-
if node.get("type") == "bulletList":
|
|
142
|
-
for item in node.get("content", []):
|
|
143
|
-
text = extract_text_from_adf(item).strip()
|
|
144
|
-
if text:
|
|
145
|
-
prerequisites.append(text)
|
|
146
|
-
elif node.get("type") == "paragraph":
|
|
147
|
-
text = extract_text_from_adf(node).strip()
|
|
148
|
-
if text:
|
|
149
|
-
prerequisites.append(text)
|
|
150
|
-
return prerequisites
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
def clean_step_text(text, screenshot_name):
|
|
154
|
-
"""Remove [SCREENSHOT: ...] or [EVIDENCE: ...] marker from step text and deduplicate."""
|
|
155
|
-
# Remove the marker itself
|
|
156
|
-
cleaned = re.sub(r'\[(SCREENSHOT|EVIDENCE):\s*[^\]]+\]\s*', '', text).strip()
|
|
157
|
-
|
|
158
|
-
# Deduplicate: if the same phrase appears twice consecutively, keep one
|
|
159
|
-
# This handles ADF text node concatenation artifacts
|
|
160
|
-
words = cleaned.split()
|
|
161
|
-
mid = len(words) // 2
|
|
162
|
-
if mid > 2 and words[:mid] == words[mid:2 * mid]:
|
|
163
|
-
cleaned = " ".join(words[:mid] + words[2 * mid:])
|
|
164
|
-
|
|
165
|
-
return cleaned
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
def parse_steps(nodes):
|
|
169
|
-
"""Extract ordered steps with optional [SCREENSHOT: name] or [EVIDENCE: name] markers."""
|
|
170
|
-
steps = []
|
|
171
|
-
step_number = 0
|
|
172
|
-
|
|
173
|
-
for node in nodes:
|
|
174
|
-
if node.get("type") == "orderedList":
|
|
175
|
-
for item in node.get("content", []):
|
|
176
|
-
step_number += 1
|
|
177
|
-
text = extract_text_from_adf(item).strip()
|
|
178
|
-
|
|
179
|
-
screenshot = None
|
|
180
|
-
match = re.search(r'\[(SCREENSHOT|EVIDENCE):\s*([^\]]+)\]', text)
|
|
181
|
-
if match:
|
|
182
|
-
screenshot = match.group(2).strip()
|
|
183
|
-
|
|
184
|
-
display_text = clean_step_text(text, screenshot) if screenshot else text
|
|
185
|
-
|
|
186
|
-
steps.append({
|
|
187
|
-
"number": step_number,
|
|
188
|
-
"text": display_text,
|
|
189
|
-
"screenshot": screenshot,
|
|
190
|
-
})
|
|
191
|
-
elif node.get("type") == "paragraph":
|
|
192
|
-
text = extract_text_from_adf(node).strip()
|
|
193
|
-
if text and re.match(r'^\d+\.?\s', text):
|
|
194
|
-
step_number += 1
|
|
195
|
-
screenshot = None
|
|
196
|
-
match = re.search(r'\[(SCREENSHOT|EVIDENCE):\s*([^\]]+)\]', text)
|
|
197
|
-
if match:
|
|
198
|
-
screenshot = match.group(2).strip()
|
|
199
|
-
|
|
200
|
-
clean_text = re.sub(r'^\d+\.?\s*', '', text)
|
|
201
|
-
display_text = clean_step_text(clean_text, screenshot) if screenshot else clean_text
|
|
202
|
-
steps.append({
|
|
203
|
-
"number": step_number,
|
|
204
|
-
"text": display_text,
|
|
205
|
-
"screenshot": screenshot,
|
|
206
|
-
})
|
|
207
|
-
|
|
208
|
-
return steps
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
def parse_viewports(nodes):
|
|
212
|
-
"""Extract viewport definitions from ADF table nodes.
|
|
213
|
-
|
|
214
|
-
Supports two table formats:
|
|
215
|
-
- 3 columns: Name | Width | Height
|
|
216
|
-
- 2 columns: Name | Resolution (WxH)
|
|
217
|
-
"""
|
|
218
|
-
viewports = []
|
|
219
|
-
|
|
220
|
-
for node in nodes:
|
|
221
|
-
if node.get("type") == "table":
|
|
222
|
-
rows = node.get("content", [])
|
|
223
|
-
for row in rows:
|
|
224
|
-
if row.get("type") != "tableRow":
|
|
225
|
-
continue
|
|
226
|
-
|
|
227
|
-
cells = row.get("content", [])
|
|
228
|
-
if not cells:
|
|
229
|
-
continue
|
|
230
|
-
|
|
231
|
-
# Skip header row (tableHeader cells)
|
|
232
|
-
if cells[0].get("type") == "tableHeader":
|
|
233
|
-
continue
|
|
234
|
-
|
|
235
|
-
cell_texts = [extract_text_from_adf(c).strip() for c in cells]
|
|
236
|
-
|
|
237
|
-
# 3-column format: Name | Width | Height
|
|
238
|
-
if len(cell_texts) >= 3:
|
|
239
|
-
name = cell_texts[0]
|
|
240
|
-
try:
|
|
241
|
-
width = int(cell_texts[1])
|
|
242
|
-
height = int(cell_texts[2])
|
|
243
|
-
viewports.append({
|
|
244
|
-
"name": name,
|
|
245
|
-
"width": width,
|
|
246
|
-
"height": height,
|
|
247
|
-
})
|
|
248
|
-
continue
|
|
249
|
-
except ValueError:
|
|
250
|
-
pass
|
|
251
|
-
|
|
252
|
-
# 2-column format: Name | WxH (e.g., "1512x768")
|
|
253
|
-
if len(cell_texts) >= 2:
|
|
254
|
-
name = cell_texts[0]
|
|
255
|
-
resolution = cell_texts[1]
|
|
256
|
-
match = re.match(r'(\d+)\s*[xX×]\s*(\d+)', resolution)
|
|
257
|
-
if match:
|
|
258
|
-
viewports.append({
|
|
259
|
-
"name": name,
|
|
260
|
-
"width": int(match.group(1)),
|
|
261
|
-
"height": int(match.group(2)),
|
|
262
|
-
})
|
|
263
|
-
|
|
264
|
-
return viewports
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
def parse_assertions(nodes):
|
|
268
|
-
"""Extract assertion strings from ADF nodes."""
|
|
269
|
-
assertions = []
|
|
270
|
-
for node in nodes:
|
|
271
|
-
if node.get("type") == "bulletList":
|
|
272
|
-
for item in node.get("content", []):
|
|
273
|
-
text = extract_text_from_adf(item).strip()
|
|
274
|
-
if text:
|
|
275
|
-
assertions.append(text)
|
|
276
|
-
elif node.get("type") == "orderedList":
|
|
277
|
-
for item in node.get("content", []):
|
|
278
|
-
text = extract_text_from_adf(item).strip()
|
|
279
|
-
if text:
|
|
280
|
-
assertions.append(text)
|
|
281
|
-
elif node.get("type") == "paragraph":
|
|
282
|
-
text = extract_text_from_adf(node).strip()
|
|
283
|
-
if text and text.startswith("-"):
|
|
284
|
-
assertions.append(text.lstrip("- ").strip())
|
|
285
|
-
elif text:
|
|
286
|
-
assertions.append(text)
|
|
287
|
-
return assertions
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
def parse_adf_journey(description_adf):
|
|
291
|
-
"""Parse the Validation Journey from an ADF description object."""
|
|
292
|
-
content = description_adf.get("content", [])
|
|
293
|
-
|
|
294
|
-
# Find the "Validation Journey" h2 heading
|
|
295
|
-
journey_idx = find_heading_index(content, "validation journey", level=2)
|
|
296
|
-
if journey_idx < 0:
|
|
297
|
-
# Try without level constraint
|
|
298
|
-
journey_idx = find_heading_index(content, "validation journey")
|
|
299
|
-
|
|
300
|
-
if journey_idx < 0:
|
|
301
|
-
print("ERROR: No 'Validation Journey' section found in ticket description", file=sys.stderr)
|
|
302
|
-
sys.exit(1)
|
|
303
|
-
|
|
304
|
-
# Extract sub-sections
|
|
305
|
-
prereq_idx = find_heading_index(content, "prerequisites", level=3)
|
|
306
|
-
steps_idx = find_heading_index(content, "steps", level=3)
|
|
307
|
-
viewports_idx = find_heading_index(content, "viewports", level=3)
|
|
308
|
-
assertions_idx = find_heading_index(content, "assertions", level=3)
|
|
309
|
-
|
|
310
|
-
prerequisites = []
|
|
311
|
-
if prereq_idx >= 0:
|
|
312
|
-
prereq_nodes = extract_section_content(content, prereq_idx)
|
|
313
|
-
prerequisites = parse_prerequisites(prereq_nodes)
|
|
314
|
-
|
|
315
|
-
steps = []
|
|
316
|
-
if steps_idx >= 0:
|
|
317
|
-
steps_nodes = extract_section_content(content, steps_idx)
|
|
318
|
-
steps = parse_steps(steps_nodes)
|
|
319
|
-
|
|
320
|
-
viewports = []
|
|
321
|
-
if viewports_idx >= 0:
|
|
322
|
-
viewport_nodes = extract_section_content(content, viewports_idx)
|
|
323
|
-
viewports = parse_viewports(viewport_nodes)
|
|
324
|
-
|
|
325
|
-
assertions = []
|
|
326
|
-
if assertions_idx >= 0:
|
|
327
|
-
assertion_nodes = extract_section_content(content, assertions_idx)
|
|
328
|
-
assertions = parse_assertions(assertion_nodes)
|
|
329
|
-
|
|
330
|
-
# Fallback: if no viewports defined, use Desktop as default
|
|
331
|
-
if not viewports:
|
|
332
|
-
viewports = [{"name": "Desktop", "width": 1512, "height": 768}]
|
|
333
|
-
|
|
334
|
-
return {
|
|
335
|
-
"prerequisites": prerequisites,
|
|
336
|
-
"steps": steps,
|
|
337
|
-
"viewports": viewports,
|
|
338
|
-
"assertions": assertions,
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
def main():
|
|
343
|
-
if len(sys.argv) < 2:
|
|
344
|
-
print("Usage: parse-plan.py <TICKET_ID>", file=sys.stderr)
|
|
345
|
-
sys.exit(1)
|
|
346
|
-
|
|
347
|
-
ticket_id = sys.argv[1]
|
|
348
|
-
server, login, token = get_jira_config()
|
|
349
|
-
ticket_data = fetch_ticket(server, login, token, ticket_id)
|
|
350
|
-
|
|
351
|
-
description = ticket_data.get("fields", {}).get("description")
|
|
352
|
-
if not description:
|
|
353
|
-
print(f"ERROR: Ticket {ticket_id} has no description", file=sys.stderr)
|
|
354
|
-
sys.exit(1)
|
|
355
|
-
|
|
356
|
-
# ADF description is a dict, wiki markup is a string
|
|
357
|
-
if isinstance(description, dict):
|
|
358
|
-
result = parse_adf_journey(description)
|
|
359
|
-
else:
|
|
360
|
-
print("ERROR: Wiki markup parsing not implemented. Use JIRA API v3 (ADF format).", file=sys.stderr)
|
|
361
|
-
sys.exit(1)
|
|
362
|
-
|
|
363
|
-
result["ticket"] = ticket_id
|
|
364
|
-
print(json.dumps(result, indent=2))
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
if __name__ == "__main__":
|
|
368
|
-
main()
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: jira-sync
|
|
3
|
-
description: "Syncs plan progress to a linked JIRA ticket. Posts plan contents, progress updates, branch links, and PR links at key milestones. Use this skill throughout the plan lifecycle to keep tickets in sync."
|
|
4
|
-
allowed-tools: ["mcp__atlassian__*", "Bash", "Read", "Glob", "Grep"]
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# JIRA Ticket Sync
|
|
8
|
-
|
|
9
|
-
Sync current plan progress to JIRA ticket: $ARGUMENTS
|
|
10
|
-
|
|
11
|
-
If no argument provided, search for a ticket URL in the active plan file (most recently modified `.md` in `plans/`).
|
|
12
|
-
|
|
13
|
-
## Workflow
|
|
14
|
-
|
|
15
|
-
### Step 1: Identify Ticket and Context
|
|
16
|
-
|
|
17
|
-
1. **Parse ticket ID** from `$ARGUMENTS` or extract from the active plan file
|
|
18
|
-
2. **Fetch current ticket state** via JIRA MCP (`mcp__atlassian__getJiraIssue`)
|
|
19
|
-
3. **Determine current milestone** by checking:
|
|
20
|
-
- Does a plan file exist? → Plan created
|
|
21
|
-
- Is there a working branch? → Implementation started
|
|
22
|
-
- Are tasks in progress? → Active implementation
|
|
23
|
-
- Is there an open PR? → PR ready for review
|
|
24
|
-
- Is the PR merged? → Complete
|
|
25
|
-
|
|
26
|
-
### Step 2: Gather Update Content
|
|
27
|
-
|
|
28
|
-
Based on the current milestone:
|
|
29
|
-
|
|
30
|
-
| Milestone | Content to Post |
|
|
31
|
-
|-----------|-----------------|
|
|
32
|
-
| **Plan created** | Plan summary, branch name, link to PR (if draft exists) |
|
|
33
|
-
| **Implementation in progress** | Task completion summary (X of Y tasks done), any blockers |
|
|
34
|
-
| **PR ready** | PR link, summary of changes, test results |
|
|
35
|
-
| **PR merged** | Final summary, suggest moving ticket to "Done" |
|
|
36
|
-
|
|
37
|
-
### Step 3: Post Update
|
|
38
|
-
|
|
39
|
-
1. **Add a comment** to the ticket with the gathered content via JIRA MCP
|
|
40
|
-
2. **Update ticket fields** if applicable:
|
|
41
|
-
- Add branch name to a custom field or comment
|
|
42
|
-
- Add PR link to a custom field or comment
|
|
43
|
-
3. **Report** what was synced to the user
|
|
44
|
-
|
|
45
|
-
### Step 4: Suggest Status Transition
|
|
46
|
-
|
|
47
|
-
Based on the milestone, suggest (but don't automatically perform) a status transition:
|
|
48
|
-
|
|
49
|
-
| Milestone | Suggested Status |
|
|
50
|
-
|-----------|-----------------|
|
|
51
|
-
| Plan created | "In Progress" |
|
|
52
|
-
| PR ready | "In Review" |
|
|
53
|
-
| PR merged | "Done" |
|
|
54
|
-
|
|
55
|
-
## Important Notes
|
|
56
|
-
|
|
57
|
-
- **Never auto-transition ticket status** — always suggest and let the user confirm
|
|
58
|
-
- **Idempotent updates** — running sync multiple times at the same milestone should not create duplicate comments
|
|
59
|
-
- **Comment format** — use JIRA markdown with clear headers and bullet points
|
|
60
|
-
|
|
61
|
-
## Execution
|
|
62
|
-
|
|
63
|
-
Sync the ticket now.
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: jira-verify
|
|
3
|
-
description: This skill should be used when verifying that a JIRA ticket meets organizational standards for epic relationships and description quality. It checks epic parent relationships and validates description completeness for coding assistants, developers, and stakeholders.
|
|
4
|
-
allowed-tools: ["mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getAccessibleAtlassianResources"]
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Verify JIRA Ticket: $ARGUMENTS
|
|
8
|
-
|
|
9
|
-
Fetch ticket $ARGUMENTS and verify it meets organizational standards.
|
|
10
|
-
|
|
11
|
-
## Verification Checks
|
|
12
|
-
|
|
13
|
-
### 1. Epic Parent Relationship
|
|
14
|
-
|
|
15
|
-
**Rule**: Non-bug, non-epic tickets MUST have an epic parent
|
|
16
|
-
|
|
17
|
-
- If missing: Search filter 10089 (Epic Backlog) and suggest appropriate epics
|
|
18
|
-
|
|
19
|
-
### 2. Description Quality
|
|
20
|
-
|
|
21
|
-
Verify description adequately addresses:
|
|
22
|
-
|
|
23
|
-
**Coding Assistants**: Acceptance criteria, requirements, constraints, I/O
|
|
24
|
-
**Developers**: Technical context, integration points, testing, edge cases
|
|
25
|
-
**Stakeholders**: Business value, user impact, success metrics, summary
|
|
26
|
-
|
|
27
|
-
### 3. Validation Journey
|
|
28
|
-
|
|
29
|
-
**Rule**: Tickets that change runtime behavior MUST include a Validation Journey section.
|
|
30
|
-
|
|
31
|
-
Check by running:
|
|
32
|
-
|
|
33
|
-
```bash
|
|
34
|
-
python3 .claude/skills/jira-journey/scripts/parse-plan.py <TICKET_ID> 2>&1
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
- If the parser returns steps: PASS
|
|
38
|
-
- If the parser fails with "No 'Validation Journey' section found": FAIL — recommend using `/jira-add-journey <TICKET_ID>` to add one
|
|
39
|
-
|
|
40
|
-
This check is skipped for:
|
|
41
|
-
- Documentation-only tickets
|
|
42
|
-
- Config-only tickets (env vars, CI/CD, feature flags)
|
|
43
|
-
- Type-definition-only tickets (no runtime effect)
|
|
44
|
-
- Epic-level tickets (journeys belong on child stories/tasks)
|
|
45
|
-
|
|
46
|
-
## Execute Verification
|
|
47
|
-
|
|
48
|
-
Retrieve ticket details, run all checks, and provide specific improvement recommendations for any failures.
|