sequant 1.2.5 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -0
- package/dist/bin/cli.js +10 -0
- package/dist/bin/cli.js.map +1 -1
- package/dist/src/commands/doctor.d.ts.map +1 -1
- package/dist/src/commands/doctor.js +33 -1
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/doctor.test.js +84 -1
- package/dist/src/commands/doctor.test.js.map +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +8 -2
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/init.test.js +2 -1
- package/dist/src/commands/init.test.js.map +1 -1
- package/dist/src/commands/logs.d.ts +2 -0
- package/dist/src/commands/logs.d.ts.map +1 -1
- package/dist/src/commands/logs.js +41 -0
- package/dist/src/commands/logs.js.map +1 -1
- package/dist/src/commands/run.d.ts +20 -0
- package/dist/src/commands/run.d.ts.map +1 -1
- package/dist/src/commands/run.js +38 -4
- package/dist/src/commands/run.js.map +1 -1
- package/dist/src/commands/run.test.js +166 -1
- package/dist/src/commands/run.test.js.map +1 -1
- package/dist/src/commands/stats.d.ts +16 -0
- package/dist/src/commands/stats.d.ts.map +1 -0
- package/dist/src/commands/stats.js +271 -0
- package/dist/src/commands/stats.js.map +1 -0
- package/dist/src/commands/stats.test.d.ts +7 -0
- package/dist/src/commands/stats.test.d.ts.map +1 -0
- package/dist/src/commands/stats.test.js +218 -0
- package/dist/src/commands/stats.test.js.map +1 -0
- package/dist/src/commands/update.d.ts.map +1 -1
- package/dist/src/commands/update.js +15 -3
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/lib/settings.d.ts +17 -0
- package/dist/src/lib/settings.d.ts.map +1 -1
- package/dist/src/lib/settings.js +9 -0
- package/dist/src/lib/settings.js.map +1 -1
- package/dist/src/lib/system.d.ts +26 -0
- package/dist/src/lib/system.d.ts.map +1 -1
- package/dist/src/lib/system.js +72 -1
- package/dist/src/lib/system.js.map +1 -1
- package/dist/src/lib/workflow/log-rotation.d.ts +138 -0
- package/dist/src/lib/workflow/log-rotation.d.ts.map +1 -0
- package/dist/src/lib/workflow/log-rotation.js +232 -0
- package/dist/src/lib/workflow/log-rotation.js.map +1 -0
- package/dist/src/lib/workflow/log-rotation.test.d.ts +7 -0
- package/dist/src/lib/workflow/log-rotation.test.d.ts.map +1 -0
- package/dist/src/lib/workflow/log-rotation.test.js +248 -0
- package/dist/src/lib/workflow/log-rotation.test.js.map +1 -0
- package/dist/src/lib/workflow/log-writer.d.ts +6 -0
- package/dist/src/lib/workflow/log-writer.d.ts.map +1 -1
- package/dist/src/lib/workflow/log-writer.js +12 -0
- package/dist/src/lib/workflow/log-writer.js.map +1 -1
- package/dist/src/lib/workflow/log-writer.test.js +4 -1
- package/dist/src/lib/workflow/log-writer.test.js.map +1 -1
- package/dist/src/lib/workflow/run-log-schema.d.ts +6 -0
- package/dist/src/lib/workflow/run-log-schema.d.ts.map +1 -1
- package/dist/src/lib/workflow/run-log-schema.js +1 -0
- package/dist/src/lib/workflow/run-log-schema.js.map +1 -1
- package/dist/src/lib/workflow/types.d.ts +1 -1
- package/dist/src/lib/workflow/types.d.ts.map +1 -1
- package/dist/src/lib/workflow/types.js.map +1 -1
- package/package.json +2 -1
- package/templates/skills/fullsolve/SKILL.md +17 -0
- package/templates/skills/spec/references/recommended-workflow.md +92 -0
- package/templates/skills/test/SKILL.md +73 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/lib/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,0CAA0C;AAC1C,eAAO,MAAM,aAAa,2BAA2B,CAAC;AAEtD,sCAAsC;AACtC,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,UAAU,EAAE,OAAO,CAAC;IACpB,qCAAqC;IACrC,WAAW,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,UAAU,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/lib/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,0CAA0C;AAC1C,eAAO,MAAM,aAAa,2BAA2B,CAAC;AAEtD,sCAAsC;AACtC,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oDAAoD;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,UAAU,EAAE,OAAO,CAAC;IACpB,qCAAqC;IACrC,WAAW,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,UAAU,EAAE,OAAO,CAAC;IACpB,4BAA4B;IAC5B,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,GAAG,EAAE,WAAW,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,yBAAyB,EAAE,gBAIvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,eAa9B,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC,CAoB5D;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3E;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAEtD;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3D"}
|
package/dist/src/lib/settings.js
CHANGED
|
@@ -16,6 +16,14 @@ import { dirname } from "path";
|
|
|
16
16
|
export const SETTINGS_PATH = ".sequant/settings.json";
|
|
17
17
|
/** Current settings schema version */
|
|
18
18
|
export const SETTINGS_VERSION = "1.0";
|
|
19
|
+
/**
|
|
20
|
+
* Default rotation settings
|
|
21
|
+
*/
|
|
22
|
+
export const DEFAULT_ROTATION_SETTINGS = {
|
|
23
|
+
enabled: true,
|
|
24
|
+
maxSizeMB: 10,
|
|
25
|
+
maxFiles: 100,
|
|
26
|
+
};
|
|
19
27
|
/**
|
|
20
28
|
* Default settings
|
|
21
29
|
*/
|
|
@@ -30,6 +38,7 @@ export const DEFAULT_SETTINGS = {
|
|
|
30
38
|
qualityLoop: false,
|
|
31
39
|
maxIterations: 3,
|
|
32
40
|
smartTests: true,
|
|
41
|
+
rotation: DEFAULT_ROTATION_SETTINGS,
|
|
33
42
|
},
|
|
34
43
|
};
|
|
35
44
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/lib/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,0CAA0C;AAC1C,MAAM,CAAC,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAEtD,sCAAsC;AACtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/lib/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,0CAA0C;AAC1C,MAAM,CAAC,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAEtD,sCAAsC;AACtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAgDtC;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAqB;IACzD,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,EAAE;IACb,QAAQ,EAAE,GAAG;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC/C,OAAO,EAAE,gBAAgB;IACzB,GAAG,EAAE;QACH,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,eAAe;QACxB,gBAAgB,EAAE,IAAI;QACtB,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,KAAK;QACjB,WAAW,EAAE,KAAK;QAClB,aAAa,EAAE,CAAC;QAChB,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,yBAAyB;KACpC;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QACvC,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA6B,CAAC;QAE/D,iDAAiD;QACjD,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,gBAAgB,CAAC,OAAO;YACnD,GAAG,EAAE;gBACH,GAAG,gBAAgB,CAAC,GAAG;gBACvB,GAAG,MAAM,CAAC,GAAG;aACd;SACF,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,gBAAgB,CAAC;IAC1B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAyB;IAC1D,MAAM,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;IACxC,MAAM,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,UAAU,CAAC,aAAa,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,YAAY,CAAC,gBAAgB,CAAC,CAAC;AACvC,CAAC"}
|
package/dist/src/lib/system.d.ts
CHANGED
|
@@ -21,4 +21,30 @@ export declare function isNativeWindows(): boolean;
|
|
|
21
21
|
* Get platform-specific install hint for a package
|
|
22
22
|
*/
|
|
23
23
|
export declare function getInstallHint(pkg: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* MCP server information for Sequant integrations
|
|
26
|
+
*/
|
|
27
|
+
export interface McpServerInfo {
|
|
28
|
+
name: string;
|
|
29
|
+
purpose: string;
|
|
30
|
+
skills: string[];
|
|
31
|
+
installUrl: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Optional MCP servers that enhance Sequant functionality
|
|
35
|
+
*/
|
|
36
|
+
export declare const OPTIONAL_MCP_SERVERS: McpServerInfo[];
|
|
37
|
+
/**
|
|
38
|
+
* Get the path to Claude Desktop config file
|
|
39
|
+
*/
|
|
40
|
+
export declare function getClaudeConfigPath(): string;
|
|
41
|
+
/**
|
|
42
|
+
* Read configured MCP servers from Claude Desktop config
|
|
43
|
+
*/
|
|
44
|
+
export declare function getConfiguredMcpServers(): string[];
|
|
45
|
+
/**
|
|
46
|
+
* Check which optional MCP servers are configured
|
|
47
|
+
* Returns an object with server names as keys and configured status as values
|
|
48
|
+
*/
|
|
49
|
+
export declare function checkOptionalMcpServers(): Record<string, boolean>;
|
|
24
50
|
//# sourceMappingURL=system.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../../src/lib/system.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../../src/lib/system.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOlD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAO3C;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,OAAO,CAa/B;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAsBlD;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAAa,EAqB/C,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAY5C;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,EAAE,CAYlD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAejE"}
|
package/dist/src/lib/system.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* System utility functions for checking prerequisites
|
|
3
3
|
*/
|
|
4
4
|
import { execSync } from "child_process";
|
|
5
|
+
import fs from "fs";
|
|
5
6
|
/**
|
|
6
7
|
* Check if a command exists on the system
|
|
7
8
|
*/
|
|
@@ -34,7 +35,6 @@ export function isWSL() {
|
|
|
34
35
|
return false;
|
|
35
36
|
}
|
|
36
37
|
try {
|
|
37
|
-
const fs = require("fs");
|
|
38
38
|
const procVersion = fs.readFileSync("/proc/version", "utf8");
|
|
39
39
|
return (procVersion.toLowerCase().includes("microsoft") ||
|
|
40
40
|
procVersion.toLowerCase().includes("wsl"));
|
|
@@ -72,4 +72,75 @@ export function getInstallHint(pkg) {
|
|
|
72
72
|
}
|
|
73
73
|
return pkgHints[platform] || pkgHints["linux"] || `Install ${pkg}`;
|
|
74
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Optional MCP servers that enhance Sequant functionality
|
|
77
|
+
*/
|
|
78
|
+
export const OPTIONAL_MCP_SERVERS = [
|
|
79
|
+
{
|
|
80
|
+
name: "chrome-devtools",
|
|
81
|
+
purpose: "Browser automation for UI testing",
|
|
82
|
+
skills: ["/test", "/testgen", "/loop"],
|
|
83
|
+
installUrl: "https://github.com/anthropics/anthropic-quickstarts/tree/main/mcp-chrome-devtools",
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: "context7",
|
|
87
|
+
purpose: "External library documentation lookup",
|
|
88
|
+
skills: ["/exec", "/fullsolve"],
|
|
89
|
+
installUrl: "https://github.com/upstash/context7",
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
name: "sequential-thinking",
|
|
93
|
+
purpose: "Complex multi-step reasoning",
|
|
94
|
+
skills: ["/fullsolve"],
|
|
95
|
+
installUrl: "https://github.com/anthropics/anthropic-quickstarts/tree/main/mcp-sequential-thinking",
|
|
96
|
+
},
|
|
97
|
+
];
|
|
98
|
+
/**
|
|
99
|
+
* Get the path to Claude Desktop config file
|
|
100
|
+
*/
|
|
101
|
+
export function getClaudeConfigPath() {
|
|
102
|
+
const platform = process.platform;
|
|
103
|
+
const home = process.env.HOME || process.env.USERPROFILE || "";
|
|
104
|
+
if (platform === "darwin") {
|
|
105
|
+
return `${home}/Library/Application Support/Claude/claude_desktop_config.json`;
|
|
106
|
+
}
|
|
107
|
+
else if (platform === "win32") {
|
|
108
|
+
return `${process.env.APPDATA}\\Claude\\claude_desktop_config.json`;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
// Linux
|
|
112
|
+
return `${home}/.config/claude/claude_desktop_config.json`;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Read configured MCP servers from Claude Desktop config
|
|
117
|
+
*/
|
|
118
|
+
export function getConfiguredMcpServers() {
|
|
119
|
+
const configPath = getClaudeConfigPath();
|
|
120
|
+
try {
|
|
121
|
+
const content = fs.readFileSync(configPath, "utf8");
|
|
122
|
+
const config = JSON.parse(content);
|
|
123
|
+
const servers = config.mcpServers || {};
|
|
124
|
+
return Object.keys(servers);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// Config file doesn't exist or is invalid
|
|
128
|
+
return [];
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Check which optional MCP servers are configured
|
|
133
|
+
* Returns an object with server names as keys and configured status as values
|
|
134
|
+
*/
|
|
135
|
+
export function checkOptionalMcpServers() {
|
|
136
|
+
const configuredServers = getConfiguredMcpServers();
|
|
137
|
+
const result = {};
|
|
138
|
+
for (const server of OPTIONAL_MCP_SERVERS) {
|
|
139
|
+
// Check for various naming conventions
|
|
140
|
+
const found = configuredServers.some((configured) => configured.toLowerCase().includes(server.name.toLowerCase()) ||
|
|
141
|
+
server.name.toLowerCase().includes(configured.toLowerCase()));
|
|
142
|
+
result[server.name] = found;
|
|
143
|
+
}
|
|
144
|
+
return result;
|
|
145
|
+
}
|
|
75
146
|
//# sourceMappingURL=system.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system.js","sourceRoot":"","sources":["../../../src/lib/system.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"system.js","sourceRoot":"","sources":["../../../src/lib/system.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Log rotation management for workflow run logs
|
|
3
|
+
*
|
|
4
|
+
* Implements automatic log rotation based on size and file count thresholds.
|
|
5
|
+
* Deletes oldest logs first until within limits.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { rotateIfNeeded, getLogStats, manualRotate } from './log-rotation';
|
|
10
|
+
*
|
|
11
|
+
* // Auto-rotate after a run
|
|
12
|
+
* await rotateIfNeeded('.sequant/logs');
|
|
13
|
+
*
|
|
14
|
+
* // Get statistics
|
|
15
|
+
* const stats = await getLogStats('.sequant/logs');
|
|
16
|
+
* console.log(`${stats.fileCount} files, ${stats.totalSizeMB.toFixed(2)}MB`);
|
|
17
|
+
*
|
|
18
|
+
* // Manual rotation with dry-run
|
|
19
|
+
* const result = await manualRotate('.sequant/logs', { dryRun: true });
|
|
20
|
+
* console.log(`Would delete ${result.deletedCount} files`);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Rotation settings
|
|
25
|
+
*/
|
|
26
|
+
export interface RotationSettings {
|
|
27
|
+
/** Enable automatic rotation (default: true) */
|
|
28
|
+
enabled: boolean;
|
|
29
|
+
/** Maximum total size in MB before rotation (default: 10) */
|
|
30
|
+
maxSizeMB: number;
|
|
31
|
+
/** Maximum file count before rotation (default: 100) */
|
|
32
|
+
maxFiles: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Default rotation settings
|
|
36
|
+
*/
|
|
37
|
+
export declare const DEFAULT_ROTATION_SETTINGS: RotationSettings;
|
|
38
|
+
/**
|
|
39
|
+
* Log directory statistics
|
|
40
|
+
*/
|
|
41
|
+
export interface LogStats {
|
|
42
|
+
/** Total size in bytes */
|
|
43
|
+
totalSizeBytes: number;
|
|
44
|
+
/** Total size in megabytes */
|
|
45
|
+
totalSizeMB: number;
|
|
46
|
+
/** Number of log files */
|
|
47
|
+
fileCount: number;
|
|
48
|
+
/** Oldest log file */
|
|
49
|
+
oldestFile: string | null;
|
|
50
|
+
/** Newest log file */
|
|
51
|
+
newestFile: string | null;
|
|
52
|
+
/** Whether size threshold is exceeded */
|
|
53
|
+
exceedsSizeThreshold: boolean;
|
|
54
|
+
/** Whether file count threshold is exceeded */
|
|
55
|
+
exceedsCountThreshold: boolean;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Result of a rotation operation
|
|
59
|
+
*/
|
|
60
|
+
export interface RotationResult {
|
|
61
|
+
/** Files that were deleted (or would be in dry-run) */
|
|
62
|
+
deletedFiles: string[];
|
|
63
|
+
/** Number of files deleted */
|
|
64
|
+
deletedCount: number;
|
|
65
|
+
/** Bytes reclaimed (or would be in dry-run) */
|
|
66
|
+
bytesReclaimed: number;
|
|
67
|
+
/** Whether rotation was performed */
|
|
68
|
+
rotated: boolean;
|
|
69
|
+
/** Error message if rotation failed */
|
|
70
|
+
error?: string;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* File info for sorting by age
|
|
74
|
+
*/
|
|
75
|
+
interface LogFileInfo {
|
|
76
|
+
filename: string;
|
|
77
|
+
filePath: string;
|
|
78
|
+
mtime: Date;
|
|
79
|
+
size: number;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get list of log files with metadata, sorted by modification time (oldest first)
|
|
83
|
+
*/
|
|
84
|
+
export declare function getLogFiles(logDir: string): LogFileInfo[];
|
|
85
|
+
/**
|
|
86
|
+
* Get statistics about the log directory
|
|
87
|
+
*
|
|
88
|
+
* @param logDir - Path to log directory
|
|
89
|
+
* @param settings - Rotation settings for threshold comparison
|
|
90
|
+
* @returns Log directory statistics
|
|
91
|
+
*/
|
|
92
|
+
export declare function getLogStats(logDir: string, settings?: RotationSettings): LogStats;
|
|
93
|
+
/**
|
|
94
|
+
* Calculate which files need to be deleted to meet thresholds
|
|
95
|
+
*
|
|
96
|
+
* Applies a 10% buffer (stops at 90% of threshold) to prevent
|
|
97
|
+
* immediate re-rotation on next run.
|
|
98
|
+
*
|
|
99
|
+
* @param logDir - Path to log directory
|
|
100
|
+
* @param settings - Rotation settings
|
|
101
|
+
* @returns List of files to delete (oldest first)
|
|
102
|
+
*/
|
|
103
|
+
export declare function getFilesToDelete(logDir: string, settings: RotationSettings): LogFileInfo[];
|
|
104
|
+
/**
|
|
105
|
+
* Rotate logs if needed (automatic rotation)
|
|
106
|
+
*
|
|
107
|
+
* Called after LogWriter.finalize() to clean up old logs.
|
|
108
|
+
*
|
|
109
|
+
* @param logDir - Path to log directory
|
|
110
|
+
* @param settings - Rotation settings
|
|
111
|
+
* @returns Rotation result
|
|
112
|
+
*/
|
|
113
|
+
export declare function rotateIfNeeded(logDir: string, settings?: RotationSettings): RotationResult;
|
|
114
|
+
/**
|
|
115
|
+
* Options for manual rotation
|
|
116
|
+
*/
|
|
117
|
+
export interface ManualRotateOptions {
|
|
118
|
+
/** Dry run - don't actually delete files */
|
|
119
|
+
dryRun?: boolean;
|
|
120
|
+
/** Custom rotation settings */
|
|
121
|
+
settings?: RotationSettings;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Manual rotation triggered by CLI command
|
|
125
|
+
*
|
|
126
|
+
* Supports dry-run mode to preview what would be deleted.
|
|
127
|
+
*
|
|
128
|
+
* @param logDir - Path to log directory
|
|
129
|
+
* @param options - Manual rotation options
|
|
130
|
+
* @returns Rotation result
|
|
131
|
+
*/
|
|
132
|
+
export declare function manualRotate(logDir: string, options?: ManualRotateOptions): RotationResult;
|
|
133
|
+
/**
|
|
134
|
+
* Format bytes for human-readable display
|
|
135
|
+
*/
|
|
136
|
+
export declare function formatBytes(bytes: number): string;
|
|
137
|
+
export {};
|
|
138
|
+
//# sourceMappingURL=log-rotation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-rotation.d.ts","sourceRoot":"","sources":["../../../../src/lib/workflow/log-rotation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAMH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gDAAgD;IAChD,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,yBAAyB,EAAE,gBAIvC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,0BAA0B;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,sBAAsB;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,yCAAyC;IACzC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,+CAA+C;IAC/C,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,UAAU,WAAW;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,IAAI,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AASD;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE,CAwBzD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,gBAA4C,GACrD,QAAQ,CA2BV;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,gBAAgB,GACzB,WAAW,EAAE,CAqCf;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,gBAA4C,GACrD,cAAc,CA+ChB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,mBAAwB,GAChC,cAAc,CAyBhB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQjD"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Log rotation management for workflow run logs
|
|
3
|
+
*
|
|
4
|
+
* Implements automatic log rotation based on size and file count thresholds.
|
|
5
|
+
* Deletes oldest logs first until within limits.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { rotateIfNeeded, getLogStats, manualRotate } from './log-rotation';
|
|
10
|
+
*
|
|
11
|
+
* // Auto-rotate after a run
|
|
12
|
+
* await rotateIfNeeded('.sequant/logs');
|
|
13
|
+
*
|
|
14
|
+
* // Get statistics
|
|
15
|
+
* const stats = await getLogStats('.sequant/logs');
|
|
16
|
+
* console.log(`${stats.fileCount} files, ${stats.totalSizeMB.toFixed(2)}MB`);
|
|
17
|
+
*
|
|
18
|
+
* // Manual rotation with dry-run
|
|
19
|
+
* const result = await manualRotate('.sequant/logs', { dryRun: true });
|
|
20
|
+
* console.log(`Would delete ${result.deletedCount} files`);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
import * as fs from "fs";
|
|
24
|
+
import * as path from "path";
|
|
25
|
+
import * as os from "os";
|
|
26
|
+
/**
|
|
27
|
+
* Default rotation settings
|
|
28
|
+
*/
|
|
29
|
+
export const DEFAULT_ROTATION_SETTINGS = {
|
|
30
|
+
enabled: true,
|
|
31
|
+
maxSizeMB: 10,
|
|
32
|
+
maxFiles: 100,
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Resolve a path, replacing ~ with home directory
|
|
36
|
+
*/
|
|
37
|
+
function resolvePath(logPath) {
|
|
38
|
+
return logPath.replace("~", os.homedir());
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get list of log files with metadata, sorted by modification time (oldest first)
|
|
42
|
+
*/
|
|
43
|
+
export function getLogFiles(logDir) {
|
|
44
|
+
const resolved = resolvePath(logDir);
|
|
45
|
+
if (!fs.existsSync(resolved)) {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
const files = fs
|
|
49
|
+
.readdirSync(resolved)
|
|
50
|
+
.filter((f) => f.startsWith("run-") && f.endsWith(".json"));
|
|
51
|
+
const fileInfos = files.map((filename) => {
|
|
52
|
+
const filePath = path.join(resolved, filename);
|
|
53
|
+
const stats = fs.statSync(filePath);
|
|
54
|
+
return {
|
|
55
|
+
filename,
|
|
56
|
+
filePath,
|
|
57
|
+
mtime: stats.mtime,
|
|
58
|
+
size: stats.size,
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
// Sort by modification time, oldest first
|
|
62
|
+
return fileInfos.sort((a, b) => a.mtime.getTime() - b.mtime.getTime());
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get statistics about the log directory
|
|
66
|
+
*
|
|
67
|
+
* @param logDir - Path to log directory
|
|
68
|
+
* @param settings - Rotation settings for threshold comparison
|
|
69
|
+
* @returns Log directory statistics
|
|
70
|
+
*/
|
|
71
|
+
export function getLogStats(logDir, settings = DEFAULT_ROTATION_SETTINGS) {
|
|
72
|
+
const files = getLogFiles(logDir);
|
|
73
|
+
if (files.length === 0) {
|
|
74
|
+
return {
|
|
75
|
+
totalSizeBytes: 0,
|
|
76
|
+
totalSizeMB: 0,
|
|
77
|
+
fileCount: 0,
|
|
78
|
+
oldestFile: null,
|
|
79
|
+
newestFile: null,
|
|
80
|
+
exceedsSizeThreshold: false,
|
|
81
|
+
exceedsCountThreshold: false,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
const totalSizeBytes = files.reduce((sum, f) => sum + f.size, 0);
|
|
85
|
+
const totalSizeMB = totalSizeBytes / (1024 * 1024);
|
|
86
|
+
return {
|
|
87
|
+
totalSizeBytes,
|
|
88
|
+
totalSizeMB,
|
|
89
|
+
fileCount: files.length,
|
|
90
|
+
oldestFile: files[0].filename,
|
|
91
|
+
newestFile: files[files.length - 1].filename,
|
|
92
|
+
exceedsSizeThreshold: totalSizeMB > settings.maxSizeMB,
|
|
93
|
+
exceedsCountThreshold: files.length > settings.maxFiles,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Calculate which files need to be deleted to meet thresholds
|
|
98
|
+
*
|
|
99
|
+
* Applies a 10% buffer (stops at 90% of threshold) to prevent
|
|
100
|
+
* immediate re-rotation on next run.
|
|
101
|
+
*
|
|
102
|
+
* @param logDir - Path to log directory
|
|
103
|
+
* @param settings - Rotation settings
|
|
104
|
+
* @returns List of files to delete (oldest first)
|
|
105
|
+
*/
|
|
106
|
+
export function getFilesToDelete(logDir, settings) {
|
|
107
|
+
const files = getLogFiles(logDir);
|
|
108
|
+
if (files.length === 0) {
|
|
109
|
+
return [];
|
|
110
|
+
}
|
|
111
|
+
const stats = getLogStats(logDir, settings);
|
|
112
|
+
// Check if rotation is needed
|
|
113
|
+
if (!stats.exceedsSizeThreshold && !stats.exceedsCountThreshold) {
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
// Target thresholds with 10% buffer (stop at 90%)
|
|
117
|
+
const targetSizeBytes = settings.maxSizeMB * 1024 * 1024 * 0.9;
|
|
118
|
+
const targetCount = Math.floor(settings.maxFiles * 0.9);
|
|
119
|
+
const toDelete = [];
|
|
120
|
+
let currentSize = stats.totalSizeBytes;
|
|
121
|
+
let currentCount = stats.fileCount;
|
|
122
|
+
// Delete oldest files first until under thresholds
|
|
123
|
+
for (const file of files) {
|
|
124
|
+
const sizeOk = currentSize <= targetSizeBytes;
|
|
125
|
+
const countOk = currentCount <= targetCount;
|
|
126
|
+
if (sizeOk && countOk) {
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
toDelete.push(file);
|
|
130
|
+
currentSize -= file.size;
|
|
131
|
+
currentCount--;
|
|
132
|
+
}
|
|
133
|
+
return toDelete;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Rotate logs if needed (automatic rotation)
|
|
137
|
+
*
|
|
138
|
+
* Called after LogWriter.finalize() to clean up old logs.
|
|
139
|
+
*
|
|
140
|
+
* @param logDir - Path to log directory
|
|
141
|
+
* @param settings - Rotation settings
|
|
142
|
+
* @returns Rotation result
|
|
143
|
+
*/
|
|
144
|
+
export function rotateIfNeeded(logDir, settings = DEFAULT_ROTATION_SETTINGS) {
|
|
145
|
+
if (!settings.enabled) {
|
|
146
|
+
return {
|
|
147
|
+
deletedFiles: [],
|
|
148
|
+
deletedCount: 0,
|
|
149
|
+
bytesReclaimed: 0,
|
|
150
|
+
rotated: false,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
const resolved = resolvePath(logDir);
|
|
154
|
+
const toDelete = getFilesToDelete(logDir, settings);
|
|
155
|
+
if (toDelete.length === 0) {
|
|
156
|
+
return {
|
|
157
|
+
deletedFiles: [],
|
|
158
|
+
deletedCount: 0,
|
|
159
|
+
bytesReclaimed: 0,
|
|
160
|
+
rotated: false,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
let bytesReclaimed = 0;
|
|
164
|
+
const deletedFiles = [];
|
|
165
|
+
for (const file of toDelete) {
|
|
166
|
+
try {
|
|
167
|
+
fs.unlinkSync(file.filePath);
|
|
168
|
+
deletedFiles.push(file.filename);
|
|
169
|
+
bytesReclaimed += file.size;
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
return {
|
|
173
|
+
deletedFiles,
|
|
174
|
+
deletedCount: deletedFiles.length,
|
|
175
|
+
bytesReclaimed,
|
|
176
|
+
rotated: deletedFiles.length > 0,
|
|
177
|
+
error: `Failed to delete ${file.filename}: ${err instanceof Error ? err.message : String(err)}`,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
deletedFiles,
|
|
183
|
+
deletedCount: deletedFiles.length,
|
|
184
|
+
bytesReclaimed,
|
|
185
|
+
rotated: true,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Manual rotation triggered by CLI command
|
|
190
|
+
*
|
|
191
|
+
* Supports dry-run mode to preview what would be deleted.
|
|
192
|
+
*
|
|
193
|
+
* @param logDir - Path to log directory
|
|
194
|
+
* @param options - Manual rotation options
|
|
195
|
+
* @returns Rotation result
|
|
196
|
+
*/
|
|
197
|
+
export function manualRotate(logDir, options = {}) {
|
|
198
|
+
const settings = options.settings ?? DEFAULT_ROTATION_SETTINGS;
|
|
199
|
+
const toDelete = getFilesToDelete(logDir, settings);
|
|
200
|
+
if (toDelete.length === 0) {
|
|
201
|
+
return {
|
|
202
|
+
deletedFiles: [],
|
|
203
|
+
deletedCount: 0,
|
|
204
|
+
bytesReclaimed: 0,
|
|
205
|
+
rotated: false,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
// Dry run - just report what would be deleted
|
|
209
|
+
if (options.dryRun) {
|
|
210
|
+
return {
|
|
211
|
+
deletedFiles: toDelete.map((f) => f.filename),
|
|
212
|
+
deletedCount: toDelete.length,
|
|
213
|
+
bytesReclaimed: toDelete.reduce((sum, f) => sum + f.size, 0),
|
|
214
|
+
rotated: false,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
// Actual deletion
|
|
218
|
+
return rotateIfNeeded(logDir, settings);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Format bytes for human-readable display
|
|
222
|
+
*/
|
|
223
|
+
export function formatBytes(bytes) {
|
|
224
|
+
if (bytes < 1024) {
|
|
225
|
+
return `${bytes} B`;
|
|
226
|
+
}
|
|
227
|
+
if (bytes < 1024 * 1024) {
|
|
228
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
229
|
+
}
|
|
230
|
+
return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=log-rotation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-rotation.js","sourceRoot":"","sources":["../../../../src/lib/workflow/log-rotation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-rotation.test.d.ts","sourceRoot":"","sources":["../../../../src/lib/workflow/log-rotation.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|