@sixseven-ai/cli 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,200 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ const DEFAULT_MAX_FILE_BYTES = 200_000;
4
+ const DEFAULT_MAX_SEARCH_RESULTS = 200;
5
+ const TEXT_EXT = new Set([
6
+ '.ts',
7
+ '.tsx',
8
+ '.js',
9
+ '.jsx',
10
+ '.mjs',
11
+ '.cjs',
12
+ '.json',
13
+ '.yml',
14
+ '.yaml',
15
+ '.md',
16
+ '.html',
17
+ '.css',
18
+ '.scss',
19
+ '.less',
20
+ '.toml',
21
+ '.env',
22
+ '.txt',
23
+ '.py',
24
+ '.go',
25
+ '.rb',
26
+ '.java',
27
+ '.kt',
28
+ '.swift',
29
+ '.rs',
30
+ '.php',
31
+ '.cs',
32
+ '.vue',
33
+ '.svelte',
34
+ '.sql',
35
+ '.graphql',
36
+ '.prisma',
37
+ ]);
38
+ export class SourceReader {
39
+ repoRoot;
40
+ roots;
41
+ excludeNames;
42
+ excludeGlobs;
43
+ maxFileBytes;
44
+ constructor(opts) {
45
+ this.repoRoot = path.resolve(opts.repoRoot);
46
+ this.roots = (opts.config.codeRoots.length ? opts.config.codeRoots : ['.']).map((r) => path.resolve(this.repoRoot, r));
47
+ const excludeNames = new Set();
48
+ const excludeGlobs = [];
49
+ for (const e of opts.config.exclude) {
50
+ if (e.includes('/') || e.includes('*'))
51
+ excludeGlobs.push(e);
52
+ else
53
+ excludeNames.add(e);
54
+ }
55
+ this.excludeNames = excludeNames;
56
+ this.excludeGlobs = excludeGlobs;
57
+ this.maxFileBytes = opts.maxFileBytes ?? DEFAULT_MAX_FILE_BYTES;
58
+ }
59
+ /**
60
+ * Resolve a user-supplied relative path. Rejects paths outside the repo root
61
+ * and outside any configured codeRoot.
62
+ */
63
+ resolveSafe(relPath) {
64
+ const cleaned = relPath.replace(/^[./\\]+/, '').replace(/\\/g, '/');
65
+ const abs = path.resolve(this.repoRoot, cleaned);
66
+ const repoRel = path.relative(this.repoRoot, abs);
67
+ if (repoRel.startsWith('..') || path.isAbsolute(repoRel)) {
68
+ throw new Error(`Path escapes repo root: ${relPath}`);
69
+ }
70
+ if (!this.roots.some((root) => abs === root || abs.startsWith(root + path.sep))) {
71
+ throw new Error(`Path is outside configured codeRoots (${this.roots
72
+ .map((r) => path.relative(this.repoRoot, r))
73
+ .join(', ')}): ${relPath}`);
74
+ }
75
+ if (this.isExcluded(abs)) {
76
+ throw new Error(`Path matches exclude pattern: ${relPath}`);
77
+ }
78
+ return abs;
79
+ }
80
+ isExcluded(absPath) {
81
+ const rel = path.relative(this.repoRoot, absPath);
82
+ const parts = rel.split(path.sep);
83
+ if (parts.some((p) => this.excludeNames.has(p)))
84
+ return true;
85
+ for (const g of this.excludeGlobs) {
86
+ if (rel.includes(g.replace(/\*/g, '')))
87
+ return true;
88
+ }
89
+ return false;
90
+ }
91
+ async readFile(relPath) {
92
+ const abs = this.resolveSafe(relPath);
93
+ const stat = await fs.stat(abs);
94
+ if (!stat.isFile())
95
+ throw new Error(`Not a file: ${relPath}`);
96
+ const ext = path.extname(abs).toLowerCase();
97
+ if (ext && !TEXT_EXT.has(ext)) {
98
+ throw new Error(`Refusing to read non-text file: ${relPath} (extension ${ext})`);
99
+ }
100
+ const buf = await fs.readFile(abs);
101
+ const truncated = buf.byteLength > this.maxFileBytes;
102
+ const sliced = truncated ? buf.subarray(0, this.maxFileBytes) : buf;
103
+ return {
104
+ path: path.relative(this.repoRoot, abs),
105
+ bytes: stat.size,
106
+ content: sliced.toString('utf8'),
107
+ truncated,
108
+ };
109
+ }
110
+ async listDir(relPath) {
111
+ const abs = this.resolveSafe(relPath || '.');
112
+ const stat = await fs.stat(abs);
113
+ if (!stat.isDirectory())
114
+ throw new Error(`Not a directory: ${relPath}`);
115
+ const dirents = await fs.readdir(abs, { withFileTypes: true });
116
+ const entries = dirents
117
+ .filter((d) => !this.isExcluded(path.join(abs, d.name)))
118
+ .map((d) => ({
119
+ name: d.name,
120
+ type: (d.isDirectory() ? 'dir' : 'file'),
121
+ }))
122
+ .sort((a, b) => a.type === b.type
123
+ ? a.name.localeCompare(b.name)
124
+ : a.type === 'dir'
125
+ ? -1
126
+ : 1);
127
+ return { path: path.relative(this.repoRoot, abs), entries };
128
+ }
129
+ /**
130
+ * Substring/regex search across configured codeRoots. Returns up to
131
+ * maxResults matches (default 200). Walks the tree itself — no shell.
132
+ */
133
+ async search(query, opts = {}) {
134
+ if (!query)
135
+ return [];
136
+ const maxResults = opts.maxResults ?? DEFAULT_MAX_SEARCH_RESULTS;
137
+ const flags = opts.caseSensitive ? 'g' : 'gi';
138
+ const re = opts.regex
139
+ ? new RegExp(query, flags)
140
+ : new RegExp(query.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), flags);
141
+ const results = [];
142
+ const walk = async (dir) => {
143
+ if (results.length >= maxResults)
144
+ return;
145
+ let dirents;
146
+ try {
147
+ dirents = await fs.readdir(dir, { withFileTypes: true });
148
+ }
149
+ catch {
150
+ return;
151
+ }
152
+ for (const d of dirents) {
153
+ if (results.length >= maxResults)
154
+ return;
155
+ const abs = path.join(dir, d.name);
156
+ if (this.isExcluded(abs))
157
+ continue;
158
+ if (d.isDirectory()) {
159
+ await walk(abs);
160
+ }
161
+ else if (d.isFile()) {
162
+ const ext = path.extname(d.name).toLowerCase();
163
+ if (ext && !TEXT_EXT.has(ext))
164
+ continue;
165
+ let content;
166
+ try {
167
+ const buf = await fs.readFile(abs);
168
+ if (buf.byteLength > this.maxFileBytes)
169
+ continue;
170
+ content = buf.toString('utf8');
171
+ }
172
+ catch {
173
+ continue;
174
+ }
175
+ const lines = content.split(/\r?\n/);
176
+ for (let i = 0; i < lines.length; i++) {
177
+ const line = lines[i];
178
+ if (re.test(line)) {
179
+ results.push({
180
+ file: path.relative(this.repoRoot, abs),
181
+ line: i + 1,
182
+ preview: line.length > 240 ? `${line.slice(0, 240)}…` : line,
183
+ });
184
+ if (results.length >= maxResults)
185
+ return;
186
+ }
187
+ re.lastIndex = 0;
188
+ }
189
+ }
190
+ }
191
+ };
192
+ for (const root of this.roots) {
193
+ await walk(root);
194
+ if (results.length >= maxResults)
195
+ break;
196
+ }
197
+ return results;
198
+ }
199
+ }
200
+ //# sourceMappingURL=source-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-reader.js","sourceRoot":"","sources":["../src/source-reader.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@sixseven-ai/cli",
3
+ "version": "0.1.1",
4
+ "description": "SixSeven CLI + MCP server for AI-driven whitebox testcase generation",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "sideEffects": false,
8
+ "keywords": [
9
+ "sixseven",
10
+ "mcp",
11
+ "model-context-protocol",
12
+ "testing",
13
+ "ui-testing",
14
+ "whitebox",
15
+ "claude",
16
+ "claude-code",
17
+ "ai-testing"
18
+ ],
19
+ "homepage": "https://gitlab.sprout.co.id/sixseven/sixseven-ai/tree/main/packages/cli",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "https://gitlab.sprout.co.id/sixseven/sixseven-ai.git",
23
+ "directory": "packages/cli"
24
+ },
25
+ "bugs": {
26
+ "url": "https://gitlab.sprout.co.id/sixseven/sixseven-ai/issues"
27
+ },
28
+ "bin": {
29
+ "sixseven": "./dist/bin.js"
30
+ },
31
+ "files": ["dist", "README.md", "USAGE.md"],
32
+ "scripts": {
33
+ "build": "tsc -p tsconfig.json && chmod +x dist/bin.js",
34
+ "dev": "tsc -p tsconfig.json --watch",
35
+ "start": "node dist/bin.js",
36
+ "typecheck": "tsc -p tsconfig.json --noEmit",
37
+ "prepack": "pnpm run build",
38
+ "test": "vitest --run",
39
+ "test:watch": "vitest"
40
+ },
41
+ "publishConfig": {
42
+ "access": "public"
43
+ },
44
+ "dependencies": {
45
+ "@modelcontextprotocol/sdk": "1.10.2",
46
+ "commander": "^12.1.0",
47
+ "picocolors": "^1.1.1",
48
+ "prompts": "^2.4.2",
49
+ "undici": "^6.0.0",
50
+ "zod": "^3.25.0"
51
+ },
52
+ "devDependencies": {
53
+ "@types/node": "^18.0.0",
54
+ "@types/prompts": "^2.4.9",
55
+ "typescript": "^5.8.3",
56
+ "vitest": "3.0.5"
57
+ },
58
+ "engines": {
59
+ "node": ">=18.19.0"
60
+ }
61
+ }