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,106 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export const GITIGNORE_MARKER = "# testme local setup";
|
|
4
|
+
const AGENT_SKILL_DIRS = {
|
|
5
|
+
cursor: [".cursor/skills/testme/", ".cursor/skills/testing/"],
|
|
6
|
+
claude: [".claude/skills/testme/", ".claude/skills/testing/"],
|
|
7
|
+
windsurf: [".windsurf/skills/testme/", ".windsurf/skills/testing/"],
|
|
8
|
+
"agents-md": [],
|
|
9
|
+
};
|
|
10
|
+
const HOOK_CONFIG_PATHS = {
|
|
11
|
+
cursor: ".cursor/hooks.json",
|
|
12
|
+
claude: ".claude/settings.json",
|
|
13
|
+
windsurf: ".windsurf/hooks.json",
|
|
14
|
+
};
|
|
15
|
+
export function isTestmeHookReference(value) {
|
|
16
|
+
return value.includes(".testme/hooks/");
|
|
17
|
+
}
|
|
18
|
+
function collectCommandsFromJson(value, commands) {
|
|
19
|
+
if (typeof value === "string") {
|
|
20
|
+
if (value.includes("/hooks/") || value.endsWith(".sh")) {
|
|
21
|
+
commands.push(value);
|
|
22
|
+
}
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (Array.isArray(value)) {
|
|
26
|
+
for (const item of value) {
|
|
27
|
+
collectCommandsFromJson(item, commands);
|
|
28
|
+
}
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (value && typeof value === "object") {
|
|
32
|
+
for (const [key, nested] of Object.entries(value)) {
|
|
33
|
+
if (key === "command" || key === "powershell") {
|
|
34
|
+
if (typeof nested === "string") {
|
|
35
|
+
commands.push(nested);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
collectCommandsFromJson(nested, commands);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export function hookConfigHasNonTestmeContent(filePath) {
|
|
45
|
+
if (!existsSync(filePath)) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
const parsed = JSON.parse(readFileSync(filePath, "utf8"));
|
|
50
|
+
const commands = [];
|
|
51
|
+
collectCommandsFromJson(parsed, commands);
|
|
52
|
+
if (commands.length === 0) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
return commands.some((command) => !isTestmeHookReference(command));
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export function buildGitignorePlan(cwd, agents, localOnly = true) {
|
|
62
|
+
const lines = [".testme/"];
|
|
63
|
+
const warnings = [];
|
|
64
|
+
let gitignoreHookConfigs = true;
|
|
65
|
+
if (localOnly) {
|
|
66
|
+
for (const agent of agents) {
|
|
67
|
+
for (const skillPath of AGENT_SKILL_DIRS[agent] ?? []) {
|
|
68
|
+
lines.push(skillPath);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
for (const agent of agents) {
|
|
72
|
+
if (agent === "agents-md") {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const hookPath = path.join(cwd, HOOK_CONFIG_PATHS[agent]);
|
|
76
|
+
if (hookConfigHasNonTestmeContent(hookPath)) {
|
|
77
|
+
gitignoreHookConfigs = false;
|
|
78
|
+
warnings.push(`${HOOK_CONFIG_PATHS[agent]} contains non-testme hooks — add testme entries manually or keep them local.`);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
lines.push(HOOK_CONFIG_PATHS[agent]);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (!gitignoreHookConfigs) {
|
|
86
|
+
return { lines, gitignoreHookConfigs: false, warnings };
|
|
87
|
+
}
|
|
88
|
+
return { lines, gitignoreHookConfigs: true, warnings };
|
|
89
|
+
}
|
|
90
|
+
export function ensureTestmeGitignore(cwd, agents, localOnly = true) {
|
|
91
|
+
const gitignorePath = path.join(cwd, ".gitignore");
|
|
92
|
+
const content = existsSync(gitignorePath) ? readFileSync(gitignorePath, "utf8") : "";
|
|
93
|
+
if (content.includes(GITIGNORE_MARKER)) {
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
const plan = buildGitignorePlan(cwd, agents, localOnly);
|
|
97
|
+
const separator = content.length > 0 && !content.endsWith("\n") ? "\n" : "";
|
|
98
|
+
const block = `${separator}\n${GITIGNORE_MARKER} — run npx comp-gate init (do not commit)\n${plan.lines.join("\n")}\n`;
|
|
99
|
+
writeFileSync(gitignorePath, content + block, "utf8");
|
|
100
|
+
const created = [".gitignore (testme local setup)"];
|
|
101
|
+
for (const warning of plan.warnings) {
|
|
102
|
+
console.warn(`Warning: ${warning}`);
|
|
103
|
+
}
|
|
104
|
+
return created;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=gitignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../src/gitignore.ts"],"names":[],"mappings":"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"}
|
package/dist/hooks.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface HookResult {
|
|
2
|
+
permission: "allow" | "deny";
|
|
3
|
+
user_message?: string;
|
|
4
|
+
agent_message?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function normalizeBranchRef(ref: string): string;
|
|
7
|
+
export declare function getCurrentBranch(cwd: string): string | null;
|
|
8
|
+
/** Branch used for diff analysis and pass validation. */
|
|
9
|
+
export declare function resolveWorkingBranch(cwd: string, cliBranch?: string): string;
|
|
10
|
+
/** Protected push targets: config list + current branch (when enabled). */
|
|
11
|
+
export declare function resolveProtectedBranches(cwd: string, cliBranch?: string): string[];
|
|
12
|
+
export declare function parsePushBranch(command: string, cwd?: string): string | null;
|
|
13
|
+
/** @deprecated Use parsePushBranch instead */
|
|
14
|
+
export declare function isPushToMain(command: string): boolean;
|
|
15
|
+
export declare function pushBlockedMessage(branch: string): string;
|
|
16
|
+
export declare function commitBlockedMessage(): string;
|
|
17
|
+
export declare function beforeCommitHook(cwd: string, command: string, cliBranch?: string): HookResult;
|
|
18
|
+
export declare function parseRemoteRef(remoteRef: string): string | null;
|
|
19
|
+
export declare function beforePushRefHook(cwd: string, remoteRef: string, cliBranch?: string): HookResult;
|
|
20
|
+
export declare function beforePushHook(cwd: string, command: string, cliBranch?: string): HookResult;
|
|
21
|
+
export declare function afterPushHook(cwd: string, command: string, cliBranch?: string): void;
|
|
22
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAcD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOtD;AAMD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM3D;AAED,yDAAyD;AACzD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAc5E;AAED,2EAA2E;AAC3E,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAgBlF;AAaD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmD5E;AAED,8CAA8C;AAC9C,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,UAAU,CAyBZ;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG/D;AA+BD,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,UAAU,CAOZ;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,UAAU,CAOZ;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAapF"}
|
package/dist/hooks.js
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { loadConfig } from "./config.js";
|
|
3
|
+
import { resetPromptsAfterPush } from "./init.js";
|
|
4
|
+
import { isPassValid } from "./verify.js";
|
|
5
|
+
function runGit(args, cwd) {
|
|
6
|
+
try {
|
|
7
|
+
return execFileSync("git", args, {
|
|
8
|
+
cwd,
|
|
9
|
+
encoding: "utf8",
|
|
10
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
11
|
+
}).trim();
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return "";
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function normalizeBranchRef(ref) {
|
|
18
|
+
const withoutRefs = ref.replace(/^refs\/heads\//, "");
|
|
19
|
+
const slash = withoutRefs.lastIndexOf("/");
|
|
20
|
+
if (slash >= 0) {
|
|
21
|
+
return withoutRefs.slice(slash + 1);
|
|
22
|
+
}
|
|
23
|
+
return withoutRefs;
|
|
24
|
+
}
|
|
25
|
+
function normalizeBranch(ref) {
|
|
26
|
+
return normalizeBranchRef(ref);
|
|
27
|
+
}
|
|
28
|
+
export function getCurrentBranch(cwd) {
|
|
29
|
+
const head = runGit(["rev-parse", "--abbrev-ref", "HEAD"], cwd);
|
|
30
|
+
if (!head || head === "HEAD") {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
return normalizeBranch(head);
|
|
34
|
+
}
|
|
35
|
+
/** Branch used for diff analysis and pass validation. */
|
|
36
|
+
export function resolveWorkingBranch(cwd, cliBranch) {
|
|
37
|
+
if (cliBranch) {
|
|
38
|
+
return cliBranch;
|
|
39
|
+
}
|
|
40
|
+
const config = loadConfig(cwd);
|
|
41
|
+
if (config.autoProtectCurrentBranch) {
|
|
42
|
+
const current = getCurrentBranch(cwd);
|
|
43
|
+
if (current) {
|
|
44
|
+
return current;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return config.protectedBranches[0] ?? "main";
|
|
48
|
+
}
|
|
49
|
+
/** Protected push targets: config list + current branch (when enabled). */
|
|
50
|
+
export function resolveProtectedBranches(cwd, cliBranch) {
|
|
51
|
+
const config = loadConfig(cwd);
|
|
52
|
+
const branches = [...config.protectedBranches];
|
|
53
|
+
if (config.autoProtectCurrentBranch) {
|
|
54
|
+
const current = getCurrentBranch(cwd);
|
|
55
|
+
if (current) {
|
|
56
|
+
branches.push(current);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (cliBranch) {
|
|
60
|
+
branches.push(cliBranch);
|
|
61
|
+
}
|
|
62
|
+
return [...new Set(branches)];
|
|
63
|
+
}
|
|
64
|
+
function tokenizeShell(command) {
|
|
65
|
+
const tokens = [];
|
|
66
|
+
const pattern = /"([^"]*)"|'([^']*)'|(\S+)/g;
|
|
67
|
+
for (const match of command.matchAll(pattern)) {
|
|
68
|
+
tokens.push(match[1] ?? match[2] ?? match[3]);
|
|
69
|
+
}
|
|
70
|
+
return tokens;
|
|
71
|
+
}
|
|
72
|
+
export function parsePushBranch(command, cwd) {
|
|
73
|
+
const trimmed = command.trim();
|
|
74
|
+
if (!/^git\s+push\b/.test(trimmed)) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
if (/(?:^|\s)--dry-run(?:\s|$)/.test(trimmed) || /(?:^|\s)-n(?:\s|$)/.test(trimmed)) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
const tokens = tokenizeShell(trimmed);
|
|
81
|
+
const positional = [];
|
|
82
|
+
for (let i = 2; i < tokens.length; i++) {
|
|
83
|
+
const token = tokens[i];
|
|
84
|
+
if (token === "--") {
|
|
85
|
+
positional.push(...tokens.slice(i + 1));
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
if (token.startsWith("-")) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
positional.push(token);
|
|
92
|
+
}
|
|
93
|
+
if (positional.length >= 2) {
|
|
94
|
+
const refspec = positional[1];
|
|
95
|
+
if (refspec.toUpperCase() === "HEAD" && cwd) {
|
|
96
|
+
const head = runGit(["rev-parse", "--abbrev-ref", "HEAD"], cwd);
|
|
97
|
+
return head ? normalizeBranch(head) : null;
|
|
98
|
+
}
|
|
99
|
+
if (refspec.includes(":")) {
|
|
100
|
+
const remotePart = refspec.split(":").at(-1);
|
|
101
|
+
return remotePart ? normalizeBranch(remotePart) : null;
|
|
102
|
+
}
|
|
103
|
+
return normalizeBranch(refspec);
|
|
104
|
+
}
|
|
105
|
+
if (cwd) {
|
|
106
|
+
const pushRef = runGit(["rev-parse", "--abbrev-ref", "@{push}"], cwd);
|
|
107
|
+
if (pushRef) {
|
|
108
|
+
return normalizeBranch(pushRef);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (positional.length === 1 && cwd) {
|
|
112
|
+
const head = runGit(["rev-parse", "--abbrev-ref", "HEAD"], cwd);
|
|
113
|
+
return head ? normalizeBranch(head) : null;
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
/** @deprecated Use parsePushBranch instead */
|
|
118
|
+
export function isPushToMain(command) {
|
|
119
|
+
const branch = parsePushBranch(command);
|
|
120
|
+
return branch === "main";
|
|
121
|
+
}
|
|
122
|
+
export function pushBlockedMessage(branch) {
|
|
123
|
+
return `You must run the /testme skill before pushing to '${branch}'.`;
|
|
124
|
+
}
|
|
125
|
+
export function commitBlockedMessage() {
|
|
126
|
+
return "You must run the /testme skill before committing.";
|
|
127
|
+
}
|
|
128
|
+
export function beforeCommitHook(cwd, command, cliBranch) {
|
|
129
|
+
if (!/^git\s+commit\b/.test(command.trim())) {
|
|
130
|
+
return { permission: "allow" };
|
|
131
|
+
}
|
|
132
|
+
const config = loadConfig(cwd);
|
|
133
|
+
if (config.gateEnabled === false) {
|
|
134
|
+
return { permission: "allow" };
|
|
135
|
+
}
|
|
136
|
+
if (!config.gateCommits) {
|
|
137
|
+
return { permission: "allow" };
|
|
138
|
+
}
|
|
139
|
+
const branch = resolveWorkingBranch(cwd, cliBranch);
|
|
140
|
+
if (isPassValid(cwd, branch)) {
|
|
141
|
+
return { permission: "allow" };
|
|
142
|
+
}
|
|
143
|
+
const message = commitBlockedMessage();
|
|
144
|
+
return {
|
|
145
|
+
permission: "deny",
|
|
146
|
+
user_message: message,
|
|
147
|
+
agent_message: message,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
export function parseRemoteRef(remoteRef) {
|
|
151
|
+
const match = remoteRef.match(/^refs\/heads\/(.+)$/);
|
|
152
|
+
return match?.[1] ?? null;
|
|
153
|
+
}
|
|
154
|
+
function evaluateProtectedPush(cwd, targetBranch, cliBranch) {
|
|
155
|
+
const config = loadConfig(cwd);
|
|
156
|
+
if (config.gateEnabled === false) {
|
|
157
|
+
return { permission: "allow" };
|
|
158
|
+
}
|
|
159
|
+
const protectedBranches = resolveProtectedBranches(cwd, cliBranch);
|
|
160
|
+
if (!protectedBranches.includes(targetBranch)) {
|
|
161
|
+
return { permission: "allow" };
|
|
162
|
+
}
|
|
163
|
+
const passBranch = resolveWorkingBranch(cwd, cliBranch);
|
|
164
|
+
if (isPassValid(cwd, passBranch)) {
|
|
165
|
+
return { permission: "allow" };
|
|
166
|
+
}
|
|
167
|
+
const message = pushBlockedMessage(targetBranch);
|
|
168
|
+
return {
|
|
169
|
+
permission: "deny",
|
|
170
|
+
user_message: message,
|
|
171
|
+
agent_message: message,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
export function beforePushRefHook(cwd, remoteRef, cliBranch) {
|
|
175
|
+
const targetBranch = parseRemoteRef(remoteRef);
|
|
176
|
+
if (!targetBranch) {
|
|
177
|
+
return { permission: "allow" };
|
|
178
|
+
}
|
|
179
|
+
return evaluateProtectedPush(cwd, targetBranch, cliBranch);
|
|
180
|
+
}
|
|
181
|
+
export function beforePushHook(cwd, command, cliBranch) {
|
|
182
|
+
const targetBranch = parsePushBranch(command, cwd);
|
|
183
|
+
if (!targetBranch) {
|
|
184
|
+
return { permission: "allow" };
|
|
185
|
+
}
|
|
186
|
+
return evaluateProtectedPush(cwd, targetBranch, cliBranch);
|
|
187
|
+
}
|
|
188
|
+
export function afterPushHook(cwd, command, cliBranch) {
|
|
189
|
+
const targetBranch = parsePushBranch(command, cwd);
|
|
190
|
+
if (!targetBranch) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const protectedBranches = resolveProtectedBranches(cwd, cliBranch);
|
|
194
|
+
if (!protectedBranches.includes(targetBranch)) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
resetPromptsAfterPush(cwd);
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/init.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type AgentId } from "./agents/types.js";
|
|
2
|
+
import { parseAgentList } from "./agents/detect.js";
|
|
3
|
+
import { type WizardChoices } from "./setup-wizard.js";
|
|
4
|
+
import type { TestmeConfig } from "./types.js";
|
|
5
|
+
import type { SummaryMode } from "./setup-wizard.js";
|
|
6
|
+
export interface InitOptions {
|
|
7
|
+
agents?: AgentId[];
|
|
8
|
+
wizard?: WizardChoices;
|
|
9
|
+
summaryMode?: SummaryMode;
|
|
10
|
+
force?: boolean;
|
|
11
|
+
yes?: boolean;
|
|
12
|
+
skipWizard?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function copyHookScripts(cwd: string): void;
|
|
15
|
+
export declare function installGitHooks(cwd: string): string[];
|
|
16
|
+
export declare function initShared(cwd: string, config: TestmeConfig, applyWizard?: boolean, wizard?: WizardChoices): string[];
|
|
17
|
+
export declare function resolveInitAgents(cwd: string, options: InitOptions): Promise<AgentId[]>;
|
|
18
|
+
export declare function resolveWizardChoices(cwd: string, options: InitOptions): Promise<WizardChoices | null>;
|
|
19
|
+
export declare function initProject(cwd: string, options?: InitOptions): Promise<string[]>;
|
|
20
|
+
export declare function initProjectSync(cwd: string, options?: InitOptions): string[];
|
|
21
|
+
export declare function resetTestmeState(cwd: string, resetPrompts?: boolean): void;
|
|
22
|
+
export declare function resetPromptsAfterPush(cwd: string): void;
|
|
23
|
+
export { parseAgentList };
|
|
24
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAcA,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEhE,OAAO,EAAgB,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAMlE,OAAO,EAEL,KAAK,aAAa,EAInB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAYD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAajD;AAiCD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBrD;AAmBD,wBAAgB,UAAU,CACxB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,YAAY,EACpB,WAAW,UAAO,EAClB,MAAM,GAAE,aAAsC,GAC7C,MAAM,EAAE,CAkCV;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,OAAO,EAAE,CAAC,CAgBpB;AAED,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAe/B;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAyB3F;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,EAAE,CA0BhF;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,IAAI,CAqBxE;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAIvD;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
package/dist/init.js
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { chmodSync, copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync, } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { installAgentsMd } from "./agents/agents-md.js";
|
|
4
|
+
import { installClaude } from "./agents/claude.js";
|
|
5
|
+
import { installCursor } from "./agents/cursor.js";
|
|
6
|
+
import { ALL_AGENT_IDS } from "./agents/types.js";
|
|
7
|
+
import { installWindsurf } from "./agents/windsurf.js";
|
|
8
|
+
import { detectAgents, parseAgentList } from "./agents/detect.js";
|
|
9
|
+
import { chmodScripts } from "./agents/shared.js";
|
|
10
|
+
import { createInitialConfig, initConfigWithWizard } from "./config-init.js";
|
|
11
|
+
import { ensureTestmeGitignore } from "./gitignore.js";
|
|
12
|
+
import { TEMPLATES_DIR } from "./paths.js";
|
|
13
|
+
import { bootstrapSummary } from "./bootstrap-summary.js";
|
|
14
|
+
import { DEFAULT_WIZARD_CHOICES, applyWizardToConfig, promptAgentSelection, promptWizardChoices, } from "./setup-wizard.js";
|
|
15
|
+
const GIT_HOOK_MARKER = "testme-managed hook";
|
|
16
|
+
function copyIfMissing(source, target) {
|
|
17
|
+
if (existsSync(target)) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
mkdirSync(path.dirname(target), { recursive: true });
|
|
21
|
+
copyFileSync(source, target);
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
export function copyHookScripts(cwd) {
|
|
25
|
+
const hooksDir = path.join(TEMPLATES_DIR, "hooks");
|
|
26
|
+
const targetDir = path.join(cwd, ".testme", "hooks");
|
|
27
|
+
mkdirSync(targetDir, { recursive: true });
|
|
28
|
+
for (const file of readdirSync(hooksDir)) {
|
|
29
|
+
if (!file.endsWith(".sh")) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const target = path.join(targetDir, file);
|
|
33
|
+
copyFileSync(path.join(hooksDir, file), target);
|
|
34
|
+
chmodSync(target, 0o755);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function installGitHookFile(cwd, hookName, scriptName) {
|
|
38
|
+
const gitDir = path.join(cwd, ".git");
|
|
39
|
+
if (!existsSync(gitDir)) {
|
|
40
|
+
return "missing-git";
|
|
41
|
+
}
|
|
42
|
+
const hookPath = path.join(gitDir, "hooks", hookName);
|
|
43
|
+
if (existsSync(hookPath)) {
|
|
44
|
+
const existing = readFileSync(hookPath, "utf8");
|
|
45
|
+
if (!existing.includes(GIT_HOOK_MARKER)) {
|
|
46
|
+
return "skipped";
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const scriptPath = `.testme/hooks/${scriptName}`;
|
|
50
|
+
const content = `#!/bin/sh
|
|
51
|
+
# ${GIT_HOOK_MARKER} — re-run npx comp-gate init to refresh
|
|
52
|
+
exec "$(git rev-parse --show-toplevel)/${scriptPath}" "$@"
|
|
53
|
+
`;
|
|
54
|
+
mkdirSync(path.dirname(hookPath), { recursive: true });
|
|
55
|
+
writeFileSync(hookPath, content, "utf8");
|
|
56
|
+
chmodSync(hookPath, 0o755);
|
|
57
|
+
return "installed";
|
|
58
|
+
}
|
|
59
|
+
export function installGitHooks(cwd) {
|
|
60
|
+
const results = [];
|
|
61
|
+
const push = installGitHookFile(cwd, "pre-push", "git-pre-push.sh");
|
|
62
|
+
const commit = installGitHookFile(cwd, "pre-commit", "git-pre-commit.sh");
|
|
63
|
+
if (push === "installed") {
|
|
64
|
+
results.push(".git/hooks/pre-push");
|
|
65
|
+
}
|
|
66
|
+
else if (push === "skipped") {
|
|
67
|
+
results.push(".git/hooks/pre-push (skipped — existing non-testme hook)");
|
|
68
|
+
}
|
|
69
|
+
if (commit === "installed") {
|
|
70
|
+
results.push(".git/hooks/pre-commit");
|
|
71
|
+
}
|
|
72
|
+
else if (commit === "skipped") {
|
|
73
|
+
results.push(".git/hooks/pre-commit (skipped — existing non-testme hook)");
|
|
74
|
+
}
|
|
75
|
+
return results;
|
|
76
|
+
}
|
|
77
|
+
function installAgent(cwd, agent, created) {
|
|
78
|
+
switch (agent) {
|
|
79
|
+
case "cursor":
|
|
80
|
+
installCursor(cwd, created);
|
|
81
|
+
break;
|
|
82
|
+
case "claude":
|
|
83
|
+
installClaude(cwd, created);
|
|
84
|
+
break;
|
|
85
|
+
case "windsurf":
|
|
86
|
+
installWindsurf(cwd, created);
|
|
87
|
+
break;
|
|
88
|
+
case "agents-md":
|
|
89
|
+
installAgentsMd(cwd, created);
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export function initShared(cwd, config, applyWizard = true, wizard = DEFAULT_WIZARD_CHOICES) {
|
|
94
|
+
const created = [];
|
|
95
|
+
const summaryPath = path.join(cwd, "SUMMARY.md");
|
|
96
|
+
if (existsSync(summaryPath)) {
|
|
97
|
+
created.push("SUMMARY.md (existing, unchanged)");
|
|
98
|
+
}
|
|
99
|
+
else if (wizard.summaryMode === "generate") {
|
|
100
|
+
mkdirSync(path.dirname(summaryPath), { recursive: true });
|
|
101
|
+
writeFileSync(summaryPath, bootstrapSummary(cwd), "utf8");
|
|
102
|
+
created.push("SUMMARY.md (generated from project metadata)");
|
|
103
|
+
}
|
|
104
|
+
else if (copyIfMissing(path.join(TEMPLATES_DIR, "SUMMARY.md"), summaryPath)) {
|
|
105
|
+
created.push("SUMMARY.md");
|
|
106
|
+
}
|
|
107
|
+
if (copyIfMissing(path.join(TEMPLATES_DIR, "PROMPTS.md"), path.join(cwd, "PROMPTS.md"))) {
|
|
108
|
+
created.push("PROMPTS.md");
|
|
109
|
+
}
|
|
110
|
+
const configResult = initConfigWithWizard(cwd, config, applyWizard);
|
|
111
|
+
if (configResult.created) {
|
|
112
|
+
created.push("testme.config.json");
|
|
113
|
+
}
|
|
114
|
+
else if (configResult.updated) {
|
|
115
|
+
created.push("testme.config.json (updated)");
|
|
116
|
+
}
|
|
117
|
+
copyHookScripts(cwd);
|
|
118
|
+
chmodScripts(path.join(cwd, ".testme", "hooks"));
|
|
119
|
+
created.push(".testme/hooks/");
|
|
120
|
+
for (const item of installGitHooks(cwd)) {
|
|
121
|
+
created.push(item);
|
|
122
|
+
}
|
|
123
|
+
return created;
|
|
124
|
+
}
|
|
125
|
+
export async function resolveInitAgents(cwd, options) {
|
|
126
|
+
if (options.agents && options.agents.length > 0) {
|
|
127
|
+
return options.agents;
|
|
128
|
+
}
|
|
129
|
+
const detection = detectAgents(cwd);
|
|
130
|
+
if (!options.yes && detection.ambiguous) {
|
|
131
|
+
return promptAgentSelection(detection.signals, detection.suggested);
|
|
132
|
+
}
|
|
133
|
+
if (detection.suggested.length > 0) {
|
|
134
|
+
return detection.suggested;
|
|
135
|
+
}
|
|
136
|
+
return ALL_AGENT_IDS;
|
|
137
|
+
}
|
|
138
|
+
export async function resolveWizardChoices(cwd, options) {
|
|
139
|
+
if (options.wizard) {
|
|
140
|
+
return options.wizard;
|
|
141
|
+
}
|
|
142
|
+
const configPath = path.join(cwd, "testme.config.json");
|
|
143
|
+
if (existsSync(configPath) && !options.force) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
if (options.yes || options.skipWizard) {
|
|
147
|
+
return DEFAULT_WIZARD_CHOICES;
|
|
148
|
+
}
|
|
149
|
+
return promptWizardChoices(cwd);
|
|
150
|
+
}
|
|
151
|
+
export async function initProject(cwd, options = {}) {
|
|
152
|
+
const agents = await resolveInitAgents(cwd, options);
|
|
153
|
+
const wizard = await resolveWizardChoices(cwd, options);
|
|
154
|
+
let config = createInitialConfig(cwd);
|
|
155
|
+
if (wizard) {
|
|
156
|
+
config = applyWizardToConfig(config, wizard);
|
|
157
|
+
}
|
|
158
|
+
config.gateCommits = true;
|
|
159
|
+
const wizardChoices = {
|
|
160
|
+
...(wizard ?? DEFAULT_WIZARD_CHOICES),
|
|
161
|
+
...(options.summaryMode ? { summaryMode: options.summaryMode } : {}),
|
|
162
|
+
};
|
|
163
|
+
const created = initShared(cwd, config, wizard !== null, wizardChoices);
|
|
164
|
+
for (const agent of agents) {
|
|
165
|
+
installAgent(cwd, agent, created);
|
|
166
|
+
}
|
|
167
|
+
const localOnly = wizard?.localOnly ?? true;
|
|
168
|
+
created.push(...ensureTestmeGitignore(cwd, agents, localOnly));
|
|
169
|
+
return created;
|
|
170
|
+
}
|
|
171
|
+
export function initProjectSync(cwd, options = {}) {
|
|
172
|
+
const agents = options.agents && options.agents.length > 0
|
|
173
|
+
? options.agents
|
|
174
|
+
: detectAgents(cwd).suggested.length > 0
|
|
175
|
+
? detectAgents(cwd).suggested
|
|
176
|
+
: ALL_AGENT_IDS;
|
|
177
|
+
const wizard = options.wizard ?? DEFAULT_WIZARD_CHOICES;
|
|
178
|
+
const wizardChoices = {
|
|
179
|
+
...wizard,
|
|
180
|
+
...(options.summaryMode ? { summaryMode: options.summaryMode } : {}),
|
|
181
|
+
};
|
|
182
|
+
let config = createInitialConfig(cwd);
|
|
183
|
+
config = applyWizardToConfig(config, wizardChoices);
|
|
184
|
+
config.gateCommits = true;
|
|
185
|
+
const created = initShared(cwd, config, true, wizardChoices);
|
|
186
|
+
for (const agent of agents) {
|
|
187
|
+
installAgent(cwd, agent, created);
|
|
188
|
+
}
|
|
189
|
+
const localOnly = wizardChoices.localOnly;
|
|
190
|
+
created.push(...ensureTestmeGitignore(cwd, agents, localOnly));
|
|
191
|
+
return created;
|
|
192
|
+
}
|
|
193
|
+
export function resetTestmeState(cwd, resetPrompts = false) {
|
|
194
|
+
const testmeDir = path.join(cwd, ".testme");
|
|
195
|
+
const hooksDir = path.join(testmeDir, "hooks");
|
|
196
|
+
if (existsSync(testmeDir)) {
|
|
197
|
+
for (const entry of readdirSync(testmeDir)) {
|
|
198
|
+
if (entry === "hooks") {
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
rmSync(path.join(testmeDir, entry), { recursive: true, force: true });
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
if (resetPrompts) {
|
|
205
|
+
const promptsTemplate = path.join(TEMPLATES_DIR, "PROMPTS.md");
|
|
206
|
+
writeFileSync(path.join(cwd, "PROMPTS.md"), readFileSync(promptsTemplate, "utf8"), "utf8");
|
|
207
|
+
}
|
|
208
|
+
if (!existsSync(hooksDir)) {
|
|
209
|
+
copyHookScripts(cwd);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
export function resetPromptsAfterPush(cwd) {
|
|
213
|
+
const promptsTemplate = path.join(TEMPLATES_DIR, "PROMPTS.md");
|
|
214
|
+
writeFileSync(path.join(cwd, "PROMPTS.md"), readFileSync(promptsTemplate, "utf8"), "utf8");
|
|
215
|
+
resetTestmeState(cwd, false);
|
|
216
|
+
}
|
|
217
|
+
export { parseAgentList };
|
|
218
|
+
//# sourceMappingURL=init.js.map
|
package/dist/init.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
package/dist/paths.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const ROOT: string;
|
|
2
|
+
export declare const TESTME_DIR: string;
|
|
3
|
+
export declare const SESSION_PATH: string;
|
|
4
|
+
export declare const ANSWERS_PATH: string;
|
|
5
|
+
export declare const REFERENCES_PATH: string;
|
|
6
|
+
export declare const JUDGMENTS_PATH: string;
|
|
7
|
+
export declare const PASS_PATH: string;
|
|
8
|
+
export declare const SUMMARY_PATH: string;
|
|
9
|
+
export declare const PROMPTS_PATH: string;
|
|
10
|
+
export declare const REPO_CONFIG_PATH: string;
|
|
11
|
+
export declare const LOCAL_CONFIG_PATH: string;
|
|
12
|
+
export declare const TEMPLATES_DIR: string;
|
|
13
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,IAAI,QAAgB,CAAC;AAClC,eAAO,MAAM,UAAU,QAA6B,CAAC;AACrD,eAAO,MAAM,YAAY,QAAwC,CAAC;AAClE,eAAO,MAAM,YAAY,QAAwC,CAAC;AAClE,eAAO,MAAM,eAAe,QAA2C,CAAC;AACxE,eAAO,MAAM,cAAc,QAA0C,CAAC;AACtE,eAAO,MAAM,SAAS,QAAqC,CAAC;AAC5D,eAAO,MAAM,YAAY,QAAgC,CAAC;AAC1D,eAAO,MAAM,YAAY,QAAgC,CAAC;AAC1D,eAAO,MAAM,gBAAgB,QAAwC,CAAC;AACtE,eAAO,MAAM,iBAAiB,QAAuC,CAAC;AAMtE,eAAO,MAAM,aAAa,QAA8C,CAAC"}
|
package/dist/paths.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { fileURLToPath } from "node:url";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export const ROOT = process.cwd();
|
|
4
|
+
export const TESTME_DIR = path.join(ROOT, ".testme");
|
|
5
|
+
export const SESSION_PATH = path.join(TESTME_DIR, "session.json");
|
|
6
|
+
export const ANSWERS_PATH = path.join(TESTME_DIR, "answers.json");
|
|
7
|
+
export const REFERENCES_PATH = path.join(TESTME_DIR, "references.json");
|
|
8
|
+
export const JUDGMENTS_PATH = path.join(TESTME_DIR, "judgments.json");
|
|
9
|
+
export const PASS_PATH = path.join(TESTME_DIR, "pass.json");
|
|
10
|
+
export const SUMMARY_PATH = path.join(ROOT, "SUMMARY.md");
|
|
11
|
+
export const PROMPTS_PATH = path.join(ROOT, "PROMPTS.md");
|
|
12
|
+
export const REPO_CONFIG_PATH = path.join(ROOT, "testme.config.json");
|
|
13
|
+
export const LOCAL_CONFIG_PATH = path.join(TESTME_DIR, "config.json");
|
|
14
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
15
|
+
const __dirname = path.dirname(__filename);
|
|
16
|
+
const PACKAGE_ROOT = path.resolve(__dirname, "..");
|
|
17
|
+
export const TEMPLATES_DIR = path.join(PACKAGE_ROOT, "src", "templates");
|
|
18
|
+
//# sourceMappingURL=paths.js.map
|