comp-gate 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/README.md +353 -0
- package/dist/agents/agents-md.d.ts +2 -0
- package/dist/agents/agents-md.d.ts.map +1 -0
- package/dist/agents/agents-md.js +25 -0
- package/dist/agents/agents-md.js.map +1 -0
- package/dist/agents/claude.d.ts +2 -0
- package/dist/agents/claude.d.ts.map +1 -0
- package/dist/agents/claude.js +45 -0
- package/dist/agents/claude.js.map +1 -0
- package/dist/agents/cursor.d.ts +2 -0
- package/dist/agents/cursor.d.ts.map +1 -0
- package/dist/agents/cursor.js +28 -0
- package/dist/agents/cursor.js.map +1 -0
- package/dist/agents/detect.d.ts +4 -0
- package/dist/agents/detect.d.ts.map +1 -0
- package/dist/agents/detect.js +96 -0
- package/dist/agents/detect.js.map +1 -0
- package/dist/agents/shared.d.ts +9 -0
- package/dist/agents/shared.d.ts.map +1 -0
- package/dist/agents/shared.js +83 -0
- package/dist/agents/shared.js.map +1 -0
- package/dist/agents/types.d.ts +14 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +8 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/agents/windsurf.d.ts +2 -0
- package/dist/agents/windsurf.d.ts.map +1 -0
- package/dist/agents/windsurf.js +27 -0
- package/dist/agents/windsurf.js.map +1 -0
- package/dist/bootstrap-summary.d.ts +2 -0
- package/dist/bootstrap-summary.d.ts.map +1 -0
- package/dist/bootstrap-summary.js +262 -0
- package/dist/bootstrap-summary.js.map +1 -0
- package/dist/categories.d.ts +13 -0
- package/dist/categories.d.ts.map +1 -0
- package/dist/categories.js +382 -0
- package/dist/categories.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +361 -0
- package/dist/cli.js.map +1 -0
- package/dist/config-init.d.ts +16 -0
- package/dist/config-init.d.ts.map +1 -0
- package/dist/config-init.js +53 -0
- package/dist/config-init.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +127 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -0
- package/dist/detect.d.ts +4 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +244 -0
- package/dist/detect.js.map +1 -0
- package/dist/diff.d.ts +11 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +198 -0
- package/dist/diff.js.map +1 -0
- package/dist/generate.d.ts +7 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +71 -0
- package/dist/generate.js.map +1 -0
- package/dist/gitignore.d.ts +12 -0
- package/dist/gitignore.d.ts.map +1 -0
- package/dist/gitignore.js +106 -0
- package/dist/gitignore.js.map +1 -0
- package/dist/hooks.d.ts +22 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +199 -0
- package/dist/hooks.js.map +1 -0
- package/dist/init.d.ts +24 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +218 -0
- package/dist/init.js.map +1 -0
- package/dist/paths.d.ts +13 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +18 -0
- package/dist/paths.js.map +1 -0
- package/dist/prompts.d.ts +9 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +88 -0
- package/dist/prompts.js.map +1 -0
- package/dist/repo-stats.d.ts +10 -0
- package/dist/repo-stats.d.ts.map +1 -0
- package/dist/repo-stats.js +117 -0
- package/dist/repo-stats.js.map +1 -0
- package/dist/setup-wizard.d.ts +34 -0
- package/dist/setup-wizard.d.ts.map +1 -0
- package/dist/setup-wizard.js +251 -0
- package/dist/setup-wizard.js.map +1 -0
- package/dist/testing.d.ts +6 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +24 -0
- package/dist/testing.js.map +1 -0
- package/dist/types.d.ts +156 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +31 -0
- package/dist/types.js.map +1 -0
- package/dist/verify.d.ts +38 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +254 -0
- package/dist/verify.js.map +1 -0
- package/package.json +52 -0
- package/src/templates/PROMPTS.md +6 -0
- package/src/templates/SKILL.md +253 -0
- package/src/templates/SUMMARY.md +29 -0
- package/src/templates/agents/agents-md/section.md +11 -0
- package/src/templates/agents/claude/SKILL.md +8 -0
- package/src/templates/agents/claude/settings.fragment.json +16 -0
- package/src/templates/agents/claude/testing-SKILL.md +9 -0
- package/src/templates/agents/cursor/SKILL.md +9 -0
- package/src/templates/agents/cursor/hooks.json +23 -0
- package/src/templates/agents/cursor/testing-SKILL.md +9 -0
- package/src/templates/agents/windsurf/SKILL.md +8 -0
- package/src/templates/agents/windsurf/hooks.json +10 -0
- package/src/templates/agents/windsurf/testing-SKILL.md +9 -0
- package/src/templates/hooks/after-push.sh +17 -0
- package/src/templates/hooks/block-commit.sh +29 -0
- package/src/templates/hooks/block-push.sh +29 -0
- package/src/templates/hooks/claude-pre-tool.sh +59 -0
- package/src/templates/hooks/git-pre-commit.sh +35 -0
- package/src/templates/hooks/git-pre-push.sh +53 -0
- package/src/templates/hooks/statusline.sh +3 -0
- package/src/templates/hooks/windsurf-pre-run.sh +39 -0
- package/src/templates/hooks.json +23 -0
- package/src/templates/testing-SKILL.md +33 -0
- package/src/templates/testme.config.json +32 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAClC,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACrD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;AACxE,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;AACtE,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AAC5D,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AAC1D,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;AACtE,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEtE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAEnD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PromptsSection } from "./types.js";
|
|
2
|
+
export declare function readTextFile(path: string): string;
|
|
3
|
+
export declare function parsePrompts(content: string): PromptsSection[];
|
|
4
|
+
export declare function loadPromptsSections(): PromptsSection[];
|
|
5
|
+
export declare function loadSummary(): string;
|
|
6
|
+
export declare function termsForFile(sections: PromptsSection[], filePath: string): string[];
|
|
7
|
+
export declare function summaryArchitectureTerms(summary: string): string[];
|
|
8
|
+
export declare function promptsHasContent(): boolean;
|
|
9
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE,CAyB9D;AAED,wBAAgB,mBAAmB,IAAI,cAAc,EAAE,CAEtD;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBnF;AAYD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAuBlE;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAG3C"}
|
package/dist/prompts.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
2
|
+
import { PROMPTS_PATH, SUMMARY_PATH } from "./paths.js";
|
|
3
|
+
import { extractTerms } from "./diff.js";
|
|
4
|
+
export function readTextFile(path) {
|
|
5
|
+
if (!existsSync(path)) {
|
|
6
|
+
return "";
|
|
7
|
+
}
|
|
8
|
+
return readFileSync(path, "utf8");
|
|
9
|
+
}
|
|
10
|
+
export function parsePrompts(content) {
|
|
11
|
+
const sections = [];
|
|
12
|
+
let current = null;
|
|
13
|
+
for (const line of content.split("\n")) {
|
|
14
|
+
const heading = line.match(/^##\s+(.+)$/);
|
|
15
|
+
if (heading) {
|
|
16
|
+
if (current) {
|
|
17
|
+
sections.push(current);
|
|
18
|
+
}
|
|
19
|
+
current = { file: heading[1].trim(), bullets: [] };
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const bullet = line.match(/^-\s+(.+)$/);
|
|
23
|
+
if (bullet && current) {
|
|
24
|
+
current.bullets.push(bullet[1].trim());
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (current) {
|
|
28
|
+
sections.push(current);
|
|
29
|
+
}
|
|
30
|
+
return sections;
|
|
31
|
+
}
|
|
32
|
+
export function loadPromptsSections() {
|
|
33
|
+
return parsePrompts(readTextFile(PROMPTS_PATH));
|
|
34
|
+
}
|
|
35
|
+
export function loadSummary() {
|
|
36
|
+
return readTextFile(SUMMARY_PATH);
|
|
37
|
+
}
|
|
38
|
+
export function termsForFile(sections, filePath) {
|
|
39
|
+
const normalized = filePath.replace(/^\.\//, "");
|
|
40
|
+
const section = sections.find((item) => item.file === normalized ||
|
|
41
|
+
item.file.endsWith(`/${normalized}`) ||
|
|
42
|
+
normalized.endsWith(item.file));
|
|
43
|
+
if (!section || section.bullets.length === 0) {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
const terms = new Set();
|
|
47
|
+
for (const bullet of section.bullets) {
|
|
48
|
+
for (const term of extractTerms(bullet)) {
|
|
49
|
+
terms.add(term);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return [...terms];
|
|
53
|
+
}
|
|
54
|
+
const GENERIC_HEADINGS = new Set([
|
|
55
|
+
"stack",
|
|
56
|
+
"architecture",
|
|
57
|
+
"conventions",
|
|
58
|
+
"runtime",
|
|
59
|
+
"runtime notes",
|
|
60
|
+
"session changes",
|
|
61
|
+
"overview",
|
|
62
|
+
]);
|
|
63
|
+
export function summaryArchitectureTerms(summary) {
|
|
64
|
+
const terms = new Set();
|
|
65
|
+
for (const line of summary.split("\n")) {
|
|
66
|
+
const heading = line.match(/^##\s+(.+)$/);
|
|
67
|
+
if (heading) {
|
|
68
|
+
const headingText = heading[1].trim();
|
|
69
|
+
if (!GENERIC_HEADINGS.has(headingText.toLowerCase())) {
|
|
70
|
+
for (const term of extractTerms(headingText)) {
|
|
71
|
+
terms.add(term);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const bullet = line.match(/^-\s+(.+)$/);
|
|
76
|
+
if (bullet) {
|
|
77
|
+
for (const term of extractTerms(bullet[1])) {
|
|
78
|
+
terms.add(term);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return [...terms].slice(0, 6);
|
|
83
|
+
}
|
|
84
|
+
export function promptsHasContent() {
|
|
85
|
+
const sections = loadPromptsSections();
|
|
86
|
+
return sections.some((section) => section.bullets.length > 0);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const LARGE_REPO_FILE_THRESHOLD = 500;
|
|
2
|
+
export interface RepoStats {
|
|
3
|
+
trackedFiles: number;
|
|
4
|
+
topLevelDirs: string[];
|
|
5
|
+
isLarge: boolean;
|
|
6
|
+
source: "git" | "filesystem";
|
|
7
|
+
}
|
|
8
|
+
export declare function listTopLevelDirs(cwd: string, max?: number): string[];
|
|
9
|
+
export declare function measureRepo(cwd: string): RepoStats;
|
|
10
|
+
//# sourceMappingURL=repo-stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-stats.d.ts","sourceRoot":"","sources":["../src/repo-stats.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAiB7C,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,GAAG,YAAY,CAAC;CAC9B;AA6DD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAK,GAAG,MAAM,EAAE,CA0BhE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAoBlD"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { existsSync, readdirSync, statSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
export const LARGE_REPO_FILE_THRESHOLD = 500;
|
|
5
|
+
const IGNORED_TOP_LEVEL = new Set([
|
|
6
|
+
"node_modules",
|
|
7
|
+
".git",
|
|
8
|
+
"dist",
|
|
9
|
+
"build",
|
|
10
|
+
".testme",
|
|
11
|
+
".next",
|
|
12
|
+
".turbo",
|
|
13
|
+
"coverage",
|
|
14
|
+
"vendor",
|
|
15
|
+
"__pycache__",
|
|
16
|
+
".venv",
|
|
17
|
+
"venv",
|
|
18
|
+
]);
|
|
19
|
+
function countGitTrackedFiles(cwd) {
|
|
20
|
+
const gitDir = path.join(cwd, ".git");
|
|
21
|
+
if (!existsSync(gitDir)) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const output = execSync("git ls-files", {
|
|
26
|
+
cwd,
|
|
27
|
+
encoding: "utf8",
|
|
28
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
29
|
+
});
|
|
30
|
+
const lines = output.split("\n").filter((line) => line.trim().length > 0);
|
|
31
|
+
return lines.length;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function countFilesystemFiles(cwd, maxDepth = 4) {
|
|
38
|
+
let count = 0;
|
|
39
|
+
function walk(dir, depth) {
|
|
40
|
+
if (depth > maxDepth) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
let entries;
|
|
44
|
+
try {
|
|
45
|
+
entries = readdirSync(dir);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
for (const entry of entries) {
|
|
51
|
+
if (IGNORED_TOP_LEVEL.has(entry)) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const fullPath = path.join(dir, entry);
|
|
55
|
+
let stat;
|
|
56
|
+
try {
|
|
57
|
+
stat = statSync(fullPath);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (stat.isDirectory()) {
|
|
63
|
+
walk(fullPath, depth + 1);
|
|
64
|
+
}
|
|
65
|
+
else if (stat.isFile()) {
|
|
66
|
+
count += 1;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
walk(cwd, 0);
|
|
71
|
+
return count;
|
|
72
|
+
}
|
|
73
|
+
export function listTopLevelDirs(cwd, max = 12) {
|
|
74
|
+
const dirs = [];
|
|
75
|
+
let entries;
|
|
76
|
+
try {
|
|
77
|
+
entries = readdirSync(cwd);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return dirs;
|
|
81
|
+
}
|
|
82
|
+
for (const entry of entries) {
|
|
83
|
+
if (entry.startsWith(".") || IGNORED_TOP_LEVEL.has(entry)) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const fullPath = path.join(cwd, entry);
|
|
87
|
+
try {
|
|
88
|
+
if (statSync(fullPath).isDirectory()) {
|
|
89
|
+
dirs.push(entry);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return dirs.sort().slice(0, max);
|
|
97
|
+
}
|
|
98
|
+
export function measureRepo(cwd) {
|
|
99
|
+
const gitCount = countGitTrackedFiles(cwd);
|
|
100
|
+
const topLevelDirs = listTopLevelDirs(cwd);
|
|
101
|
+
if (gitCount !== null) {
|
|
102
|
+
return {
|
|
103
|
+
trackedFiles: gitCount,
|
|
104
|
+
topLevelDirs,
|
|
105
|
+
isLarge: gitCount >= LARGE_REPO_FILE_THRESHOLD,
|
|
106
|
+
source: "git",
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const fsCount = countFilesystemFiles(cwd);
|
|
110
|
+
return {
|
|
111
|
+
trackedFiles: fsCount,
|
|
112
|
+
topLevelDirs,
|
|
113
|
+
isLarge: fsCount >= LARGE_REPO_FILE_THRESHOLD,
|
|
114
|
+
source: "filesystem",
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=repo-stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-stats.js","sourceRoot":"","sources":["../src/repo-stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { TestmeConfig } from "./types.js";
|
|
2
|
+
import { type AgentId } from "./agents/types.js";
|
|
3
|
+
import type { AgentSignal } from "./agents/types.js";
|
|
4
|
+
export type Difficulty = "easy" | "medium" | "hard";
|
|
5
|
+
export type AlignmentLevel = "low" | "medium" | "high";
|
|
6
|
+
export type SummaryMode = "blank" | "generate";
|
|
7
|
+
export interface WizardChoices {
|
|
8
|
+
questions: {
|
|
9
|
+
min: number;
|
|
10
|
+
max: number;
|
|
11
|
+
};
|
|
12
|
+
difficulty: Difficulty;
|
|
13
|
+
/** When true, agent skills and hook configs are added to .gitignore (local-only setup). */
|
|
14
|
+
localOnly: boolean;
|
|
15
|
+
summaryMode: SummaryMode;
|
|
16
|
+
}
|
|
17
|
+
export declare function questionsFromCount(count: number): {
|
|
18
|
+
min: number;
|
|
19
|
+
max: number;
|
|
20
|
+
};
|
|
21
|
+
export declare function parseQuestionsOption(value: string): {
|
|
22
|
+
min: number;
|
|
23
|
+
max: number;
|
|
24
|
+
};
|
|
25
|
+
export declare function parseDifficultyOption(value: string): Difficulty;
|
|
26
|
+
export declare function minAlignmentForDifficulty(difficulty: Difficulty): AlignmentLevel;
|
|
27
|
+
export declare function applyWizardToConfig(config: TestmeConfig, wizard: WizardChoices): TestmeConfig;
|
|
28
|
+
export declare const DEFAULT_WIZARD_CHOICES: WizardChoices;
|
|
29
|
+
export declare function terminalLink(url: string, label: string): string;
|
|
30
|
+
export declare function parseSummaryModeOption(value: string): SummaryMode;
|
|
31
|
+
export declare function parseLocalOnlyOption(value: string): boolean;
|
|
32
|
+
export declare function promptAgentSelection(signals: AgentSignal[], suggested: AgentId[]): Promise<AgentId[]>;
|
|
33
|
+
export declare function promptWizardChoices(cwd?: string): Promise<WizardChoices>;
|
|
34
|
+
//# sourceMappingURL=setup-wizard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-wizard.d.ts","sourceRoot":"","sources":["../src/setup-wizard.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AACpD,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AACvD,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,UAAU,CAAC;AAE/C,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,UAAU,EAAE,UAAU,CAAC;IACvB,2FAA2F;IAC3F,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAY9E;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAMhF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAK/D;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,UAAU,GAAG,cAAc,CAQhF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,GAAG,YAAY,CA2B7F;AAED,eAAO,MAAM,sBAAsB,EAAE,aAKpC,CAAC;AAEF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAMjE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAS3D;AAOD,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,WAAW,EAAE,EACtB,SAAS,EAAE,OAAO,EAAE,GACnB,OAAO,CAAC,OAAO,EAAE,CAAC,CAyCpB;AAED,wBAAsB,mBAAmB,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,aAAa,CAAC,CA8HrF"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import * as readline from "node:readline/promises";
|
|
2
|
+
import { stdin as input, stdout as output } from "node:process";
|
|
3
|
+
import { ALL_CATEGORY_KEYS } from "./types.js";
|
|
4
|
+
import { AGENT_LABELS } from "./agents/types.js";
|
|
5
|
+
import { ADOPTING_EXISTING_REPOS_URL } from "./constants.js";
|
|
6
|
+
import { measureRepo } from "./repo-stats.js";
|
|
7
|
+
export function questionsFromCount(count) {
|
|
8
|
+
const n = Math.min(5, Math.max(1, count));
|
|
9
|
+
if (n <= 2) {
|
|
10
|
+
return { min: 2, max: 2 };
|
|
11
|
+
}
|
|
12
|
+
if (n === 3) {
|
|
13
|
+
return { min: 2, max: 3 };
|
|
14
|
+
}
|
|
15
|
+
if (n === 4) {
|
|
16
|
+
return { min: 3, max: 4 };
|
|
17
|
+
}
|
|
18
|
+
return { min: 3, max: 5 };
|
|
19
|
+
}
|
|
20
|
+
export function parseQuestionsOption(value) {
|
|
21
|
+
const n = Number.parseInt(value, 10);
|
|
22
|
+
if (Number.isNaN(n) || n < 1 || n > 5) {
|
|
23
|
+
throw new Error("Questions must be a number between 1 and 5.");
|
|
24
|
+
}
|
|
25
|
+
return questionsFromCount(n);
|
|
26
|
+
}
|
|
27
|
+
export function parseDifficultyOption(value) {
|
|
28
|
+
if (value !== "easy" && value !== "medium" && value !== "hard") {
|
|
29
|
+
throw new Error("Difficulty must be easy, medium, or hard.");
|
|
30
|
+
}
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
export function minAlignmentForDifficulty(difficulty) {
|
|
34
|
+
if (difficulty === "easy") {
|
|
35
|
+
return "low";
|
|
36
|
+
}
|
|
37
|
+
if (difficulty === "hard") {
|
|
38
|
+
return "high";
|
|
39
|
+
}
|
|
40
|
+
return "medium";
|
|
41
|
+
}
|
|
42
|
+
export function applyWizardToConfig(config, wizard) {
|
|
43
|
+
const next = {
|
|
44
|
+
...config,
|
|
45
|
+
questions: { ...wizard.questions },
|
|
46
|
+
difficulty: wizard.difficulty,
|
|
47
|
+
minAlignment: minAlignmentForDifficulty(wizard.difficulty),
|
|
48
|
+
categories: { ...config.categories },
|
|
49
|
+
};
|
|
50
|
+
if (wizard.difficulty === "easy") {
|
|
51
|
+
for (const key of ALL_CATEGORY_KEYS) {
|
|
52
|
+
next.categories[key] = key === "changeRationale" || key === "symbols";
|
|
53
|
+
}
|
|
54
|
+
next.autoDetect = false;
|
|
55
|
+
next.passThreshold = 60;
|
|
56
|
+
}
|
|
57
|
+
else if (wizard.difficulty === "medium") {
|
|
58
|
+
next.autoDetect = true;
|
|
59
|
+
next.passThreshold = 70;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
next.autoDetect = true;
|
|
63
|
+
next.passThreshold = 85;
|
|
64
|
+
next.categories.architecture = true;
|
|
65
|
+
next.categories.runtime = true;
|
|
66
|
+
next.categories.security = true;
|
|
67
|
+
}
|
|
68
|
+
return next;
|
|
69
|
+
}
|
|
70
|
+
export const DEFAULT_WIZARD_CHOICES = {
|
|
71
|
+
questions: { min: 2, max: 3 },
|
|
72
|
+
difficulty: "medium",
|
|
73
|
+
localOnly: true,
|
|
74
|
+
summaryMode: "blank",
|
|
75
|
+
};
|
|
76
|
+
export function terminalLink(url, label) {
|
|
77
|
+
return `\u001b]8;;${url}\u0007${label}\u001b]8;;\u0007`;
|
|
78
|
+
}
|
|
79
|
+
export function parseSummaryModeOption(value) {
|
|
80
|
+
const normalized = value.trim().toLowerCase();
|
|
81
|
+
if (normalized === "blank" || normalized === "generate") {
|
|
82
|
+
return normalized;
|
|
83
|
+
}
|
|
84
|
+
throw new Error("Summary mode must be blank or generate.");
|
|
85
|
+
}
|
|
86
|
+
export function parseLocalOnlyOption(value) {
|
|
87
|
+
const normalized = value.trim().toLowerCase();
|
|
88
|
+
if (normalized === "true" || normalized === "yes" || normalized === "1") {
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
if (normalized === "false" || normalized === "no" || normalized === "0") {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
throw new Error("Local-only must be true/false or yes/no.");
|
|
95
|
+
}
|
|
96
|
+
async function ask(rl, question) {
|
|
97
|
+
const answer = await rl.question(question);
|
|
98
|
+
return answer.trim();
|
|
99
|
+
}
|
|
100
|
+
export async function promptAgentSelection(signals, suggested) {
|
|
101
|
+
const rl = readline.createInterface({ input, output });
|
|
102
|
+
try {
|
|
103
|
+
console.log("\nWhich desktop agent(s) should testme configure?");
|
|
104
|
+
if (signals.length > 0) {
|
|
105
|
+
console.log("Detected signals:");
|
|
106
|
+
for (const signal of signals) {
|
|
107
|
+
console.log(` - ${AGENT_LABELS[signal.id]} (${signal.confidence}): ${signal.reason}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const options = ["cursor", "claude", "windsurf", "agents-md"];
|
|
111
|
+
options.forEach((id, index) => {
|
|
112
|
+
const mark = suggested.includes(id) ? " *" : "";
|
|
113
|
+
console.log(` ${index + 1}. ${AGENT_LABELS[id]}${mark}`);
|
|
114
|
+
});
|
|
115
|
+
console.log(" 5. All of the above");
|
|
116
|
+
console.log("Enter numbers separated by commas (e.g. 1,3), or press Enter for detected/all:");
|
|
117
|
+
const raw = await ask(rl, "> ");
|
|
118
|
+
if (!raw) {
|
|
119
|
+
return suggested.length > 0 ? suggested : options;
|
|
120
|
+
}
|
|
121
|
+
if (raw === "5" || raw.toLowerCase() === "all") {
|
|
122
|
+
return options;
|
|
123
|
+
}
|
|
124
|
+
const picks = raw
|
|
125
|
+
.split(",")
|
|
126
|
+
.map((part) => Number.parseInt(part.trim(), 10))
|
|
127
|
+
.filter((n) => !Number.isNaN(n) && n >= 1 && n <= 4);
|
|
128
|
+
if (picks.length === 0) {
|
|
129
|
+
return suggested.length > 0 ? suggested : options;
|
|
130
|
+
}
|
|
131
|
+
return [...new Set(picks.map((n) => options[n - 1]).filter(Boolean))];
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
rl.close();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
export async function promptWizardChoices(cwd = process.cwd()) {
|
|
138
|
+
const rl = readline.createInterface({ input, output });
|
|
139
|
+
try {
|
|
140
|
+
console.log("\nHow many questions per session?");
|
|
141
|
+
console.log(" 1. 2 (quick)");
|
|
142
|
+
console.log(" 2. 3 (balanced)");
|
|
143
|
+
console.log(" 3. 5 (thorough)");
|
|
144
|
+
console.log(" 4. Custom (1-5)");
|
|
145
|
+
const countRaw = await ask(rl, "> ");
|
|
146
|
+
let questions;
|
|
147
|
+
switch (countRaw) {
|
|
148
|
+
case "1":
|
|
149
|
+
case "2":
|
|
150
|
+
questions = { min: 2, max: 2 };
|
|
151
|
+
break;
|
|
152
|
+
case "3":
|
|
153
|
+
questions = { min: 2, max: 3 };
|
|
154
|
+
break;
|
|
155
|
+
case "5":
|
|
156
|
+
questions = { min: 3, max: 5 };
|
|
157
|
+
break;
|
|
158
|
+
case "4": {
|
|
159
|
+
const custom = await ask(rl, "Enter number of questions (1-5): ");
|
|
160
|
+
questions = parseQuestionsOption(custom);
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
default:
|
|
164
|
+
questions = countRaw === "" ? DEFAULT_WIZARD_CHOICES.questions : parseQuestionsOption(countRaw);
|
|
165
|
+
}
|
|
166
|
+
console.log("\nHow difficult should the questions be?");
|
|
167
|
+
console.log(" 1. Easy (60% pass, basic categories)");
|
|
168
|
+
console.log(" 2. Medium (70% pass, balanced)");
|
|
169
|
+
console.log(" 3. Hard (85% pass, strict alignment)");
|
|
170
|
+
const diffRaw = await ask(rl, "> ");
|
|
171
|
+
let difficulty;
|
|
172
|
+
switch (diffRaw) {
|
|
173
|
+
case "1":
|
|
174
|
+
difficulty = "easy";
|
|
175
|
+
break;
|
|
176
|
+
case "3":
|
|
177
|
+
difficulty = "hard";
|
|
178
|
+
break;
|
|
179
|
+
case "2":
|
|
180
|
+
case "":
|
|
181
|
+
difficulty = "medium";
|
|
182
|
+
break;
|
|
183
|
+
default:
|
|
184
|
+
difficulty = parseDifficultyOption(diffRaw);
|
|
185
|
+
}
|
|
186
|
+
console.log("\nKeep agent skills local-only (add to .gitignore)?");
|
|
187
|
+
console.log(" 1. Yes (default — each developer runs init after clone)");
|
|
188
|
+
console.log(" 2. No (commit skills to the repo for the whole team)");
|
|
189
|
+
const localRaw = await ask(rl, "> ");
|
|
190
|
+
let localOnly;
|
|
191
|
+
switch (localRaw) {
|
|
192
|
+
case "2":
|
|
193
|
+
localOnly = false;
|
|
194
|
+
break;
|
|
195
|
+
case "1":
|
|
196
|
+
case "":
|
|
197
|
+
localOnly = true;
|
|
198
|
+
break;
|
|
199
|
+
default:
|
|
200
|
+
localOnly = parseLocalOnlyOption(localRaw);
|
|
201
|
+
}
|
|
202
|
+
const stats = measureRepo(cwd);
|
|
203
|
+
const largeLabel = stats.isLarge ? " (large)" : "";
|
|
204
|
+
console.log("\nSUMMARY.md setup");
|
|
205
|
+
console.log(`\nThis repository has ~${stats.trackedFiles.toLocaleString()} tracked files${largeLabel}.`);
|
|
206
|
+
console.log("\n Blank: install an empty template. You fill SUMMARY.md once with");
|
|
207
|
+
if (stats.isLarge) {
|
|
208
|
+
console.log(" high-level architecture (recommended for large repos).");
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
console.log(" high-level architecture.");
|
|
212
|
+
}
|
|
213
|
+
console.log("\n Generate: draft SUMMARY.md from README, package.json/pyproject.toml,");
|
|
214
|
+
console.log(" and top-level folders only — not a full codebase summary.");
|
|
215
|
+
if (stats.isLarge) {
|
|
216
|
+
console.log("\n On large repos, auto-generated summaries are often shallow, stale quickly,");
|
|
217
|
+
console.log(" and cannot replace a hand-written project map.");
|
|
218
|
+
}
|
|
219
|
+
console.log(`\n Learn more: ${terminalLink(ADOPTING_EXISTING_REPOS_URL, "adopting existing repos")}`);
|
|
220
|
+
console.log(` ${ADOPTING_EXISTING_REPOS_URL}`);
|
|
221
|
+
const blankLabel = stats.isLarge
|
|
222
|
+
? "1. Start blank (recommended for large repos)"
|
|
223
|
+
: "1. Start blank (recommended)";
|
|
224
|
+
console.log(`\n ${blankLabel}`);
|
|
225
|
+
console.log(" 2. Generate SUMMARY.md from project metadata");
|
|
226
|
+
const summaryRaw = await ask(rl, "> ");
|
|
227
|
+
let summaryMode;
|
|
228
|
+
switch (summaryRaw) {
|
|
229
|
+
case "2":
|
|
230
|
+
summaryMode = "generate";
|
|
231
|
+
break;
|
|
232
|
+
case "1":
|
|
233
|
+
case "":
|
|
234
|
+
summaryMode = "blank";
|
|
235
|
+
break;
|
|
236
|
+
default:
|
|
237
|
+
summaryMode = parseSummaryModeOption(summaryRaw);
|
|
238
|
+
}
|
|
239
|
+
if (stats.isLarge && summaryMode === "generate") {
|
|
240
|
+
const confirm = await ask(rl, 'Type "generate" to continue: ');
|
|
241
|
+
if (confirm !== "generate") {
|
|
242
|
+
summaryMode = "blank";
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return { questions, difficulty, localOnly, summaryMode };
|
|
246
|
+
}
|
|
247
|
+
finally {
|
|
248
|
+
rl.close();
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=setup-wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-wizard.js","sourceRoot":"","sources":["../src/setup-wizard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function isGateEnabled(cwd: string): boolean;
|
|
2
|
+
export declare function setGateEnabled(cwd: string, enabled: boolean): void;
|
|
3
|
+
export declare function toggleGateEnabled(cwd: string): boolean;
|
|
4
|
+
export declare function formatGateBanner(enabled: boolean): string;
|
|
5
|
+
export declare function formatStatusline(enabled: boolean): string;
|
|
6
|
+
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAElE;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAItD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAOzD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAEzD"}
|
package/dist/testing.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { loadConfig, patchLocalConfig } from "./config.js";
|
|
2
|
+
export function isGateEnabled(cwd) {
|
|
3
|
+
return loadConfig(cwd).gateEnabled !== false;
|
|
4
|
+
}
|
|
5
|
+
export function setGateEnabled(cwd, enabled) {
|
|
6
|
+
patchLocalConfig(cwd, { gateEnabled: enabled });
|
|
7
|
+
}
|
|
8
|
+
export function toggleGateEnabled(cwd) {
|
|
9
|
+
const next = !isGateEnabled(cwd);
|
|
10
|
+
setGateEnabled(cwd, next);
|
|
11
|
+
return next;
|
|
12
|
+
}
|
|
13
|
+
export function formatGateBanner(enabled) {
|
|
14
|
+
const state = enabled ? "ON 🟢" : "OFF 🔴";
|
|
15
|
+
return [
|
|
16
|
+
"┌─────────────────────────┐",
|
|
17
|
+
`│ testme gate: ${state} │`,
|
|
18
|
+
"└─────────────────────────┘",
|
|
19
|
+
].join("\n");
|
|
20
|
+
}
|
|
21
|
+
export function formatStatusline(enabled) {
|
|
22
|
+
return enabled ? "🟢 testme" : "🔴 testme off";
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,WAAW,KAAK,KAAK,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,OAAgB;IAC1D,gBAAgB,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACjC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC5C,OAAO;QACL,6BAA6B;QAC7B,oBAAoB,KAAK,MAAM;QAC/B,6BAA6B;KAC9B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,OAAO,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC;AACjD,CAAC"}
|