@baton-dx/cli 0.1.0
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/context-detection-0m8_Fp0j.mjs +45 -0
- package/dist/context-detection-0m8_Fp0j.mjs.map +1 -0
- package/dist/create-CqfUSGj7.mjs +81 -0
- package/dist/create-CqfUSGj7.mjs.map +1 -0
- package/dist/index.d.mts +2 -0
- package/dist/index.mjs +3053 -0
- package/dist/index.mjs.map +1 -0
- package/dist/list-o76RXPxE.mjs +56 -0
- package/dist/list-o76RXPxE.mjs.map +1 -0
- package/dist/remove-BB883RDx.mjs +92 -0
- package/dist/remove-BB883RDx.mjs.map +1 -0
- package/dist/templates/profile/minimal/ai/memory/CLAUDE.md +3 -0
- package/dist/templates/profile/minimal/ai/memory/MEMORY.md +5 -0
- package/dist/templates/profile/minimal/baton.profile.yaml +11 -0
- package/dist/templates/profile/team/ai/commands/review.md +15 -0
- package/dist/templates/profile/team/ai/memory/CLAUDE.md +9 -0
- package/dist/templates/profile/team/ai/memory/MEMORY.md +11 -0
- package/dist/templates/profile/team/ai/rules/cursor/code-style.mdc +18 -0
- package/dist/templates/profile/team/ai/rules/universal/coding-standards.md +15 -0
- package/dist/templates/profile/team/ai/skills/code-review/SKILL.md +22 -0
- package/dist/templates/profile/team/baton.profile.yaml +33 -0
- package/dist/templates/profile/team/files/biome.json +17 -0
- package/dist/templates/profile/team/ide/vscode/extensions.json +3 -0
- package/dist/templates/profile/team/ide/vscode/settings.json +9 -0
- package/package.json +43 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { n as isInSourceRepo } from "./context-detection-0m8_Fp0j.mjs";
|
|
3
|
+
import { defineCommand } from "citty";
|
|
4
|
+
import { discoverProfilesInSourceRepo } from "@baton-dx/core";
|
|
5
|
+
import * as p from "@clack/prompts";
|
|
6
|
+
|
|
7
|
+
//#region src/commands/profile/list.ts
|
|
8
|
+
const profileListCommand = defineCommand({
|
|
9
|
+
meta: {
|
|
10
|
+
name: "profile list",
|
|
11
|
+
description: `List all profiles in the current source repository
|
|
12
|
+
|
|
13
|
+
Shows a table of all profiles with:
|
|
14
|
+
- Profile name (root profile marked with "(root)")
|
|
15
|
+
- Version from baton.profile.yaml
|
|
16
|
+
- Description from profile manifest
|
|
17
|
+
|
|
18
|
+
Examples:
|
|
19
|
+
baton profile list
|
|
20
|
+
|
|
21
|
+
Note: Must be run from a source repository (directory with baton.source.yaml)`
|
|
22
|
+
},
|
|
23
|
+
run: async () => {
|
|
24
|
+
p.intro("List Profiles");
|
|
25
|
+
if (!await isInSourceRepo()) {
|
|
26
|
+
p.outro("Error: Not in a source repository. Run this command from a directory containing baton.source.yaml");
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
const profiles = await discoverProfilesInSourceRepo(process.cwd());
|
|
30
|
+
if (profiles.length === 0) {
|
|
31
|
+
p.outro("No profiles found.");
|
|
32
|
+
process.exit(0);
|
|
33
|
+
}
|
|
34
|
+
const lines = [];
|
|
35
|
+
lines.push("┌─────────────────────┬─────────┬────────────────────────────────────┐");
|
|
36
|
+
lines.push("│ Name │ Version │ Description │");
|
|
37
|
+
lines.push("├─────────────────────┼─────────┼────────────────────────────────────┤");
|
|
38
|
+
for (const profile of profiles) {
|
|
39
|
+
const name = profile.name;
|
|
40
|
+
const version = profile.version || "-";
|
|
41
|
+
const description = profile.description || "-";
|
|
42
|
+
const namePadded = name.padEnd(19);
|
|
43
|
+
const versionPadded = version.padEnd(7);
|
|
44
|
+
const descPadded = description.padEnd(34);
|
|
45
|
+
lines.push(`│ ${namePadded} │ ${versionPadded} │ ${descPadded} │`);
|
|
46
|
+
}
|
|
47
|
+
lines.push("└─────────────────────┴─────────┴────────────────────────────────────┘");
|
|
48
|
+
p.note(lines.join("\n"), "Profiles");
|
|
49
|
+
p.outro(`Found ${profiles.length} profile${profiles.length === 1 ? "" : "s"}`);
|
|
50
|
+
process.exit(0);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
//#endregion
|
|
55
|
+
export { profileListCommand };
|
|
56
|
+
//# sourceMappingURL=list-o76RXPxE.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-o76RXPxE.mjs","names":[],"sources":["../src/commands/profile/list.ts"],"sourcesContent":["import { discoverProfilesInSourceRepo } from \"@baton-dx/core\";\nimport * as p from \"@clack/prompts\";\nimport { defineCommand } from \"citty\";\nimport { isInSourceRepo } from \"../../utils/context-detection.js\";\n\nexport const profileListCommand = defineCommand({\n meta: {\n name: \"profile list\",\n description: `List all profiles in the current source repository\n\nShows a table of all profiles with:\n - Profile name (root profile marked with \"(root)\")\n - Version from baton.profile.yaml\n - Description from profile manifest\n\nExamples:\n baton profile list\n\nNote: Must be run from a source repository (directory with baton.source.yaml)`,\n },\n run: async () => {\n p.intro(\"List Profiles\");\n\n // Check if we're in a source repo\n const inSourceRepo = await isInSourceRepo();\n if (!inSourceRepo) {\n p.outro(\n \"Error: Not in a source repository. Run this command from a directory containing baton.source.yaml\",\n );\n process.exit(1);\n }\n\n const cwd = process.cwd();\n\n // Discover all profiles in the profiles/ directory\n const profiles = await discoverProfilesInSourceRepo(cwd);\n\n if (profiles.length === 0) {\n p.outro(\"No profiles found.\");\n process.exit(0);\n }\n\n // Build table output\n const lines: string[] = [];\n lines.push(\"┌─────────────────────┬─────────┬────────────────────────────────────┐\");\n lines.push(\"│ Name │ Version │ Description │\");\n lines.push(\"├─────────────────────┼─────────┼────────────────────────────────────┤\");\n\n for (const profile of profiles) {\n const name = profile.name;\n const version = profile.version || \"-\";\n const description = profile.description || \"-\";\n\n // Pad columns to fixed width\n const namePadded = name.padEnd(19);\n const versionPadded = version.padEnd(7);\n const descPadded = description.padEnd(34);\n\n lines.push(`│ ${namePadded} │ ${versionPadded} │ ${descPadded} │`);\n }\n\n lines.push(\"└─────────────────────┴─────────┴────────────────────────────────────┘\");\n\n p.note(lines.join(\"\\n\"), \"Profiles\");\n p.outro(`Found ${profiles.length} profile${profiles.length === 1 ? \"\" : \"s\"}`);\n process.exit(0);\n },\n});\n"],"mappings":";;;;;;;AAKA,MAAa,qBAAqB,cAAc;CAC9C,MAAM;EACJ,MAAM;EACN,aAAa;;;;;;;;;;;EAWd;CACD,KAAK,YAAY;AACf,IAAE,MAAM,gBAAgB;AAIxB,MAAI,CADiB,MAAM,gBAAgB,EACxB;AACjB,KAAE,MACA,oGACD;AACD,WAAQ,KAAK,EAAE;;EAMjB,MAAM,WAAW,MAAM,6BAHX,QAAQ,KAAK,CAG+B;AAExD,MAAI,SAAS,WAAW,GAAG;AACzB,KAAE,MAAM,qBAAqB;AAC7B,WAAQ,KAAK,EAAE;;EAIjB,MAAM,QAAkB,EAAE;AAC1B,QAAM,KAAK,yEAAyE;AACpF,QAAM,KAAK,yEAAyE;AACpF,QAAM,KAAK,yEAAyE;AAEpF,OAAK,MAAM,WAAW,UAAU;GAC9B,MAAM,OAAO,QAAQ;GACrB,MAAM,UAAU,QAAQ,WAAW;GACnC,MAAM,cAAc,QAAQ,eAAe;GAG3C,MAAM,aAAa,KAAK,OAAO,GAAG;GAClC,MAAM,gBAAgB,QAAQ,OAAO,EAAE;GACvC,MAAM,aAAa,YAAY,OAAO,GAAG;AAEzC,SAAM,KAAK,KAAK,WAAW,KAAK,cAAc,KAAK,WAAW,IAAI;;AAGpE,QAAM,KAAK,yEAAyE;AAEpF,IAAE,KAAK,MAAM,KAAK,KAAK,EAAE,WAAW;AACpC,IAAE,MAAM,SAAS,SAAS,OAAO,UAAU,SAAS,WAAW,IAAI,KAAK,MAAM;AAC9E,UAAQ,KAAK,EAAE;;CAElB,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { t as findSourceRoot } from "./context-detection-0m8_Fp0j.mjs";
|
|
3
|
+
import { readFile, readdir, rm, writeFile } from "node:fs/promises";
|
|
4
|
+
import { join, relative } from "node:path";
|
|
5
|
+
import { defineCommand } from "citty";
|
|
6
|
+
import * as p from "@clack/prompts";
|
|
7
|
+
import { parse, stringify } from "yaml";
|
|
8
|
+
|
|
9
|
+
//#region src/commands/profile/remove.ts
|
|
10
|
+
/**
|
|
11
|
+
* Recursively collect all file paths in a directory (relative to baseDir)
|
|
12
|
+
*/
|
|
13
|
+
async function collectFiles(dir, baseDir) {
|
|
14
|
+
const files = [];
|
|
15
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
16
|
+
for (const entry of entries) {
|
|
17
|
+
const fullPath = join(dir, entry.name);
|
|
18
|
+
if (entry.isDirectory()) files.push(...await collectFiles(fullPath, baseDir));
|
|
19
|
+
else files.push(relative(baseDir, fullPath));
|
|
20
|
+
}
|
|
21
|
+
return files;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Remove a profile entry from baton.source.yaml if it exists in the profiles array
|
|
25
|
+
*/
|
|
26
|
+
async function removeProfileFromSourceManifest(sourceRoot, profileName) {
|
|
27
|
+
const manifestPath = join(sourceRoot, "baton.source.yaml");
|
|
28
|
+
try {
|
|
29
|
+
const manifest = parse(await readFile(manifestPath, "utf-8"));
|
|
30
|
+
if (manifest?.profiles && Array.isArray(manifest.profiles)) {
|
|
31
|
+
const originalLength = manifest.profiles.length;
|
|
32
|
+
manifest.profiles = manifest.profiles.filter((profile) => profile.name !== profileName && profile.path !== `profiles/${profileName}`);
|
|
33
|
+
if (manifest.profiles.length < originalLength) {
|
|
34
|
+
if (manifest.profiles.length === 0) manifest.profiles = void 0;
|
|
35
|
+
await writeFile(manifestPath, stringify(manifest), "utf-8");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
} catch {}
|
|
39
|
+
}
|
|
40
|
+
const profileRemoveCommand = defineCommand({
|
|
41
|
+
meta: {
|
|
42
|
+
name: "remove",
|
|
43
|
+
description: "Remove a profile from the source repository"
|
|
44
|
+
},
|
|
45
|
+
args: { name: {
|
|
46
|
+
type: "positional",
|
|
47
|
+
description: "Profile name to remove",
|
|
48
|
+
required: true
|
|
49
|
+
} },
|
|
50
|
+
async run({ args }) {
|
|
51
|
+
p.intro("Remove Profile");
|
|
52
|
+
const sourceRoot = await findSourceRoot();
|
|
53
|
+
if (!sourceRoot) {
|
|
54
|
+
p.cancel("This command must be run inside a source directory (baton.source.yaml not found)");
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
const profileName = args.name;
|
|
58
|
+
const profileDir = join(sourceRoot, "profiles", profileName);
|
|
59
|
+
let files;
|
|
60
|
+
try {
|
|
61
|
+
files = await collectFiles(profileDir, sourceRoot);
|
|
62
|
+
} catch (error) {
|
|
63
|
+
if (error.code === "ENOENT") {
|
|
64
|
+
p.cancel(`Profile "${profileName}" does not exist in profiles/${profileName}/`);
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
if (files.length > 0) {
|
|
70
|
+
p.log.warn("The following files will be deleted:");
|
|
71
|
+
for (const file of files) p.log.info(` ${file}`);
|
|
72
|
+
} else p.log.warn(`Directory profiles/${profileName}/ will be deleted.`);
|
|
73
|
+
const confirmed = await p.confirm({
|
|
74
|
+
message: `Are you sure you want to remove profile "${profileName}"?`,
|
|
75
|
+
initialValue: false
|
|
76
|
+
});
|
|
77
|
+
if (p.isCancel(confirmed) || !confirmed) {
|
|
78
|
+
p.cancel("Operation cancelled.");
|
|
79
|
+
process.exit(0);
|
|
80
|
+
}
|
|
81
|
+
await rm(profileDir, {
|
|
82
|
+
recursive: true,
|
|
83
|
+
force: true
|
|
84
|
+
});
|
|
85
|
+
await removeProfileFromSourceManifest(sourceRoot, profileName);
|
|
86
|
+
p.outro(`Profile "${profileName}" removed from profiles/${profileName}/`);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
//#endregion
|
|
91
|
+
export { profileRemoveCommand };
|
|
92
|
+
//# sourceMappingURL=remove-BB883RDx.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove-BB883RDx.mjs","names":["parseYaml","stringifyYaml"],"sources":["../src/commands/profile/remove.ts"],"sourcesContent":["import { readFile, readdir, rm, writeFile } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport { defineCommand } from \"citty\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { findSourceRoot } from \"../../utils/context-detection.js\";\n\n/**\n * Recursively collect all file paths in a directory (relative to baseDir)\n */\nasync function collectFiles(dir: string, baseDir: string): Promise<string[]> {\n const files: string[] = [];\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await collectFiles(fullPath, baseDir)));\n } else {\n files.push(relative(baseDir, fullPath));\n }\n }\n\n return files;\n}\n\n/**\n * Remove a profile entry from baton.source.yaml if it exists in the profiles array\n */\nasync function removeProfileFromSourceManifest(\n sourceRoot: string,\n profileName: string,\n): Promise<void> {\n const manifestPath = join(sourceRoot, \"baton.source.yaml\");\n\n try {\n const content = await readFile(manifestPath, \"utf-8\");\n const manifest = parseYaml(content);\n\n if (manifest?.profiles && Array.isArray(manifest.profiles)) {\n const originalLength = manifest.profiles.length;\n manifest.profiles = manifest.profiles.filter(\n (profile: { name?: string; path?: string }) =>\n profile.name !== profileName && profile.path !== `profiles/${profileName}`,\n );\n\n if (manifest.profiles.length < originalLength) {\n // Remove empty profiles array\n if (manifest.profiles.length === 0) {\n manifest.profiles = undefined;\n }\n await writeFile(manifestPath, stringifyYaml(manifest), \"utf-8\");\n }\n }\n } catch {\n // If manifest can't be read/written, skip — the directory removal is the primary action\n }\n}\n\nexport const profileRemoveCommand = defineCommand({\n meta: {\n name: \"remove\",\n description: \"Remove a profile from the source repository\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Profile name to remove\",\n required: true,\n },\n },\n async run({ args }) {\n p.intro(\"Remove Profile\");\n\n // Check for baton.source.yaml in current or parent directories\n const sourceRoot = await findSourceRoot();\n if (!sourceRoot) {\n p.cancel(\"This command must be run inside a source directory (baton.source.yaml not found)\");\n process.exit(1);\n }\n\n const profileName = args.name as string;\n const profileDir = join(sourceRoot, \"profiles\", profileName);\n\n // Check if profile directory exists\n let files: string[];\n try {\n files = await collectFiles(profileDir, sourceRoot);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n p.cancel(`Profile \"${profileName}\" does not exist in profiles/${profileName}/`);\n process.exit(1);\n }\n throw error;\n }\n\n // Warn about files that will be deleted\n if (files.length > 0) {\n p.log.warn(\"The following files will be deleted:\");\n for (const file of files) {\n p.log.info(` ${file}`);\n }\n } else {\n p.log.warn(`Directory profiles/${profileName}/ will be deleted.`);\n }\n\n // Confirm before removing\n const confirmed = await p.confirm({\n message: `Are you sure you want to remove profile \"${profileName}\"?`,\n initialValue: false,\n });\n\n if (p.isCancel(confirmed) || !confirmed) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n // Remove the profile directory\n await rm(profileDir, { recursive: true, force: true });\n\n // Remove entry from baton.source.yaml if present\n await removeProfileFromSourceManifest(sourceRoot, profileName);\n\n p.outro(`Profile \"${profileName}\" removed from profiles/${profileName}/`);\n },\n});\n"],"mappings":";;;;;;;;;;;;AAUA,eAAe,aAAa,KAAa,SAAoC;CAC3E,MAAM,QAAkB,EAAE;CAC1B,MAAM,UAAU,MAAM,QAAQ,KAAK,EAAE,eAAe,MAAM,CAAC;AAE3D,MAAK,MAAM,SAAS,SAAS;EAC3B,MAAM,WAAW,KAAK,KAAK,MAAM,KAAK;AACtC,MAAI,MAAM,aAAa,CACrB,OAAM,KAAK,GAAI,MAAM,aAAa,UAAU,QAAQ,CAAE;MAEtD,OAAM,KAAK,SAAS,SAAS,SAAS,CAAC;;AAI3C,QAAO;;;;;AAMT,eAAe,gCACb,YACA,aACe;CACf,MAAM,eAAe,KAAK,YAAY,oBAAoB;AAE1D,KAAI;EAEF,MAAM,WAAWA,MADD,MAAM,SAAS,cAAc,QAAQ,CAClB;AAEnC,MAAI,UAAU,YAAY,MAAM,QAAQ,SAAS,SAAS,EAAE;GAC1D,MAAM,iBAAiB,SAAS,SAAS;AACzC,YAAS,WAAW,SAAS,SAAS,QACnC,YACC,QAAQ,SAAS,eAAe,QAAQ,SAAS,YAAY,cAChE;AAED,OAAI,SAAS,SAAS,SAAS,gBAAgB;AAE7C,QAAI,SAAS,SAAS,WAAW,EAC/B,UAAS,WAAW;AAEtB,UAAM,UAAU,cAAcC,UAAc,SAAS,EAAE,QAAQ;;;SAG7D;;AAKV,MAAa,uBAAuB,cAAc;CAChD,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD,MAAM,EACJ,MAAM;EACJ,MAAM;EACN,aAAa;EACb,UAAU;EACX,EACF;CACD,MAAM,IAAI,EAAE,QAAQ;AAClB,IAAE,MAAM,iBAAiB;EAGzB,MAAM,aAAa,MAAM,gBAAgB;AACzC,MAAI,CAAC,YAAY;AACf,KAAE,OAAO,mFAAmF;AAC5F,WAAQ,KAAK,EAAE;;EAGjB,MAAM,cAAc,KAAK;EACzB,MAAM,aAAa,KAAK,YAAY,YAAY,YAAY;EAG5D,IAAI;AACJ,MAAI;AACF,WAAQ,MAAM,aAAa,YAAY,WAAW;WAC3C,OAAO;AACd,OAAK,MAAgC,SAAS,UAAU;AACtD,MAAE,OAAO,YAAY,YAAY,+BAA+B,YAAY,GAAG;AAC/E,YAAQ,KAAK,EAAE;;AAEjB,SAAM;;AAIR,MAAI,MAAM,SAAS,GAAG;AACpB,KAAE,IAAI,KAAK,uCAAuC;AAClD,QAAK,MAAM,QAAQ,MACjB,GAAE,IAAI,KAAK,KAAK,OAAO;QAGzB,GAAE,IAAI,KAAK,sBAAsB,YAAY,oBAAoB;EAInE,MAAM,YAAY,MAAM,EAAE,QAAQ;GAChC,SAAS,4CAA4C,YAAY;GACjE,cAAc;GACf,CAAC;AAEF,MAAI,EAAE,SAAS,UAAU,IAAI,CAAC,WAAW;AACvC,KAAE,OAAO,uBAAuB;AAChC,WAAQ,KAAK,EAAE;;AAIjB,QAAM,GAAG,YAAY;GAAE,WAAW;GAAM,OAAO;GAAM,CAAC;AAGtD,QAAM,gCAAgC,YAAY,YAAY;AAE9D,IAAE,MAAM,YAAY,YAAY,0BAA0B,YAAY,GAAG;;CAE5E,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Code style guidelines for {{name}}
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# {{name}} Code Style
|
|
6
|
+
|
|
7
|
+
Follow these code style guidelines when working in the {{name}} profile.
|
|
8
|
+
|
|
9
|
+
## Formatting
|
|
10
|
+
|
|
11
|
+
- Use consistent indentation
|
|
12
|
+
- Add proper spacing
|
|
13
|
+
- Keep lines readable
|
|
14
|
+
|
|
15
|
+
## Naming
|
|
16
|
+
|
|
17
|
+
- Use descriptive names
|
|
18
|
+
- Follow language conventions
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# {{name}} - Coding Standards
|
|
2
|
+
|
|
3
|
+
Universal coding standards for the {{name}} profile.
|
|
4
|
+
|
|
5
|
+
## Code Style
|
|
6
|
+
|
|
7
|
+
- Use consistent formatting
|
|
8
|
+
- Follow language-specific conventions
|
|
9
|
+
- Write clear, maintainable code
|
|
10
|
+
|
|
11
|
+
## Best Practices
|
|
12
|
+
|
|
13
|
+
- Write tests for new features
|
|
14
|
+
- Document complex logic
|
|
15
|
+
- Use meaningful variable names
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-review
|
|
3
|
+
description: Code review skill for {{name}} profile
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Code Review Skill
|
|
7
|
+
|
|
8
|
+
Perform comprehensive code reviews for the {{name}} profile.
|
|
9
|
+
|
|
10
|
+
## Process
|
|
11
|
+
|
|
12
|
+
1. Review code changes
|
|
13
|
+
2. Check against coding standards
|
|
14
|
+
3. Suggest improvements
|
|
15
|
+
4. Validate tests
|
|
16
|
+
|
|
17
|
+
## Focus Areas
|
|
18
|
+
|
|
19
|
+
- Code quality
|
|
20
|
+
- Best practices
|
|
21
|
+
- Performance
|
|
22
|
+
- Security
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: "{{name}}"
|
|
2
|
+
version: "0.1.0"
|
|
3
|
+
description: "Team profile {{name}} - Enhanced DX standards"
|
|
4
|
+
|
|
5
|
+
ai:
|
|
6
|
+
# Add profile-specific tools here
|
|
7
|
+
tools: []
|
|
8
|
+
|
|
9
|
+
skills:
|
|
10
|
+
- name: "code-review"
|
|
11
|
+
scope: "project"
|
|
12
|
+
|
|
13
|
+
rules:
|
|
14
|
+
universal:
|
|
15
|
+
- "coding-standards"
|
|
16
|
+
cursor:
|
|
17
|
+
- "code-style"
|
|
18
|
+
|
|
19
|
+
commands:
|
|
20
|
+
- "review"
|
|
21
|
+
|
|
22
|
+
memory:
|
|
23
|
+
- source: MEMORY.md
|
|
24
|
+
merge: "append"
|
|
25
|
+
|
|
26
|
+
files:
|
|
27
|
+
- source: "biome.json"
|
|
28
|
+
merge: "deep"
|
|
29
|
+
|
|
30
|
+
ide:
|
|
31
|
+
vscode:
|
|
32
|
+
- "settings.json"
|
|
33
|
+
- "extensions.json"
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
|
|
3
|
+
"organizeImports": {
|
|
4
|
+
"enabled": true
|
|
5
|
+
},
|
|
6
|
+
"linter": {
|
|
7
|
+
"enabled": true,
|
|
8
|
+
"rules": {
|
|
9
|
+
"recommended": true
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"formatter": {
|
|
13
|
+
"enabled": true,
|
|
14
|
+
"indentStyle": "space",
|
|
15
|
+
"indentWidth": 2
|
|
16
|
+
}
|
|
17
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@baton-dx/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI for Baton - the package manager for Developer Experience & AI configuration",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.mjs",
|
|
7
|
+
"module": "./dist/index.mjs",
|
|
8
|
+
"types": "./dist/index.d.mts",
|
|
9
|
+
"bin": {
|
|
10
|
+
"baton": "./dist/index.mjs",
|
|
11
|
+
"baton-dx": "./dist/index.mjs"
|
|
12
|
+
},
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"import": "./dist/index.mjs",
|
|
16
|
+
"types": "./dist/index.d.mts"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"files": ["dist"],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsdown",
|
|
22
|
+
"typecheck": "tsc --noEmit"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@baton-dx/agent-paths": "workspace:*",
|
|
26
|
+
"@baton-dx/core": "workspace:*",
|
|
27
|
+
"@clack/prompts": "^1.0.1",
|
|
28
|
+
"citty": "^0.1.0",
|
|
29
|
+
"handlebars": "^4.7.8",
|
|
30
|
+
"simple-git": "^3.30.0",
|
|
31
|
+
"yaml": "^2.8.2"
|
|
32
|
+
},
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "https://github.com/baton-dx/baton.git",
|
|
36
|
+
"directory": "packages/cli"
|
|
37
|
+
},
|
|
38
|
+
"homepage": "https://github.com/baton-dx/baton#readme",
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/baton-dx/baton/issues"
|
|
41
|
+
},
|
|
42
|
+
"license": "MIT"
|
|
43
|
+
}
|