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":"verification.js","sourceRoot":"","sources":["../../src/core/verification.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,0BAA0B,CAAC,WAA4B;IACrE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,IAAI,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,OAAO,CAAC,SAAS;QAAE,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC1D,IAAI,OAAO,CAAC,IAAI;QAAE,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAChD,IAAI,OAAO,CAAC,IAAI;QAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,OAAO,CAAC,KAAK;QAAE,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAElD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { VerificationEvidence } from "../types/index.js";
|
|
2
|
+
export interface ReplayTimelineItem {
|
|
3
|
+
label: string;
|
|
4
|
+
timestamp: string;
|
|
5
|
+
}
|
|
6
|
+
export interface HtmlReplayInput {
|
|
7
|
+
task: string;
|
|
8
|
+
sessionId: string;
|
|
9
|
+
startedAt: string;
|
|
10
|
+
timeline: ReplayTimelineItem[];
|
|
11
|
+
changedFiles: string[];
|
|
12
|
+
riskBadges: string[];
|
|
13
|
+
verificationEvidence: VerificationEvidence[];
|
|
14
|
+
recommendation: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function renderHtmlReplay(input: HtmlReplayInput): string;
|
|
17
|
+
//# sourceMappingURL=html-replay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-replay.d.ts","sourceRoot":"","sources":["../../src/renderers/html-replay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,oBAAoB,EAAE,oBAAoB,EAAE,CAAC;IAC7C,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAuD/D"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
export function renderHtmlReplay(input) {
|
|
2
|
+
return `<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="utf-8">
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
7
|
+
<title>AgentFlight Replay ${escapeHtml(input.sessionId)}</title>
|
|
8
|
+
<style>
|
|
9
|
+
:root { color-scheme: light; font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; }
|
|
10
|
+
body { margin: 0; background: #f7f8fa; color: #1b1f24; }
|
|
11
|
+
main { max-width: 960px; margin: 0 auto; padding: 40px 24px; }
|
|
12
|
+
header { border-bottom: 1px solid #d8dee4; padding-bottom: 24px; margin-bottom: 28px; }
|
|
13
|
+
h1 { font-size: 32px; line-height: 1.1; margin: 0 0 12px; letter-spacing: 0; }
|
|
14
|
+
h2 { font-size: 18px; margin: 28px 0 12px; }
|
|
15
|
+
.meta { color: #57606a; font-size: 14px; }
|
|
16
|
+
.badges { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; }
|
|
17
|
+
.badge { border: 1px solid #d0d7de; border-radius: 999px; padding: 4px 10px; background: #ffffff; font-size: 13px; }
|
|
18
|
+
.panel { background: #ffffff; border: 1px solid #d0d7de; border-radius: 8px; padding: 18px; margin: 16px 0; }
|
|
19
|
+
ul { margin: 0; padding-left: 22px; }
|
|
20
|
+
li { margin: 6px 0; }
|
|
21
|
+
code { background: #f0f3f6; border-radius: 4px; padding: 2px 5px; }
|
|
22
|
+
</style>
|
|
23
|
+
</head>
|
|
24
|
+
<body>
|
|
25
|
+
<main>
|
|
26
|
+
<header>
|
|
27
|
+
<div class="meta">AgentFlight replay · ${escapeHtml(input.sessionId)}</div>
|
|
28
|
+
<h1>${escapeHtml(input.task)}</h1>
|
|
29
|
+
<div class="meta">Started ${escapeHtml(input.startedAt)}</div>
|
|
30
|
+
<div class="badges">${input.riskBadges.map((badge) => `<span class="badge">${escapeHtml(badge)}</span>`).join("")}</div>
|
|
31
|
+
</header>
|
|
32
|
+
|
|
33
|
+
<section class="panel">
|
|
34
|
+
<h2>Timeline</h2>
|
|
35
|
+
${renderTimeline(input.timeline)}
|
|
36
|
+
</section>
|
|
37
|
+
|
|
38
|
+
<section class="panel">
|
|
39
|
+
<h2>Changed Files</h2>
|
|
40
|
+
${renderFileList(input.changedFiles)}
|
|
41
|
+
</section>
|
|
42
|
+
|
|
43
|
+
<section class="panel">
|
|
44
|
+
<h2>Verification Evidence</h2>
|
|
45
|
+
${renderVerification(input.verificationEvidence)}
|
|
46
|
+
</section>
|
|
47
|
+
|
|
48
|
+
<section class="panel">
|
|
49
|
+
<h2>Recommendation</h2>
|
|
50
|
+
<p>${escapeHtml(input.recommendation)}</p>
|
|
51
|
+
</section>
|
|
52
|
+
</main>
|
|
53
|
+
</body>
|
|
54
|
+
</html>
|
|
55
|
+
`;
|
|
56
|
+
}
|
|
57
|
+
function renderTimeline(items) {
|
|
58
|
+
if (items.length === 0)
|
|
59
|
+
return "<p>No timeline events recorded.</p>";
|
|
60
|
+
return `<ul>${items
|
|
61
|
+
.map((item) => `<li><strong>${escapeHtml(item.timestamp)}</strong> ${escapeHtml(item.label)}</li>`)
|
|
62
|
+
.join("")}</ul>`;
|
|
63
|
+
}
|
|
64
|
+
function renderFileList(files) {
|
|
65
|
+
if (files.length === 0)
|
|
66
|
+
return "<p>No changed files detected.</p>";
|
|
67
|
+
return `<ul>${files.map((file) => `<li><code>${escapeHtml(file)}</code></li>`).join("")}</ul>`;
|
|
68
|
+
}
|
|
69
|
+
function renderVerification(evidence) {
|
|
70
|
+
if (evidence.length === 0)
|
|
71
|
+
return "<p>No verification evidence recorded.</p>";
|
|
72
|
+
return `<ul>${evidence
|
|
73
|
+
.map((item) => `<li><code>${escapeHtml(item.command)}</code>: ${escapeHtml(item.status)}</li>`)
|
|
74
|
+
.join("")}</ul>`;
|
|
75
|
+
}
|
|
76
|
+
function escapeHtml(value) {
|
|
77
|
+
return value
|
|
78
|
+
.replaceAll("&", "&")
|
|
79
|
+
.replaceAll("<", "<")
|
|
80
|
+
.replaceAll(">", ">")
|
|
81
|
+
.replaceAll('"', """)
|
|
82
|
+
.replaceAll("'", "'");
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=html-replay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-replay.js","sourceRoot":"","sources":["../../src/renderers/html-replay.ts"],"names":[],"mappings":"AAkBA,MAAM,UAAU,gBAAgB,CAAC,KAAsB;IACrD,OAAO;;;;;8BAKqB,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;;;;;;;;;;;;;;;;;;;;+CAoBV,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;YAC9D,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;kCACA,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;4BACjC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,uBAAuB,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;;;;QAK/G,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC;;;;;QAK9B,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC;;;;;QAKlC,kBAAkB,CAAC,KAAK,CAAC,oBAAoB,CAAC;;;;;WAK3C,UAAU,CAAC,KAAK,CAAC,cAAc,CAAC;;;;;CAK1C,CAAC;AACF,CAAC;AAED,SAAS,cAAc,CAAC,KAA2B;IACjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,qCAAqC,CAAC;IACrE,OAAO,OAAO,KAAK;SAChB,GAAG,CACF,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAC9F;SACA,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;AACrB,CAAC;AAED,SAAS,cAAc,CAAC,KAAe;IACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,mCAAmC,CAAC;IACnE,OAAO,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;AACjG,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgC;IAC1D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,2CAA2C,CAAC;IAC9E,OAAO,OAAO,QAAQ;SACnB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;SAC9F,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;AACrB,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK;SACT,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC;SACzB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { RiskAnalysis, ToolAdapterResult, VerificationEvidence } from "../types/index.js";
|
|
2
|
+
export interface MarkdownReportInput {
|
|
3
|
+
task: string;
|
|
4
|
+
sessionId: string;
|
|
5
|
+
startedAt: string;
|
|
6
|
+
changedFiles: string[];
|
|
7
|
+
risk: RiskAnalysis;
|
|
8
|
+
verificationCommands: string[];
|
|
9
|
+
verificationEvidence: VerificationEvidence[];
|
|
10
|
+
tooling: {
|
|
11
|
+
projscan: ToolAdapterResult;
|
|
12
|
+
agentloopkit: ToolAdapterResult;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export declare function renderMarkdownReport(input: MarkdownReportInput): string;
|
|
16
|
+
//# sourceMappingURL=markdown-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-report.d.ts","sourceRoot":"","sources":["../../src/renderers/markdown-report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE/F,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,oBAAoB,EAAE,oBAAoB,EAAE,CAAC;IAC7C,OAAO,EAAE;QACP,QAAQ,EAAE,iBAAiB,CAAC;QAC5B,YAAY,EAAE,iBAAiB,CAAC;KACjC,CAAC;CACH;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAoCvE"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export function renderMarkdownReport(input) {
|
|
2
|
+
return `# AgentFlight Proof Report
|
|
3
|
+
|
|
4
|
+
## Task
|
|
5
|
+
${input.task}
|
|
6
|
+
|
|
7
|
+
## Session
|
|
8
|
+
- Session ID: ${input.sessionId}
|
|
9
|
+
- Started: ${input.startedAt}
|
|
10
|
+
|
|
11
|
+
## Changed Files
|
|
12
|
+
${renderList(input.changedFiles, "No changed files detected.")}
|
|
13
|
+
|
|
14
|
+
## Risk Summary
|
|
15
|
+
- Level: ${input.risk.level}
|
|
16
|
+
- Changed files: ${input.risk.changedFiles}
|
|
17
|
+
${renderList(input.risk.reasons)}
|
|
18
|
+
|
|
19
|
+
## Verification Evidence
|
|
20
|
+
${renderVerification(input)}
|
|
21
|
+
|
|
22
|
+
## Review Focus
|
|
23
|
+
${renderReviewFocus(input.risk)}
|
|
24
|
+
|
|
25
|
+
## Recommendation
|
|
26
|
+
${renderRecommendation(input.risk, input.verificationEvidence)}
|
|
27
|
+
|
|
28
|
+
## Next Action
|
|
29
|
+
${renderNextAction(input)}
|
|
30
|
+
|
|
31
|
+
## Tooling
|
|
32
|
+
- ProjScan: ${formatTool(input.tooling.projscan)}
|
|
33
|
+
- AgentLoopKit: ${formatTool(input.tooling.agentloopkit)}
|
|
34
|
+
|
|
35
|
+
Generated by AgentFlight, powered by ProjScan and AgentLoopKit where available.
|
|
36
|
+
`;
|
|
37
|
+
}
|
|
38
|
+
function renderList(items, empty = "None.") {
|
|
39
|
+
return items.length ? items.map((item) => `- ${item}`).join("\n") : empty;
|
|
40
|
+
}
|
|
41
|
+
function renderVerification(input) {
|
|
42
|
+
if (input.verificationEvidence.length === 0) {
|
|
43
|
+
const commands = input.verificationCommands.length
|
|
44
|
+
? `\n\nSuggested commands:\n${renderList(input.verificationCommands)}`
|
|
45
|
+
: "";
|
|
46
|
+
return `No verification evidence recorded.${commands}`;
|
|
47
|
+
}
|
|
48
|
+
return input.verificationEvidence
|
|
49
|
+
.map((evidence) => `- ${evidence.command}: ${evidence.status}`)
|
|
50
|
+
.join("\n");
|
|
51
|
+
}
|
|
52
|
+
function renderReviewFocus(risk) {
|
|
53
|
+
return risk.categories.length
|
|
54
|
+
? risk.categories
|
|
55
|
+
.map((summary) => `- ${summary.category}: ${summary.files.join(", ")}`)
|
|
56
|
+
.join("\n")
|
|
57
|
+
: "- Confirm the session has meaningful changes before review.";
|
|
58
|
+
}
|
|
59
|
+
function renderRecommendation(risk, evidence) {
|
|
60
|
+
if (evidence.length === 0) {
|
|
61
|
+
return "Do not claim completion yet. Run the suggested verification commands and regenerate the report.";
|
|
62
|
+
}
|
|
63
|
+
if (risk.level === "high") {
|
|
64
|
+
return "Request careful human review focused on the high-risk file categories before merging.";
|
|
65
|
+
}
|
|
66
|
+
return "Review the changed files and verification evidence before handoff.";
|
|
67
|
+
}
|
|
68
|
+
function renderNextAction(input) {
|
|
69
|
+
if (input.verificationEvidence.length === 0 && input.verificationCommands.length > 0) {
|
|
70
|
+
return `Run ${input.verificationCommands[0]} and capture the result.`;
|
|
71
|
+
}
|
|
72
|
+
return "Prepare a scoped handoff for the next agent or reviewer.";
|
|
73
|
+
}
|
|
74
|
+
function formatTool(result) {
|
|
75
|
+
const status = result.available ? "available" : "unavailable";
|
|
76
|
+
const version = result.version ? ` ${result.version}` : "";
|
|
77
|
+
const warnings = result.warnings.length ? ` (${result.warnings.join("; ")})` : "";
|
|
78
|
+
return `${status}${version}${warnings}`;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=markdown-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-report.js","sourceRoot":"","sources":["../../src/renderers/markdown-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { RiskLevel } from "../types/index.js";
|
|
2
|
+
export interface ResumePromptInput {
|
|
3
|
+
task: string;
|
|
4
|
+
sessionId: string;
|
|
5
|
+
branch: string | null;
|
|
6
|
+
changedFiles: string[];
|
|
7
|
+
riskLevel: RiskLevel;
|
|
8
|
+
riskReasons: string[];
|
|
9
|
+
verificationGaps: string[];
|
|
10
|
+
nextAction: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function renderResumePrompt(input: ResumePromptInput): string;
|
|
13
|
+
//# sourceMappingURL=resume-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume-prompt.d.ts","sourceRoot":"","sources":["../../src/renderers/resume-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CA6BnE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export function renderResumePrompt(input) {
|
|
2
|
+
return `Continue this AgentFlight-recorded coding session safely.
|
|
3
|
+
|
|
4
|
+
## Task
|
|
5
|
+
${input.task}
|
|
6
|
+
|
|
7
|
+
## Current State
|
|
8
|
+
- Session: ${input.sessionId}
|
|
9
|
+
- Git branch: ${input.branch ?? "unknown"}
|
|
10
|
+
- Risk level: ${input.riskLevel}
|
|
11
|
+
|
|
12
|
+
## Changed Files
|
|
13
|
+
${renderList(input.changedFiles, "No changed files detected.")}
|
|
14
|
+
|
|
15
|
+
## Risks
|
|
16
|
+
${renderList(input.riskReasons, "No specific risks detected yet.")}
|
|
17
|
+
|
|
18
|
+
## Verification Gaps
|
|
19
|
+
${renderList(input.verificationGaps, "No verification gaps recorded.")}
|
|
20
|
+
|
|
21
|
+
## Next Recommended Action
|
|
22
|
+
${input.nextAction}
|
|
23
|
+
|
|
24
|
+
## Constraints
|
|
25
|
+
- Do not start unrelated work.
|
|
26
|
+
- Do not claim completion without running proof.
|
|
27
|
+
- Run relevant verification.
|
|
28
|
+
- Keep changes scoped.
|
|
29
|
+
`;
|
|
30
|
+
}
|
|
31
|
+
function renderList(items, empty) {
|
|
32
|
+
return items.length ? items.map((item) => `- ${item}`).join("\n") : empty;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=resume-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume-prompt.js","sourceRoot":"","sources":["../../src/renderers/resume-prompt.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,kBAAkB,CAAC,KAAwB;IACzD,OAAO;;;EAGP,KAAK,CAAC,IAAI;;;aAGC,KAAK,CAAC,SAAS;gBACZ,KAAK,CAAC,MAAM,IAAI,SAAS;gBACzB,KAAK,CAAC,SAAS;;;EAG7B,UAAU,CAAC,KAAK,CAAC,YAAY,EAAE,4BAA4B,CAAC;;;EAG5D,UAAU,CAAC,KAAK,CAAC,WAAW,EAAE,iCAAiC,CAAC;;;EAGhE,UAAU,CAAC,KAAK,CAAC,gBAAgB,EAAE,gCAAgC,CAAC;;;EAGpE,KAAK,CAAC,UAAU;;;;;;;CAOjB,CAAC;AACF,CAAC;AAED,SAAS,UAAU,CAAC,KAAe,EAAE,KAAa;IAChD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5E,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
export type AgentFlightEngineMode = "npx" | "local";
|
|
2
|
+
export interface AgentFlightConfig {
|
|
3
|
+
version: 1;
|
|
4
|
+
projectName: string;
|
|
5
|
+
createdAt: string;
|
|
6
|
+
engines: {
|
|
7
|
+
projscan: {
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
mode: AgentFlightEngineMode;
|
|
10
|
+
};
|
|
11
|
+
agentloopkit: {
|
|
12
|
+
enabled: boolean;
|
|
13
|
+
mode: AgentFlightEngineMode;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
verification: {
|
|
17
|
+
commands: string[];
|
|
18
|
+
};
|
|
19
|
+
privacy: {
|
|
20
|
+
localOnly: true;
|
|
21
|
+
telemetry: false;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export interface AgentFlightPaths {
|
|
25
|
+
root: string;
|
|
26
|
+
config: string;
|
|
27
|
+
sessions: string;
|
|
28
|
+
reports: string;
|
|
29
|
+
current: string;
|
|
30
|
+
currentSession: string;
|
|
31
|
+
currentHandoff: string;
|
|
32
|
+
currentResumePrompt: string;
|
|
33
|
+
}
|
|
34
|
+
export interface GitInfo {
|
|
35
|
+
branch: string | null;
|
|
36
|
+
commit: string | null;
|
|
37
|
+
dirty: boolean;
|
|
38
|
+
changedFiles: string[];
|
|
39
|
+
}
|
|
40
|
+
export interface AgentFlightSession {
|
|
41
|
+
id: string;
|
|
42
|
+
task: {
|
|
43
|
+
title: string;
|
|
44
|
+
};
|
|
45
|
+
startedAt: string;
|
|
46
|
+
repoRoot: string;
|
|
47
|
+
git: GitInfo;
|
|
48
|
+
packageManager: string | null;
|
|
49
|
+
repoSummary?: string;
|
|
50
|
+
verificationCommands: string[];
|
|
51
|
+
tools: {
|
|
52
|
+
projscan: ToolAdapterResult;
|
|
53
|
+
agentloopkit: ToolAdapterResult;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export type RiskCategory = "auth" | "billing/payments" | "database/migrations" | "security/secrets" | "config" | "tests" | "docs" | "frontend" | "backend/api" | "dependencies" | "unknown";
|
|
57
|
+
export type RiskLevel = "low" | "medium" | "high" | "unknown";
|
|
58
|
+
export interface RiskCategorySummary {
|
|
59
|
+
category: RiskCategory;
|
|
60
|
+
files: string[];
|
|
61
|
+
}
|
|
62
|
+
export interface RiskAnalysis {
|
|
63
|
+
level: RiskLevel;
|
|
64
|
+
changedFiles: number;
|
|
65
|
+
categories: RiskCategorySummary[];
|
|
66
|
+
reasons: string[];
|
|
67
|
+
}
|
|
68
|
+
export interface ToolAdapterResult {
|
|
69
|
+
available: boolean;
|
|
70
|
+
version?: string;
|
|
71
|
+
summary?: string;
|
|
72
|
+
warnings: string[];
|
|
73
|
+
rawOutputPath?: string;
|
|
74
|
+
taskLinked?: boolean;
|
|
75
|
+
}
|
|
76
|
+
export interface VerificationEvidence {
|
|
77
|
+
command: string;
|
|
78
|
+
status: "pass" | "fail" | "not-run";
|
|
79
|
+
output?: string;
|
|
80
|
+
startedAt?: string;
|
|
81
|
+
finishedAt?: string;
|
|
82
|
+
}
|
|
83
|
+
export interface DoctorCheck {
|
|
84
|
+
name: string;
|
|
85
|
+
status: "ok" | "warning" | "error";
|
|
86
|
+
message: string;
|
|
87
|
+
suggestedFix?: string;
|
|
88
|
+
}
|
|
89
|
+
export interface DoctorResult {
|
|
90
|
+
status: "ok" | "warning" | "error";
|
|
91
|
+
checks: DoctorCheck[];
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agentflight",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Local-first flight recorder for AI coding agents.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/cli.js",
|
|
7
|
+
"types": "./dist/cli.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"agentflight": "./dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md",
|
|
14
|
+
"LICENSE"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc -p tsconfig.build.json",
|
|
18
|
+
"test": "vitest run",
|
|
19
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
20
|
+
"lint": "eslint .",
|
|
21
|
+
"format": "prettier --write .",
|
|
22
|
+
"format:check": "prettier --check .",
|
|
23
|
+
"check": "npm run typecheck && npm run lint && npm run test",
|
|
24
|
+
"dev": "tsx src/cli.ts",
|
|
25
|
+
"agentflight": "tsx src/cli.ts",
|
|
26
|
+
"projscan": "projscan start --intent \"Build AgentFlight, a local-first flight recorder for AI coding agents\"",
|
|
27
|
+
"agentloopkit:doctor": "agentloopkit doctor",
|
|
28
|
+
"verify": "npm run typecheck && npm run lint && npm test && npm run build"
|
|
29
|
+
},
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "git+https://github.com/abhiyoheswaran1/AgentFlight.git"
|
|
33
|
+
},
|
|
34
|
+
"keywords": [
|
|
35
|
+
"ai",
|
|
36
|
+
"coding-agents",
|
|
37
|
+
"cli",
|
|
38
|
+
"developer-tools",
|
|
39
|
+
"local-first",
|
|
40
|
+
"observability"
|
|
41
|
+
],
|
|
42
|
+
"author": "Baseframe Labs",
|
|
43
|
+
"license": "Apache-2.0",
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=20"
|
|
46
|
+
},
|
|
47
|
+
"bugs": {
|
|
48
|
+
"url": "https://github.com/abhiyoheswaran1/AgentFlight/issues"
|
|
49
|
+
},
|
|
50
|
+
"homepage": "https://github.com/abhiyoheswaran1/AgentFlight#readme",
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@eslint/js": "^10.0.1",
|
|
53
|
+
"@types/node": "^25.9.3",
|
|
54
|
+
"agentloopkit": "^0.28.7",
|
|
55
|
+
"eslint": "^10.5.0",
|
|
56
|
+
"prettier": "^3.8.4",
|
|
57
|
+
"projscan": "^4.3.1",
|
|
58
|
+
"tsx": "^4.22.4",
|
|
59
|
+
"typescript": "^6.0.3",
|
|
60
|
+
"typescript-eslint": "^8.61.0",
|
|
61
|
+
"vitest": "^4.1.8"
|
|
62
|
+
},
|
|
63
|
+
"dependencies": {
|
|
64
|
+
"commander": "^15.0.0"
|
|
65
|
+
}
|
|
66
|
+
}
|