@sebasgc0399/agents-md 0.2.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/LICENSE +21 -0
- package/README.md +203 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +128 -0
- package/dist/cli.js.map +1 -0
- package/dist/detect/command-detector.d.ts +6 -0
- package/dist/detect/command-detector.d.ts.map +1 -0
- package/dist/detect/command-detector.js +62 -0
- package/dist/detect/command-detector.js.map +1 -0
- package/dist/detect/folder-detector.d.ts +6 -0
- package/dist/detect/folder-detector.d.ts.map +1 -0
- package/dist/detect/folder-detector.js +69 -0
- package/dist/detect/folder-detector.js.map +1 -0
- package/dist/detect/framework-detector.d.ts +10 -0
- package/dist/detect/framework-detector.d.ts.map +1 -0
- package/dist/detect/framework-detector.js +121 -0
- package/dist/detect/framework-detector.js.map +1 -0
- package/dist/detect/index.d.ts +11 -0
- package/dist/detect/index.d.ts.map +1 -0
- package/dist/detect/index.js +70 -0
- package/dist/detect/index.js.map +1 -0
- package/dist/detect/package-detector.d.ts +6 -0
- package/dist/detect/package-detector.d.ts.map +1 -0
- package/dist/detect/package-detector.js +34 -0
- package/dist/detect/package-detector.js.map +1 -0
- package/dist/detect/runtime-detector.d.ts +6 -0
- package/dist/detect/runtime-detector.d.ts.map +1 -0
- package/dist/detect/runtime-detector.js +35 -0
- package/dist/detect/runtime-detector.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/render/data-builder.d.ts +9 -0
- package/dist/render/data-builder.d.ts.map +1 -0
- package/dist/render/data-builder.js +138 -0
- package/dist/render/data-builder.js.map +1 -0
- package/dist/render/index.d.ts +12 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +29 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/mustache-renderer.d.ts +13 -0
- package/dist/render/mustache-renderer.d.ts.map +1 -0
- package/dist/render/mustache-renderer.js +51 -0
- package/dist/render/mustache-renderer.js.map +1 -0
- package/dist/render/validators.d.ts +9 -0
- package/dist/render/validators.d.ts.map +1 -0
- package/dist/render/validators.js +107 -0
- package/dist/render/validators.js.map +1 -0
- package/dist/templates/base.mustache +296 -0
- package/dist/templates/firebase.mustache +236 -0
- package/dist/templates/monorepo.mustache +253 -0
- package/dist/templates/react.mustache +231 -0
- package/dist/types.d.ts +112 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/fs-utils.d.ts +20 -0
- package/dist/utils/fs-utils.d.ts.map +1 -0
- package/dist/utils/fs-utils.js +121 -0
- package/dist/utils/fs-utils.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +32 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/token-counter.d.ts +18 -0
- package/dist/utils/token-counter.d.ts.map +1 -0
- package/dist/utils/token-counter.js +45 -0
- package/dist/utils/token-counter.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Safe file system utilities
|
|
3
|
+
*/
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
/**
|
|
7
|
+
* Safely read package.json with size limit (1MB max)
|
|
8
|
+
*/
|
|
9
|
+
export async function readPackageJson(rootPath) {
|
|
10
|
+
const packagePath = path.join(rootPath, 'package.json');
|
|
11
|
+
// Check if file exists
|
|
12
|
+
if (!fs.existsSync(packagePath)) {
|
|
13
|
+
throw new Error('No package.json found');
|
|
14
|
+
}
|
|
15
|
+
// Check file size (max 1MB for safety)
|
|
16
|
+
const stats = fs.statSync(packagePath);
|
|
17
|
+
const MAX_SIZE = 1024 * 1024; // 1MB
|
|
18
|
+
if (stats.size > MAX_SIZE) {
|
|
19
|
+
throw new Error('package.json is too large (>1MB). This may indicate a corrupted file.');
|
|
20
|
+
}
|
|
21
|
+
// Read and parse
|
|
22
|
+
const content = fs.readFileSync(packagePath, 'utf-8');
|
|
23
|
+
try {
|
|
24
|
+
return JSON.parse(content);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
throw new Error('Invalid JSON in package.json');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Check if a directory exists
|
|
32
|
+
*/
|
|
33
|
+
export function directoryExists(dirPath) {
|
|
34
|
+
try {
|
|
35
|
+
return fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Check if a file exists
|
|
43
|
+
*/
|
|
44
|
+
export function fileExists(filePath) {
|
|
45
|
+
try {
|
|
46
|
+
return fs.existsSync(filePath) && fs.statSync(filePath).isFile();
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Check if path is within project (prevent path traversal)
|
|
54
|
+
*/
|
|
55
|
+
export function isPathSafe(basePath, targetPath) {
|
|
56
|
+
const baseReal = resolveRealPath(path.resolve(basePath));
|
|
57
|
+
if (!baseReal) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
const targetAbsolute = path.isAbsolute(targetPath)
|
|
61
|
+
? path.resolve(targetPath)
|
|
62
|
+
: path.resolve(baseReal, targetPath);
|
|
63
|
+
// Outside base directory (including sibling prefix tricks like project -> project2)
|
|
64
|
+
if (!isPathInside(baseReal, targetAbsolute)) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
// Best-effort symlink guard: only block symlinks that resolve outside project root.
|
|
68
|
+
const relativeToBase = path.relative(baseReal, targetAbsolute);
|
|
69
|
+
if (hasExternalSymlinkInExistingSegments(baseReal, relativeToBase)) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
function resolveRealPath(value) {
|
|
75
|
+
try {
|
|
76
|
+
return fs.realpathSync(value);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function normalizePathForComparison(value) {
|
|
83
|
+
const normalized = path.normalize(value);
|
|
84
|
+
return process.platform === 'win32' ? normalized.toLowerCase() : normalized;
|
|
85
|
+
}
|
|
86
|
+
function isPathInside(basePath, targetPath) {
|
|
87
|
+
const resolvedBase = normalizePathForComparison(path.resolve(basePath));
|
|
88
|
+
const resolvedTarget = normalizePathForComparison(path.resolve(targetPath));
|
|
89
|
+
const relative = path.relative(resolvedBase, resolvedTarget);
|
|
90
|
+
const escapes = relative === '..' ||
|
|
91
|
+
relative.startsWith(`..${path.sep}`) ||
|
|
92
|
+
path.isAbsolute(relative);
|
|
93
|
+
return !escapes;
|
|
94
|
+
}
|
|
95
|
+
function hasExternalSymlinkInExistingSegments(basePath, relativePath) {
|
|
96
|
+
if (!relativePath) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
const segments = relativePath.split(path.sep).filter(Boolean);
|
|
100
|
+
let current = basePath;
|
|
101
|
+
for (const segment of segments) {
|
|
102
|
+
current = path.join(current, segment);
|
|
103
|
+
if (!fs.existsSync(current)) {
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
if (fs.lstatSync(current).isSymbolicLink()) {
|
|
108
|
+
const symlinkReal = resolveRealPath(current);
|
|
109
|
+
if (!symlinkReal || !isPathInside(basePath, symlinkReal)) {
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Fail closed if metadata cannot be read.
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=fs-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-utils.js","sourceRoot":"","sources":["../../src/utils/fs-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI logging utilities for consistent output
|
|
3
|
+
*/
|
|
4
|
+
export declare class Logger {
|
|
5
|
+
private isVerbose;
|
|
6
|
+
constructor(isVerbose?: boolean);
|
|
7
|
+
success(message: string): void;
|
|
8
|
+
error(message: string): void;
|
|
9
|
+
warning(message: string): void;
|
|
10
|
+
info(message: string): void;
|
|
11
|
+
verbose(message: string): void;
|
|
12
|
+
debug(label: string, data: unknown): void;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,MAAM;IACL,OAAO,CAAC,SAAS;gBAAT,SAAS,GAAE,OAAe;IAE9C,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI5B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM9B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;CAK1C"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI logging utilities for consistent output
|
|
3
|
+
*/
|
|
4
|
+
export class Logger {
|
|
5
|
+
isVerbose;
|
|
6
|
+
constructor(isVerbose = false) {
|
|
7
|
+
this.isVerbose = isVerbose;
|
|
8
|
+
}
|
|
9
|
+
success(message) {
|
|
10
|
+
console.log(`✓ ${message}`);
|
|
11
|
+
}
|
|
12
|
+
error(message) {
|
|
13
|
+
console.error(`✗ Error: ${message}`);
|
|
14
|
+
}
|
|
15
|
+
warning(message) {
|
|
16
|
+
console.warn(`⚠ ${message}`);
|
|
17
|
+
}
|
|
18
|
+
info(message) {
|
|
19
|
+
console.log(message);
|
|
20
|
+
}
|
|
21
|
+
verbose(message) {
|
|
22
|
+
if (this.isVerbose) {
|
|
23
|
+
console.log(`→ ${message}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
debug(label, data) {
|
|
27
|
+
if (this.isVerbose) {
|
|
28
|
+
console.log(`[DEBUG] ${label}:`, data);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,MAAM;IACG;IAApB,YAAoB,YAAqB,KAAK;QAA1B,cAAS,GAAT,SAAS,CAAiB;IAAG,CAAC;IAElD,OAAO,CAAC,OAAe;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,OAAO,CAAC,KAAK,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAa,EAAE,IAAa;QAChC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,GAAG,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token estimation utilities
|
|
3
|
+
* Uses character count heuristic: ~4 chars/token for text, ~3 chars/token for code
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Estimate token count for given content
|
|
7
|
+
* This is approximate but sufficient for validation
|
|
8
|
+
*/
|
|
9
|
+
export declare function estimateTokens(content: string): number;
|
|
10
|
+
/**
|
|
11
|
+
* Validate token count is within budget
|
|
12
|
+
*/
|
|
13
|
+
export declare function validateTokenCount(content: string): {
|
|
14
|
+
tokens: number;
|
|
15
|
+
withinBudget: boolean;
|
|
16
|
+
warning?: string;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=token-counter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-counter.d.ts","sourceRoot":"","sources":["../../src/utils/token-counter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAetD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAsBA"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token estimation utilities
|
|
3
|
+
* Uses character count heuristic: ~4 chars/token for text, ~3 chars/token for code
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Estimate token count for given content
|
|
7
|
+
* This is approximate but sufficient for validation
|
|
8
|
+
*/
|
|
9
|
+
export function estimateTokens(content) {
|
|
10
|
+
// Extract code blocks (more token-dense)
|
|
11
|
+
const codeBlockRegex = /```[\s\S]*?```/g;
|
|
12
|
+
const codeBlocks = content.match(codeBlockRegex) || [];
|
|
13
|
+
const codeChars = codeBlocks.join('').length;
|
|
14
|
+
// Text without code blocks
|
|
15
|
+
const textContent = content.replace(codeBlockRegex, '');
|
|
16
|
+
const textChars = textContent.length;
|
|
17
|
+
// Estimate: 3 chars/token for code, 4 chars/token for text
|
|
18
|
+
const codeTokens = Math.ceil(codeChars / 3);
|
|
19
|
+
const textTokens = Math.ceil(textChars / 4);
|
|
20
|
+
return codeTokens + textTokens;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Validate token count is within budget
|
|
24
|
+
*/
|
|
25
|
+
export function validateTokenCount(content) {
|
|
26
|
+
const tokens = estimateTokens(content);
|
|
27
|
+
const MIN_TOKENS = 800;
|
|
28
|
+
const MAX_TOKENS = 1500;
|
|
29
|
+
if (tokens < MIN_TOKENS) {
|
|
30
|
+
return {
|
|
31
|
+
tokens,
|
|
32
|
+
withinBudget: false,
|
|
33
|
+
warning: `Output is quite short (${tokens} tokens). Consider adding more details.`,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
if (tokens > MAX_TOKENS) {
|
|
37
|
+
return {
|
|
38
|
+
tokens,
|
|
39
|
+
withinBudget: false,
|
|
40
|
+
warning: `Output is too long (${tokens} tokens). AI agents may not process it efficiently.`,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
return { tokens, withinBudget: true };
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=token-counter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-counter.js","sourceRoot":"","sources":["../../src/utils/token-counter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,yCAAyC;IACzC,MAAM,cAAc,GAAG,iBAAiB,CAAC;IACzC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IACvD,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;IAE7C,2BAA2B;IAC3B,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC;IAErC,2DAA2D;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAE5C,OAAO,UAAU,GAAG,UAAU,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAKhD,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,GAAG,CAAC;IACvB,MAAM,UAAU,GAAG,IAAI,CAAC;IAExB,IAAI,MAAM,GAAG,UAAU,EAAE,CAAC;QACxB,OAAO;YACL,MAAM;YACN,YAAY,EAAE,KAAK;YACnB,OAAO,EAAE,0BAA0B,MAAM,yCAAyC;SACnF,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,GAAG,UAAU,EAAE,CAAC;QACxB,OAAO;YACL,MAAM;YACN,YAAY,EAAE,KAAK;YACnB,OAAO,EAAE,uBAAuB,MAAM,qDAAqD;SAC5F,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AACxC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sebasgc0399/agents-md",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "git+https://github.com/sebasgc0399/agents-md.git"
|
|
7
|
+
},
|
|
8
|
+
"bugs": {
|
|
9
|
+
"url": "https://github.com/sebasgc0399/agents-md/issues"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/sebasgc0399/agents-md#readme",
|
|
12
|
+
"description": "Generate AGENTS.md files for AI coding agents",
|
|
13
|
+
"type": "module",
|
|
14
|
+
"bin": {
|
|
15
|
+
"agents-md": "dist/cli.js"
|
|
16
|
+
},
|
|
17
|
+
"main": "./dist/index.js",
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"import": "./dist/index.js",
|
|
22
|
+
"types": "./dist/index.d.ts"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsc && npm run copy-templates",
|
|
27
|
+
"benchmark:lite": "node scripts/benchmark/lite.mjs",
|
|
28
|
+
"benchmark:p1": "node scripts/benchmark/p1.mjs",
|
|
29
|
+
"benchmark:p1:update": "node scripts/benchmark/p1.mjs --update-baseline",
|
|
30
|
+
"benchmark:p2": "node scripts/benchmark/p2.mjs",
|
|
31
|
+
"copy-templates": "node -e \"require('fs').cpSync('src/templates', 'dist/templates', {recursive: true})\"",
|
|
32
|
+
"dev": "tsc --watch",
|
|
33
|
+
"start": "node dist/cli.js",
|
|
34
|
+
"test": "npm run build && vitest run",
|
|
35
|
+
"test:coverage": "npm run build && vitest run --coverage",
|
|
36
|
+
"test:watch": "vitest",
|
|
37
|
+
"lint": "tsc --noEmit",
|
|
38
|
+
"prepublishOnly": "npm run build && npm test",
|
|
39
|
+
"release": "release-it"
|
|
40
|
+
},
|
|
41
|
+
"keywords": [
|
|
42
|
+
"agents",
|
|
43
|
+
"ai",
|
|
44
|
+
"llm",
|
|
45
|
+
"documentation",
|
|
46
|
+
"readme",
|
|
47
|
+
"claude",
|
|
48
|
+
"copilot",
|
|
49
|
+
"windsurf"
|
|
50
|
+
],
|
|
51
|
+
"author": "sebasgc0399",
|
|
52
|
+
"license": "MIT",
|
|
53
|
+
"files": [
|
|
54
|
+
"dist",
|
|
55
|
+
"LICENSE",
|
|
56
|
+
"README.md"
|
|
57
|
+
],
|
|
58
|
+
"dependencies": {
|
|
59
|
+
"commander": "^11.1.0",
|
|
60
|
+
"mustache": "^4.2.0"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@release-it/conventional-changelog": "^10.0.5",
|
|
64
|
+
"@types/mustache": "^4.2.5",
|
|
65
|
+
"@types/node": "^20.10.0",
|
|
66
|
+
"@vitest/coverage-v8": "^1.1.0",
|
|
67
|
+
"release-it": "^19.2.4",
|
|
68
|
+
"tsx": "^4.21.0",
|
|
69
|
+
"typescript": "^5.3.3",
|
|
70
|
+
"vitest": "^1.1.0"
|
|
71
|
+
},
|
|
72
|
+
"engines": {
|
|
73
|
+
"node": ">=18.0.0"
|
|
74
|
+
}
|
|
75
|
+
}
|