@codyswann/lisa 2.203.0 → 2.204.1
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/nestjs/create-only/.github/workflows/deploy.yml +69 -0
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-skill-creator/SKILL.md +8 -6
- package/plugins/lisa/skills/lisa-parity-skill-creator/SKILL.md +8 -6
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-parity-skill-creator/SKILL.md +8 -6
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/skills/lisa-parity-skill-creator/SKILL.md +8 -6
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/skills/lisa-parity-skill-creator/SKILL.md +8 -6
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/skills/lisa-parity-skill-creator/SKILL.md +8 -6
- package/scripts/generate-agy-plugin-artifacts.mjs +7 -0
- package/scripts/generate-copilot-plugin-artifacts.mjs +6 -0
- package/scripts/generate-cursor-plugin-artifacts.mjs +6 -0
- package/scripts/lib/nest-plugin-commands.mjs +32 -0
- package/scripts/migrate-skill-command-namespace.mjs +0 -141
- package/scripts/update-test-command-paths.mjs +0 -87
- /package/plugins/lisa/commands/{lisa/agent-ready.md → agent-ready.md} +0 -0
- /package/plugins/lisa/commands/{lisa/analyze-claude-remote.md → analyze-claude-remote.md} +0 -0
- /package/plugins/lisa/commands/{lisa/automation-status.md → automation-status.md} +0 -0
- /package/plugins/lisa/commands/{lisa/codify-verification.md → codify-verification.md} +0 -0
- /package/plugins/lisa/commands/{lisa/cross-pollinate.md → cross-pollinate.md} +0 -0
- /package/plugins/lisa/commands/{lisa/debrief → debrief}/apply.md +0 -0
- /package/plugins/lisa/commands/{lisa/debrief.md → debrief.md} +0 -0
- /package/plugins/lisa/commands/{lisa/doctor.md → doctor.md} +0 -0
- /package/plugins/lisa/commands/{lisa/exploratory-qa.md → exploratory-qa.md} +0 -0
- /package/plugins/lisa/commands/{lisa/fix → fix}/linter-error.md +0 -0
- /package/plugins/lisa/commands/{lisa/generate-claude-remote-build-script.md → generate-claude-remote-build-script.md} +0 -0
- /package/plugins/lisa/commands/{lisa/git → git}/commit.md +0 -0
- /package/plugins/lisa/commands/{lisa/git → git}/prune.md +0 -0
- /package/plugins/lisa/commands/{lisa/git → git}/submit-pr.md +0 -0
- /package/plugins/lisa/commands/{lisa/implement.md → implement.md} +0 -0
- /package/plugins/lisa/commands/{lisa/improve → improve}/code-complexity.md +0 -0
- /package/plugins/lisa/commands/{lisa/improve → improve}/max-lines-per-function.md +0 -0
- /package/plugins/lisa/commands/{lisa/improve → improve}/max-lines.md +0 -0
- /package/plugins/lisa/commands/{lisa/improve → improve}/test-coverage.md +0 -0
- /package/plugins/lisa/commands/{lisa/improve → improve}/tests.md +0 -0
- /package/plugins/lisa/commands/{lisa/intake-explain.md → intake-explain.md} +0 -0
- /package/plugins/lisa/commands/{lisa/intake.md → intake.md} +0 -0
- /package/plugins/lisa/commands/{lisa/monitor.md → monitor.md} +0 -0
- /package/plugins/lisa/commands/{lisa/parity-code-review.md → parity-code-review.md} +0 -0
- /package/plugins/lisa/commands/{lisa/parity-code-simplifier.md → parity-code-simplifier.md} +0 -0
- /package/plugins/lisa/commands/{lisa/parity-coderabbit.md → parity-coderabbit.md} +0 -0
- /package/plugins/lisa/commands/{lisa/parity-safety-net-rules.md → parity-safety-net-rules.md} +0 -0
- /package/plugins/lisa/commands/{lisa/parity-sentry-sdk-setup.md → parity-sentry-sdk-setup.md} +0 -0
- /package/plugins/lisa/commands/{lisa/parity-sentry-seer.md → parity-sentry-seer.md} +0 -0
- /package/plugins/lisa/commands/{lisa/parity-skill-creator.md → parity-skill-creator.md} +0 -0
- /package/plugins/lisa/commands/{lisa/plan.md → plan.md} +0 -0
- /package/plugins/lisa/commands/{lisa/plugin-sync-explain.md → plugin-sync-explain.md} +0 -0
- /package/plugins/lisa/commands/{lisa/product-walkthrough.md → product-walkthrough.md} +0 -0
- /package/plugins/lisa/commands/{lisa/project-ideation.md → project-ideation.md} +0 -0
- /package/plugins/lisa/commands/{lisa/pull-request → pull-request}/review.md +0 -0
- /package/plugins/lisa/commands/{lisa/queue-status.md → queue-status.md} +0 -0
- /package/plugins/lisa/commands/{lisa/repair-intake.md → repair-intake.md} +0 -0
- /package/plugins/lisa/commands/{lisa/research.md → research.md} +0 -0
- /package/plugins/lisa/commands/{lisa/review → review}/local.md +0 -0
- /package/plugins/lisa/commands/{lisa/security → security}/zap-scan.md +0 -0
- /package/plugins/lisa/commands/{lisa/setup → setup}/atlassian.md +0 -0
- /package/plugins/lisa/commands/{lisa/setup → setup}/confluence.md +0 -0
- /package/plugins/lisa/commands/{lisa/setup → setup}/github-repo.md +0 -0
- /package/plugins/lisa/commands/{lisa/setup → setup}/github.md +0 -0
- /package/plugins/lisa/commands/{lisa/setup → setup}/jira.md +0 -0
- /package/plugins/lisa/commands/{lisa/setup → setup}/linear.md +0 -0
- /package/plugins/lisa/commands/{lisa/setup → setup}/notion.md +0 -0
- /package/plugins/lisa/commands/{lisa/setup-automations.md → setup-automations.md} +0 -0
- /package/plugins/lisa/commands/{lisa/sync-down.md → sync-down.md} +0 -0
- /package/plugins/lisa/commands/{lisa/tear-down-automations.md → tear-down-automations.md} +0 -0
- /package/plugins/lisa/commands/{lisa/validate-tracker-mapping.md → validate-tracker-mapping.md} +0 -0
- /package/plugins/lisa/commands/{lisa/verify-prd.md → verify-prd.md} +0 -0
- /package/plugins/lisa/commands/{lisa/verify.md → verify.md} +0 -0
- /package/plugins/lisa/commands/{lisa/wiki → wiki}/install.md +0 -0
- /package/plugins/lisa-expo-agy/commands/{e2e-coverage-gaps.md → lisa/e2e-coverage-gaps.md} +0 -0
- /package/plugins/lisa-expo-copilot/commands/{e2e-coverage-gaps.md → lisa/e2e-coverage-gaps.md} +0 -0
- /package/plugins/lisa-expo-cursor/commands/{e2e-coverage-gaps.md → lisa/e2e-coverage-gaps.md} +0 -0
- /package/plugins/lisa-harper-fabric-agy/commands/{e2e-coverage-gaps.md → lisa/e2e-coverage-gaps.md} +0 -0
- /package/plugins/lisa-harper-fabric-copilot/commands/{e2e-coverage-gaps.md → lisa/e2e-coverage-gaps.md} +0 -0
- /package/plugins/lisa-harper-fabric-cursor/commands/{e2e-coverage-gaps.md → lisa/e2e-coverage-gaps.md} +0 -0
- /package/plugins/lisa-openclaw-agy/commands/{connect-repo-topic.md → lisa/connect-repo-topic.md} +0 -0
- /package/plugins/lisa-openclaw-agy/commands/{connect-staff-slack.md → lisa/connect-staff-slack.md} +0 -0
- /package/plugins/lisa-openclaw-agy/commands/{connect-staff-telegram.md → lisa/connect-staff-telegram.md} +0 -0
- /package/plugins/lisa-openclaw-agy/commands/{setup-openclaw.md → lisa/setup-openclaw.md} +0 -0
- /package/plugins/lisa-openclaw-copilot/commands/{connect-repo-topic.md → lisa/connect-repo-topic.md} +0 -0
- /package/plugins/lisa-openclaw-copilot/commands/{connect-staff-slack.md → lisa/connect-staff-slack.md} +0 -0
- /package/plugins/lisa-openclaw-copilot/commands/{connect-staff-telegram.md → lisa/connect-staff-telegram.md} +0 -0
- /package/plugins/lisa-openclaw-copilot/commands/{setup-openclaw.md → lisa/setup-openclaw.md} +0 -0
- /package/plugins/lisa-openclaw-cursor/commands/{connect-repo-topic.md → lisa/connect-repo-topic.md} +0 -0
- /package/plugins/lisa-openclaw-cursor/commands/{connect-staff-slack.md → lisa/connect-staff-slack.md} +0 -0
- /package/plugins/lisa-openclaw-cursor/commands/{connect-staff-telegram.md → lisa/connect-staff-telegram.md} +0 -0
- /package/plugins/lisa-openclaw-cursor/commands/{setup-openclaw.md → lisa/setup-openclaw.md} +0 -0
- /package/plugins/lisa-rails-agy/commands/{e2e-coverage-gaps.md → lisa/e2e-coverage-gaps.md} +0 -0
- /package/plugins/lisa-rails-agy/commands/{fix → lisa/fix}/linter-error.md +0 -0
- /package/plugins/lisa-rails-agy/commands/{improve → lisa/improve}/code-complexity.md +0 -0
- /package/plugins/lisa-rails-agy/commands/{improve → lisa/improve}/max-lines-per-function.md +0 -0
- /package/plugins/lisa-rails-agy/commands/{improve → lisa/improve}/max-lines.md +0 -0
- /package/plugins/lisa-rails-agy/commands/{improve → lisa/improve}/test-coverage.md +0 -0
- /package/plugins/lisa-rails-copilot/commands/{e2e-coverage-gaps.md → lisa/e2e-coverage-gaps.md} +0 -0
- /package/plugins/lisa-rails-copilot/commands/{fix → lisa/fix}/linter-error.md +0 -0
- /package/plugins/lisa-rails-copilot/commands/{improve → lisa/improve}/code-complexity.md +0 -0
- /package/plugins/lisa-rails-copilot/commands/{improve → lisa/improve}/max-lines-per-function.md +0 -0
- /package/plugins/lisa-rails-copilot/commands/{improve → lisa/improve}/max-lines.md +0 -0
- /package/plugins/lisa-rails-copilot/commands/{improve → lisa/improve}/test-coverage.md +0 -0
- /package/plugins/lisa-rails-cursor/commands/{e2e-coverage-gaps.md → lisa/e2e-coverage-gaps.md} +0 -0
- /package/plugins/lisa-rails-cursor/commands/{fix → lisa/fix}/linter-error.md +0 -0
- /package/plugins/lisa-rails-cursor/commands/{improve → lisa/improve}/code-complexity.md +0 -0
- /package/plugins/lisa-rails-cursor/commands/{improve → lisa/improve}/max-lines-per-function.md +0 -0
- /package/plugins/lisa-rails-cursor/commands/{improve → lisa/improve}/max-lines.md +0 -0
- /package/plugins/lisa-rails-cursor/commands/{improve → lisa/improve}/test-coverage.md +0 -0
- /package/plugins/lisa-wiki/commands/{lisa/add-ingest.md → add-ingest.md} +0 -0
- /package/plugins/lisa-wiki/commands/{lisa/add-role.md → add-role.md} +0 -0
- /package/plugins/lisa-wiki/commands/{lisa/doctor.md → doctor.md} +0 -0
- /package/plugins/lisa-wiki/commands/{lisa/ingest.md → ingest.md} +0 -0
- /package/plugins/lisa-wiki/commands/{lisa/lint.md → lint.md} +0 -0
- /package/plugins/lisa-wiki/commands/{lisa/migrate.md → migrate.md} +0 -0
- /package/plugins/lisa-wiki/commands/{lisa/onboard-me.md → onboard-me.md} +0 -0
- /package/plugins/lisa-wiki/commands/{lisa/query.md → query.md} +0 -0
- /package/plugins/lisa-wiki/commands/{lisa/setup-automations.md → setup-automations.md} +0 -0
- /package/plugins/lisa-wiki/commands/{lisa/setup.md → setup.md} +0 -0
- /package/plugins/lisa-wiki/commands/{lisa/status.md → status.md} +0 -0
- /package/plugins/lisa-wiki/commands/{lisa/tear-down-automations.md → tear-down-automations.md} +0 -0
- /package/plugins/lisa-wiki-agy/commands/{setup → lisa/setup}/wiki.md +0 -0
- /package/plugins/lisa-wiki-copilot/commands/{setup → lisa/setup}/wiki.md +0 -0
- /package/plugins/lisa-wiki-cursor/commands/{setup → lisa/setup}/wiki.md +0 -0
- /package/plugins/src/base/commands/{lisa/agent-ready.md → agent-ready.md} +0 -0
- /package/plugins/src/base/commands/{lisa/analyze-claude-remote.md → analyze-claude-remote.md} +0 -0
- /package/plugins/src/base/commands/{lisa/automation-status.md → automation-status.md} +0 -0
- /package/plugins/src/base/commands/{lisa/codify-verification.md → codify-verification.md} +0 -0
- /package/plugins/src/base/commands/{lisa/cross-pollinate.md → cross-pollinate.md} +0 -0
- /package/plugins/src/base/commands/{lisa/debrief → debrief}/apply.md +0 -0
- /package/plugins/src/base/commands/{lisa/debrief.md → debrief.md} +0 -0
- /package/plugins/src/base/commands/{lisa/doctor.md → doctor.md} +0 -0
- /package/plugins/src/base/commands/{lisa/exploratory-qa.md → exploratory-qa.md} +0 -0
- /package/plugins/src/base/commands/{lisa/fix → fix}/linter-error.md +0 -0
- /package/plugins/src/base/commands/{lisa/generate-claude-remote-build-script.md → generate-claude-remote-build-script.md} +0 -0
- /package/plugins/src/base/commands/{lisa/git → git}/commit.md +0 -0
- /package/plugins/src/base/commands/{lisa/git → git}/prune.md +0 -0
- /package/plugins/src/base/commands/{lisa/git → git}/submit-pr.md +0 -0
- /package/plugins/src/base/commands/{lisa/implement.md → implement.md} +0 -0
- /package/plugins/src/base/commands/{lisa/improve → improve}/code-complexity.md +0 -0
- /package/plugins/src/base/commands/{lisa/improve → improve}/max-lines-per-function.md +0 -0
- /package/plugins/src/base/commands/{lisa/improve → improve}/max-lines.md +0 -0
- /package/plugins/src/base/commands/{lisa/improve → improve}/test-coverage.md +0 -0
- /package/plugins/src/base/commands/{lisa/improve → improve}/tests.md +0 -0
- /package/plugins/src/base/commands/{lisa/intake-explain.md → intake-explain.md} +0 -0
- /package/plugins/src/base/commands/{lisa/intake.md → intake.md} +0 -0
- /package/plugins/src/base/commands/{lisa/monitor.md → monitor.md} +0 -0
- /package/plugins/src/base/commands/{lisa/parity-code-review.md → parity-code-review.md} +0 -0
- /package/plugins/src/base/commands/{lisa/parity-code-simplifier.md → parity-code-simplifier.md} +0 -0
- /package/plugins/src/base/commands/{lisa/parity-coderabbit.md → parity-coderabbit.md} +0 -0
- /package/plugins/src/base/commands/{lisa/parity-safety-net-rules.md → parity-safety-net-rules.md} +0 -0
- /package/plugins/src/base/commands/{lisa/parity-sentry-sdk-setup.md → parity-sentry-sdk-setup.md} +0 -0
- /package/plugins/src/base/commands/{lisa/parity-sentry-seer.md → parity-sentry-seer.md} +0 -0
- /package/plugins/src/base/commands/{lisa/parity-skill-creator.md → parity-skill-creator.md} +0 -0
- /package/plugins/src/base/commands/{lisa/plan.md → plan.md} +0 -0
- /package/plugins/src/base/commands/{lisa/plugin-sync-explain.md → plugin-sync-explain.md} +0 -0
- /package/plugins/src/base/commands/{lisa/product-walkthrough.md → product-walkthrough.md} +0 -0
- /package/plugins/src/base/commands/{lisa/project-ideation.md → project-ideation.md} +0 -0
- /package/plugins/src/base/commands/{lisa/pull-request → pull-request}/review.md +0 -0
- /package/plugins/src/base/commands/{lisa/queue-status.md → queue-status.md} +0 -0
- /package/plugins/src/base/commands/{lisa/repair-intake.md → repair-intake.md} +0 -0
- /package/plugins/src/base/commands/{lisa/research.md → research.md} +0 -0
- /package/plugins/src/base/commands/{lisa/review → review}/local.md +0 -0
- /package/plugins/src/base/commands/{lisa/security → security}/zap-scan.md +0 -0
- /package/plugins/src/base/commands/{lisa/setup → setup}/atlassian.md +0 -0
- /package/plugins/src/base/commands/{lisa/setup → setup}/confluence.md +0 -0
- /package/plugins/src/base/commands/{lisa/setup → setup}/github-repo.md +0 -0
- /package/plugins/src/base/commands/{lisa/setup → setup}/github.md +0 -0
- /package/plugins/src/base/commands/{lisa/setup → setup}/jira.md +0 -0
- /package/plugins/src/base/commands/{lisa/setup → setup}/linear.md +0 -0
- /package/plugins/src/base/commands/{lisa/setup → setup}/notion.md +0 -0
- /package/plugins/src/base/commands/{lisa/setup-automations.md → setup-automations.md} +0 -0
- /package/plugins/src/base/commands/{lisa/sync-down.md → sync-down.md} +0 -0
- /package/plugins/src/base/commands/{lisa/tear-down-automations.md → tear-down-automations.md} +0 -0
- /package/plugins/src/base/commands/{lisa/validate-tracker-mapping.md → validate-tracker-mapping.md} +0 -0
- /package/plugins/src/base/commands/{lisa/verify-prd.md → verify-prd.md} +0 -0
- /package/plugins/src/base/commands/{lisa/verify.md → verify.md} +0 -0
- /package/plugins/src/base/commands/{lisa/wiki → wiki}/install.md +0 -0
- /package/plugins/src/wiki/commands/{lisa/add-ingest.md → add-ingest.md} +0 -0
- /package/plugins/src/wiki/commands/{lisa/add-role.md → add-role.md} +0 -0
- /package/plugins/src/wiki/commands/{lisa/doctor.md → doctor.md} +0 -0
- /package/plugins/src/wiki/commands/{lisa/ingest.md → ingest.md} +0 -0
- /package/plugins/src/wiki/commands/{lisa/lint.md → lint.md} +0 -0
- /package/plugins/src/wiki/commands/{lisa/migrate.md → migrate.md} +0 -0
- /package/plugins/src/wiki/commands/{lisa/onboard-me.md → onboard-me.md} +0 -0
- /package/plugins/src/wiki/commands/{lisa/query.md → query.md} +0 -0
- /package/plugins/src/wiki/commands/{lisa/setup-automations.md → setup-automations.md} +0 -0
- /package/plugins/src/wiki/commands/{lisa/setup.md → setup.md} +0 -0
- /package/plugins/src/wiki/commands/{lisa/status.md → status.md} +0 -0
- /package/plugins/src/wiki/commands/{lisa/tear-down-automations.md → tear-down-automations.md} +0 -0
|
@@ -58,9 +58,11 @@ first:
|
|
|
58
58
|
`name`: `lisa-implement`, `lisa-git-commit`, `lisa-tracker-write`. No spaces,
|
|
59
59
|
no camelCase, no underscores.
|
|
60
60
|
- The directory name and the frontmatter `name` must match exactly.
|
|
61
|
-
- Commands live under `commands
|
|
62
|
-
`commands/
|
|
63
|
-
`commands/
|
|
61
|
+
- Commands live flat under `commands/` — Claude Code prefixes plugin commands
|
|
62
|
+
with the plugin name, so `commands/git/commit.md` → `/lisa:git:commit` and
|
|
63
|
+
`commands/implement.md` → `/lisa:implement`. (Per-agent variant generators
|
|
64
|
+
nest them under `commands/lisa/` for harnesses without plugin-name
|
|
65
|
+
namespacing; never author that nesting in source.)
|
|
64
66
|
- **Commands** surface as `/lisa:*` (colon). **Skills** surface as `/lisa-*`
|
|
65
67
|
(hyphen). Never share a bare name like `implement` across both surfaces.
|
|
66
68
|
|
|
@@ -112,15 +114,15 @@ carries the actual logic. Keep the two descriptions consistent.
|
|
|
112
114
|
1. **Decide placement** — downstream (`plugins/src/base`) vs. Lisa-only
|
|
113
115
|
(`.claude`). For base, both a skill and a command directory entry are needed.
|
|
114
116
|
2. **Pick the name** — `lisa-<slug>`, hyphenated, unique. Check it does not collide:
|
|
115
|
-
`ls plugins/src/base/skills/` and `ls plugins/src/base/commands
|
|
117
|
+
`ls plugins/src/base/skills/` and `ls plugins/src/base/commands/`.
|
|
116
118
|
3. **Create the skill** at
|
|
117
119
|
`plugins/src/base/skills/lisa-<name>/SKILL.md` with the frontmatter above and a
|
|
118
120
|
body that follows house style — see `plugins/src/base/skills/lisa-quality-review/SKILL.md`
|
|
119
121
|
for the canonical shape (title, "When to use", numbered checklist/steps,
|
|
120
122
|
explicit "Rules"/"Output" sections). Write real, actionable guidance, not
|
|
121
123
|
TODOs.
|
|
122
|
-
4. **Create the command** at `plugins/src/base/commands
|
|
123
|
-
`commands
|
|
124
|
+
4. **Create the command** at `plugins/src/base/commands/<name>.md` (or a nested
|
|
125
|
+
`commands/<namespace>/<name>.md` for a colon-namespaced command) using the
|
|
124
126
|
pass-through template.
|
|
125
127
|
5. **Rebuild the artifacts** so the generated plugins match source:
|
|
126
128
|
```bash
|
|
@@ -40,6 +40,8 @@ import fs from "node:fs";
|
|
|
40
40
|
import path from "node:path";
|
|
41
41
|
import { fileURLToPath } from "node:url";
|
|
42
42
|
|
|
43
|
+
import { nestCommandsUnderLisa } from "./lib/nest-plugin-commands.mjs";
|
|
44
|
+
|
|
43
45
|
const REPO_ROOT = path.resolve(
|
|
44
46
|
path.dirname(fileURLToPath(import.meta.url)),
|
|
45
47
|
".."
|
|
@@ -163,6 +165,11 @@ export function generateAgyVariant(srcDir, outDir, version) {
|
|
|
163
165
|
}
|
|
164
166
|
}
|
|
165
167
|
|
|
168
|
+
// 1b. Nest commands under commands/lisa/ — agy does not prefix plugin
|
|
169
|
+
// commands with the plugin name, so the directory manufactures the /lisa:*
|
|
170
|
+
// namespace that Claude gets from the plugin name alone.
|
|
171
|
+
nestCommandsUnderLisa(outDir);
|
|
172
|
+
|
|
166
173
|
// 2. Read the Claude manifest, drop hooks + mcpServers, write bare plugin.json.
|
|
167
174
|
// agy reads hooks from a root hooks.json (emitted below), not the manifest;
|
|
168
175
|
// MCP is user-global. So the bare manifest carries neither field.
|
|
@@ -30,6 +30,7 @@ import {
|
|
|
30
30
|
filterHooksForAgent,
|
|
31
31
|
filterScriptsForAgent,
|
|
32
32
|
} from "./lib/per-agent-hook-filter.mjs";
|
|
33
|
+
import { nestCommandsUnderLisa } from "./lib/nest-plugin-commands.mjs";
|
|
33
34
|
|
|
34
35
|
const REPO_ROOT = path.resolve(
|
|
35
36
|
path.dirname(fileURLToPath(import.meta.url)),
|
|
@@ -166,6 +167,11 @@ export function generateCopilotVariant(srcDir, outDir, version) {
|
|
|
166
167
|
}
|
|
167
168
|
}
|
|
168
169
|
|
|
170
|
+
// 1b. Nest commands under commands/lisa/ — Copilot does not prefix plugin
|
|
171
|
+
// commands with the plugin name, so the directory manufactures the /lisa:*
|
|
172
|
+
// namespace that Claude gets from the plugin name alone.
|
|
173
|
+
nestCommandsUnderLisa(outDir);
|
|
174
|
+
|
|
169
175
|
// 2. Rename agents/<n>.md to agents/<n>.agent.md (per Copilot's default convention).
|
|
170
176
|
// This is the safe-default path; if the manifest agents-path override probe
|
|
171
177
|
// returns positive, this rename is unnecessary but harmless.
|
|
@@ -49,6 +49,7 @@ import {
|
|
|
49
49
|
buildCursorHooksJson,
|
|
50
50
|
filterScriptsForAgent,
|
|
51
51
|
} from "./lib/per-agent-hook-filter.mjs";
|
|
52
|
+
import { nestCommandsUnderLisa } from "./lib/nest-plugin-commands.mjs";
|
|
52
53
|
|
|
53
54
|
const REPO_ROOT = path.resolve(
|
|
54
55
|
path.dirname(fileURLToPath(import.meta.url)),
|
|
@@ -322,6 +323,11 @@ export function generateCursorVariant(srcDir, outDir, version) {
|
|
|
322
323
|
// 1c. Rename .mcp.json → mcp.json (Cursor auto-discovers the un-dotted name).
|
|
323
324
|
renameMcpFile(outDir);
|
|
324
325
|
|
|
326
|
+
// 1d. Nest commands under commands/lisa/ — Cursor does not prefix plugin
|
|
327
|
+
// commands with the plugin name, so the directory manufactures the /lisa:*
|
|
328
|
+
// namespace that Claude gets from the plugin name alone.
|
|
329
|
+
nestCommandsUnderLisa(outDir);
|
|
330
|
+
|
|
325
331
|
// 2. Read the manifest, stamp the version, and strip the inline hook block.
|
|
326
332
|
// Cursor reads hooks from hooks/hooks.json (emitted in 2a), never inline.
|
|
327
333
|
const manifestPath = path.join(outDir, ".claude-plugin", "plugin.json");
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Relocate a built plugin variant's `commands/` tree under `commands/lisa/`.
|
|
3
|
+
*
|
|
4
|
+
* Claude Code prefixes plugin commands with the plugin name, so the Claude
|
|
5
|
+
* artifact ships flat commands (`commands/implement.md` → `/lisa:implement`);
|
|
6
|
+
* a nested `commands/lisa/` there double-namespaces every command
|
|
7
|
+
* (`/lisa:lisa:implement`). Cursor, Agy, and Copilot surface plugin commands
|
|
8
|
+
* WITHOUT a plugin-name prefix, so a flat layout would expose bare colliding
|
|
9
|
+
* names like `/implement` — the collision e0856eddd originally fixed. The
|
|
10
|
+
* per-agent variants therefore manufacture the namespace with a directory:
|
|
11
|
+
* `commands/lisa/implement.md` → `/lisa:implement`.
|
|
12
|
+
* @module scripts/lib/nest-plugin-commands
|
|
13
|
+
*/
|
|
14
|
+
import fs from "node:fs";
|
|
15
|
+
import path from "node:path";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Move every entry of `<pluginDir>/commands/` into `<pluginDir>/commands/lisa/`.
|
|
19
|
+
* No-op when the variant ships no commands. Idempotent: a tree that is already
|
|
20
|
+
* a lone `lisa/` directory is left untouched.
|
|
21
|
+
* @param {string} pluginDir Built per-agent variant directory.
|
|
22
|
+
*/
|
|
23
|
+
export function nestCommandsUnderLisa(pluginDir) {
|
|
24
|
+
const commandsDir = path.join(pluginDir, "commands");
|
|
25
|
+
if (!fs.existsSync(commandsDir)) return;
|
|
26
|
+
const entries = fs.readdirSync(commandsDir);
|
|
27
|
+
if (entries.length === 1 && entries[0] === "lisa") return;
|
|
28
|
+
const stagingDir = path.join(pluginDir, "commands.nest-staging");
|
|
29
|
+
fs.renameSync(commandsDir, stagingDir);
|
|
30
|
+
fs.mkdirSync(commandsDir, { recursive: true });
|
|
31
|
+
fs.renameSync(stagingDir, path.join(commandsDir, "lisa"));
|
|
32
|
+
}
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* One-shot migration: namespace Lisa base-plugin skills and commands.
|
|
4
|
-
*
|
|
5
|
-
* - Skills: `implement` → `lisa-implement` (directory + frontmatter `name`)
|
|
6
|
-
* - Commands: nest under `commands/lisa/` for colon-scoped slash surfaces
|
|
7
|
-
* - Skill references: `lisa:foo-bar` → `lisa-foo-bar` (Skill tool / prose)
|
|
8
|
-
* - Command pass-throughs: `/lisa:foo-bar` → `/lisa-foo-bar` in delegator bodies
|
|
9
|
-
*
|
|
10
|
-
* @module scripts/migrate-skill-command-namespace
|
|
11
|
-
*/
|
|
12
|
-
import fs from "node:fs";
|
|
13
|
-
import path from "node:path";
|
|
14
|
-
import { fileURLToPath } from "node:url";
|
|
15
|
-
|
|
16
|
-
const REPO_ROOT = path.resolve(
|
|
17
|
-
path.dirname(fileURLToPath(import.meta.url)),
|
|
18
|
-
".."
|
|
19
|
-
);
|
|
20
|
-
const BASE_SRC = path.join(REPO_ROOT, "plugins", "src", "base");
|
|
21
|
-
const SKILLS_DIR = path.join(BASE_SRC, "skills");
|
|
22
|
-
const COMMANDS_DIR = path.join(BASE_SRC, "commands");
|
|
23
|
-
const LISA_COMMANDS_DIR = path.join(COMMANDS_DIR, "lisa");
|
|
24
|
-
|
|
25
|
-
/** @param {string} name */
|
|
26
|
-
function prefixedSkillName(name) {
|
|
27
|
-
return name.startsWith("lisa-") ? name : `lisa-${name}`;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/** Rename skill directories and frontmatter `name` fields. */
|
|
31
|
-
function migrateSkills() {
|
|
32
|
-
const entries = fs
|
|
33
|
-
.readdirSync(SKILLS_DIR, { withFileTypes: true })
|
|
34
|
-
.filter(e => e.isDirectory())
|
|
35
|
-
.map(e => e.name)
|
|
36
|
-
.sort();
|
|
37
|
-
|
|
38
|
-
for (const oldName of entries) {
|
|
39
|
-
const newName = prefixedSkillName(oldName);
|
|
40
|
-
const oldDir = path.join(SKILLS_DIR, oldName);
|
|
41
|
-
const newDir = path.join(SKILLS_DIR, newName);
|
|
42
|
-
if (oldName !== newName) {
|
|
43
|
-
fs.renameSync(oldDir, newDir);
|
|
44
|
-
}
|
|
45
|
-
const skillMd = path.join(newDir, "SKILL.md");
|
|
46
|
-
if (!fs.existsSync(skillMd)) continue;
|
|
47
|
-
let content = fs.readFileSync(skillMd, "utf8");
|
|
48
|
-
content = content.replace(/^name:\s*.+$/m, `name: ${newName}`);
|
|
49
|
-
fs.writeFileSync(skillMd, content);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/** Move every command file under `commands/lisa/`, preserving subdirs. */
|
|
54
|
-
function migrateCommands() {
|
|
55
|
-
if (!fs.existsSync(COMMANDS_DIR)) return;
|
|
56
|
-
fs.mkdirSync(LISA_COMMANDS_DIR, { recursive: true });
|
|
57
|
-
|
|
58
|
-
/** @param {string} dir @param {string} rel */
|
|
59
|
-
function walk(dir, rel = "") {
|
|
60
|
-
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
61
|
-
const entryRel = rel ? `${rel}/${entry.name}` : entry.name;
|
|
62
|
-
const src = path.join(dir, entry.name);
|
|
63
|
-
if (
|
|
64
|
-
entry.name === "lisa" &&
|
|
65
|
-
entry.isDirectory() &&
|
|
66
|
-
dir === COMMANDS_DIR
|
|
67
|
-
) {
|
|
68
|
-
continue;
|
|
69
|
-
}
|
|
70
|
-
if (entry.isDirectory()) {
|
|
71
|
-
walk(src, entryRel);
|
|
72
|
-
continue;
|
|
73
|
-
}
|
|
74
|
-
if (!entry.name.endsWith(".md")) continue;
|
|
75
|
-
const dest = path.join(LISA_COMMANDS_DIR, entryRel);
|
|
76
|
-
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
77
|
-
fs.renameSync(src, dest);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
walk(COMMANDS_DIR);
|
|
82
|
-
|
|
83
|
-
// Remove empty directories left behind (except commands/ and commands/lisa/).
|
|
84
|
-
/** @param {string} dir */
|
|
85
|
-
function pruneEmpty(dir) {
|
|
86
|
-
if (dir === COMMANDS_DIR || dir === LISA_COMMANDS_DIR) return;
|
|
87
|
-
if (!fs.existsSync(dir)) return;
|
|
88
|
-
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
89
|
-
if (entry.isDirectory()) pruneEmpty(path.join(dir, entry.name));
|
|
90
|
-
}
|
|
91
|
-
if (fs.readdirSync(dir).length === 0) fs.rmdirSync(dir);
|
|
92
|
-
}
|
|
93
|
-
pruneEmpty(COMMANDS_DIR);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* @param {string} content
|
|
98
|
-
* @returns {string}
|
|
99
|
-
*/
|
|
100
|
-
function rewriteSkillReferences(content) {
|
|
101
|
-
let out = content;
|
|
102
|
-
|
|
103
|
-
// Command pass-through delegators: `/lisa:foo` skill → `/lisa-foo` skill
|
|
104
|
-
out = out.replace(
|
|
105
|
-
/Use the \/lisa:([a-z][a-z0-9-]*) skill/g,
|
|
106
|
-
(_m, skill) => `Use the /${prefixedSkillName(skill)} skill`
|
|
107
|
-
);
|
|
108
|
-
|
|
109
|
-
// Inline skill refs without leading slash: `lisa:foo-bar` → `lisa-foo-bar`
|
|
110
|
-
// Skip slash commands like `/lisa:setup:jira` (multi-colon) and `/lisa:debrief:apply`.
|
|
111
|
-
out = out.replace(
|
|
112
|
-
/(?<![/:])lisa:([a-z][a-z0-9-]*)(?![a-z0-9-:])/g,
|
|
113
|
-
(_m, skill) => prefixedSkillName(skill)
|
|
114
|
-
);
|
|
115
|
-
|
|
116
|
-
return out;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/** Rewrite skill references across plugins/src/base. */
|
|
120
|
-
function rewriteBaseReferences() {
|
|
121
|
-
/** @param {string} dir */
|
|
122
|
-
function walk(dir) {
|
|
123
|
-
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
124
|
-
const p = path.join(dir, entry.name);
|
|
125
|
-
if (entry.isDirectory()) {
|
|
126
|
-
walk(p);
|
|
127
|
-
continue;
|
|
128
|
-
}
|
|
129
|
-
if (!/\.(md|mdc|sh|json|agent\.md)$/i.test(entry.name)) continue;
|
|
130
|
-
const original = fs.readFileSync(p, "utf8");
|
|
131
|
-
const updated = rewriteSkillReferences(original);
|
|
132
|
-
if (updated !== original) fs.writeFileSync(p, updated);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
walk(BASE_SRC);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
migrateSkills();
|
|
139
|
-
migrateCommands();
|
|
140
|
-
rewriteBaseReferences();
|
|
141
|
-
console.log("Migrated base plugin skill/command namespace.");
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Update test command paths after base-plugin command namespace migration.
|
|
4
|
-
*/
|
|
5
|
-
import fs from "node:fs";
|
|
6
|
-
import path from "node:path";
|
|
7
|
-
import { fileURLToPath } from "node:url";
|
|
8
|
-
|
|
9
|
-
const REPO_ROOT = path.resolve(
|
|
10
|
-
path.dirname(fileURLToPath(import.meta.url)),
|
|
11
|
-
".."
|
|
12
|
-
);
|
|
13
|
-
|
|
14
|
-
/** @param {string} content */
|
|
15
|
-
function rewrite(content) {
|
|
16
|
-
let out = content;
|
|
17
|
-
|
|
18
|
-
// Base command paths: commands/<file> -> commands/lisa/<file>
|
|
19
|
-
out = out.replace(/commands\/((?!lisa\/)[^"'`\s]+\.md)/g, "commands/lisa/$1");
|
|
20
|
-
|
|
21
|
-
// Lifecycle skill folder reads: skills/<lifecycle>/SKILL.md in test arrays
|
|
22
|
-
for (const skill of [
|
|
23
|
-
"debrief",
|
|
24
|
-
"implement",
|
|
25
|
-
"intake",
|
|
26
|
-
"monitor",
|
|
27
|
-
"plan",
|
|
28
|
-
"research",
|
|
29
|
-
"verify",
|
|
30
|
-
]) {
|
|
31
|
-
out = out.replace(
|
|
32
|
-
new RegExp(`(["\`])${skill}(["\`])`, "g"),
|
|
33
|
-
`$1lisa-${skill}$2`
|
|
34
|
-
);
|
|
35
|
-
out = out.replace(new RegExp(`/%s/${skill}"`, "g"), `/%s/lisa-${skill}"`);
|
|
36
|
-
out = out.replace(
|
|
37
|
-
new RegExp(`skills/${skill}/`, "g"),
|
|
38
|
-
`skills/lisa-${skill}/`
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// Build-intake skills in orchestration tests
|
|
43
|
-
for (const skill of [
|
|
44
|
-
"github-build-intake",
|
|
45
|
-
"jira-build-intake",
|
|
46
|
-
"linear-build-intake",
|
|
47
|
-
"github-prd-intake",
|
|
48
|
-
"prd-backlink",
|
|
49
|
-
"tracker-write",
|
|
50
|
-
"usage-accounting",
|
|
51
|
-
]) {
|
|
52
|
-
out = out.replace(
|
|
53
|
-
new RegExp(`skills/${skill}/`, "g"),
|
|
54
|
-
`skills/lisa-${skill}/`
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Command delegator expectations
|
|
59
|
-
out = out.replace(
|
|
60
|
-
/delegates to\s+\n?\s*`\/lisa:doctor`/g,
|
|
61
|
-
"delegates to `/lisa:doctor`"
|
|
62
|
-
);
|
|
63
|
-
out = out.replace(
|
|
64
|
-
/Use the \/lisa:doctor skill/g,
|
|
65
|
-
"Use the /lisa-doctor skill"
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
return out;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/** @param {string} dir */
|
|
72
|
-
function walk(dir) {
|
|
73
|
-
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
74
|
-
const p = path.join(dir, entry.name);
|
|
75
|
-
if (entry.isDirectory()) {
|
|
76
|
-
walk(p);
|
|
77
|
-
continue;
|
|
78
|
-
}
|
|
79
|
-
if (!/\.(ts|md)$/.test(entry.name)) continue;
|
|
80
|
-
const original = fs.readFileSync(p, "utf8");
|
|
81
|
-
const updated = rewrite(original);
|
|
82
|
-
if (updated !== original) fs.writeFileSync(p, updated);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
walk(path.join(REPO_ROOT, "tests"));
|
|
87
|
-
console.log("Updated test command paths.");
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/plugins/lisa/commands/{lisa/parity-safety-net-rules.md → parity-safety-net-rules.md}
RENAMED
|
File without changes
|
/package/plugins/lisa/commands/{lisa/parity-sentry-sdk-setup.md → parity-sentry-sdk-setup.md}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/plugins/lisa/commands/{lisa/validate-tracker-mapping.md → validate-tracker-mapping.md}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/plugins/lisa-expo-copilot/commands/{e2e-coverage-gaps.md → lisa/e2e-coverage-gaps.md}
RENAMED
|
File without changes
|
/package/plugins/lisa-expo-cursor/commands/{e2e-coverage-gaps.md → lisa/e2e-coverage-gaps.md}
RENAMED
|
File without changes
|
/package/plugins/lisa-harper-fabric-agy/commands/{e2e-coverage-gaps.md → lisa/e2e-coverage-gaps.md}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/plugins/lisa-openclaw-agy/commands/{connect-repo-topic.md → lisa/connect-repo-topic.md}
RENAMED
|
File without changes
|
/package/plugins/lisa-openclaw-agy/commands/{connect-staff-slack.md → lisa/connect-staff-slack.md}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/plugins/lisa-openclaw-copilot/commands/{connect-repo-topic.md → lisa/connect-repo-topic.md}
RENAMED
|
File without changes
|