agentflight 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/LICENSE +201 -0
- package/README.md +152 -0
- package/dist/adapters/agentloopkit.d.ts +10 -0
- package/dist/adapters/agentloopkit.d.ts.map +1 -0
- package/dist/adapters/agentloopkit.js +68 -0
- package/dist/adapters/agentloopkit.js.map +1 -0
- package/dist/adapters/projscan.d.ts +10 -0
- package/dist/adapters/projscan.d.ts.map +1 -0
- package/dist/adapters/projscan.js +54 -0
- package/dist/adapters/projscan.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +95 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/doctor.d.ts +16 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +91 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +28 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/replay.d.ts +10 -0
- package/dist/commands/replay.d.ts.map +1 -0
- package/dist/commands/replay.js +32 -0
- package/dist/commands/replay.js.map +1 -0
- package/dist/commands/report.d.ts +10 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +30 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/resume.d.ts +10 -0
- package/dist/commands/resume.d.ts.map +1 -0
- package/dist/commands/resume.js +34 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/commands/start.d.ts +20 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +89 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +12 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +55 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/core/config.d.ts +23 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +74 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/doctor.d.ts +22 -0
- package/dist/core/doctor.d.ts.map +1 -0
- package/dist/core/doctor.js +68 -0
- package/dist/core/doctor.js.map +1 -0
- package/dist/core/fs-safe.d.ts +14 -0
- package/dist/core/fs-safe.d.ts.map +1 -0
- package/dist/core/fs-safe.js +31 -0
- package/dist/core/fs-safe.js.map +1 -0
- package/dist/core/git.d.ts +7 -0
- package/dist/core/git.d.ts.map +1 -0
- package/dist/core/git.js +40 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/output.d.ts +6 -0
- package/dist/core/output.d.ts.map +1 -0
- package/dist/core/output.js +11 -0
- package/dist/core/output.js.map +1 -0
- package/dist/core/paths.d.ts +3 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +15 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/process.d.ts +11 -0
- package/dist/core/process.d.ts.map +1 -0
- package/dist/core/process.js +27 -0
- package/dist/core/process.js.map +1 -0
- package/dist/core/project.d.ts +4 -0
- package/dist/core/project.d.ts.map +1 -0
- package/dist/core/project.js +25 -0
- package/dist/core/project.js.map +1 -0
- package/dist/core/risk.d.ts +4 -0
- package/dist/core/risk.d.ts.map +1 -0
- package/dist/core/risk.js +110 -0
- package/dist/core/risk.js.map +1 -0
- package/dist/core/session.d.ts +26 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +83 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/verification.d.ts +5 -0
- package/dist/core/verification.d.ts.map +1 -0
- package/dist/core/verification.js +14 -0
- package/dist/core/verification.js.map +1 -0
- package/dist/renderers/html-replay.d.ts +17 -0
- package/dist/renderers/html-replay.d.ts.map +1 -0
- package/dist/renderers/html-replay.js +84 -0
- package/dist/renderers/html-replay.js.map +1 -0
- package/dist/renderers/markdown-report.d.ts +16 -0
- package/dist/renderers/markdown-report.d.ts.map +1 -0
- package/dist/renderers/markdown-report.js +80 -0
- package/dist/renderers/markdown-report.js.map +1 -0
- package/dist/renderers/resume-prompt.d.ts +13 -0
- package/dist/renderers/resume-prompt.d.ts.map +1 -0
- package/dist/renderers/resume-prompt.js +34 -0
- package/dist/renderers/resume-prompt.js.map +1 -0
- package/dist/types/index.d.ts +93 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/core/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEnE,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,OAAO,EAAE;QACP,IAAI,EAAE,OAAO,CAAC;QACd,KAAK,EAAE,OAAO,CAAC;QACf,SAAS,EAAE,OAAO,CAAC;QACnB,IAAI,EAAE,OAAO,CAAC;KACf,CAAC;CACH;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,qBAAqB,GAAG,YAAY,CAkI/E"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export function evaluateDoctorChecks(input) {
|
|
2
|
+
const checks = [];
|
|
3
|
+
const nodeMajor = parseNodeMajor(input.nodeVersion);
|
|
4
|
+
checks.push(nodeMajor >= 20
|
|
5
|
+
? ok("Node.js version", `${input.nodeVersion} satisfies AgentFlight's Node.js 20+ target.`)
|
|
6
|
+
: error("Node.js version", `${input.nodeVersion} is below AgentFlight's Node.js 20+ target.`, "Install Node.js 20 or newer."));
|
|
7
|
+
checks.push(input.npmVersion
|
|
8
|
+
? ok("npm availability", `npm ${input.npmVersion} is available.`)
|
|
9
|
+
: error("npm availability", "npm is not available.", "Install npm with Node.js 20 or newer."));
|
|
10
|
+
checks.push(input.gitAvailable
|
|
11
|
+
? ok("git availability", "git is available.")
|
|
12
|
+
: warning("git availability", "git is not available or this repo cannot run git commands.", "Install git or run AgentFlight inside a git repository."));
|
|
13
|
+
checks.push(input.repoRoot
|
|
14
|
+
? ok("repository root", input.repoRoot)
|
|
15
|
+
: error("repository root", "Unable to determine repository root.", "Run AgentFlight from inside a git repository or project directory."));
|
|
16
|
+
checks.push(input.packageManager
|
|
17
|
+
? ok("package manager", input.packageManager)
|
|
18
|
+
: warning("package manager", "No package manager lockfile was detected.", "Run npm install or add a package manager lockfile."));
|
|
19
|
+
checks.push(input.agentFlightExists
|
|
20
|
+
? ok(".agentflight presence", ".agentflight exists.")
|
|
21
|
+
: warning(".agentflight presence", ".agentflight has not been initialized.", "Run agentflight init."));
|
|
22
|
+
checks.push(input.configValid
|
|
23
|
+
? ok("config validity", ".agentflight/config.json is valid.")
|
|
24
|
+
: error("config validity", ".agentflight/config.json is missing or invalid.", "Run agentflight init or fix config.json."));
|
|
25
|
+
checks.push(input.writable
|
|
26
|
+
? ok(".agentflight writable", ".agentflight is writable.")
|
|
27
|
+
: error(".agentflight writable", ".agentflight is not writable.", "Check filesystem permissions."));
|
|
28
|
+
checks.push(input.currentSessionExists
|
|
29
|
+
? ok("current session", "A current session exists.")
|
|
30
|
+
: warning("current session", "No current session exists.", 'Run agentflight start --task "...".'));
|
|
31
|
+
checks.push(input.projscanAvailable
|
|
32
|
+
? ok("ProjScan availability", "ProjScan is available.")
|
|
33
|
+
: warning("ProjScan availability", "ProjScan is not currently available.", "Install projscan locally or allow AgentFlight to use npx projscan@latest."));
|
|
34
|
+
checks.push(input.agentloopkitAvailable
|
|
35
|
+
? ok("AgentLoopKit availability", "AgentLoopKit is available.")
|
|
36
|
+
: warning("AgentLoopKit availability", "AgentLoopKit is not currently available.", "Install agentloopkit locally or allow AgentFlight to use npx agentloopkit@latest."));
|
|
37
|
+
for (const script of ["test", "build", "typecheck", "lint"]) {
|
|
38
|
+
checks.push(input.scripts[script]
|
|
39
|
+
? ok(`${script} script`, `npm run ${script} is configured.`)
|
|
40
|
+
: warning(`${script} script`, `npm run ${script} is not configured.`, `Add a ${script} script to package.json.`));
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
status: checks.some((check) => check.status === "error")
|
|
44
|
+
? "error"
|
|
45
|
+
: checks.some((check) => check.status === "warning")
|
|
46
|
+
? "warning"
|
|
47
|
+
: "ok",
|
|
48
|
+
checks
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function parseNodeMajor(version) {
|
|
52
|
+
const match = /^v?(\d+)/.exec(version);
|
|
53
|
+
return match ? Number(match[1]) : 0;
|
|
54
|
+
}
|
|
55
|
+
function ok(name, message) {
|
|
56
|
+
return { name, status: "ok", message };
|
|
57
|
+
}
|
|
58
|
+
function warning(name, message, suggestedFix) {
|
|
59
|
+
return suggestedFix
|
|
60
|
+
? { name, status: "warning", message, suggestedFix }
|
|
61
|
+
: { name, status: "warning", message };
|
|
62
|
+
}
|
|
63
|
+
function error(name, message, suggestedFix) {
|
|
64
|
+
return suggestedFix
|
|
65
|
+
? { name, status: "error", message, suggestedFix }
|
|
66
|
+
: { name, status: "error", message };
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/core/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type SafeWriteStatus = "created" | "overwritten" | "skipped";
|
|
2
|
+
export interface SafeWriteResult {
|
|
3
|
+
path: string;
|
|
4
|
+
status: SafeWriteStatus;
|
|
5
|
+
}
|
|
6
|
+
export interface SafeWriteOptions {
|
|
7
|
+
overwrite?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function pathExists(path: string): Promise<boolean>;
|
|
10
|
+
export declare function ensureDir(path: string): Promise<void>;
|
|
11
|
+
export declare function readJsonFile<T>(path: string): Promise<T>;
|
|
12
|
+
export declare function writeJsonFileSafe(path: string, value: unknown, options?: SafeWriteOptions): Promise<SafeWriteResult>;
|
|
13
|
+
export declare function writeTextFileSafe(path: string, value: string, options?: SafeWriteOptions): Promise<SafeWriteResult>;
|
|
14
|
+
//# sourceMappingURL=fs-safe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-safe.d.ts","sourceRoot":"","sources":["../../src/core/fs-safe.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,CAAC;AAEpE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/D;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;AAED,wBAAsB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAE9D;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAU1B"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { constants } from "node:fs";
|
|
2
|
+
import { access, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname } from "node:path";
|
|
4
|
+
export async function pathExists(path) {
|
|
5
|
+
try {
|
|
6
|
+
await access(path, constants.F_OK);
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export async function ensureDir(path) {
|
|
14
|
+
await mkdir(path, { recursive: true });
|
|
15
|
+
}
|
|
16
|
+
export async function readJsonFile(path) {
|
|
17
|
+
return JSON.parse(await readFile(path, "utf8"));
|
|
18
|
+
}
|
|
19
|
+
export async function writeJsonFileSafe(path, value, options = {}) {
|
|
20
|
+
return writeTextFileSafe(path, `${JSON.stringify(value, null, 2)}\n`, options);
|
|
21
|
+
}
|
|
22
|
+
export async function writeTextFileSafe(path, value, options = {}) {
|
|
23
|
+
await mkdir(dirname(path), { recursive: true });
|
|
24
|
+
const exists = await pathExists(path);
|
|
25
|
+
if (exists && options.overwrite !== true) {
|
|
26
|
+
return { path, status: "skipped" };
|
|
27
|
+
}
|
|
28
|
+
await writeFile(path, value, "utf8");
|
|
29
|
+
return { path, status: exists ? "overwritten" : "created" };
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=fs-safe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-safe.js","sourceRoot":"","sources":["../../src/core/fs-safe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY;IAC1C,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,IAAY;IAChD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAM,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAY,EACZ,KAAc,EACd,UAA4B,EAAE;IAE9B,OAAO,iBAAiB,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAY,EACZ,KAAa,EACb,UAA4B,EAAE;IAE9B,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEhD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,MAAM,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QACzC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACrC,CAAC;IAED,MAAM,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACrC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CommandRunner } from "./process.js";
|
|
2
|
+
import type { GitInfo } from "../types/index.js";
|
|
3
|
+
export declare function getRepositoryRoot(cwd: string, run?: CommandRunner): Promise<string>;
|
|
4
|
+
export declare function getGitInfo(repoRoot: string, run?: CommandRunner): Promise<GitInfo>;
|
|
5
|
+
export declare function listChangedFiles(repoRoot: string, run?: CommandRunner): Promise<string[]>;
|
|
6
|
+
export declare function parseGitStatusFiles(output: string): string[];
|
|
7
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/core/git.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,aAA0B,GAC9B,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,aAA0B,GAC9B,OAAO,CAAC,OAAO,CAAC,CAelB;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,aAA0B,GAC9B,OAAO,CAAC,MAAM,EAAE,CAAC,CAMnB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAW5D"}
|
package/dist/core/git.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { runCommand } from "./process.js";
|
|
2
|
+
export async function getRepositoryRoot(cwd, run = runCommand) {
|
|
3
|
+
const result = await run("git", ["rev-parse", "--show-toplevel"], { cwd, timeoutMs: 10_000 });
|
|
4
|
+
return result.exitCode === 0 && result.stdout.trim() ? result.stdout.trim() : cwd;
|
|
5
|
+
}
|
|
6
|
+
export async function getGitInfo(repoRoot, run = runCommand) {
|
|
7
|
+
const [branch, commit, status] = await Promise.all([
|
|
8
|
+
run("git", ["branch", "--show-current"], { cwd: repoRoot, timeoutMs: 10_000 }),
|
|
9
|
+
run("git", ["rev-parse", "--short", "HEAD"], { cwd: repoRoot, timeoutMs: 10_000 }),
|
|
10
|
+
run("git", ["status", "--porcelain", "-uall"], { cwd: repoRoot, timeoutMs: 10_000 })
|
|
11
|
+
]);
|
|
12
|
+
const changedFiles = status.exitCode === 0 ? parseGitStatusFiles(status.stdout) : [];
|
|
13
|
+
return {
|
|
14
|
+
branch: branch.exitCode === 0 && branch.stdout.trim() ? branch.stdout.trim() : null,
|
|
15
|
+
commit: commit.exitCode === 0 && commit.stdout.trim() ? commit.stdout.trim() : null,
|
|
16
|
+
dirty: changedFiles.length > 0,
|
|
17
|
+
changedFiles
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export async function listChangedFiles(repoRoot, run = runCommand) {
|
|
21
|
+
const result = await run("git", ["status", "--porcelain", "-uall"], {
|
|
22
|
+
cwd: repoRoot,
|
|
23
|
+
timeoutMs: 10_000
|
|
24
|
+
});
|
|
25
|
+
return result.exitCode === 0 ? parseGitStatusFiles(result.stdout) : [];
|
|
26
|
+
}
|
|
27
|
+
export function parseGitStatusFiles(output) {
|
|
28
|
+
return output
|
|
29
|
+
.split("\n")
|
|
30
|
+
.filter((line) => line.trim().length > 0)
|
|
31
|
+
.map((line) => {
|
|
32
|
+
const pathPart = line.slice(3).trim();
|
|
33
|
+
const renameMatch = /.+ -> (.+)$/.exec(pathPart);
|
|
34
|
+
if (renameMatch?.[1])
|
|
35
|
+
return renameMatch[1];
|
|
36
|
+
return pathPart;
|
|
37
|
+
})
|
|
38
|
+
.filter(Boolean);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/core/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export interface CommandOutput {
|
|
2
|
+
output: string;
|
|
3
|
+
}
|
|
4
|
+
export declare function formatToolAvailability(label: string, available: boolean): string;
|
|
5
|
+
export declare function renderStatus(status: "ok" | "warning" | "error"): string;
|
|
6
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/core/output.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,CAEhF;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,IAAI,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAIvE"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function formatToolAvailability(label, available) {
|
|
2
|
+
return `${label}: ${available ? "available" : "unavailable"}`;
|
|
3
|
+
}
|
|
4
|
+
export function renderStatus(status) {
|
|
5
|
+
if (status === "ok")
|
|
6
|
+
return "OK";
|
|
7
|
+
if (status === "warning")
|
|
8
|
+
return "Warning";
|
|
9
|
+
return "Error";
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/core/output.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,sBAAsB,CAAC,KAAa,EAAE,SAAkB;IACtE,OAAO,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAkC;IAC7D,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACjC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAa1E"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
export function resolveAgentFlightPaths(repoRoot) {
|
|
3
|
+
const root = join(repoRoot, ".agentflight");
|
|
4
|
+
return {
|
|
5
|
+
root,
|
|
6
|
+
config: join(root, "config.json"),
|
|
7
|
+
sessions: join(root, "sessions"),
|
|
8
|
+
reports: join(root, "reports"),
|
|
9
|
+
current: join(root, "current"),
|
|
10
|
+
currentSession: join(root, "current", "session.json"),
|
|
11
|
+
currentHandoff: join(root, "current", "handoff.md"),
|
|
12
|
+
currentResumePrompt: join(root, "current", "resume-prompt.md")
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,UAAU,uBAAuB,CAAC,QAAgB;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAE5C,OAAO;QACL,IAAI;QACJ,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC;QACjC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;QAChC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;QAC9B,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;QAC9B,cAAc,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,cAAc,CAAC;QACrD,cAAc,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,CAAC;QACnD,mBAAmB,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,kBAAkB,CAAC;KAC/D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface CommandResult {
|
|
2
|
+
exitCode: number;
|
|
3
|
+
stdout: string;
|
|
4
|
+
stderr: string;
|
|
5
|
+
}
|
|
6
|
+
export type CommandRunner = (command: string, args: string[], options?: {
|
|
7
|
+
cwd?: string | undefined;
|
|
8
|
+
timeoutMs?: number | undefined;
|
|
9
|
+
}) => Promise<CommandResult>;
|
|
10
|
+
export declare const runCommand: CommandRunner;
|
|
11
|
+
//# sourceMappingURL=process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/core/process.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,aAAa,GAAG,CAC1B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,KACnE,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5B,eAAO,MAAM,UAAU,EAAE,aA4BxB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
export const runCommand = async (command, args, options = {}) => {
|
|
5
|
+
try {
|
|
6
|
+
const result = await execFileAsync(command, args, {
|
|
7
|
+
cwd: options.cwd,
|
|
8
|
+
timeout: options.timeoutMs ?? 15_000,
|
|
9
|
+
maxBuffer: 1024 * 1024,
|
|
10
|
+
shell: false
|
|
11
|
+
});
|
|
12
|
+
return {
|
|
13
|
+
exitCode: 0,
|
|
14
|
+
stdout: result.stdout,
|
|
15
|
+
stderr: result.stderr
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
const failure = error;
|
|
20
|
+
return {
|
|
21
|
+
exitCode: typeof failure.code === "number" ? failure.code : 1,
|
|
22
|
+
stdout: failure.stdout ?? "",
|
|
23
|
+
stderr: failure.stderr ?? failure.message ?? "Command failed."
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/core/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAc1C,MAAM,CAAC,MAAM,UAAU,GAAkB,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE;IAC7E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE;YAChD,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,OAAO,EAAE,OAAO,CAAC,SAAS,IAAI,MAAM;YACpC,SAAS,EAAE,IAAI,GAAG,IAAI;YACtB,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;QAEH,OAAO;YACL,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAKf,CAAC;QAEF,OAAO;YACL,QAAQ,EAAE,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7D,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;YAC5B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,OAAO,IAAI,iBAAiB;SAC/D,CAAC;IACJ,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { PackageJsonLike } from "./verification.js";
|
|
2
|
+
export declare function readPackageJson(repoRoot: string): Promise<PackageJsonLike>;
|
|
3
|
+
export declare function detectPackageManager(repoRoot: string): Promise<string | null>;
|
|
4
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/core/project.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAMhF;AAED,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOnF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { pathExists } from "./fs-safe.js";
|
|
4
|
+
export async function readPackageJson(repoRoot) {
|
|
5
|
+
try {
|
|
6
|
+
return JSON.parse(await readFile(join(repoRoot, "package.json"), "utf8"));
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return {};
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export async function detectPackageManager(repoRoot) {
|
|
13
|
+
if (await pathExists(join(repoRoot, "package-lock.json")))
|
|
14
|
+
return "npm";
|
|
15
|
+
if (await pathExists(join(repoRoot, "pnpm-lock.yaml")))
|
|
16
|
+
return "pnpm";
|
|
17
|
+
if (await pathExists(join(repoRoot, "yarn.lock")))
|
|
18
|
+
return "yarn";
|
|
19
|
+
if (await pathExists(join(repoRoot, "bun.lockb")))
|
|
20
|
+
return "bun";
|
|
21
|
+
if (await pathExists(join(repoRoot, "package.json")))
|
|
22
|
+
return "npm";
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/core/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB;IACpD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAoB,CAAC;IAC/F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAgB;IACzD,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACxE,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACtE,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACjE,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAChE,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACnE,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk.d.ts","sourceRoot":"","sources":["../../src/core/risk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAkC,MAAM,mBAAmB,CAAC;AAYpG,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CA4CzD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,YAAY,CA8BzD"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
const highRiskCategories = new Set([
|
|
2
|
+
"auth",
|
|
3
|
+
"billing/payments",
|
|
4
|
+
"database/migrations",
|
|
5
|
+
"security/secrets",
|
|
6
|
+
"config"
|
|
7
|
+
]);
|
|
8
|
+
const mediumRiskCategories = new Set(["backend/api", "dependencies"]);
|
|
9
|
+
export function categorizeFile(file) {
|
|
10
|
+
const normalized = file.replaceAll("\\", "/").toLowerCase();
|
|
11
|
+
if (/(^|\/)\.env($|\.)/.test(normalized)) {
|
|
12
|
+
return "security/secrets";
|
|
13
|
+
}
|
|
14
|
+
if (/(^|\/)(test|tests|__tests__|spec)(\/|$)|\.(test|spec)\.[cm]?[jt]sx?$/.test(normalized)) {
|
|
15
|
+
return "tests";
|
|
16
|
+
}
|
|
17
|
+
if (/(^|\/)(doc|docs)(\/|$)|\.(md|mdx|txt)$/.test(normalized)) {
|
|
18
|
+
return "docs";
|
|
19
|
+
}
|
|
20
|
+
if (/(^|\/)(auth|authentication|oauth|permission|permissions)(\/|[-_.])/.test(normalized)) {
|
|
21
|
+
return "auth";
|
|
22
|
+
}
|
|
23
|
+
if (/(payment|payments|billing|stripe|checkout|invoice|invoices)/.test(normalized)) {
|
|
24
|
+
return "billing/payments";
|
|
25
|
+
}
|
|
26
|
+
if (/(^|\/)(migration|migrations|db\/migrate|database\/migrations)(\/|$)/.test(normalized)) {
|
|
27
|
+
return "database/migrations";
|
|
28
|
+
}
|
|
29
|
+
if (/secret|secrets|credential|credentials|token|tokens/.test(normalized)) {
|
|
30
|
+
return "security/secrets";
|
|
31
|
+
}
|
|
32
|
+
if (/(^|\/)(package-lock\.json|pnpm-lock\.yaml|yarn\.lock|package\.json)$/.test(normalized) ||
|
|
33
|
+
/(^|\/)(deps|dependencies)(\/|$)/.test(normalized)) {
|
|
34
|
+
return "dependencies";
|
|
35
|
+
}
|
|
36
|
+
if (/(^|\/)(\.github|\.gitlab|ci|config|configs)(\/|$)/.test(normalized) ||
|
|
37
|
+
/(tsconfig|eslint|prettier|vite|vitest|rollup|webpack|babel|dockerfile)/.test(normalized)) {
|
|
38
|
+
return "config";
|
|
39
|
+
}
|
|
40
|
+
if (/(^|\/)(components|ui|pages|app|styles)(\/|$)|\.(tsx|jsx|css|scss)$/.test(normalized)) {
|
|
41
|
+
return "frontend";
|
|
42
|
+
}
|
|
43
|
+
if (/(^|\/)(api|routes|controllers|server|backend)(\/|$)/.test(normalized)) {
|
|
44
|
+
return "backend/api";
|
|
45
|
+
}
|
|
46
|
+
return "unknown";
|
|
47
|
+
}
|
|
48
|
+
export function analyzeRisk(files) {
|
|
49
|
+
if (files.length === 0) {
|
|
50
|
+
return {
|
|
51
|
+
level: "unknown",
|
|
52
|
+
changedFiles: 0,
|
|
53
|
+
categories: [],
|
|
54
|
+
reasons: ["No changed files detected yet."]
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const grouped = new Map();
|
|
58
|
+
for (const file of files) {
|
|
59
|
+
const category = categorizeFile(file);
|
|
60
|
+
grouped.set(category, [...(grouped.get(category) ?? []), file]);
|
|
61
|
+
}
|
|
62
|
+
const categories = [...grouped.entries()].map(([category, categoryFiles]) => ({
|
|
63
|
+
category,
|
|
64
|
+
files: categoryFiles
|
|
65
|
+
}));
|
|
66
|
+
const level = determineRiskLevel(categories);
|
|
67
|
+
return {
|
|
68
|
+
level,
|
|
69
|
+
changedFiles: files.length,
|
|
70
|
+
categories,
|
|
71
|
+
reasons: buildReasons(categories, level)
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function determineRiskLevel(categories) {
|
|
75
|
+
if (categories.some((summary) => highRiskCategories.has(summary.category)))
|
|
76
|
+
return "high";
|
|
77
|
+
if (categories.some((summary) => mediumRiskCategories.has(summary.category)))
|
|
78
|
+
return "medium";
|
|
79
|
+
if (categories.every((summary) => summary.category === "docs" ||
|
|
80
|
+
summary.category === "tests" ||
|
|
81
|
+
summary.category === "frontend")) {
|
|
82
|
+
return "low";
|
|
83
|
+
}
|
|
84
|
+
return "medium";
|
|
85
|
+
}
|
|
86
|
+
function buildReasons(categories, level) {
|
|
87
|
+
const present = new Set(categories.map((summary) => summary.category));
|
|
88
|
+
const reasons = [];
|
|
89
|
+
if (present.has("auth"))
|
|
90
|
+
reasons.push("Authentication-sensitive files changed.");
|
|
91
|
+
if (present.has("billing/payments"))
|
|
92
|
+
reasons.push("Billing or payment files changed.");
|
|
93
|
+
if (present.has("database/migrations"))
|
|
94
|
+
reasons.push("Database migration files changed.");
|
|
95
|
+
if (present.has("security/secrets"))
|
|
96
|
+
reasons.push("Secret or credential-adjacent files changed.");
|
|
97
|
+
if (present.has("config"))
|
|
98
|
+
reasons.push("Configuration or CI files changed.");
|
|
99
|
+
if (present.has("backend/api"))
|
|
100
|
+
reasons.push("Backend or API files changed.");
|
|
101
|
+
if (present.has("dependencies"))
|
|
102
|
+
reasons.push("Dependency or package metadata changed.");
|
|
103
|
+
if (reasons.length === 0) {
|
|
104
|
+
reasons.push(level === "low"
|
|
105
|
+
? "Only low-risk docs, tests, or isolated UI files changed."
|
|
106
|
+
: "Risk is based on changed file categories.");
|
|
107
|
+
}
|
|
108
|
+
return reasons;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=risk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk.js","sourceRoot":"","sources":["../../src/core/risk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { AgentFlightSession, GitInfo, ToolAdapterResult } from "../types/index.js";
|
|
2
|
+
export interface BuildSessionRecordOptions {
|
|
3
|
+
repoRoot: string;
|
|
4
|
+
task: string;
|
|
5
|
+
now?: Date | undefined;
|
|
6
|
+
git: GitInfo;
|
|
7
|
+
packageManager: string | null;
|
|
8
|
+
repoSummary?: string | undefined;
|
|
9
|
+
verificationCommands?: string[] | undefined;
|
|
10
|
+
tools?: {
|
|
11
|
+
projscan: ToolAdapterResult;
|
|
12
|
+
agentloopkit: ToolAdapterResult;
|
|
13
|
+
} | undefined;
|
|
14
|
+
}
|
|
15
|
+
export type StartSessionOptions = BuildSessionRecordOptions;
|
|
16
|
+
export interface StartSessionResult {
|
|
17
|
+
session: AgentFlightSession;
|
|
18
|
+
sessionPath: string;
|
|
19
|
+
currentSessionPath: string;
|
|
20
|
+
handoffPath: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function buildSessionRecord(options: BuildSessionRecordOptions): AgentFlightSession;
|
|
23
|
+
export declare function startSession(options: StartSessionOptions): Promise<StartSessionResult>;
|
|
24
|
+
export declare function createSessionId(now: Date, task: string): string;
|
|
25
|
+
export declare function slugify(value: string): string;
|
|
26
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAExF,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IACvB,GAAG,EAAE,OAAO,CAAC;IACb,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,oBAAoB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5C,KAAK,CAAC,EACF;QACE,QAAQ,EAAE,iBAAiB,CAAC;QAC5B,YAAY,EAAE,iBAAiB,CAAC;KACjC,GACD,SAAS,CAAC;CACf;AAED,MAAM,MAAM,mBAAmB,GAAG,yBAAyB,CAAC;AAE5D,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB;AAOD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,kBAAkB,CAuBzF;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAe5F;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ7C"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { basename } from "node:path";
|
|
2
|
+
import { writeJsonFileSafe, writeTextFileSafe } from "./fs-safe.js";
|
|
3
|
+
import { resolveAgentFlightPaths } from "./paths.js";
|
|
4
|
+
const unavailableTool = {
|
|
5
|
+
available: false,
|
|
6
|
+
warnings: ["Not inspected for this session."]
|
|
7
|
+
};
|
|
8
|
+
export function buildSessionRecord(options) {
|
|
9
|
+
const now = options.now ?? new Date();
|
|
10
|
+
const session = {
|
|
11
|
+
id: createSessionId(now, options.task),
|
|
12
|
+
task: {
|
|
13
|
+
title: options.task
|
|
14
|
+
},
|
|
15
|
+
startedAt: now.toISOString(),
|
|
16
|
+
repoRoot: options.repoRoot,
|
|
17
|
+
git: options.git,
|
|
18
|
+
packageManager: options.packageManager,
|
|
19
|
+
verificationCommands: options.verificationCommands ?? [],
|
|
20
|
+
tools: options.tools ?? {
|
|
21
|
+
projscan: unavailableTool,
|
|
22
|
+
agentloopkit: unavailableTool
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
if (options.repoSummary !== undefined) {
|
|
26
|
+
session.repoSummary = options.repoSummary;
|
|
27
|
+
}
|
|
28
|
+
return session;
|
|
29
|
+
}
|
|
30
|
+
export async function startSession(options) {
|
|
31
|
+
const session = buildSessionRecord(options);
|
|
32
|
+
const paths = resolveAgentFlightPaths(options.repoRoot);
|
|
33
|
+
const sessionPath = `${paths.sessions}/${session.id}.json`;
|
|
34
|
+
await writeJsonFileSafe(sessionPath, session);
|
|
35
|
+
await writeJsonFileSafe(paths.currentSession, session, { overwrite: true });
|
|
36
|
+
await writeTextFileSafe(paths.currentHandoff, renderInitialHandoff(session), { overwrite: true });
|
|
37
|
+
return {
|
|
38
|
+
session,
|
|
39
|
+
sessionPath,
|
|
40
|
+
currentSessionPath: paths.currentSession,
|
|
41
|
+
handoffPath: paths.currentHandoff
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export function createSessionId(now, task) {
|
|
45
|
+
return `af-${formatDateForId(now)}-${slugify(task)}`;
|
|
46
|
+
}
|
|
47
|
+
export function slugify(value) {
|
|
48
|
+
const slug = value
|
|
49
|
+
.toLowerCase()
|
|
50
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
51
|
+
.replace(/^-+|-+$/g, "")
|
|
52
|
+
.slice(0, 64);
|
|
53
|
+
return slug.length > 0 ? slug : "session";
|
|
54
|
+
}
|
|
55
|
+
function formatDateForId(now) {
|
|
56
|
+
const iso = now.toISOString();
|
|
57
|
+
return `${iso.slice(0, 10).replaceAll("-", "")}-${iso.slice(11, 19).replaceAll(":", "")}`;
|
|
58
|
+
}
|
|
59
|
+
function renderInitialHandoff(session) {
|
|
60
|
+
const proof = session.verificationCommands.length
|
|
61
|
+
? session.verificationCommands.map((command) => `- ${command}`).join("\n")
|
|
62
|
+
: "- No verification commands detected yet.";
|
|
63
|
+
return `# AgentFlight Handoff
|
|
64
|
+
|
|
65
|
+
## Task
|
|
66
|
+
${session.task.title}
|
|
67
|
+
|
|
68
|
+
## Session
|
|
69
|
+
- ID: ${session.id}
|
|
70
|
+
- Project: ${basename(session.repoRoot)}
|
|
71
|
+
- Started: ${session.startedAt}
|
|
72
|
+
- Git branch: ${session.git.branch ?? "unknown"}
|
|
73
|
+
- Git commit: ${session.git.commit ?? "unknown"}
|
|
74
|
+
- Dirty at start: ${session.git.dirty ? "yes" : "no"}
|
|
75
|
+
- Package manager: ${session.packageManager ?? "unknown"}
|
|
76
|
+
|
|
77
|
+
## Suggested proof
|
|
78
|
+
${proof}
|
|
79
|
+
|
|
80
|
+
Now run your coding agent normally. Keep changes scoped and record proof before claiming completion.
|
|
81
|
+
`;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../../src/core/verification.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,eAAe,GAAG,MAAM,EAAE,CAUjF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function detectVerificationCommands(packageJson) {
|
|
2
|
+
const scripts = packageJson.scripts ?? {};
|
|
3
|
+
const commands = [];
|
|
4
|
+
if (scripts.typecheck)
|
|
5
|
+
commands.push("npm run typecheck");
|
|
6
|
+
if (scripts.lint)
|
|
7
|
+
commands.push("npm run lint");
|
|
8
|
+
if (scripts.test)
|
|
9
|
+
commands.push("npm test");
|
|
10
|
+
if (scripts.build)
|
|
11
|
+
commands.push("npm run build");
|
|
12
|
+
return commands;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=verification.js.map
|