@batijs/cli 0.0.657 → 0.0.658
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/boilerplates/@batijs/docker-compose/bati.config.mjs +2 -1
- package/dist/boilerplates/@batijs/shared-agents/bati.config.mjs +1 -6
- package/dist/boilerplates/@batijs/shared-agents/hooks/after.mjs +17 -7
- package/dist/boilerplates/@batijs/shared-agents/hooks/asset-boilerplates/shared-agents/compose.mjs +7 -21
- package/dist/boilerplates/@batijs/shared-agents/hooks/asset-packages/features/dist/{features-CStxEDu3.mjs → features-CPCPsYbg.mjs} +6 -58
- package/dist/boilerplates/@batijs/shared-agents/hooks/asset-packages/features/dist/index.mjs +5 -158
- package/dist/index.js +3 -6
- package/package.json +5 -5
- package/dist/boilerplates/@batijs/shared-agents/hooks/asset-boilerplates/shared-agents/agents-md.mjs +0 -70
|
@@ -12,7 +12,8 @@ var bati_config_default = t({
|
|
|
12
12
|
return meta.BATI.has("docker");
|
|
13
13
|
},
|
|
14
14
|
enforce: "post",
|
|
15
|
-
skills() {
|
|
15
|
+
skills(meta) {
|
|
16
|
+
if (meta.BATI.has("dokploy")) return [];
|
|
16
17
|
return [{
|
|
17
18
|
name: "deploy",
|
|
18
19
|
description: "How to build and run this app with Docker. Use when containerizing or deploying via Docker.",
|
|
@@ -7,11 +7,6 @@ function t(t) {
|
|
|
7
7
|
}
|
|
8
8
|
//#endregion
|
|
9
9
|
//#region bati.config.ts
|
|
10
|
-
var bati_config_default = t({
|
|
11
|
-
enforce: "post",
|
|
12
|
-
if(meta) {
|
|
13
|
-
return meta.BATI.hasAiAgent;
|
|
14
|
-
}
|
|
15
|
-
});
|
|
10
|
+
var bati_config_default = t({ enforce: "post" });
|
|
16
11
|
//#endregion
|
|
17
12
|
export { bati_config_default as default };
|
|
@@ -1,15 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { mkdir, writeFile } from "node:fs/promises";
|
|
4
|
-
import { dirname, join } from "node:path";
|
|
1
|
+
import { CLAUDE_SKILLS_DIR, SKILLS_DIR } from "./asset-packages/features/dist/index.mjs";
|
|
2
|
+
import { composeSkills } from "./asset-boilerplates/shared-agents/compose.mjs";
|
|
3
|
+
import { cp, mkdir, symlink, writeFile } from "node:fs/promises";
|
|
4
|
+
import { dirname, join, relative } from "node:path";
|
|
5
5
|
//#region hooks/after.ts
|
|
6
|
-
async function onafter(cwd,
|
|
7
|
-
const
|
|
8
|
-
for (const { path, content } of agentFiles) {
|
|
6
|
+
async function onafter(cwd, _meta, { skills }) {
|
|
7
|
+
for (const { path, content } of composeSkills(skills)) {
|
|
9
8
|
const dest = join(cwd, path);
|
|
10
9
|
await mkdir(dirname(dest), { recursive: true });
|
|
11
10
|
await writeFile(dest, content, "utf-8");
|
|
12
11
|
}
|
|
12
|
+
await mirrorSkillsForClaude(cwd);
|
|
13
|
+
}
|
|
14
|
+
async function mirrorSkillsForClaude(cwd) {
|
|
15
|
+
const source = join(cwd, SKILLS_DIR);
|
|
16
|
+
const target = join(cwd, CLAUDE_SKILLS_DIR);
|
|
17
|
+
await mkdir(dirname(target), { recursive: true });
|
|
18
|
+
try {
|
|
19
|
+
await symlink(relative(dirname(target), source), target, "dir");
|
|
20
|
+
} catch {
|
|
21
|
+
await cp(source, target, { recursive: true });
|
|
22
|
+
}
|
|
13
23
|
}
|
|
14
24
|
//#endregion
|
|
15
25
|
export { onafter as default };
|
package/dist/boilerplates/@batijs/shared-agents/hooks/asset-boilerplates/shared-agents/compose.mjs
CHANGED
|
@@ -1,26 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SKILLS_DIR } from "../../asset-packages/features/dist/index.mjs";
|
|
2
2
|
//#region compose.ts
|
|
3
|
-
/**
|
|
4
|
-
|
|
5
|
-
* minimal skills dir, plus the canonical `AGENTS.md` (= `agentsBody`) and its `@AGENTS.md` shims.
|
|
6
|
-
* Output order is deterministic (canonical agent order; skills sorted by name) for stable snapshots.
|
|
7
|
-
*/
|
|
8
|
-
function composeAgentFiles(meta, skills, agentsBody) {
|
|
3
|
+
/** One `SKILL.md` per skill under {@link SKILLS_DIR}, sorted by name so the output is deterministic. */
|
|
4
|
+
function composeSkills(skills) {
|
|
9
5
|
assertUniqueNames(skills);
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const files = [];
|
|
13
|
-
for (const dir of resolveSkillDirs(selected)) for (const skill of sortedSkills) files.push({
|
|
14
|
-
path: `${dir}/${skill.name}/SKILL.md`,
|
|
6
|
+
return [...skills].sort((a, b) => a.name.localeCompare(b.name)).map((skill) => ({
|
|
7
|
+
path: `${SKILLS_DIR}/${skill.name}/SKILL.md`,
|
|
15
8
|
content: renderSkillMd(skill)
|
|
16
|
-
});
|
|
17
|
-
for (const target of resolveInstructionFiles(selected)) files.push({
|
|
18
|
-
path: target.path,
|
|
19
|
-
content: target.import === null ? ensureTrailingNewline(agentsBody) : `${target.import}\n`
|
|
20
|
-
});
|
|
21
|
-
return files;
|
|
9
|
+
}));
|
|
22
10
|
}
|
|
23
|
-
/** Serialize a skill to a `SKILL.md` document (YAML frontmatter + body). */
|
|
24
11
|
function renderSkillMd(skill) {
|
|
25
12
|
const frontmatter = [`name: ${yamlString(skill.name)}`, `description: ${yamlString(skill.description)}`];
|
|
26
13
|
if (skill.allowedTools?.length) frontmatter.push(`allowed-tools: [${skill.allowedTools.map(yamlString).join(", ")}]`);
|
|
@@ -36,9 +23,8 @@ function assertUniqueNames(skills) {
|
|
|
36
23
|
function ensureTrailingNewline(s) {
|
|
37
24
|
return s.endsWith("\n") ? s : `${s}\n`;
|
|
38
25
|
}
|
|
39
|
-
/** Double-quote and escape so the colons/brackets common in descriptions stay YAML-safe. */
|
|
40
26
|
function yamlString(s) {
|
|
41
27
|
return `"${s.replace(/\\/g, "\\\\").replace(/"/g, "\\\"")}"`;
|
|
42
28
|
}
|
|
43
29
|
//#endregion
|
|
44
|
-
export {
|
|
30
|
+
export { composeSkills };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region ../../packages/features/dist/features-
|
|
1
|
+
//#region ../../packages/features/dist/features-CPCPsYbg.js
|
|
2
2
|
/**
|
|
3
3
|
* In forder to have an icon that has different colors based on dark/light mode:
|
|
4
4
|
*
|
|
@@ -625,63 +625,11 @@ const features = [
|
|
|
625
625
|
},
|
|
626
626
|
{
|
|
627
627
|
category: "AI Agent",
|
|
628
|
-
label: "
|
|
629
|
-
flag: "
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
links: [{
|
|
634
|
-
label: "Skills docs",
|
|
635
|
-
href: "https://code.claude.com/docs/en/skills"
|
|
636
|
-
}]
|
|
637
|
-
},
|
|
638
|
-
{
|
|
639
|
-
category: "AI Agent",
|
|
640
|
-
label: "Codex",
|
|
641
|
-
flag: "codex",
|
|
642
|
-
image: "data:image/svg+xml;base64,PHN2ZyBmaWxsPSJjdXJyZW50Q29sb3IiIGZpbGwtcnVsZT0iZXZlbm9kZCIgaGVpZ2h0PSIxZW0iIHN0eWxlPSJmbGV4Om5vbmU7bGluZS1oZWlnaHQ6MSIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMWVtIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxzdHlsZT5wYXRoe2ZpbGw6IzAwMH1AbWVkaWEocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7cGF0aHtmaWxsOiNmZmZ9fTwvc3R5bGU+PHRpdGxlPkNvZGV4PC90aXRsZT48cGF0aCBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik04LjA4Ni40NTdhNi4xMDUgNi4xMDUgMCAwMTMuMDQ2LS40MTVjMS4zMzMuMTUzIDIuNTIxLjcyIDMuNTY0IDEuN2EuMTE3LjExNyAwIDAwLjEwNy4wMjljMS40MDgtLjM0NiAyLjc2Mi0uMjI0IDQuMDYxLjM2NmwuMDYzLjAzLjE1NC4wNzZjMS4zNTcuNzAzIDIuMzMgMS43NyAyLjkxOCAzLjE5OC4yNzguNjc5LjQxOCAxLjM4OC40MjEgMi4xMjZhNS42NTUgNS42NTUgMCAwMS0uMTggMS42MzEuMTY3LjE2NyAwIDAwLjA0LjE1NSA1Ljk4MiA1Ljk4MiAwIDAxMS41NzggMi44OTFjLjM4NSAxLjkwMS0uMDEgMy42MTUtMS4xODMgNS4xNGwtLjE4Mi4yMmE2LjA2MyA2LjA2MyAwIDAxLTIuOTM0IDEuODUxLjE2Mi4xNjIgMCAwMC0uMTA4LjEwMmMtLjI1NS43MzYtLjUxMSAxLjM2NC0uOTg3IDEuOTkyLTEuMTk5IDEuNTgyLTIuOTYyIDIuNDYyLTQuOTQ4IDIuNDUxLTEuNTgzLS4wMDgtMi45ODYtLjU4Ny00LjIxLTEuNzM2YS4xNDUuMTQ1IDAgMDAtLjE0LS4wMzJjLS41MTguMTY3LTEuMDQuMTkxLTEuNjA0LjE4NWE1LjkyNCA1LjkyNCAwIDAxLTIuNTk1LS42MjIgNi4wNTggNi4wNTggMCAwMS0yLjE0Ni0xLjc4MWMtLjIwMy0uMjY5LS40MDQtLjUyMi0uNTUxLS44MjFhNy43NCA3Ljc0IDAgMDEtLjQ5NS0xLjI4MyA2LjExIDYuMTEgMCAwMS0uMDE3LTMuMDY0LjE2Ni4xNjYgMCAwMC4wMDgtLjA3NC4xMTUuMTE1IDAgMDAtLjAzNy0uMDY0IDUuOTU4IDUuOTU4IDAgMDEtMS4zOC0yLjIwMiA1LjE5NiA1LjE5NiAwIDAxLS4zMzMtMS41ODkgNi45MTUgNi45MTUgMCAwMS4xODgtMi4xMzJjLjQ1LTEuNDg0IDEuMzA5LTIuNjQ4IDIuNTc3LTMuNDkzLjI4Mi0uMTg4LjU1LS4zMzQuODAyLS40MzguMjg2LS4xMi41NzMtLjIyLjg2MS0uMzA0YS4xMjkuMTI5IDAgMDAuMDg3LS4wODdBNi4wMTYgNi4wMTYgMCAwMTUuNjM1IDIuMzFDNi4zMTUgMS40NjQgNy4xMzIuODQ2IDguMDg2LjQ1N3ptLS44MDQgNy44NWEuODQ4Ljg0OCAwIDAwLTEuNDczLjg0MmwxLjY5NCAyLjk2NS0xLjY4OCAyLjg0OGEuODQ5Ljg0OSAwIDAwMS40Ni44NjRsMS45NC0zLjI3MmEuODQ5Ljg0OSAwIDAwLjAwNy0uODU0bC0xLjk0LTMuMzkzem01LjQ0NiA2LjI0YS44NDkuODQ5IDAgMDAwIDEuNjk1aDQuODQ4YS44NDkuODQ5IDAgMDAwLTEuNjk2aC00Ljg0OHoiPjwvcGF0aD48L3N2Zz4=",
|
|
643
|
-
url: "https://developers.openai.com/codex",
|
|
644
|
-
tagline: "OpenAI's coding agent",
|
|
645
|
-
links: [{
|
|
646
|
-
label: "Skills docs",
|
|
647
|
-
href: "https://developers.openai.com/codex/skills"
|
|
648
|
-
}]
|
|
649
|
-
},
|
|
650
|
-
{
|
|
651
|
-
category: "AI Agent",
|
|
652
|
-
label: "Gemini",
|
|
653
|
-
flag: "gemini",
|
|
654
|
-
image: "data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjFlbSIgc3R5bGU9ImZsZXg6bm9uZTtsaW5lLWhlaWdodDoxIiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxZW0iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHRpdGxlPkdlbWluaTwvdGl0bGU+PHBhdGggZD0iTTIwLjYxNiAxMC44MzVhMTQuMTQ3IDE0LjE0NyAwIDAxLTQuNDUtMy4wMDEgMTQuMTExIDE0LjExMSAwIDAxLTMuNjc4LTYuNDUyLjUwMy41MDMgMCAwMC0uOTc1IDAgMTQuMTM0IDE0LjEzNCAwIDAxLTMuNjc5IDYuNDUyIDE0LjE1NSAxNC4xNTUgMCAwMS00LjQ1IDMuMDAxYy0uNjUuMjgtMS4zMTguNTA1LTIuMDAyLjY3OGEuNTAyLjUwMiAwIDAwMCAuOTc1Yy42ODQuMTcyIDEuMzUuMzk3IDIuMDAyLjY3N2ExNC4xNDcgMTQuMTQ3IDAgMDE0LjQ1IDMuMDAxIDE0LjExMiAxNC4xMTIgMCAwMTMuNjc5IDYuNDUzLjUwMi41MDIgMCAwMC45NzUgMGMuMTcyLS42ODUuMzk3LTEuMzUxLjY3Ny0yLjAwM2ExNC4xNDUgMTQuMTQ1IDAgMDEzLjAwMS00LjQ1IDE0LjExMyAxNC4xMTMgMCAwMTYuNDUzLTMuNjc4LjUwMy41MDMgMCAwMDAtLjk3NSAxMy4yNDUgMTMuMjQ1IDAgMDEtMi4wMDMtLjY3OHoiIGZpbGw9IiMzMTg2RkYiPjwvcGF0aD48cGF0aCBkPSJNMjAuNjE2IDEwLjgzNWExNC4xNDcgMTQuMTQ3IDAgMDEtNC40NS0zLjAwMSAxNC4xMTEgMTQuMTExIDAgMDEtMy42NzgtNi40NTIuNTAzLjUwMyAwIDAwLS45NzUgMCAxNC4xMzQgMTQuMTM0IDAgMDEtMy42NzkgNi40NTIgMTQuMTU1IDE0LjE1NSAwIDAxLTQuNDUgMy4wMDFjLS42NS4yOC0xLjMxOC41MDUtMi4wMDIuNjc4YS41MDIuNTAyIDAgMDAwIC45NzVjLjY4NC4xNzIgMS4zNS4zOTcgMi4wMDIuNjc3YTE0LjE0NyAxNC4xNDcgMCAwMTQuNDUgMy4wMDEgMTQuMTEyIDE0LjExMiAwIDAxMy42NzkgNi40NTMuNTAyLjUwMiAwIDAwLjk3NSAwYy4xNzItLjY4NS4zOTctMS4zNTEuNjc3LTIuMDAzYTE0LjE0NSAxNC4xNDUgMCAwMTMuMDAxLTQuNDUgMTQuMTEzIDE0LjExMyAwIDAxNi40NTMtMy42NzguNTAzLjUwMyAwIDAwMC0uOTc1IDEzLjI0NSAxMy4yNDUgMCAwMS0yLjAwMy0uNjc4eiIgZmlsbD0idXJsKCNsb2JlLWljb25zLWdlbWluaS0wLV9SXzBfKSI+PC9wYXRoPjxwYXRoIGQ9Ik0yMC42MTYgMTAuODM1YTE0LjE0NyAxNC4xNDcgMCAwMS00LjQ1LTMuMDAxIDE0LjExMSAxNC4xMTEgMCAwMS0zLjY3OC02LjQ1Mi41MDMuNTAzIDAgMDAtLjk3NSAwIDE0LjEzNCAxNC4xMzQgMCAwMS0zLjY3OSA2LjQ1MiAxNC4xNTUgMTQuMTU1IDAgMDEtNC40NSAzLjAwMWMtLjY1LjI4LTEuMzE4LjUwNS0yLjAwMi42NzhhLjUwMi41MDIgMCAwMDAgLjk3NWMuNjg0LjE3MiAxLjM1LjM5NyAyLjAwMi42NzdhMTQuMTQ3IDE0LjE0NyAwIDAxNC40NSAzLjAwMSAxNC4xMTIgMTQuMTEyIDAgMDEzLjY3OSA2LjQ1My41MDIuNTAyIDAgMDAuOTc1IDBjLjE3Mi0uNjg1LjM5Ny0xLjM1MS42NzctMi4wMDNhMTQuMTQ1IDE0LjE0NSAwIDAxMy4wMDEtNC40NSAxNC4xMTMgMTQuMTEzIDAgMDE2LjQ1My0zLjY3OC41MDMuNTAzIDAgMDAwLS45NzUgMTMuMjQ1IDEzLjI0NSAwIDAxLTIuMDAzLS42Nzh6IiBmaWxsPSJ1cmwoI2xvYmUtaWNvbnMtZ2VtaW5pLTEtX1JfMF8pIj48L3BhdGg+PHBhdGggZD0iTTIwLjYxNiAxMC44MzVhMTQuMTQ3IDE0LjE0NyAwIDAxLTQuNDUtMy4wMDEgMTQuMTExIDE0LjExMSAwIDAxLTMuNjc4LTYuNDUyLjUwMy41MDMgMCAwMC0uOTc1IDAgMTQuMTM0IDE0LjEzNCAwIDAxLTMuNjc5IDYuNDUyIDE0LjE1NSAxNC4xNTUgMCAwMS00LjQ1IDMuMDAxYy0uNjUuMjgtMS4zMTguNTA1LTIuMDAyLjY3OGEuNTAyLjUwMiAwIDAwMCAuOTc1Yy42ODQuMTcyIDEuMzUuMzk3IDIuMDAyLjY3N2ExNC4xNDcgMTQuMTQ3IDAgMDE0LjQ1IDMuMDAxIDE0LjExMiAxNC4xMTIgMCAwMTMuNjc5IDYuNDUzLjUwMi41MDIgMCAwMC45NzUgMGMuMTcyLS42ODUuMzk3LTEuMzUxLjY3Ny0yLjAwM2ExNC4xNDUgMTQuMTQ1IDAgMDEzLjAwMS00LjQ1IDE0LjExMyAxNC4xMTMgMCAwMTYuNDUzLTMuNjc4LjUwMy41MDMgMCAwMDAtLjk3NSAxMy4yNDUgMTMuMjQ1IDAgMDEtMi4wMDMtLjY3OHoiIGZpbGw9InVybCgjbG9iZS1pY29ucy1nZW1pbmktMi1fUl8wXykiPjwvcGF0aD48ZGVmcz48bGluZWFyR3JhZGllbnQgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJsb2JlLWljb25zLWdlbWluaS0wLV9SXzBfIiB4MT0iNyIgeDI9IjExIiB5MT0iMTUuNSIgeTI9IjEyIj48c3RvcCBzdG9wLWNvbG9yPSIjMDhCOTYyIj48L3N0b3A+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDhCOTYyIiBzdG9wLW9wYWNpdHk9IjAiPjwvc3RvcD48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgaWQ9ImxvYmUtaWNvbnMtZ2VtaW5pLTEtX1JfMF8iIHgxPSI4IiB4Mj0iMTEuNSIgeTE9IjUuNSIgeTI9IjExIj48c3RvcCBzdG9wLWNvbG9yPSIjRjk0NTQzIj48L3N0b3A+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRjk0NTQzIiBzdG9wLW9wYWNpdHk9IjAiPjwvc3RvcD48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgaWQ9ImxvYmUtaWNvbnMtZ2VtaW5pLTItX1JfMF8iIHgxPSIzLjUiIHgyPSIxNy41IiB5MT0iMTMuNSIgeTI9IjEyIj48c3RvcCBzdG9wLWNvbG9yPSIjRkFCQzEyIj48L3N0b3A+PHN0b3Agb2Zmc2V0PSIuNDYiIHN0b3AtY29sb3I9IiNGQUJDMTIiIHN0b3Atb3BhY2l0eT0iMCI+PC9zdG9wPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjwvc3ZnPg==",
|
|
655
|
-
url: "https://github.com/google-gemini/gemini-cli",
|
|
656
|
-
tagline: "Google's open-source AI agent for the terminal",
|
|
657
|
-
links: [{
|
|
658
|
-
label: "Repo",
|
|
659
|
-
href: "https://github.com/google-gemini/gemini-cli"
|
|
660
|
-
}]
|
|
661
|
-
},
|
|
662
|
-
{
|
|
663
|
-
category: "AI Agent",
|
|
664
|
-
label: "Cursor",
|
|
665
|
-
flag: "cursor",
|
|
666
|
-
image: "data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48c3R5bGU+cGF0aHtmaWxsOiMwMDB9QG1lZGlhKHByZWZlcnMtY29sb3Itc2NoZW1lOmRhcmspe3BhdGh7ZmlsbDojZmZmfX08L3N0eWxlPjx0aXRsZT5DdXJzb3I8L3RpdGxlPjxwYXRoIGQ9Ik0xMS41MDMuMTMxIDEuODkxIDUuNjc4YS44NC44NCAwIDAgMC0uNDIuNzI2djExLjE4OGMwIC4zLjE2Mi41NzUuNDIuNzI0bDkuNjA5IDUuNTVhMSAxIDAgMCAwIC45OTggMGw5LjYxLTUuNTVhLjg0Ljg0IDAgMCAwIC40Mi0uNzI0VjYuNDA0YS44NC44NCAwIDAgMC0uNDItLjcyNkwxMi40OTcuMTMxYTEuMDEgMS4wMSAwIDAgMC0uOTk2IDBNMi42NTcgNi4zMzhoMTguNTVjLjI2MyAwIC40My4yODcuMjk3LjUxNUwxMi4yMyAyMi45MThjLS4wNjIuMTA3LS4yMjkuMDY0LS4yMjktLjA2VjEyLjMzNWEuNTkuNTkgMCAwIDAtLjI5NS0uNTFsLTkuMTEtNS4yNTdjLS4xMDktLjA2My0uMDY0LS4yMy4wNjEtLjIzIi8+PC9zdmc+",
|
|
667
|
-
url: "https://cursor.com",
|
|
668
|
-
tagline: "The AI code editor",
|
|
669
|
-
links: [{
|
|
670
|
-
label: "Skills docs",
|
|
671
|
-
href: "https://cursor.com/docs/skills"
|
|
672
|
-
}]
|
|
673
|
-
},
|
|
674
|
-
{
|
|
675
|
-
category: "AI Agent",
|
|
676
|
-
label: "Copilot",
|
|
677
|
-
flag: "copilot",
|
|
678
|
-
image: "data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48c3R5bGU+cGF0aHtmaWxsOiMwMDB9QG1lZGlhKHByZWZlcnMtY29sb3Itc2NoZW1lOmRhcmspe3BhdGh7ZmlsbDojZmZmfX08L3N0eWxlPjx0aXRsZT5HaXRIdWIgQ29waWxvdDwvdGl0bGU+PHBhdGggZD0iTTIzLjkyMiAxNi45OTdDMjMuMDYxIDE4LjQ5MiAxOC4wNjMgMjIuMDIgMTIgMjIuMDIgNS45MzcgMjIuMDIuOTM5IDE4LjQ5Mi4wNzggMTYuOTk3QS42NDEuNjQxIDAgMCAxIDAgMTYuNzQxdi0yLjg2OWEuODgzLjg4MyAwIDAgMSAuMDUzLS4yMmMuMzcyLS45MzUgMS4zNDctMi4yOTIgMi42MDUtMi42NTYuMTY3LS40MjkuNDE0LTEuMDU1LjY0NC0xLjUxN2ExMC4wOTggMTAuMDk4IDAgMCAxLS4wNTItMS4wODZjMC0xLjMzMS4yODItMi40OTkgMS4xMzItMy4zNjguMzk3LS40MDYuODktLjcxNyAxLjQ3NC0uOTUyQzcuMjU1IDIuOTM3IDkuMjQ4IDEuOTggMTEuOTc4IDEuOThjMi43MzEgMCA0Ljc2Ny45NTcgNi4xNjYgMi4wOTMuNTg0LjIzNSAxLjA3Ny41NDYgMS40NzQuOTUyLjg1Ljg2OSAxLjEzMiAyLjAzNyAxLjEzMiAzLjM2OCAwIC4zNjgtLjAxNC43MzMtLjA1MiAxLjA4Ni4yMy40NjIuNDc3IDEuMDg4LjY0NCAxLjUxNyAxLjI1OC4zNjQgMi4yMzMgMS43MjEgMi42MDUgMi42NTZhLjg0MS44NDEgMCAwIDEgLjA1My4yMnYyLjg2OWEuNjQxLjY0MSAwIDAgMS0uMDc4LjI1NlptLTExLjc1LTUuOTkyaC0uMzQ0YTQuMzU5IDQuMzU5IDAgMCAxLS4zNTUuNTA4Yy0uNzcuOTQ3LTEuOTE4IDEuNDkyLTMuNTA4IDEuNDkyLTEuNzI1IDAtMi45ODktLjM1OS0zLjc4Mi0xLjI1OWEyLjEzNyAyLjEzNyAwIDAgMS0uMDg1LS4xMDRMNCAxMS43NDZ2Ni41ODVjMS40MzUuNzc5IDQuNTE0IDIuMTc5IDggMi4xNzkgMy40ODYgMCA2LjU2NS0xLjQgOC0yLjE3OXYtNi41ODVsLS4wOTgtLjEwNHMtLjAzMy4wNDUtLjA4NS4xMDRjLS43OTMuOS0yLjA1NyAxLjI1OS0zLjc4MiAxLjI1OS0xLjU5IDAtMi43MzgtLjU0NS0zLjUwOC0xLjQ5MmE0LjM1OSA0LjM1OSAwIDAgMS0uMzU1LS41MDhabTIuMzI4IDMuMjVjLjU0OSAwIDEgLjQ1MSAxIDF2MmMwIC41NDktLjQ1MSAxLTEgMS0uNTQ5IDAtMS0uNDUxLTEtMXYtMmMwLS41NDkuNDUxLTEgMS0xWm0tNSAwYy41NDkgMCAxIC40NTEgMSAxdjJjMCAuNTQ5LS40NTEgMS0xIDEtLjU0OSAwLTEtLjQ1MS0xLTF2LTJjMC0uNTQ5LjQ1MS0xIDEtMVptMy4zMTMtNi4xODVjLjEzNiAxLjA1Ny40MDMgMS45MTMuODc4IDIuNDk3LjQ0Mi41NDQgMS4xMzQuOTM4IDIuMzQ0LjkzOCAxLjU3MyAwIDIuMjkyLS4zMzcgMi42NTctLjc1MS4zODQtLjQzNS41NTgtMS4xNS41NTgtMi4zNjEgMC0xLjE0LS4yNDMtMS44NDctLjcwNS0yLjMxOS0uNDc3LS40ODgtMS4zMTktLjg2Mi0yLjgyNC0xLjAyNS0xLjQ4Ny0uMTYxLTIuMTkyLjEzOC0yLjUzMy41MjktLjI2OS4zMDctLjQzNy44MDgtLjQzOCAxLjU3OHYuMDIxYzAgLjI2NS4wMjEuNTYyLjA2My44OTNabS0xLjYyNiAwYy4wNDItLjMzMS4wNjMtLjYyOC4wNjMtLjg5NHYtLjAyYy0uMDAxLS43Ny0uMTY5LTEuMjcxLS40MzgtMS41NzgtLjM0MS0uMzkxLTEuMDQ2LS42OS0yLjUzMy0uNTI5LTEuNTA1LjE2My0yLjM0Ny41MzctMi44MjQgMS4wMjUtLjQ2Mi40NzItLjcwNSAxLjE3OS0uNzA1IDIuMzE5IDAgMS4yMTEuMTc1IDEuOTI2LjU1OCAyLjM2MS4zNjUuNDE0IDEuMDg0Ljc1MSAyLjY1Ny43NTEgMS4yMSAwIDEuOTAyLS4zOTQgMi4zNDQtLjkzOC40NzUtLjU4NC43NDItMS40NC44NzgtMi40OTdaIi8+PC9zdmc+",
|
|
679
|
-
url: "https://github.com/features/copilot",
|
|
680
|
-
tagline: "AI pair programmer",
|
|
681
|
-
links: [{
|
|
682
|
-
label: "Agent skills",
|
|
683
|
-
href: "https://docs.github.com/en/copilot/concepts/agents/about-agent-skills"
|
|
684
|
-
}]
|
|
628
|
+
label: "Agent Skills",
|
|
629
|
+
flag: "skills",
|
|
630
|
+
readonly: true,
|
|
631
|
+
invisibleCli: true,
|
|
632
|
+
invisibleWeb: true
|
|
685
633
|
}
|
|
686
634
|
];
|
|
687
635
|
features.map((f) => f.flag);
|
package/dist/boilerplates/@batijs/shared-agents/hooks/asset-packages/features/dist/index.mjs
CHANGED
|
@@ -1,160 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import "./features-CPCPsYbg.mjs";
|
|
2
2
|
//#region ../../packages/features/dist/index.js
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
* `.agents/skills` is the cross-tool standard (Codex/Gemini/Cursor/Copilot), only Claude needs
|
|
7
|
-
* `.claude/skills`; AGENTS.md is native everywhere except Claude and Gemini, which take an `@`-import.
|
|
8
|
-
*/
|
|
9
|
-
const aiAgents = {
|
|
10
|
-
claude: {
|
|
11
|
-
skillsDir: ".claude/skills",
|
|
12
|
-
instructionFile: "CLAUDE.md",
|
|
13
|
-
instructionImport: "@AGENTS.md"
|
|
14
|
-
},
|
|
15
|
-
codex: {
|
|
16
|
-
skillsDir: ".agents/skills",
|
|
17
|
-
instructionFile: "AGENTS.md",
|
|
18
|
-
instructionImport: null
|
|
19
|
-
},
|
|
20
|
-
gemini: {
|
|
21
|
-
skillsDir: ".agents/skills",
|
|
22
|
-
instructionFile: "GEMINI.md",
|
|
23
|
-
instructionImport: "@./AGENTS.md"
|
|
24
|
-
},
|
|
25
|
-
cursor: {
|
|
26
|
-
skillsDir: ".agents/skills",
|
|
27
|
-
instructionFile: "AGENTS.md",
|
|
28
|
-
instructionImport: null
|
|
29
|
-
},
|
|
30
|
-
copilot: {
|
|
31
|
-
skillsDir: ".agents/skills",
|
|
32
|
-
instructionFile: "AGENTS.md",
|
|
33
|
-
instructionImport: null
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
/**
|
|
37
|
-
* Minimal set of skill directories covering the selected agents (SKILLS_PLAN.md §4) — at most two:
|
|
38
|
-
* `.agents/skills` for Codex/Gemini/Cursor/Copilot, `.claude/skills` for Claude.
|
|
39
|
-
*/
|
|
40
|
-
function resolveSkillDirs(selected) {
|
|
41
|
-
const sel = new Set(selected);
|
|
42
|
-
const dirs = /* @__PURE__ */ new Set();
|
|
43
|
-
for (const flag of aiAgentFlags) if (sel.has(flag)) dirs.add(aiAgents[flag].skillsDir);
|
|
44
|
-
return [...dirs];
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Instruction files for the selected agents (SKILLS_PLAN.md §3): the canonical `AGENTS.md` (always,
|
|
48
|
-
* since the shims import it) plus each agent's file, deduped. Empty when no agent is selected.
|
|
49
|
-
*/
|
|
50
|
-
function resolveInstructionFiles(selected) {
|
|
51
|
-
const sel = new Set(selected);
|
|
52
|
-
if (!aiAgentFlags.some((flag) => sel.has(flag))) return [];
|
|
53
|
-
const byPath = new Map([["AGENTS.md", {
|
|
54
|
-
path: "AGENTS.md",
|
|
55
|
-
import: null
|
|
56
|
-
}]]);
|
|
57
|
-
for (const flag of aiAgentFlags) {
|
|
58
|
-
if (!sel.has(flag)) continue;
|
|
59
|
-
const { instructionFile, instructionImport } = aiAgents[flag];
|
|
60
|
-
byPath.set(instructionFile, {
|
|
61
|
-
path: instructionFile,
|
|
62
|
-
import: instructionImport
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
return [...byPath.values()];
|
|
66
|
-
}
|
|
67
|
-
const categories = [
|
|
68
|
-
{
|
|
69
|
-
label: "Frontend Framework",
|
|
70
|
-
group: "Frontend",
|
|
71
|
-
description: `Flexible, robust, community-driven, and fast Vite-based frontend framework.`,
|
|
72
|
-
required: true
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
label: "UI Framework",
|
|
76
|
-
group: "Frontend",
|
|
77
|
-
description: `It’s recommended to choose a frontend lib to kickstart a new Vike project,
|
|
78
|
-
as they each come with a wide range of integrations. You can at any time eject and take control over integration code
|
|
79
|
-
so that it doesn’t get in your way.`,
|
|
80
|
-
required: true
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
label: "CSS",
|
|
84
|
-
group: "Frontend",
|
|
85
|
-
description: `These CSS libraries are deeply integrated with UI frameworks.
|
|
86
|
-
They showcase their respective recommended usage and how they integrate with Vite and Vike.`
|
|
87
|
-
},
|
|
88
|
-
{
|
|
89
|
-
label: "UI Component Libraries",
|
|
90
|
-
group: "Frontend",
|
|
91
|
-
description: `These UI Component Libraries are deeply integrated with UI frameworks.
|
|
92
|
-
They showcase their respective recommended usage and how they integrate with Vite and Vike.`
|
|
93
|
-
},
|
|
94
|
-
{
|
|
95
|
-
label: "Auth",
|
|
96
|
-
group: "Data",
|
|
97
|
-
description: `Ready to use self-hosted or cloud-based Auth solutions.
|
|
98
|
-
Requires to also select a Server of your choosing.`
|
|
99
|
-
},
|
|
100
|
-
{
|
|
101
|
-
label: "Data fetching",
|
|
102
|
-
group: "Data",
|
|
103
|
-
description: `Data fetching libraries to help you interact with your backend.
|
|
104
|
-
Selecting one of those usually requires you to also choose a Server.`
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
label: "Server",
|
|
108
|
-
group: "Data",
|
|
109
|
-
description: `Mostly required by other integrations such as Auth or RPC,
|
|
110
|
-
it's recommended to only install a Server if you really need to, as Vike doesn't require one to operate.`
|
|
111
|
-
},
|
|
112
|
-
{
|
|
113
|
-
label: "Database",
|
|
114
|
-
group: "Data",
|
|
115
|
-
description: `The database your app talks to. SQLite runs embedded (and powers Cloudflare D1);
|
|
116
|
-
PostgreSQL targets a Postgres server. Selected on its own you get a thin client; pair it with an ORM or query builder below.`
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
label: "ORM / Query builder",
|
|
120
|
-
group: "Data",
|
|
121
|
-
description: `Type-safe data access on top of your database. Requires choosing a Database above.`
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
label: "Hosting",
|
|
125
|
-
group: "Deployment",
|
|
126
|
-
description: `Quickly host your Vike project with a Serverless or VPS (coming soon) solution.`,
|
|
127
|
-
required: true
|
|
128
|
-
},
|
|
129
|
-
{
|
|
130
|
-
label: "AI Agent",
|
|
131
|
-
multiple: true,
|
|
132
|
-
group: "Utilities",
|
|
133
|
-
description: `Generate agent skills and instruction files (SKILL.md, AGENTS.md, CLAUDE.md, …) tailored to your
|
|
134
|
-
selected stack, so AI coding agents understand this project's conventions out of the box. Select every agent you use.`
|
|
135
|
-
},
|
|
136
|
-
{
|
|
137
|
-
label: "Linter",
|
|
138
|
-
multiple: true,
|
|
139
|
-
group: "Utilities",
|
|
140
|
-
description: `Well known linting and formatting tools, pre-configured to match their recommended usage,
|
|
141
|
-
tailored for Vike.`
|
|
142
|
-
},
|
|
143
|
-
{
|
|
144
|
-
label: "Analytics",
|
|
145
|
-
group: "Utilities",
|
|
146
|
-
description: `Keep track of your website traffic with these ready-to-get-started Analytics solutions.`
|
|
147
|
-
},
|
|
148
|
-
{
|
|
149
|
-
label: "Error tracking",
|
|
150
|
-
group: "Utilities",
|
|
151
|
-
description: `Coming soon: Error Tracking solution for frontend and backend`
|
|
152
|
-
},
|
|
153
|
-
{
|
|
154
|
-
label: "Tooling",
|
|
155
|
-
group: "Utilities",
|
|
156
|
-
description: `Additional tooling to improve your developer experience.`
|
|
157
|
-
}
|
|
158
|
-
];
|
|
3
|
+
/** Skills are written to the cross-tool `.agents/` standard, read by Codex/Gemini/Cursor/Copilot. */
|
|
4
|
+
const SKILLS_DIR = ".agents/skills";
|
|
5
|
+
const CLAUDE_SKILLS_DIR = ".claude/skills";
|
|
159
6
|
//#endregion
|
|
160
|
-
export {
|
|
7
|
+
export { CLAUDE_SKILLS_DIR, SKILLS_DIR };
|
package/dist/index.js
CHANGED
|
@@ -2638,7 +2638,7 @@ function kebabCase(str, joiner) {
|
|
|
2638
2638
|
//#endregion
|
|
2639
2639
|
//#region package.json
|
|
2640
2640
|
var name = "@batijs/cli";
|
|
2641
|
-
var version = "0.0.
|
|
2641
|
+
var version = "0.0.658";
|
|
2642
2642
|
var description = "Next-gen scaffolder. Get started with fully-functional apps, and choose any tool you want";
|
|
2643
2643
|
//#endregion
|
|
2644
2644
|
//#region rules.ts
|
|
@@ -3055,11 +3055,8 @@ async function run() {
|
|
|
3055
3055
|
env,
|
|
3056
3056
|
deploy
|
|
3057
3057
|
}, meta);
|
|
3058
|
-
const skills =
|
|
3059
|
-
for (const onafter of hooksMap.get("after") ?? []) await onafter(args.project, meta, {
|
|
3060
|
-
skills,
|
|
3061
|
-
env
|
|
3062
|
-
});
|
|
3058
|
+
const skills = filteredBoilerplates.flatMap((b) => b.config.skills?.(meta) ?? []);
|
|
3059
|
+
for (const onafter of hooksMap.get("after") ?? []) await onafter(args.project, meta, { skills });
|
|
3063
3060
|
if (args.knip) await generateKnipConfig(args.project, filteredBoilerplates);
|
|
3064
3061
|
if (!args["skip-git"]) gitInit(args.project);
|
|
3065
3062
|
const nextSteps = filteredBoilerplates.flatMap((b) => b.config.nextSteps?.(meta, pm.run, colorette_exports)).filter(Boolean);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@batijs/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.658",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"check-types": "tsc --noEmit",
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
"repository": "https://github.com/vikejs/bati",
|
|
14
14
|
"license": "MIT",
|
|
15
15
|
"devDependencies": {
|
|
16
|
-
"@batijs/build": "0.0.
|
|
17
|
-
"@batijs/compile": "0.0.
|
|
16
|
+
"@batijs/build": "0.0.658",
|
|
17
|
+
"@batijs/compile": "0.0.658",
|
|
18
18
|
"@inquirer/prompts": "^8.5.2",
|
|
19
19
|
"@types/node": "^20.19.37",
|
|
20
20
|
"@types/which": "^3.0.4",
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
"vite": "^8.0.16"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@batijs/core": "0.0.
|
|
34
|
-
"@batijs/features": "0.0.
|
|
33
|
+
"@batijs/core": "0.0.658",
|
|
34
|
+
"@batijs/features": "0.0.658"
|
|
35
35
|
},
|
|
36
36
|
"bin": "./cli.js",
|
|
37
37
|
"exports": {
|
package/dist/boilerplates/@batijs/shared-agents/hooks/asset-boilerplates/shared-agents/agents-md.mjs
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { features } from "../../asset-packages/features/dist/features-CStxEDu3.mjs";
|
|
2
|
-
import { categories } from "../../asset-packages/features/dist/index.mjs";
|
|
3
|
-
//#region agents-md.ts
|
|
4
|
-
/**
|
|
5
|
-
* The canonical `AGENTS.md` body (SKILLS_PLAN.md §3/§6.A): the always-loaded project guide —
|
|
6
|
-
* orientation, commands, env, structure — composed from the resolved stack. Kept lean, pointing at
|
|
7
|
-
* `README.md` and upstream docs rather than duplicating volatile detail.
|
|
8
|
-
*/
|
|
9
|
-
function buildAgentsMd(meta, hasEnv) {
|
|
10
|
-
const run = meta.BATI.pmRun;
|
|
11
|
-
const sections = [
|
|
12
|
-
`# AGENTS.md
|
|
13
|
-
|
|
14
|
-
Guidance for AI coding agents working in this repository. This is a [Vike](https://vike.dev) app
|
|
15
|
-
scaffolded with [Bati](https://batijs.dev). Match the existing conventions and the stack below.`,
|
|
16
|
-
stackSection(meta),
|
|
17
|
-
`## Commands
|
|
18
|
-
|
|
19
|
-
- \`${run} dev\` — start the development server
|
|
20
|
-
- \`${run} build\` — build for production
|
|
21
|
-
- \`${run} preview\` — preview the production build
|
|
22
|
-
|
|
23
|
-
Use \`${meta.BATI.pm}\` for package management. See \`package.json\` for the full list of scripts.`
|
|
24
|
-
];
|
|
25
|
-
if (hasEnv) sections.push(environmentSection(meta));
|
|
26
|
-
sections.push(structureSection(meta));
|
|
27
|
-
sections.push(`## Notes for agents
|
|
28
|
-
|
|
29
|
-
- Respect the selected stack above; prefer its idioms over introducing new libraries.
|
|
30
|
-
- Task-specific how-tos are provided as skills under \`.agents/skills/\` (and \`.claude/skills/\`) — consult them when relevant.
|
|
31
|
-
- See \`README.md\` for setup and feature-specific notes.`);
|
|
32
|
-
sections.push(referencesSection(meta));
|
|
33
|
-
return `${sections.join("\n\n")}\n`;
|
|
34
|
-
}
|
|
35
|
-
/** `llms.txt` docs indexes for the selected stack (Vike is the always-present foundation). */
|
|
36
|
-
function referencesSection(meta) {
|
|
37
|
-
const refs = [];
|
|
38
|
-
for (const f of features) {
|
|
39
|
-
const { llms } = f;
|
|
40
|
-
if (llms && f.category !== "AI Agent" && (f.flag === "vike" || meta.BATI.has(f.flag))) refs.push(`- ${f.label} — ${llms}`);
|
|
41
|
-
}
|
|
42
|
-
return `## References
|
|
43
|
-
|
|
44
|
-
LLM-friendly docs (\`llms.txt\`) for this stack — fetch these for authoritative, up-to-date API details:
|
|
45
|
-
|
|
46
|
-
${refs.join("\n")}`;
|
|
47
|
-
}
|
|
48
|
-
/** Selected features grouped by category (excluding the AI agents themselves), in category order. */
|
|
49
|
-
function stackSection(meta) {
|
|
50
|
-
const byCategory = /* @__PURE__ */ new Map();
|
|
51
|
-
for (const f of features) {
|
|
52
|
-
if (f.category === "AI Agent" || !meta.BATI.has(f.flag)) continue;
|
|
53
|
-
byCategory.set(f.category, [...byCategory.get(f.category) ?? [], f.label]);
|
|
54
|
-
}
|
|
55
|
-
return `## Stack\n\n${categories.filter((c) => byCategory.has(c.label)).map((c) => `- **${c.label}:** ${byCategory.get(c.label).join(", ")}`).join("\n")}`;
|
|
56
|
-
}
|
|
57
|
-
function environmentSection(meta) {
|
|
58
|
-
const lines = ["- Client/build-time vars use the `PUBLIC_ENV__*` prefix (read via `import.meta.env`); everything else is server-only."];
|
|
59
|
-
if (meta.BATI.hasDotEnvSecrets) lines.unshift("- Environment variables are configured in `.env` (dev defaults are committed there); keep real secrets out of version control.");
|
|
60
|
-
else lines.unshift("- Non-secret vars live in `wrangler.jsonc` (`vars`); set secrets with `wrangler secret put <NAME>`. `.env` holds public/dev values only.");
|
|
61
|
-
return `## Environment\n\n${lines.join("\n")}`;
|
|
62
|
-
}
|
|
63
|
-
function structureSection(meta) {
|
|
64
|
-
const lines = ["- `pages/` — file-based routing. A route is a directory with a `+Page` file; add `+route`, `+data`, `+config`, `+guard`, or `+Layout` files beside it. See https://vike.dev.", "- `+config.ts` — Vike configuration (global under `pages/`, or per-route)."];
|
|
65
|
-
if (meta.BATI.hasServer) lines.push("- The app runs behind a server; the server entry boots Vike (see the `dev` script in `package.json`).");
|
|
66
|
-
if (meta.BATI.hasDatabase || meta.BATI.hasOrm) lines.push("- Database access lives in the project's db modules; check the schema/migration files and `package.json`.");
|
|
67
|
-
return `## Project structure\n\n${lines.join("\n")}`;
|
|
68
|
-
}
|
|
69
|
-
//#endregion
|
|
70
|
-
export { buildAgentsMd };
|