adonisjs-maestro 0.0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Walaff Fernandes
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,153 @@
1
+ # Skills
2
+
3
+ Reusable agent skills for AdonisJS, Lucid, Inertia, Japa, and full-cycle engineering orchestration.
4
+
5
+ ## Install
6
+
7
+ ### Guided Installer
8
+
9
+ Use the `adonisjs-maestro` CLI to install the right skills for your stack:
10
+
11
+ ```bash
12
+ npx adonisjs-maestro
13
+ ```
14
+
15
+ Non-interactive examples:
16
+
17
+ ```bash
18
+ npx adonisjs-maestro --stack=vue --yes
19
+ npx adonisjs-maestro --stack=react --global --agent=codex --yes
20
+ npx adonisjs-maestro --skills=maestro,adonisjs,lucid,japa --yes
21
+ ```
22
+
23
+ Available stacks:
24
+
25
+ | Stack | Skills |
26
+ | --- | --- |
27
+ | `monorepo` | `maestro`, `adonisjs`, `lucid`, `japa` |
28
+ | `hypermedia` | `maestro`, `adonisjs`, `lucid`, `japa` |
29
+ | `react` | `maestro`, `adonisjs`, `lucid`, `japa`, `inertia-react` |
30
+ | `vue` | `maestro`, `adonisjs`, `lucid`, `japa`, `inertia-vue` |
31
+ | `custom` | Choose individual skills |
32
+
33
+ ### Direct Skills CLI
34
+
35
+ Install the collection with the `skills` CLI:
36
+
37
+ ```bash
38
+ npx skills add lncitador/adonisjs-maestro
39
+ ```
40
+
41
+ For a global install:
42
+
43
+ ```bash
44
+ npx skills add lncitador/adonisjs-maestro -g --yes
45
+ ```
46
+
47
+ Restart your agent after installing so the new skills are loaded.
48
+
49
+ ## Skills
50
+
51
+ | Skill | Use it for |
52
+ | --- | --- |
53
+ | `maestro` | Orchestrating full-cycle app work: intake, planning, implementation, verification, commit, push, and PR |
54
+ | `adonisjs` | AdonisJS v7 backend work: migrations, models, transformers, controllers, routes, auth, policies, services, events, and review |
55
+ | `lucid` | Lucid ORM and SQL layer: migrations, schema generation, models, relationships, query builders, transactions, factories, and seeders |
56
+ | `inertia-vue` | Vue 3 frontend patterns in AdonisJS + Inertia projects |
57
+ | `inertia-react` | React frontend patterns in AdonisJS + Inertia projects |
58
+ | `japa` | Japa testing in AdonisJS apps: API tests, browser tests, console tests, fakes, swaps, and database setup |
59
+
60
+ ## Recommended Entry Point
61
+
62
+ Use `maestro` when the task is broader than a single framework question.
63
+
64
+ ```text
65
+ INTAKE -> PLANNING -> BUILD -> VERIFY -> PUBLISH -> DONE
66
+ ```
67
+
68
+ Examples:
69
+
70
+ ```text
71
+ /maestro plan and implement this AdonisJS + Inertia feature.
72
+ /maestro review this PR against the implementation plan.
73
+ /maestro verify, commit, push, and open a PR for this change.
74
+ ```
75
+
76
+ `maestro` coordinates the other skills instead of replacing them. For example, an AdonisJS + Inertia Vue task should usually combine:
77
+
78
+ - `/maestro` for phase control and workflow gates
79
+ - `/adonisjs` for backend contracts and routing
80
+ - `/lucid` for migrations, models, relationships, query builders, and factories
81
+ - `/inertia-vue` for frontend page/form patterns
82
+ - `/japa` for test strategy and fixtures
83
+
84
+ ## Direct Skill Usage
85
+
86
+ Use a specialized skill directly when the request is narrow:
87
+
88
+ ```text
89
+ /adonisjs create a controller, route, and validator for posts.
90
+ /lucid create a migration, model relationship, and factory for posts.
91
+ /japa write a functional test with loginAs.
92
+ /inertia-vue fix this Form component.
93
+ /inertia-react type these generated Data props.
94
+ ```
95
+
96
+ ## Repository Layout
97
+
98
+ All skills live under `skills/`. Each folder contains a required `SKILL.md` file and optional resources:
99
+
100
+ ```text
101
+ skills/
102
+ ├── maestro/
103
+ ├── adonisjs/
104
+ ├── lucid/
105
+ ├── inertia-vue/
106
+ ├── inertia-react/
107
+ └── japa/
108
+ ```
109
+
110
+ The framework skills include references and runbooks for deeper context. The `maestro` skill intentionally has no scripts or references: it is an orchestration layer.
111
+
112
+ ## Development
113
+
114
+ Use the Skills CLI to search, install, check, and update skills:
115
+
116
+ ```bash
117
+ npm run typecheck
118
+ npm run build
119
+ npx skills find adonisjs
120
+ npx skills check
121
+ npx skills update
122
+ ```
123
+
124
+ Before publishing changes, make sure each skill folder contains a valid `SKILL.md` with YAML frontmatter:
125
+
126
+ ```yaml
127
+ ---
128
+ name: skill-name
129
+ description: Use when...
130
+ ---
131
+ ```
132
+
133
+ Keep optional resources (`references/`, `scripts/`, `assets/`, `agents/`) only when they directly support the skill.
134
+
135
+ ## Release
136
+
137
+ Releases are created with `release-it`:
138
+
139
+ ```bash
140
+ npm run release
141
+ ```
142
+
143
+ The release command runs typecheck, tests, and build before bumping the package version, creating the release commit, and tagging it as `v<version>`. Pushing the tag triggers GitHub Actions to publish `adonisjs-maestro` to npm.
144
+
145
+ Configure npm Trusted Publishing for `.github/workflows/publish.yml` before the first release. The workflow uses GitHub OIDC instead of a long-lived npm token.
146
+
147
+ ## Notes
148
+
149
+ - These skills assume modern AdonisJS v7 conventions.
150
+ - `lucid` is focused on the ORM/database layer and should be paired with `adonisjs` for controllers, routes, validators, services, and framework-level architecture.
151
+ - `inertia-vue` and `inertia-react` are frontend-layer skills and should be paired with `adonisjs` for backend work.
152
+ - `japa` is focused on testing patterns for AdonisJS apps.
153
+ - `maestro` should be used when a task needs orchestration, phase gates, or publishing workflow discipline.
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ kernel
4
+ } from "../chunk-ZWBJVZPB.js";
5
+
6
+ // bin/run.ts
7
+ kernel.handle(["adonisjs-maestro", ...process.argv.slice(2)]).catch((error) => {
8
+ console.error(error);
9
+ process.exitCode = 1;
10
+ });
@@ -0,0 +1,217 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __decorateClass = (decorators, target, key, kind) => {
4
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
5
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
6
+ if (decorator = decorators[i])
7
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
8
+ if (kind && result) __defProp(target, key, result);
9
+ return result;
10
+ };
11
+
12
+ // index.ts
13
+ import { HelpCommand, Kernel } from "@adonisjs/ace";
14
+
15
+ // commands/main.ts
16
+ import { execa } from "execa";
17
+ import { BaseCommand, flags } from "@adonisjs/ace";
18
+
19
+ // src/stacks.ts
20
+ var SKILLS_REPOSITORY = "lncitador/adonisjs-maestro";
21
+ var AVAILABLE_SKILLS = [
22
+ "maestro",
23
+ "adonisjs",
24
+ "lucid",
25
+ "japa",
26
+ "inertia-react",
27
+ "inertia-vue"
28
+ ];
29
+ var STACKS = [
30
+ {
31
+ name: "monorepo",
32
+ label: "Monorepo: API + TanStack",
33
+ hint: "API/backend workflow without Inertia frontend skills",
34
+ skills: ["maestro", "adonisjs", "lucid", "japa"]
35
+ },
36
+ {
37
+ name: "hypermedia",
38
+ label: "Hypermedia",
39
+ hint: "Server-rendered or hypermedia-oriented AdonisJS app",
40
+ skills: ["maestro", "adonisjs", "lucid", "japa"]
41
+ },
42
+ {
43
+ name: "react",
44
+ label: "Fullstack: Inertia React",
45
+ hint: "AdonisJS + Lucid + Inertia React",
46
+ skills: ["maestro", "adonisjs", "lucid", "japa", "inertia-react"]
47
+ },
48
+ {
49
+ name: "vue",
50
+ label: "Fullstack: Inertia Vue",
51
+ hint: "AdonisJS + Lucid + Inertia Vue",
52
+ skills: ["maestro", "adonisjs", "lucid", "japa", "inertia-vue"]
53
+ },
54
+ {
55
+ name: "custom",
56
+ label: "Custom",
57
+ hint: "Choose individual skills",
58
+ skills: []
59
+ }
60
+ ];
61
+ function getStack(name) {
62
+ return STACKS.find((stack) => stack.name === name);
63
+ }
64
+ function parseSkills(value) {
65
+ const requested = value.split(",").map((skill) => skill.trim()).filter(Boolean);
66
+ const invalid = requested.filter((skill) => !AVAILABLE_SKILLS.includes(skill));
67
+ if (invalid.length > 0) {
68
+ throw new Error(`Unknown skill(s): ${invalid.join(", ")}`);
69
+ }
70
+ return [...new Set(requested)];
71
+ }
72
+ function buildSkillsAddArgs(options) {
73
+ const args = ["skills", "add", SKILLS_REPOSITORY];
74
+ for (const skill of options.skills) {
75
+ args.push("--skill", skill);
76
+ }
77
+ if (options.global) {
78
+ args.push("--global");
79
+ }
80
+ for (const agent of options.agents ?? []) {
81
+ args.push("--agent", agent);
82
+ }
83
+ if (options.yes) {
84
+ args.push("--yes");
85
+ }
86
+ return args;
87
+ }
88
+
89
+ // commands/main.ts
90
+ var InstallSkills = class extends BaseCommand {
91
+ static commandName = "adonisjs-maestro";
92
+ static description = "Install AdonisJS Maestro agent skills for your stack";
93
+ async #promptForStack() {
94
+ if (this.stack) {
95
+ return this.stack;
96
+ }
97
+ const selected = await this.prompt.choice(
98
+ "Which AdonisJS stack are you using?",
99
+ STACKS.map((stack) => ({
100
+ name: stack.name,
101
+ message: stack.label,
102
+ hint: stack.hint
103
+ }))
104
+ );
105
+ return selected;
106
+ }
107
+ async #promptForCustomSkills() {
108
+ const answer = await this.prompt.ask(
109
+ [
110
+ "Which skills should be installed?",
111
+ `Available: ${AVAILABLE_SKILLS.join(", ")}`,
112
+ "Enter a comma-separated list"
113
+ ].join("\n")
114
+ );
115
+ return parseSkills(answer);
116
+ }
117
+ #parseAgents() {
118
+ if (!this.agent) {
119
+ return [];
120
+ }
121
+ return this.agent.split(",").map((agent) => agent.trim()).filter(Boolean);
122
+ }
123
+ async #resolveSkills() {
124
+ if (this.skills) {
125
+ return parseSkills(this.skills);
126
+ }
127
+ const stackName = await this.#promptForStack();
128
+ const stack = getStack(stackName);
129
+ if (!stack) {
130
+ throw new Error(`Unknown stack "${stackName}". Expected one of: ${STACKS.map((item) => item.name).join(", ")}`);
131
+ }
132
+ if (stack.name === "custom") {
133
+ return this.#promptForCustomSkills();
134
+ }
135
+ return stack.skills;
136
+ }
137
+ #renderCommand(args) {
138
+ return ["npx", ...args].join(" ");
139
+ }
140
+ async run() {
141
+ const skills = await this.#resolveSkills();
142
+ if (skills.length === 0) {
143
+ throw new Error("No skills selected");
144
+ }
145
+ const args = buildSkillsAddArgs({
146
+ skills,
147
+ global: this.global,
148
+ agents: this.#parseAgents(),
149
+ yes: this.yes
150
+ });
151
+ this.logger.info(`Installing skills: ${skills.join(", ")}`);
152
+ this.logger.info(this.#renderCommand(args));
153
+ if (this.dryRun) {
154
+ return;
155
+ }
156
+ await execa("npx", args, {
157
+ stdio: this.verbose ? "inherit" : "pipe"
158
+ });
159
+ this.logger.success("AdonisJS Maestro skills installed");
160
+ }
161
+ };
162
+ __decorateClass([
163
+ flags.string({
164
+ description: "Stack preset to install: monorepo, hypermedia, react, vue, or custom"
165
+ })
166
+ ], InstallSkills.prototype, "stack", 2);
167
+ __decorateClass([
168
+ flags.string({
169
+ description: "Comma-separated list of skills to install"
170
+ })
171
+ ], InstallSkills.prototype, "skills", 2);
172
+ __decorateClass([
173
+ flags.string({
174
+ description: 'Target agent. Repeat by comma-separating values, or use "*" for all agents',
175
+ alias: "a"
176
+ })
177
+ ], InstallSkills.prototype, "agent", 2);
178
+ __decorateClass([
179
+ flags.boolean({
180
+ description: "Install globally instead of the current project",
181
+ alias: "g"
182
+ })
183
+ ], InstallSkills.prototype, "global", 2);
184
+ __decorateClass([
185
+ flags.boolean({
186
+ description: "Skip skills CLI confirmation prompts",
187
+ alias: "y"
188
+ })
189
+ ], InstallSkills.prototype, "yes", 2);
190
+ __decorateClass([
191
+ flags.boolean({
192
+ description: "Print the generated npx skills command without running it"
193
+ })
194
+ ], InstallSkills.prototype, "dryRun", 2);
195
+ __decorateClass([
196
+ flags.boolean({
197
+ description: "Show command output from the skills CLI",
198
+ alias: "v"
199
+ })
200
+ ], InstallSkills.prototype, "verbose", 2);
201
+
202
+ // index.ts
203
+ Kernel.defaultCommand = InstallSkills;
204
+ var kernel = Kernel.create();
205
+ kernel.defineFlag("help", {
206
+ type: "boolean",
207
+ description: HelpCommand.description
208
+ });
209
+ kernel.on("help", async (command, $kernel, parsed) => {
210
+ parsed.args.unshift(command.commandName);
211
+ await new HelpCommand($kernel, parsed, kernel.ui, kernel.prompt).exec();
212
+ return $kernel.shortcircuit();
213
+ });
214
+
215
+ export {
216
+ kernel
217
+ };
package/build/index.js ADDED
@@ -0,0 +1,6 @@
1
+ import {
2
+ kernel
3
+ } from "./chunk-ZWBJVZPB.js";
4
+ export {
5
+ kernel
6
+ };
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "adonisjs-maestro",
3
+ "description": "Install AdonisJS Maestro agent skills by stack",
4
+ "version": "0.0.1",
5
+ "type": "module",
6
+ "main": "build/index.js",
7
+ "bin": {
8
+ "adonisjs-maestro": "build/bin/run.js"
9
+ },
10
+ "exports": {
11
+ ".": "./build/index.js"
12
+ },
13
+ "files": [
14
+ "build",
15
+ "LICENSE",
16
+ "README.md"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsup",
20
+ "prepack": "npm run build",
21
+ "release": "release-it",
22
+ "release:dry-run": "release-it --dry-run",
23
+ "test": "node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts",
24
+ "typecheck": "tsc --noEmit"
25
+ },
26
+ "dependencies": {
27
+ "@adonisjs/ace": "^14.1.0",
28
+ "execa": "^9.6.1"
29
+ },
30
+ "devDependencies": {
31
+ "@japa/assert": "^4.2.0",
32
+ "@japa/runner": "^5.3.0",
33
+ "@poppinss/ts-exec": "^1.4.4",
34
+ "@types/node": "^25.0.0",
35
+ "release-it": "^20.0.1",
36
+ "tsup": "^8.5.1",
37
+ "typescript": "^5.9.0"
38
+ },
39
+ "publishConfig": {
40
+ "access": "public",
41
+ "provenance": true
42
+ },
43
+ "tsup": {
44
+ "entry": [
45
+ "./index.ts",
46
+ "./bin/run.ts"
47
+ ],
48
+ "outDir": "./build",
49
+ "clean": true,
50
+ "format": "esm",
51
+ "target": "esnext",
52
+ "dts": false,
53
+ "sourcemap": false
54
+ },
55
+ "keywords": [
56
+ "adonisjs",
57
+ "agent-skills",
58
+ "skills",
59
+ "maestro"
60
+ ],
61
+ "homepage": "https://github.com/lncitador/adonisjs-maestro#readme",
62
+ "repository": {
63
+ "type": "git",
64
+ "url": "git+https://github.com/lncitador/adonisjs-maestro.git"
65
+ },
66
+ "bugs": {
67
+ "url": "https://github.com/lncitador/adonisjs-maestro/issues"
68
+ },
69
+ "license": "MIT"
70
+ }