@holo-js/cli 0.2.3 → 0.2.5
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/dist/agent-skills-MSEMQUXT.mjs +173 -0
- package/dist/bin/holo.mjs +81 -21
- package/dist/{broadcast-IL24KZHW.mjs → broadcast-5MJ3GJK7.mjs} +1 -1
- package/dist/{broadcast-NVBDC5DR.mjs → broadcast-MRJGFCFH.mjs} +1 -1
- package/dist/{cache-INHARA5B.mjs → cache-KVRYC7FB.mjs} +1 -1
- package/dist/{cache-QT4L44AW.mjs → cache-WWE4Q4YE.mjs} +1 -1
- package/dist/{cache-migrations-A3PXSAEM.mjs → cache-migrations-APDFSFEX.mjs} +5 -5
- package/dist/{cache-migrations-MOIIT5FK.mjs → cache-migrations-CPYQC7T6.mjs} +5 -5
- package/dist/{chunk-HHQZB6Z4.mjs → chunk-PT72AMV7.mjs} +67 -67
- package/dist/{chunk-PJOYKYYG.mjs → chunk-TWITVSFZ.mjs} +67 -67
- package/dist/{chunk-42V4KAVA.mjs → chunk-UPXQONEH.mjs} +1 -1
- package/dist/{chunk-YKFOYZLS.mjs → chunk-XDRCZ3Z5.mjs} +1 -1
- package/dist/{dev-I3SVGKBU.mjs → dev-CT4DRTLN.mjs} +2 -2
- package/dist/{dev-KOQ3MDF4.mjs → dev-QDLR6C7K.mjs} +2 -2
- package/dist/{generators-M4IS5JUN.mjs → generators-PUN5TFP5.mjs} +5 -5
- package/dist/{generators-YJJHKGCV.mjs → generators-WQHI7DBW.mjs} +5 -5
- package/dist/index.mjs +81 -21
- package/dist/{media-migrations-TLZ5TC4Y.mjs → media-migrations-D3CDNMPT.mjs} +6 -6
- package/dist/{media-migrations-ZIYGFLLR.mjs → media-migrations-IWCSCKSA.mjs} +6 -6
- package/dist/{queue-C4GCAEO3.mjs → queue-GRB2IH5M.mjs} +3 -3
- package/dist/{queue-VNBAQSXD.mjs → queue-O3OSLGOV.mjs} +3 -3
- package/dist/{queue-migrations-KLI35TWM.mjs → queue-migrations-7T42S4FX.mjs} +21 -20
- package/dist/{queue-migrations-UPPGTXUT.mjs → queue-migrations-HFZB64OG.mjs} +21 -20
- package/dist/{runtime-UK77C7Y5.mjs → runtime-M3G5OKQV.mjs} +1 -1
- package/dist/{runtime-UMBLJHYV.mjs → runtime-TTRP2DGL.mjs} +1 -1
- package/dist/runtime-worker.mjs +6 -0
- package/dist/{scaffold-BQDH5BKC.mjs → scaffold-5BOVJYF3.mjs} +1 -1
- package/dist/{scaffold-K3J5J2O6.mjs → scaffold-NY3MWUZF.mjs} +1 -1
- package/dist/{security-2S6523NZ.mjs → security-H7AGDFBX.mjs} +1 -1
- package/dist/{security-73KA2VFP.mjs → security-ST6ED7EK.mjs} +1 -1
- package/package.json +8 -8
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
// src/agent-skills.ts
|
|
2
|
+
import { homedir } from "os";
|
|
3
|
+
import { dirname, resolve } from "path";
|
|
4
|
+
import { mkdir, readFile, writeFile } from "fs/promises";
|
|
5
|
+
var SUPPORTED_AGENT_SKILL_TARGETS = [
|
|
6
|
+
"codex",
|
|
7
|
+
"claude",
|
|
8
|
+
"cursor",
|
|
9
|
+
"windsurf",
|
|
10
|
+
"opencode",
|
|
11
|
+
"gemini",
|
|
12
|
+
"kiro"
|
|
13
|
+
];
|
|
14
|
+
var HOLO_AGENT_SKILL = `---
|
|
15
|
+
name: holo-js
|
|
16
|
+
description: Help users build applications with the Holo-JS framework by researching the current Holo-JS documentation at https://docs.holo-js.com/ before answering or coding. Use when a user asks how to scaffold, configure, integrate, or implement Holo-JS app features in Nuxt, Next.js, or SvelteKit, including database, ORM, auth, authorization, validation, forms, storage, media, queues, events, broadcast, realtime, mail, notifications, testing, or deployment. Prefer this for user-facing app work, not Holo-JS framework internals.
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# Holo-JS
|
|
20
|
+
|
|
21
|
+
Use the docs as the source of truth. Do not answer from memory when exact commands, imports, API names, config shape, route shape, or framework integration details matter.
|
|
22
|
+
|
|
23
|
+
Primary documentation URL: https://docs.holo-js.com/
|
|
24
|
+
|
|
25
|
+
## Required Workflow
|
|
26
|
+
|
|
27
|
+
1. Clarify the user's task category in your own reasoning: setup, config, database, ORM, auth, authorization, validation/forms, storage/media, queue/events, broadcast/realtime, mail/notifications, testing, deployment, or framework integration.
|
|
28
|
+
2. Search the live docs before giving implementation details.
|
|
29
|
+
3. Open the most relevant docs pages and read the sections that match the task.
|
|
30
|
+
4. Cross-check at least one adjacent or overview page when the task touches package setup, framework integration, auth/session/security, background workers, or deployment.
|
|
31
|
+
5. Base commands and code on the docs you just read.
|
|
32
|
+
6. Mention when docs do not cover the requested detail and ask for a docs link, local project context, or permission to inspect the package source.
|
|
33
|
+
|
|
34
|
+
## How To Search
|
|
35
|
+
|
|
36
|
+
Prefer these approaches, in order:
|
|
37
|
+
|
|
38
|
+
1. Use the docs site's own search if you have browser access.
|
|
39
|
+
2. Use web search with \`site:docs.holo-js.com\` plus the concrete feature terms.
|
|
40
|
+
3. Open likely docs URLs from search results, then follow sidebar or in-page links to related pages.
|
|
41
|
+
4. If working inside the Holo-JS repository, search local docs source under \`apps/docs/docs/**/*.md\` with \`rg\` as a fallback or for faster exact matching.
|
|
42
|
+
|
|
43
|
+
Good search queries:
|
|
44
|
+
|
|
45
|
+
- \`site:docs.holo-js.com Holo-JS install <package-or-feature>\`
|
|
46
|
+
- \`site:docs.holo-js.com Holo-JS <framework> <feature>\`
|
|
47
|
+
- \`site:docs.holo-js.com Holo-JS <api-or-command-name>\`
|
|
48
|
+
- \`site:docs.holo-js.com Holo-JS <error message or concept>\`
|
|
49
|
+
|
|
50
|
+
Local repo fallback:
|
|
51
|
+
|
|
52
|
+
\`\`\`bash
|
|
53
|
+
rg -n "<feature|api|command|error>" apps/docs/docs
|
|
54
|
+
find apps/docs/docs -type f -name '*.md' | sort
|
|
55
|
+
\`\`\`
|
|
56
|
+
|
|
57
|
+
## What To Open
|
|
58
|
+
|
|
59
|
+
Use docs pages by task area, not by package guesses. Examples:
|
|
60
|
+
|
|
61
|
+
- Starting a project: installation, configuration, directory structure.
|
|
62
|
+
- Framework routing or handlers: routing, runtime services, framework-specific integration pages.
|
|
63
|
+
- Database and models: database pages first, then ORM pages.
|
|
64
|
+
- Auth flows: auth overview plus the specific flow page, then session/cookies or current auth client if state is involved.
|
|
65
|
+
- Authorization: authorization overview plus policies or abilities.
|
|
66
|
+
- Forms: forms overview plus server validation, client usage, and framework integration as needed.
|
|
67
|
+
- Files: storage first; media only when files belong to models or need conversions/collections.
|
|
68
|
+
- Background work: queue, events, queued listeners, workers, failed jobs, and deployment pages as needed.
|
|
69
|
+
- Browser realtime: broadcast or realtime docs plus framework helper pages.
|
|
70
|
+
- Production behavior: deployment plus any worker/driver page for the feature.
|
|
71
|
+
|
|
72
|
+
These names are navigation hints, not an API reference. Confirm exact paths and examples from the docs before responding.
|
|
73
|
+
|
|
74
|
+
## Answering Rules
|
|
75
|
+
|
|
76
|
+
- Cite or link the docs pages you used when the environment supports links.
|
|
77
|
+
- Keep examples aligned with the user's framework and package manager.
|
|
78
|
+
- Preserve framework-native routing, redirect, server action, and handler conventions shown by the docs.
|
|
79
|
+
- Do not invent helper APIs to make an answer look cleaner.
|
|
80
|
+
- Do not assume optional packages are installed. Check install/setup docs for the feature.
|
|
81
|
+
- Do not expose secrets in client code or examples.
|
|
82
|
+
- Do not hand-edit generated Holo-JS output unless docs explicitly instruct it.
|
|
83
|
+
- If docs and installed package behavior disagree, tell the user what you found and treat the discrepancy as something to verify before coding.
|
|
84
|
+
|
|
85
|
+
## Coding Against An Existing App
|
|
86
|
+
|
|
87
|
+
When editing a user's app:
|
|
88
|
+
|
|
89
|
+
1. Inspect the app's framework, package manager, installed \`@holo-js/*\` packages, and existing Holo-JS config.
|
|
90
|
+
2. Search docs for the exact feature and framework.
|
|
91
|
+
3. Match the app's existing conventions.
|
|
92
|
+
4. Add validation and authorization at boundaries when the docs indicate they are required.
|
|
93
|
+
5. Run the app's relevant typecheck, lint, and tests when available.
|
|
94
|
+
|
|
95
|
+
If the user asks for a broad implementation such as "add auth" or "add realtime", start from the docs' setup/overview pages and implement the smallest complete vertical slice rather than assembling APIs from memory.
|
|
96
|
+
`;
|
|
97
|
+
function resolveAgentSkillPath(root, agent) {
|
|
98
|
+
return resolve(root, agentRoot(agent), "skills/holo-js/SKILL.md");
|
|
99
|
+
}
|
|
100
|
+
function resolveGlobalAgentSkillPath(agent) {
|
|
101
|
+
const home = homedir();
|
|
102
|
+
if (agent === "opencode") {
|
|
103
|
+
return resolve(home, ".config/opencode/skills/holo-js/SKILL.md");
|
|
104
|
+
}
|
|
105
|
+
return resolveAgentSkillPath(home, agent);
|
|
106
|
+
}
|
|
107
|
+
function agentRoot(agent) {
|
|
108
|
+
if (agent === "claude") {
|
|
109
|
+
return ".claude";
|
|
110
|
+
}
|
|
111
|
+
if (agent === "opencode") {
|
|
112
|
+
return ".opencode";
|
|
113
|
+
}
|
|
114
|
+
return `.${agent}`;
|
|
115
|
+
}
|
|
116
|
+
async function readExisting(path) {
|
|
117
|
+
try {
|
|
118
|
+
return await readFile(path, "utf8");
|
|
119
|
+
} catch (error) {
|
|
120
|
+
if (error && typeof error === "object" && "code" in error && error.code === "ENOENT") {
|
|
121
|
+
return void 0;
|
|
122
|
+
}
|
|
123
|
+
throw error;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function normalizeAgentSkillTargets(values) {
|
|
127
|
+
const requested = values.length > 0 ? values : ["all"];
|
|
128
|
+
const agents = /* @__PURE__ */ new Set();
|
|
129
|
+
for (const value of requested) {
|
|
130
|
+
const normalized = value.trim().toLowerCase();
|
|
131
|
+
if (!normalized) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (normalized === "all") {
|
|
135
|
+
for (const agent of SUPPORTED_AGENT_SKILL_TARGETS) {
|
|
136
|
+
agents.add(agent);
|
|
137
|
+
}
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (!SUPPORTED_AGENT_SKILL_TARGETS.includes(normalized)) {
|
|
141
|
+
throw new Error(`Unsupported agent skill target: ${value}.`);
|
|
142
|
+
}
|
|
143
|
+
agents.add(normalized);
|
|
144
|
+
}
|
|
145
|
+
return [...agents];
|
|
146
|
+
}
|
|
147
|
+
async function installAgentSkills(projectRoot, options) {
|
|
148
|
+
const results = [];
|
|
149
|
+
for (const agent of options.agents) {
|
|
150
|
+
const path = options.global === true ? resolveGlobalAgentSkillPath(agent) : resolveAgentSkillPath(projectRoot, agent);
|
|
151
|
+
const existing = await readExisting(path);
|
|
152
|
+
if (existing === HOLO_AGENT_SKILL) {
|
|
153
|
+
results.push({ agent, path, status: "unchanged" });
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
if (typeof existing === "string" && options.force !== true) {
|
|
157
|
+
throw new Error(`Refusing to overwrite existing ${agent} skill at ${path}. Re-run with --force to replace it.`);
|
|
158
|
+
}
|
|
159
|
+
await mkdir(dirname(path), { recursive: true });
|
|
160
|
+
await writeFile(path, HOLO_AGENT_SKILL, "utf8");
|
|
161
|
+
results.push({
|
|
162
|
+
agent,
|
|
163
|
+
path,
|
|
164
|
+
status: typeof existing === "string" ? "updated" : "created"
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return results;
|
|
168
|
+
}
|
|
169
|
+
export {
|
|
170
|
+
SUPPORTED_AGENT_SKILL_TARGETS,
|
|
171
|
+
installAgentSkills,
|
|
172
|
+
normalizeAgentSkillTargets
|
|
173
|
+
};
|
package/dist/bin/holo.mjs
CHANGED
|
@@ -30,7 +30,7 @@ import {
|
|
|
30
30
|
} from "../chunk-LBJAJLKU.mjs";
|
|
31
31
|
import "../chunk-D7O4SU6N.mjs";
|
|
32
32
|
import "../chunk-VP2E62DF.mjs";
|
|
33
|
-
import "../chunk-
|
|
33
|
+
import "../chunk-PT72AMV7.mjs";
|
|
34
34
|
import "../chunk-YEFJBN56.mjs";
|
|
35
35
|
import "../chunk-J76GH2DR.mjs";
|
|
36
36
|
import {
|
|
@@ -112,6 +112,7 @@ var AUTH_INSTALL_FEATURES = ["social", "workos", "clerk"];
|
|
|
112
112
|
var AUTH_SOCIAL_PROVIDER_MODES = ["default", "specific"];
|
|
113
113
|
var EVENTS_QUEUE_ACTIONS = ["skip", "enable"];
|
|
114
114
|
var MODEL_GENERATOR_OPTIONS = ["migration", "observer", "seeder", "factory"];
|
|
115
|
+
var COMMAND_LIST_DESCRIPTION_COLUMN = 32;
|
|
115
116
|
var runtimeModulePromise;
|
|
116
117
|
var queueModulePromise;
|
|
117
118
|
var cacheModulePromise;
|
|
@@ -126,44 +127,45 @@ var projectConfigModulePromise;
|
|
|
126
127
|
var projectDiscoveryModulePromise;
|
|
127
128
|
var projectRuntimeModulePromise;
|
|
128
129
|
var projectScaffoldModulePromise;
|
|
130
|
+
var agentSkillsModulePromise;
|
|
129
131
|
function loadRuntimeModule() {
|
|
130
|
-
runtimeModulePromise ??= import("../runtime-
|
|
132
|
+
runtimeModulePromise ??= import("../runtime-TTRP2DGL.mjs");
|
|
131
133
|
return runtimeModulePromise;
|
|
132
134
|
}
|
|
133
135
|
function loadQueueModule() {
|
|
134
|
-
queueModulePromise ??= import("../queue-
|
|
136
|
+
queueModulePromise ??= import("../queue-GRB2IH5M.mjs");
|
|
135
137
|
return queueModulePromise;
|
|
136
138
|
}
|
|
137
139
|
function loadCacheModule() {
|
|
138
|
-
cacheModulePromise ??= import("../cache-
|
|
140
|
+
cacheModulePromise ??= import("../cache-WWE4Q4YE.mjs");
|
|
139
141
|
return cacheModulePromise;
|
|
140
142
|
}
|
|
141
143
|
function loadQueueMigrationsModule() {
|
|
142
|
-
queueMigrationsModulePromise ??= import("../queue-migrations-
|
|
144
|
+
queueMigrationsModulePromise ??= import("../queue-migrations-HFZB64OG.mjs");
|
|
143
145
|
return queueMigrationsModulePromise;
|
|
144
146
|
}
|
|
145
147
|
function loadCacheMigrationsModule() {
|
|
146
|
-
cacheMigrationsModulePromise ??= import("../cache-migrations-
|
|
148
|
+
cacheMigrationsModulePromise ??= import("../cache-migrations-CPYQC7T6.mjs");
|
|
147
149
|
return cacheMigrationsModulePromise;
|
|
148
150
|
}
|
|
149
151
|
function loadMediaMigrationsModule() {
|
|
150
|
-
mediaMigrationsModulePromise ??= import("../media-migrations-
|
|
152
|
+
mediaMigrationsModulePromise ??= import("../media-migrations-D3CDNMPT.mjs");
|
|
151
153
|
return mediaMigrationsModulePromise;
|
|
152
154
|
}
|
|
153
155
|
function loadGeneratorsModule() {
|
|
154
|
-
generatorsModulePromise ??= import("../generators-
|
|
156
|
+
generatorsModulePromise ??= import("../generators-PUN5TFP5.mjs");
|
|
155
157
|
return generatorsModulePromise;
|
|
156
158
|
}
|
|
157
159
|
function loadBroadcastModule() {
|
|
158
|
-
broadcastModulePromise ??= import("../broadcast-
|
|
160
|
+
broadcastModulePromise ??= import("../broadcast-MRJGFCFH.mjs");
|
|
159
161
|
return broadcastModulePromise;
|
|
160
162
|
}
|
|
161
163
|
function loadSecurityModule() {
|
|
162
|
-
securityModulePromise ??= import("../security-
|
|
164
|
+
securityModulePromise ??= import("../security-H7AGDFBX.mjs");
|
|
163
165
|
return securityModulePromise;
|
|
164
166
|
}
|
|
165
167
|
function loadDevModule() {
|
|
166
|
-
devModulePromise ??= import("../dev-
|
|
168
|
+
devModulePromise ??= import("../dev-QDLR6C7K.mjs");
|
|
167
169
|
return devModulePromise;
|
|
168
170
|
}
|
|
169
171
|
function loadProjectConfigModule() {
|
|
@@ -179,9 +181,13 @@ function loadProjectRuntimeModule() {
|
|
|
179
181
|
return projectRuntimeModulePromise;
|
|
180
182
|
}
|
|
181
183
|
function loadProjectScaffoldModule() {
|
|
182
|
-
projectScaffoldModulePromise ??= import("../scaffold-
|
|
184
|
+
projectScaffoldModulePromise ??= import("../scaffold-NY3MWUZF.mjs");
|
|
183
185
|
return projectScaffoldModulePromise;
|
|
184
186
|
}
|
|
187
|
+
function loadAgentSkillsModule() {
|
|
188
|
+
agentSkillsModulePromise ??= import("../agent-skills-MSEMQUXT.mjs");
|
|
189
|
+
return agentSkillsModulePromise;
|
|
190
|
+
}
|
|
185
191
|
async function resolveRuntimeExecutor(runtimeExecutor) {
|
|
186
192
|
return runtimeExecutor ?? (await loadRuntimeModule()).withRuntimeEnvironment;
|
|
187
193
|
}
|
|
@@ -252,20 +258,27 @@ function createCommandContext(io, projectRoot, loadProject, input) {
|
|
|
252
258
|
function printCommandList(io, registry) {
|
|
253
259
|
const internal = registry.filter((command) => command.source === "internal");
|
|
254
260
|
const app = registry.filter((command) => command.source === "app");
|
|
255
|
-
writeLine(io.stdout, "
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
261
|
+
writeLine(io.stdout, "Usage:");
|
|
262
|
+
writeLine(io.stdout, " holo <command> [options] [arguments]");
|
|
263
|
+
writeLine(io.stdout);
|
|
264
|
+
writeLine(io.stdout, "Internal commands:");
|
|
265
|
+
printCommandListEntries(io, internal);
|
|
259
266
|
writeLine(io.stdout);
|
|
260
|
-
writeLine(io.stdout, "App
|
|
267
|
+
writeLine(io.stdout, "App commands:");
|
|
261
268
|
if (app.length === 0) {
|
|
262
269
|
writeLine(io.stdout, " (none)");
|
|
263
270
|
return;
|
|
264
271
|
}
|
|
265
|
-
|
|
266
|
-
|
|
272
|
+
printCommandListEntries(io, app);
|
|
273
|
+
}
|
|
274
|
+
function printCommandListEntries(io, commands) {
|
|
275
|
+
for (const command of commands) {
|
|
276
|
+
printCommandListEntry(io, command);
|
|
267
277
|
}
|
|
268
278
|
}
|
|
279
|
+
function printCommandListEntry(io, command) {
|
|
280
|
+
writeLine(io.stdout, ` ${command.name.padEnd(COMMAND_LIST_DESCRIPTION_COLUMN)}${command.description}`);
|
|
281
|
+
}
|
|
269
282
|
function printCommandHelp(io, command) {
|
|
270
283
|
writeLine(io.stdout, command.usage);
|
|
271
284
|
writeLine(io.stdout, command.description);
|
|
@@ -368,6 +381,50 @@ function createInternalCommands(context, runtimeExecutor, queueExecutors = {}, p
|
|
|
368
381
|
writeLine(context.stdout, ` ${resolvePackageManagerDevCommand(packageManager)}`);
|
|
369
382
|
}
|
|
370
383
|
},
|
|
384
|
+
{
|
|
385
|
+
name: "agents:install",
|
|
386
|
+
aliases: ["agent:install", "ai:install"],
|
|
387
|
+
description: "Install Holo-JS docs-search skills for coding agents.",
|
|
388
|
+
usage: "holo agents:install [--agent <all|codex|claude|cursor|windsurf|opencode|gemini|kiro>] [--global] [--force]",
|
|
389
|
+
source: "internal",
|
|
390
|
+
async prepare(input) {
|
|
391
|
+
const { normalizeAgentSkillTargets, SUPPORTED_AGENT_SKILL_TARGETS } = await loadAgentSkillsModule();
|
|
392
|
+
const requestedAgents = (collectMultiStringFlag(input.flags, "agent") ?? []).flatMap((entry) => splitCsv(entry) ?? []);
|
|
393
|
+
const agents = requestedAgents.length > 0 ? normalizeAgentSkillTargets(requestedAgents) : isInteractive(context, input.flags) ? await promptMultiChoice(context, "Coding agents", SUPPORTED_AGENT_SKILL_TARGETS, {
|
|
394
|
+
required: true,
|
|
395
|
+
initialValues: [...SUPPORTED_AGENT_SKILL_TARGETS]
|
|
396
|
+
}) : normalizeAgentSkillTargets([]);
|
|
397
|
+
return {
|
|
398
|
+
args: [],
|
|
399
|
+
flags: {
|
|
400
|
+
agent: agents,
|
|
401
|
+
...resolveBooleanFlag(input.flags, "global") === true ? { global: true } : {},
|
|
402
|
+
...resolveBooleanFlag(input.flags, "force") === true ? { force: true } : {}
|
|
403
|
+
}
|
|
404
|
+
};
|
|
405
|
+
},
|
|
406
|
+
async run(commandContext) {
|
|
407
|
+
const { installAgentSkills } = await loadAgentSkillsModule();
|
|
408
|
+
const agents = collectMultiStringFlag(commandContext.flags, "agent") ?? [];
|
|
409
|
+
const results = await installAgentSkills(context.projectRoot, {
|
|
410
|
+
agents,
|
|
411
|
+
global: commandContext.flags.global === true,
|
|
412
|
+
force: commandContext.flags.force === true
|
|
413
|
+
});
|
|
414
|
+
const created = results.filter((result) => result.status === "created").length;
|
|
415
|
+
const updated = results.filter((result) => result.status === "updated").length;
|
|
416
|
+
const unchanged = results.filter((result) => result.status === "unchanged").length;
|
|
417
|
+
const changed = created + updated;
|
|
418
|
+
writeLine(
|
|
419
|
+
context.stdout,
|
|
420
|
+
changed > 0 ? "Installed Holo-JS agent skills." : "Holo-JS agent skills are already installed."
|
|
421
|
+
);
|
|
422
|
+
for (const result of results) {
|
|
423
|
+
writeLine(context.stdout, ` - ${result.status} ${result.agent}: ${result.path}`);
|
|
424
|
+
}
|
|
425
|
+
writeLine(context.stdout, ` - summary: ${created} created, ${updated} updated, ${unchanged} unchanged`);
|
|
426
|
+
}
|
|
427
|
+
},
|
|
371
428
|
{
|
|
372
429
|
name: "key:generate",
|
|
373
430
|
description: "Generate APP_KEY in the project .env file when it is missing.",
|
|
@@ -742,7 +799,9 @@ function createInternalCommands(context, runtimeExecutor, queueExecutors = {}, p
|
|
|
742
799
|
async run() {
|
|
743
800
|
const runProjectPrepare = await resolveProjectExecutor(projectExecutors, "runProjectPrepare");
|
|
744
801
|
const runProjectBuild = await resolveProjectExecutor(projectExecutors, "runProjectBuild");
|
|
802
|
+
const executeRuntime = await resolveRuntimeExecutor(runtimeExecutor);
|
|
745
803
|
await runProjectPrepare(context.projectRoot, context);
|
|
804
|
+
await executeRuntime(context.projectRoot, "hydrate-schema", {}, async () => void 0);
|
|
746
805
|
await runProjectBuild(context, context.projectRoot);
|
|
747
806
|
}
|
|
748
807
|
},
|
|
@@ -1575,7 +1634,8 @@ function findCommand(registry, name) {
|
|
|
1575
1634
|
async function runCli(argv, io) {
|
|
1576
1635
|
try {
|
|
1577
1636
|
const requestedCommandName = argv[0];
|
|
1578
|
-
const
|
|
1637
|
+
const usesCurrentDirectoryAsProjectRoot = requestedCommandName === "new" || requestedCommandName === "agents:install" || requestedCommandName === "agent:install" || requestedCommandName === "ai:install";
|
|
1638
|
+
const projectRoot = usesCurrentDirectoryAsProjectRoot ? io.cwd : await (await loadProjectRuntimeModule()).findProjectRoot(io.cwd);
|
|
1579
1639
|
let cachedProject;
|
|
1580
1640
|
const loadProject = async () => {
|
|
1581
1641
|
cachedProject ??= await (await loadProjectConfigModule()).loadProjectConfig(projectRoot);
|
|
@@ -1590,7 +1650,7 @@ async function runCli(argv, io) {
|
|
|
1590
1650
|
};
|
|
1591
1651
|
const internalCommands = createInternalCommands(internalContext);
|
|
1592
1652
|
const registry = [...internalCommands];
|
|
1593
|
-
const canSkipAppDiscovery = requestedCommandName === "config:cache" || requestedCommandName === "config:clear" || requestedCommandName === "key:generate" || requestedCommandName === "new" || requestedCommandName === "install" || requestedCommandName === "auth:notifications:publish" || requestedCommandName === "prepare" || requestedCommandName === "dev" || requestedCommandName === "build" || requestedCommandName === "cache:table" || requestedCommandName === "cache:clear" || requestedCommandName === "cache:forget" || requestedCommandName === "media:table" || requestedCommandName === "broadcast:work" || requestedCommandName === "queue:table" || requestedCommandName === "queue:failed-table" || requestedCommandName === "queue:work" || requestedCommandName === "queue:listen" || requestedCommandName === "queue:failed" || requestedCommandName === "queue:retry" || requestedCommandName === "queue:forget" || requestedCommandName === "queue:flush" || requestedCommandName === "queue:restart" || requestedCommandName === "queue:clear" || requestedCommandName === "rate-limit:clear";
|
|
1653
|
+
const canSkipAppDiscovery = requestedCommandName === "config:cache" || requestedCommandName === "config:clear" || requestedCommandName === "key:generate" || requestedCommandName === "new" || requestedCommandName === "install" || requestedCommandName === "agents:install" || requestedCommandName === "agent:install" || requestedCommandName === "ai:install" || requestedCommandName === "auth:notifications:publish" || requestedCommandName === "prepare" || requestedCommandName === "dev" || requestedCommandName === "build" || requestedCommandName === "cache:table" || requestedCommandName === "cache:clear" || requestedCommandName === "cache:forget" || requestedCommandName === "media:table" || requestedCommandName === "broadcast:work" || requestedCommandName === "queue:table" || requestedCommandName === "queue:failed-table" || requestedCommandName === "queue:work" || requestedCommandName === "queue:listen" || requestedCommandName === "queue:failed" || requestedCommandName === "queue:retry" || requestedCommandName === "queue:forget" || requestedCommandName === "queue:flush" || requestedCommandName === "queue:restart" || requestedCommandName === "queue:clear" || requestedCommandName === "rate-limit:clear";
|
|
1594
1654
|
if (!canSkipAppDiscovery) {
|
|
1595
1655
|
const initialProject = await loadProject();
|
|
1596
1656
|
const appCommands = (await (await loadProjectDiscoveryModule()).discoverAppCommands(projectRoot, initialProject.config)).map((entry) => createAppCommandDefinition(entry));
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
runProjectPrepare
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-XDRCZ3Z5.mjs";
|
|
4
4
|
import "./chunk-FGQ2I2YH.mjs";
|
|
5
5
|
import {
|
|
6
6
|
getRegistryMigrationSlug,
|
|
@@ -16,7 +16,7 @@ import "./chunk-D7O4SU6N.mjs";
|
|
|
16
16
|
import {
|
|
17
17
|
prepareProjectDiscovery
|
|
18
18
|
} from "./chunk-VP2E62DF.mjs";
|
|
19
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-TWITVSFZ.mjs";
|
|
20
20
|
import {
|
|
21
21
|
ensureProjectConfig
|
|
22
22
|
} from "./chunk-YEFJBN56.mjs";
|
|
@@ -94,14 +94,14 @@ function renderCacheTableMigration(tableName = DEFAULT_CACHE_DATABASE_TABLE, loc
|
|
|
94
94
|
const entryTableDefinition = resolveCacheDatabaseTableDefinition("entries");
|
|
95
95
|
const lockTableDefinition = resolveCacheDatabaseTableDefinition("locks");
|
|
96
96
|
return [
|
|
97
|
-
"import { defineMigration
|
|
97
|
+
"import { defineMigration } from '@holo-js/db'",
|
|
98
98
|
"",
|
|
99
99
|
"export default defineMigration({",
|
|
100
|
-
" async up({ schema }
|
|
100
|
+
" async up({ schema }) {",
|
|
101
101
|
...renderCacheTableCreateStatement(tableName, entryTableDefinition),
|
|
102
102
|
...renderCacheTableCreateStatement(lockTableName, lockTableDefinition),
|
|
103
103
|
" },",
|
|
104
|
-
" async down({ schema }
|
|
104
|
+
" async down({ schema }) {",
|
|
105
105
|
` await schema.dropTable('${escapeSingleQuotedString(lockTableName)}')`,
|
|
106
106
|
` await schema.dropTable('${escapeSingleQuotedString(tableName)}')`,
|
|
107
107
|
" },",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
runProjectPrepare
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-UPXQONEH.mjs";
|
|
4
4
|
import "./chunk-FGQ2I2YH.mjs";
|
|
5
5
|
import {
|
|
6
6
|
getRegistryMigrationSlug,
|
|
@@ -16,7 +16,7 @@ import "./chunk-D7O4SU6N.mjs";
|
|
|
16
16
|
import {
|
|
17
17
|
prepareProjectDiscovery
|
|
18
18
|
} from "./chunk-VP2E62DF.mjs";
|
|
19
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-PT72AMV7.mjs";
|
|
20
20
|
import {
|
|
21
21
|
ensureProjectConfig
|
|
22
22
|
} from "./chunk-YEFJBN56.mjs";
|
|
@@ -94,14 +94,14 @@ function renderCacheTableMigration(tableName = DEFAULT_CACHE_DATABASE_TABLE, loc
|
|
|
94
94
|
const entryTableDefinition = resolveCacheDatabaseTableDefinition("entries");
|
|
95
95
|
const lockTableDefinition = resolveCacheDatabaseTableDefinition("locks");
|
|
96
96
|
return [
|
|
97
|
-
"import { defineMigration
|
|
97
|
+
"import { defineMigration } from '@holo-js/db'",
|
|
98
98
|
"",
|
|
99
99
|
"export default defineMigration({",
|
|
100
|
-
" async up({ schema }
|
|
100
|
+
" async up({ schema }) {",
|
|
101
101
|
...renderCacheTableCreateStatement(tableName, entryTableDefinition),
|
|
102
102
|
...renderCacheTableCreateStatement(lockTableName, lockTableDefinition),
|
|
103
103
|
" },",
|
|
104
|
-
" async down({ schema }
|
|
104
|
+
" async down({ schema }) {",
|
|
105
105
|
` await schema.dropTable('${escapeSingleQuotedString(lockTableName)}')`,
|
|
106
106
|
` await schema.dropTable('${escapeSingleQuotedString(tableName)}')`,
|
|
107
107
|
" },",
|