@planu/cli 0.35.2 → 0.37.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/dist/config/license-plans.json +2 -1
- package/dist/engine/docs-site-generator/dashboard-renderer.d.ts +3 -0
- package/dist/engine/docs-site-generator/dashboard-renderer.d.ts.map +1 -0
- package/dist/engine/docs-site-generator/dashboard-renderer.js +84 -0
- package/dist/engine/docs-site-generator/dashboard-renderer.js.map +1 -0
- package/dist/engine/docs-site-generator/data-collector.d.ts +5 -0
- package/dist/engine/docs-site-generator/data-collector.d.ts.map +1 -0
- package/dist/engine/docs-site-generator/data-collector.js +300 -0
- package/dist/engine/docs-site-generator/data-collector.js.map +1 -0
- package/dist/engine/docs-site-generator/diagrams-renderer.d.ts +2 -0
- package/dist/engine/docs-site-generator/diagrams-renderer.d.ts.map +1 -0
- package/dist/engine/docs-site-generator/diagrams-renderer.js +40 -0
- package/dist/engine/docs-site-generator/diagrams-renderer.js.map +1 -0
- package/dist/engine/docs-site-generator/html-templates.d.ts +12 -0
- package/dist/engine/docs-site-generator/html-templates.d.ts.map +1 -0
- package/dist/engine/docs-site-generator/html-templates.js +359 -0
- package/dist/engine/docs-site-generator/html-templates.js.map +1 -0
- package/dist/engine/docs-site-generator/index.d.ts +3 -0
- package/dist/engine/docs-site-generator/index.d.ts.map +1 -0
- package/dist/engine/docs-site-generator/index.js +74 -0
- package/dist/engine/docs-site-generator/index.js.map +1 -0
- package/dist/engine/docs-site-generator/markdown-renderer.d.ts +6 -0
- package/dist/engine/docs-site-generator/markdown-renderer.d.ts.map +1 -0
- package/dist/engine/docs-site-generator/markdown-renderer.js +168 -0
- package/dist/engine/docs-site-generator/markdown-renderer.js.map +1 -0
- package/dist/engine/docs-site-generator/spec-renderer.d.ts +4 -0
- package/dist/engine/docs-site-generator/spec-renderer.d.ts.map +1 -0
- package/dist/engine/docs-site-generator/spec-renderer.js +81 -0
- package/dist/engine/docs-site-generator/spec-renderer.js.map +1 -0
- package/dist/engine/docs-site-generator/tools-renderer.d.ts +3 -0
- package/dist/engine/docs-site-generator/tools-renderer.d.ts.map +1 -0
- package/dist/engine/docs-site-generator/tools-renderer.js +55 -0
- package/dist/engine/docs-site-generator/tools-renderer.js.map +1 -0
- package/dist/engine/safety/atomic-writer.d.ts +22 -0
- package/dist/engine/safety/atomic-writer.d.ts.map +1 -0
- package/dist/engine/safety/atomic-writer.js +89 -0
- package/dist/engine/safety/atomic-writer.js.map +1 -0
- package/dist/engine/safety/circuit-breaker.d.ts +14 -0
- package/dist/engine/safety/circuit-breaker.d.ts.map +1 -0
- package/dist/engine/safety/circuit-breaker.js +63 -0
- package/dist/engine/safety/circuit-breaker.js.map +1 -0
- package/dist/engine/safety/file-mutex.d.ts +13 -0
- package/dist/engine/safety/file-mutex.d.ts.map +1 -0
- package/dist/engine/safety/file-mutex.js +108 -0
- package/dist/engine/safety/file-mutex.js.map +1 -0
- package/dist/engine/safety/health-monitor.d.ts +4 -0
- package/dist/engine/safety/health-monitor.d.ts.map +1 -0
- package/dist/engine/safety/health-monitor.js +95 -0
- package/dist/engine/safety/health-monitor.js.map +1 -0
- package/dist/engine/safety/index.d.ts +7 -0
- package/dist/engine/safety/index.d.ts.map +1 -0
- package/dist/engine/safety/index.js +8 -0
- package/dist/engine/safety/index.js.map +1 -0
- package/dist/engine/safety/path-sanitizer.d.ts +17 -0
- package/dist/engine/safety/path-sanitizer.d.ts.map +1 -0
- package/dist/engine/safety/path-sanitizer.js +36 -0
- package/dist/engine/safety/path-sanitizer.js.map +1 -0
- package/dist/engine/safety/transaction.d.ts +18 -0
- package/dist/engine/safety/transaction.d.ts.map +1 -0
- package/dist/engine/safety/transaction.js +70 -0
- package/dist/engine/safety/transaction.js.map +1 -0
- package/dist/engine/webhook/server.d.ts +4 -10
- package/dist/engine/webhook/server.d.ts.map +1 -1
- package/dist/engine/webhook/server.js +78 -24
- package/dist/engine/webhook/server.js.map +1 -1
- package/dist/resources/process.js +2 -2
- package/dist/resources/process.js.map +1 -1
- package/dist/storage/base-store.d.ts.map +1 -1
- package/dist/storage/base-store.js +3 -2
- package/dist/storage/base-store.js.map +1 -1
- package/dist/storage/trash-store.d.ts +10 -0
- package/dist/storage/trash-store.d.ts.map +1 -1
- package/dist/storage/trash-store.js +74 -0
- package/dist/storage/trash-store.js.map +1 -1
- package/dist/tools/check-config-health.d.ts.map +1 -1
- package/dist/tools/check-config-health.js +2 -1
- package/dist/tools/check-config-health.js.map +1 -1
- package/dist/tools/generate-docs-site.d.ts +3 -0
- package/dist/tools/generate-docs-site.d.ts.map +1 -0
- package/dist/tools/generate-docs-site.js +25 -0
- package/dist/tools/generate-docs-site.js.map +1 -0
- package/dist/tools/generate-teammate-prompt.d.ts.map +1 -1
- package/dist/tools/generate-teammate-prompt.js +7 -4
- package/dist/tools/generate-teammate-prompt.js.map +1 -1
- package/dist/tools/plan-team-distribution.d.ts.map +1 -1
- package/dist/tools/plan-team-distribution.js +6 -2
- package/dist/tools/plan-team-distribution.js.map +1 -1
- package/dist/tools/register-agent-tools.d.ts.map +1 -1
- package/dist/tools/register-agent-tools.js +32 -14
- package/dist/tools/register-agent-tools.js.map +1 -1
- package/dist/tools/register-changelog-tools.d.ts.map +1 -1
- package/dist/tools/register-changelog-tools.js +6 -2
- package/dist/tools/register-changelog-tools.js.map +1 -1
- package/dist/tools/register-ci-tools.d.ts.map +1 -1
- package/dist/tools/register-ci-tools.js +12 -3
- package/dist/tools/register-ci-tools.js.map +1 -1
- package/dist/tools/register-context-tools.d.ts.map +1 -1
- package/dist/tools/register-context-tools.js +32 -11
- package/dist/tools/register-context-tools.js.map +1 -1
- package/dist/tools/register-coverage-tools.d.ts.map +1 -1
- package/dist/tools/register-coverage-tools.js +2 -1
- package/dist/tools/register-coverage-tools.js.map +1 -1
- package/dist/tools/register-delete-tools.d.ts.map +1 -1
- package/dist/tools/register-delete-tools.js +9 -8
- package/dist/tools/register-delete-tools.js.map +1 -1
- package/dist/tools/register-event-tools.d.ts.map +1 -1
- package/dist/tools/register-event-tools.js +69 -33
- package/dist/tools/register-event-tools.js.map +1 -1
- package/dist/tools/register-facilitator-tools.d.ts.map +1 -1
- package/dist/tools/register-facilitator-tools.js +10 -2
- package/dist/tools/register-facilitator-tools.js.map +1 -1
- package/dist/tools/register-governance-tools.d.ts.map +1 -1
- package/dist/tools/register-governance-tools.js +4 -1
- package/dist/tools/register-governance-tools.js.map +1 -1
- package/dist/tools/register-hooks-tools.d.ts.map +1 -1
- package/dist/tools/register-hooks-tools.js +45 -18
- package/dist/tools/register-hooks-tools.js.map +1 -1
- package/dist/tools/register-ide-tools.js +1 -1
- package/dist/tools/register-ide-tools.js.map +1 -1
- package/dist/tools/register-learning-tools.d.ts.map +1 -1
- package/dist/tools/register-learning-tools.js +7 -1
- package/dist/tools/register-learning-tools.js.map +1 -1
- package/dist/tools/register-license-tools.d.ts.map +1 -1
- package/dist/tools/register-license-tools.js +6 -1
- package/dist/tools/register-license-tools.js.map +1 -1
- package/dist/tools/register-llm-provider-tools.d.ts.map +1 -1
- package/dist/tools/register-llm-provider-tools.js +13 -9
- package/dist/tools/register-llm-provider-tools.js.map +1 -1
- package/dist/tools/register-memory-tools.d.ts.map +1 -1
- package/dist/tools/register-memory-tools.js +17 -6
- package/dist/tools/register-memory-tools.js.map +1 -1
- package/dist/tools/register-migration-tools.d.ts.map +1 -1
- package/dist/tools/register-migration-tools.js +8 -1
- package/dist/tools/register-migration-tools.js.map +1 -1
- package/dist/tools/register-orchestrator-tools.d.ts.map +1 -1
- package/dist/tools/register-orchestrator-tools.js +15 -14
- package/dist/tools/register-orchestrator-tools.js.map +1 -1
- package/dist/tools/register-platform-tools/design-stack-tools.d.ts.map +1 -1
- package/dist/tools/register-platform-tools/design-stack-tools.js +62 -35
- package/dist/tools/register-platform-tools/design-stack-tools.js.map +1 -1
- package/dist/tools/register-platform-tools/lifecycle-infra-tools.d.ts.map +1 -1
- package/dist/tools/register-platform-tools/lifecycle-infra-tools.js +72 -36
- package/dist/tools/register-platform-tools/lifecycle-infra-tools.js.map +1 -1
- package/dist/tools/register-readiness-tools.js +4 -4
- package/dist/tools/register-readiness-tools.js.map +1 -1
- package/dist/tools/register-runtime-security-tools.js +1 -1
- package/dist/tools/register-runtime-security-tools.js.map +1 -1
- package/dist/tools/register-scope-tools.d.ts.map +1 -1
- package/dist/tools/register-scope-tools.js +26 -6
- package/dist/tools/register-scope-tools.js.map +1 -1
- package/dist/tools/register-search-tools.js +2 -2
- package/dist/tools/register-search-tools.js.map +1 -1
- package/dist/tools/register-security-tools.d.ts.map +1 -1
- package/dist/tools/register-security-tools.js +4 -3
- package/dist/tools/register-security-tools.js.map +1 -1
- package/dist/tools/register-spec-tools/analysis-tools.d.ts.map +1 -1
- package/dist/tools/register-spec-tools/analysis-tools.js +36 -25
- package/dist/tools/register-spec-tools/analysis-tools.js.map +1 -1
- package/dist/tools/register-spec-tools/core-spec-tools.d.ts.map +1 -1
- package/dist/tools/register-spec-tools/core-spec-tools.js +38 -24
- package/dist/tools/register-spec-tools/core-spec-tools.js.map +1 -1
- package/dist/tools/register-stack-tools.d.ts.map +1 -1
- package/dist/tools/register-stack-tools.js +18 -10
- package/dist/tools/register-stack-tools.js.map +1 -1
- package/dist/tools/register-team-tools.d.ts.map +1 -1
- package/dist/tools/register-team-tools.js +17 -9
- package/dist/tools/register-team-tools.js.map +1 -1
- package/dist/tools/register-template-tools.d.ts.map +1 -1
- package/dist/tools/register-template-tools.js +13 -2
- package/dist/tools/register-template-tools.js.map +1 -1
- package/dist/tools/register-transform-tools.d.ts.map +1 -1
- package/dist/tools/register-transform-tools.js +3 -2
- package/dist/tools/register-transform-tools.js.map +1 -1
- package/dist/tools/register-workspace-tools.d.ts.map +1 -1
- package/dist/tools/register-workspace-tools.js +21 -1
- package/dist/tools/register-workspace-tools.js.map +1 -1
- package/dist/tools/schemas/github.d.ts.map +1 -1
- package/dist/tools/schemas/github.js +18 -9
- package/dist/tools/schemas/github.js.map +1 -1
- package/dist/tools/schemas/ide-config.js +1 -1
- package/dist/tools/schemas/ide-config.js.map +1 -1
- package/dist/tools/schemas/plugins-schemas.d.ts.map +1 -1
- package/dist/tools/schemas/plugins-schemas.js +15 -4
- package/dist/tools/schemas/plugins-schemas.js.map +1 -1
- package/dist/tools/schemas/registry.d.ts.map +1 -1
- package/dist/tools/schemas/registry.js +27 -10
- package/dist/tools/schemas/registry.js.map +1 -1
- package/dist/tools/schemas/session.d.ts.map +1 -1
- package/dist/tools/schemas/session.js +5 -3
- package/dist/tools/schemas/session.js.map +1 -1
- package/dist/tools/schemas/workers-schema.d.ts.map +1 -1
- package/dist/tools/schemas/workers-schema.js +16 -9
- package/dist/tools/schemas/workers-schema.js.map +1 -1
- package/dist/tools/validate-team-results.d.ts.map +1 -1
- package/dist/tools/validate-team-results.js +9 -3
- package/dist/tools/validate-team-results.js.map +1 -1
- package/dist/types/docs.d.ts +51 -0
- package/dist/types/docs.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/safe-schemas.d.ts +12 -0
- package/dist/types/safe-schemas.d.ts.map +1 -0
- package/dist/types/safe-schemas.js +27 -0
- package/dist/types/safe-schemas.js.map +1 -0
- package/dist/types/safety.d.ts +66 -0
- package/dist/types/safety.d.ts.map +1 -0
- package/dist/types/safety.js +3 -0
- package/dist/types/safety.js.map +1 -0
- package/package.json +1 -1
- package/src/config/license-plans.json +2 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { SafePath } from '../../types/safety.js';
|
|
2
|
+
export declare class PathViolationError extends Error {
|
|
3
|
+
readonly code: "PATH_VIOLATION";
|
|
4
|
+
readonly input: string;
|
|
5
|
+
constructor(message: string, input: string);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Sanitizes a path ensuring it stays within projectRoot.
|
|
9
|
+
* Returns a branded SafePath on success.
|
|
10
|
+
*
|
|
11
|
+
* Checks:
|
|
12
|
+
* 1. No null bytes
|
|
13
|
+
* 2. Path length <= 4096
|
|
14
|
+
* 3. Resolved path does not escape projectRoot (relative check)
|
|
15
|
+
*/
|
|
16
|
+
export declare function sanitizePath(input: string, projectRoot: string): SafePath;
|
|
17
|
+
//# sourceMappingURL=path-sanitizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-sanitizer.d.ts","sourceRoot":"","sources":["../../../src/engine/safety/path-sanitizer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAItD,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAG,gBAAgB,CAAU;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CAK3C;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,QAAQ,CA0BzE"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// SPEC-094 AC-3: Path sanitizer — prevents path traversal attacks
|
|
2
|
+
import { resolve, normalize, relative } from 'node:path';
|
|
3
|
+
const MAX_PATH_LENGTH = 4096;
|
|
4
|
+
export class PathViolationError extends Error {
|
|
5
|
+
code = 'PATH_VIOLATION';
|
|
6
|
+
input;
|
|
7
|
+
constructor(message, input) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = 'PathViolationError';
|
|
10
|
+
this.input = input;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Sanitizes a path ensuring it stays within projectRoot.
|
|
15
|
+
* Returns a branded SafePath on success.
|
|
16
|
+
*
|
|
17
|
+
* Checks:
|
|
18
|
+
* 1. No null bytes
|
|
19
|
+
* 2. Path length <= 4096
|
|
20
|
+
* 3. Resolved path does not escape projectRoot (relative check)
|
|
21
|
+
*/
|
|
22
|
+
export function sanitizePath(input, projectRoot) {
|
|
23
|
+
if (input.includes('\0')) {
|
|
24
|
+
throw new PathViolationError('Path contains null bytes. Remove null characters and retry.', input);
|
|
25
|
+
}
|
|
26
|
+
if (input.length > MAX_PATH_LENGTH) {
|
|
27
|
+
throw new PathViolationError(`Path exceeds maximum length of ${MAX_PATH_LENGTH} characters. Use a shorter path.`, input);
|
|
28
|
+
}
|
|
29
|
+
const resolved = normalize(resolve(projectRoot, input));
|
|
30
|
+
const rel = relative(projectRoot, resolved);
|
|
31
|
+
if (rel.startsWith('..') || rel.startsWith('/')) {
|
|
32
|
+
throw new PathViolationError(`Path "${input}" escapes project root. Use a path within the project directory.`, input);
|
|
33
|
+
}
|
|
34
|
+
return resolved;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=path-sanitizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-sanitizer.js","sourceRoot":"","sources":["../../../src/engine/safety/path-sanitizer.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAElE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGzD,MAAM,eAAe,GAAG,IAAI,CAAC;AAE7B,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,GAAG,gBAAyB,CAAC;IACjC,KAAK,CAAS;IAEvB,YAAY,OAAe,EAAE,KAAa;QACxC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,WAAmB;IAC7D,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,kBAAkB,CAC1B,6DAA6D,EAC7D,KAAK,CACN,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;QACnC,MAAM,IAAI,kBAAkB,CAC1B,kCAAkC,eAAe,kCAAkC,EACnF,KAAK,CACN,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAE5C,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,kBAAkB,CAC1B,SAAS,KAAK,kEAAkE,EAChF,KAAK,CACN,CAAC;IACJ,CAAC;IAED,OAAO,QAAoB,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ErrorSeverity, RollbackEvent, SafetyErrorCode, TransactionStep } from '../../types/safety.js';
|
|
2
|
+
export declare class SafetyTransactionError extends Error {
|
|
3
|
+
readonly code: SafetyErrorCode;
|
|
4
|
+
readonly severity: ErrorSeverity;
|
|
5
|
+
readonly recovery: string;
|
|
6
|
+
readonly rollbackEvent: RollbackEvent;
|
|
7
|
+
constructor(message: string, code: SafetyErrorCode, severity: ErrorSeverity, recovery: string, rollbackEvent: RollbackEvent);
|
|
8
|
+
}
|
|
9
|
+
export declare class Transaction {
|
|
10
|
+
readonly id: string;
|
|
11
|
+
private readonly steps;
|
|
12
|
+
private readonly completedSteps;
|
|
13
|
+
constructor();
|
|
14
|
+
addStep(step: TransactionStep): void;
|
|
15
|
+
commit(): Promise<void>;
|
|
16
|
+
rollback(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=transaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/engine/safety/transaction.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,eAAe,EACf,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAE/B,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;gBAGpC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,aAAa;CAS/B;AAmBD,qBAAa,WAAW;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;;IAM/C,OAAO,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAI9B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BvB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAehC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// SPEC-094 AC-2 + AC-10: Transaction with auto-rollback and error classification
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
export class SafetyTransactionError extends Error {
|
|
4
|
+
code;
|
|
5
|
+
severity;
|
|
6
|
+
recovery;
|
|
7
|
+
rollbackEvent;
|
|
8
|
+
constructor(message, code, severity, recovery, rollbackEvent) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = 'SafetyTransactionError';
|
|
11
|
+
this.code = code;
|
|
12
|
+
this.severity = severity;
|
|
13
|
+
this.recovery = recovery;
|
|
14
|
+
this.rollbackEvent = rollbackEvent;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function createRollbackEvent(transactionId, failedStep, stepsRolledBack, error) {
|
|
18
|
+
const event = {
|
|
19
|
+
transactionId,
|
|
20
|
+
failedStep,
|
|
21
|
+
stepsRolledBack,
|
|
22
|
+
error,
|
|
23
|
+
timestamp: new Date().toISOString(),
|
|
24
|
+
};
|
|
25
|
+
console.warn('[Transaction] Rollback event:', JSON.stringify(event));
|
|
26
|
+
return event;
|
|
27
|
+
}
|
|
28
|
+
export class Transaction {
|
|
29
|
+
id;
|
|
30
|
+
steps = [];
|
|
31
|
+
completedSteps = [];
|
|
32
|
+
constructor() {
|
|
33
|
+
this.id = randomUUID();
|
|
34
|
+
}
|
|
35
|
+
addStep(step) {
|
|
36
|
+
this.steps.push(step);
|
|
37
|
+
}
|
|
38
|
+
async commit() {
|
|
39
|
+
for (const step of this.steps) {
|
|
40
|
+
try {
|
|
41
|
+
await step.doFn();
|
|
42
|
+
this.completedSteps.push(step.name);
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
46
|
+
await this.rollback();
|
|
47
|
+
const rollbackEvent = createRollbackEvent(this.id, step.name, [...this.completedSteps], errorMessage);
|
|
48
|
+
throw new SafetyTransactionError(`Transaction failed at step "${step.name}": ${errorMessage}`, 'ROLLBACK_TRIGGERED', 'critical', `Review the failed step "${step.name}" and retry the operation. ` +
|
|
49
|
+
`${this.completedSteps.length} step(s) were rolled back.`, rollbackEvent);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async rollback() {
|
|
54
|
+
const stepsToUndo = [...this.completedSteps].reverse();
|
|
55
|
+
for (const stepName of stepsToUndo) {
|
|
56
|
+
const step = this.steps.find((s) => s.name === stepName);
|
|
57
|
+
if (!step) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
await step.undoFn();
|
|
62
|
+
}
|
|
63
|
+
catch (undoErr) {
|
|
64
|
+
const msg = undoErr instanceof Error ? undoErr.message : String(undoErr);
|
|
65
|
+
console.warn(`[Transaction] Undo failed for step "${stepName}": ${msg}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=transaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../../src/engine/safety/transaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,16 +3,10 @@ import type { WebhookServerState } from '../../types/index.js';
|
|
|
3
3
|
export declare function getWebhookState(): WebhookServerState;
|
|
4
4
|
/** Replaces the webhook secret used for HMAC-SHA256 validation. */
|
|
5
5
|
export declare function setWebhookSecret(secret: string): void;
|
|
6
|
-
/**
|
|
7
|
-
* Starts the HTTP webhook server on the given port.
|
|
8
|
-
* Idempotent: if already running on the same port, returns the current state.
|
|
9
|
-
*
|
|
10
|
-
* @throws if the port is in use or an OS-level error occurs
|
|
11
|
-
*/
|
|
6
|
+
/** Starts the HTTP webhook server on the given port. Idempotent. */
|
|
12
7
|
export declare function startWebhookServer(port?: number): Promise<WebhookServerState>;
|
|
13
|
-
/**
|
|
14
|
-
* Stops the running webhook server gracefully.
|
|
15
|
-
* Idempotent: if already stopped, returns idle state.
|
|
16
|
-
*/
|
|
8
|
+
/** Stops the running webhook server gracefully. Idempotent. */
|
|
17
9
|
export declare function stopWebhookServer(): Promise<WebhookServerState>;
|
|
10
|
+
/** Reset replay protection state (for testing only). */
|
|
11
|
+
export declare function _resetReplayState(): void;
|
|
18
12
|
//# sourceMappingURL=server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/engine/webhook/server.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAGV,kBAAkB,EACnB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/engine/webhook/server.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAGV,kBAAkB,EACnB,MAAM,sBAAsB,CAAC;AAuB9B,qEAAqE;AACrE,wBAAgB,eAAe,IAAI,kBAAkB,CAEpD;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAErD;AAED,oEAAoE;AACpE,wBAAsB,kBAAkB,CAAC,IAAI,GAAE,MAAqB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAwBjG;AAED,+DAA+D;AAC/D,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAoBrE;AAyGD,wDAAwD;AACxD,wBAAgB,iBAAiB,IAAI,IAAI,CAIxC"}
|
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
// engine/webhook/server.ts — Lightweight HTTP webhook receiver using node:http.
|
|
2
2
|
// No framework dependencies — only built-in Node.js modules.
|
|
3
3
|
import { createServer } from 'node:http';
|
|
4
|
-
import { randomUUID } from 'node:crypto';
|
|
4
|
+
import { randomUUID, createHash } from 'node:crypto';
|
|
5
5
|
import { validateSignature, extractSignatureHeader } from './signature.js';
|
|
6
6
|
import { dispatchWebhookEvent } from './event-handlers.js';
|
|
7
|
-
// ---------------------------------------------------------------------------
|
|
8
7
|
// Constants
|
|
9
|
-
// ---------------------------------------------------------------------------
|
|
10
8
|
const DEFAULT_PORT = 2358;
|
|
11
9
|
const MAX_RECENT_EVENTS = 20;
|
|
12
10
|
const MAX_BODY_SIZE = 1024 * 1024; // 1 MB
|
|
13
|
-
|
|
11
|
+
const NONCE_CACHE_SIZE = 1000;
|
|
12
|
+
const MAX_TIMESTAMP_AGE_MS = 5 * 60 * 1000; // 5 minutes
|
|
13
|
+
const RATE_LIMIT_WINDOW_MS = 60 * 1000;
|
|
14
|
+
const RATE_LIMIT_MAX = 10;
|
|
14
15
|
// Module state
|
|
15
|
-
// ---------------------------------------------------------------------------
|
|
16
16
|
let activeServer = null;
|
|
17
17
|
let serverState = makeIdleState();
|
|
18
18
|
let webhookSecret = '';
|
|
19
|
-
|
|
19
|
+
const recentNonces = new Set();
|
|
20
|
+
const nonceQueue = [];
|
|
21
|
+
const rateLimitMap = new Map();
|
|
20
22
|
// Public API
|
|
21
|
-
// ---------------------------------------------------------------------------
|
|
22
23
|
/** Returns the current webhook server state (immutable snapshot). */
|
|
23
24
|
export function getWebhookState() {
|
|
24
25
|
return serverState;
|
|
@@ -27,12 +28,7 @@ export function getWebhookState() {
|
|
|
27
28
|
export function setWebhookSecret(secret) {
|
|
28
29
|
webhookSecret = secret;
|
|
29
30
|
}
|
|
30
|
-
/**
|
|
31
|
-
* Starts the HTTP webhook server on the given port.
|
|
32
|
-
* Idempotent: if already running on the same port, returns the current state.
|
|
33
|
-
*
|
|
34
|
-
* @throws if the port is in use or an OS-level error occurs
|
|
35
|
-
*/
|
|
31
|
+
/** Starts the HTTP webhook server on the given port. Idempotent. */
|
|
36
32
|
export async function startWebhookServer(port = DEFAULT_PORT) {
|
|
37
33
|
if (activeServer !== null) {
|
|
38
34
|
return serverState;
|
|
@@ -55,10 +51,7 @@ export async function startWebhookServer(port = DEFAULT_PORT) {
|
|
|
55
51
|
});
|
|
56
52
|
});
|
|
57
53
|
}
|
|
58
|
-
/**
|
|
59
|
-
* Stops the running webhook server gracefully.
|
|
60
|
-
* Idempotent: if already stopped, returns idle state.
|
|
61
|
-
*/
|
|
54
|
+
/** Stops the running webhook server gracefully. Idempotent. */
|
|
62
55
|
export async function stopWebhookServer() {
|
|
63
56
|
if (activeServer === null) {
|
|
64
57
|
serverState = makeIdleState();
|
|
@@ -79,9 +72,7 @@ export async function stopWebhookServer() {
|
|
|
79
72
|
});
|
|
80
73
|
});
|
|
81
74
|
}
|
|
82
|
-
// ---------------------------------------------------------------------------
|
|
83
75
|
// HTTP request handler
|
|
84
|
-
// ---------------------------------------------------------------------------
|
|
85
76
|
function handleRequest(req, res) {
|
|
86
77
|
if (req.method !== 'POST') {
|
|
87
78
|
res.writeHead(405, { 'Content-Type': 'text/plain' });
|
|
@@ -115,7 +106,74 @@ function collectBody(req) {
|
|
|
115
106
|
req.on('error', reject);
|
|
116
107
|
});
|
|
117
108
|
}
|
|
109
|
+
// Replay & rate-limit protection (SPEC-094 AC-7)
|
|
110
|
+
function isReplayAttack(headers, bodyStr) {
|
|
111
|
+
const tsHeader = headers['x-webhook-timestamp'] ?? headers['X-Webhook-Timestamp'];
|
|
112
|
+
const timestamp = typeof tsHeader === 'string' ? tsHeader : undefined;
|
|
113
|
+
if (timestamp) {
|
|
114
|
+
const age = Date.now() - new Date(timestamp).getTime();
|
|
115
|
+
if (age > MAX_TIMESTAMP_AGE_MS || age < -MAX_TIMESTAMP_AGE_MS) {
|
|
116
|
+
return 'Webhook timestamp too old or in the future';
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const nonce = extractNonce(headers, bodyStr);
|
|
120
|
+
if (nonce && recentNonces.has(nonce)) {
|
|
121
|
+
return 'Duplicate webhook (replay detected)';
|
|
122
|
+
}
|
|
123
|
+
if (nonce) {
|
|
124
|
+
trackNonce(nonce);
|
|
125
|
+
}
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
function extractNonce(headers, bodyStr) {
|
|
129
|
+
const idHeader = headers['x-webhook-id'] ?? headers['X-Webhook-Id'];
|
|
130
|
+
if (typeof idHeader === 'string') {
|
|
131
|
+
return idHeader;
|
|
132
|
+
}
|
|
133
|
+
return createHash('sha256').update(bodyStr).digest('hex').slice(0, 32);
|
|
134
|
+
}
|
|
135
|
+
function trackNonce(nonce) {
|
|
136
|
+
recentNonces.add(nonce);
|
|
137
|
+
nonceQueue.push(nonce);
|
|
138
|
+
while (nonceQueue.length > NONCE_CACHE_SIZE) {
|
|
139
|
+
const old = nonceQueue.shift();
|
|
140
|
+
if (old) {
|
|
141
|
+
recentNonces.delete(old);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
function isRateLimited(source) {
|
|
146
|
+
const now = Date.now();
|
|
147
|
+
const entry = rateLimitMap.get(source);
|
|
148
|
+
if (!entry || now - entry.windowStart > RATE_LIMIT_WINDOW_MS) {
|
|
149
|
+
rateLimitMap.set(source, { count: 1, windowStart: now });
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
entry.count++;
|
|
153
|
+
return entry.count > RATE_LIMIT_MAX;
|
|
154
|
+
}
|
|
155
|
+
/** Reset replay protection state (for testing only). */
|
|
156
|
+
export function _resetReplayState() {
|
|
157
|
+
recentNonces.clear();
|
|
158
|
+
nonceQueue.length = 0;
|
|
159
|
+
rateLimitMap.clear();
|
|
160
|
+
}
|
|
118
161
|
function processWebhookRequest(rawBody, headers, res) {
|
|
162
|
+
// Rate limiting
|
|
163
|
+
const source = String(headers['x-forwarded-for'] ?? headers['x-real-ip'] ?? 'unknown');
|
|
164
|
+
if (isRateLimited(source)) {
|
|
165
|
+
res.writeHead(429, { 'Content-Type': 'text/plain' });
|
|
166
|
+
res.end('Too Many Requests');
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
// Replay protection
|
|
170
|
+
const replayReason = isReplayAttack(headers, rawBody.toString('utf8'));
|
|
171
|
+
if (replayReason) {
|
|
172
|
+
recordEvent('replay_rejected', false, replayReason, '');
|
|
173
|
+
res.writeHead(409, { 'Content-Type': 'text/plain' });
|
|
174
|
+
res.end(replayReason);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
119
177
|
// Signature validation (only if a secret is configured)
|
|
120
178
|
if (webhookSecret) {
|
|
121
179
|
const sig = extractSignatureHeader(headers);
|
|
@@ -153,9 +211,7 @@ function processWebhookRequest(rawBody, headers, res) {
|
|
|
153
211
|
}
|
|
154
212
|
/* v8 ignore stop */
|
|
155
213
|
}
|
|
156
|
-
//
|
|
157
|
-
// Event recording (internal state update)
|
|
158
|
-
// ---------------------------------------------------------------------------
|
|
214
|
+
// Event recording
|
|
159
215
|
function recordEvent(_eventType, processed, summary, resolvedType) {
|
|
160
216
|
const record = {
|
|
161
217
|
id: randomUUID(),
|
|
@@ -172,9 +228,7 @@ function recordEvent(_eventType, processed, summary, resolvedType) {
|
|
|
172
228
|
recentEvents,
|
|
173
229
|
};
|
|
174
230
|
}
|
|
175
|
-
// ---------------------------------------------------------------------------
|
|
176
231
|
// Helpers
|
|
177
|
-
// ---------------------------------------------------------------------------
|
|
178
232
|
function makeIdleState() {
|
|
179
233
|
return {
|
|
180
234
|
running: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/engine/webhook/server.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,6DAA6D;AAE7D,OAAO,EAAE,YAAY,EAA0D,MAAM,WAAW,CAAC;AACjG,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/engine/webhook/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -92,13 +92,13 @@ function getSddProcess() {
|
|
|
92
92
|
{
|
|
93
93
|
id: 'documenting',
|
|
94
94
|
name: '8. Document & Ship',
|
|
95
|
-
tools: ['generate_docs', 'integrate_pm', 'learn_pattern'],
|
|
95
|
+
tools: ['generate_docs', 'generate_docs_site', 'integrate_pm', 'learn_pattern'],
|
|
96
96
|
description: 'Generate documentation. Sync with project management tools. ' +
|
|
97
97
|
'Learn patterns for future estimations.',
|
|
98
98
|
},
|
|
99
99
|
],
|
|
100
100
|
specLifecycle: ['draft', 'review', 'approved', 'implementing', 'done'],
|
|
101
|
-
totalTools:
|
|
101
|
+
totalTools: 104,
|
|
102
102
|
};
|
|
103
103
|
}
|
|
104
104
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/resources/process.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,8DAA8D;AAE9D,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAC;AAErC;;;GAGG;AACH,SAAS,aAAa;IACpB,OAAO;QACL,IAAI,EAAE,+BAA+B;QACrC,OAAO,EAAE,KAAK;QACd,WAAW,EACT,4DAA4D;YAC5D,yEAAyE;YACzE,gCAAgC;QAClC,MAAM,EAAE;YACN;gBACE,EAAE,EAAE,cAAc;gBAClB,IAAI,EAAE,eAAe;gBACrB,KAAK,EAAE,CAAC,cAAc,EAAE,mBAAmB,EAAE,cAAc,CAAC;gBAC5D,WAAW,EACT,qEAAqE;oBACrE,yEAAyE;aAC5E;YACD;gBACE,EAAE,EAAE,WAAW;gBACf,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE;oBACL,sBAAsB;oBACtB,eAAe;oBACf,gBAAgB;oBAChB,cAAc;oBACd,eAAe;oBACf,cAAc;oBACd,iBAAiB;iBAClB;gBACD,WAAW,EACT,sEAAsE;oBACtE,mEAAmE;aACtE;YACD;gBACE,EAAE,EAAE,eAAe;gBACnB,IAAI,EAAE,gBAAgB;gBACtB,KAAK,EAAE,CAAC,aAAa,EAAE,kBAAkB,EAAE,UAAU,CAAC;gBACtD,WAAW,EACT,yEAAyE;oBACzE,yEAAyE;aAC5E;YACD;gBACE,EAAE,EAAE,WAAW;gBACf,IAAI,EAAE,oBAAoB;gBAC1B,KAAK,EAAE;oBACL,cAAc;oBACd,eAAe;oBACf,oBAAoB;oBACpB,gBAAgB;oBAChB,yBAAyB;iBAC1B;gBACD,WAAW,EACT,8EAA8E;oBAC9E,wDAAwD;aAC3D;YACD;gBACE,EAAE,EAAE,WAAW;gBACf,IAAI,EAAE,WAAW;gBACjB,KAAK,EAAE;oBACL,gBAAgB;oBAChB,oBAAoB;oBACpB,gBAAgB;oBAChB,YAAY;oBACZ,eAAe;iBAChB;gBACD,WAAW,EACT,qEAAqE;oBACrE,+CAA+C;aAClD;YACD;gBACE,EAAE,EAAE,cAAc;gBAClB,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE;oBACL,gBAAgB;oBAChB,oBAAoB;oBACpB,gBAAgB;oBAChB,YAAY;oBACZ,gBAAgB;oBAChB,aAAa;iBACd;gBACD,WAAW,EACT,gEAAgE;oBAChE,qEAAqE;aACxE;YACD;gBACE,EAAE,EAAE,YAAY;gBAChB,IAAI,EAAE,aAAa;gBACnB,KAAK,EAAE,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,CAAC;gBAC9D,WAAW,EACT,0EAA0E;oBAC1E,8BAA8B;aACjC;YACD;gBACE,EAAE,EAAE,aAAa;gBACjB,IAAI,EAAE,oBAAoB;gBAC1B,KAAK,EAAE,CAAC,eAAe,EAAE,cAAc,EAAE,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/resources/process.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-store.d.ts","sourceRoot":"","sources":["../../src/storage/base-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"base-store.d.ts","sourceRoot":"","sources":["../../src/storage/base-store.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3D;AASD;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAc/E;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAc9E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// base-store.ts — Shared JSON read/write logic for all stores
|
|
2
|
-
import { readFile,
|
|
2
|
+
import { readFile, mkdir } from 'node:fs/promises';
|
|
3
3
|
import { dirname } from 'node:path';
|
|
4
4
|
import { createHash } from 'node:crypto';
|
|
5
|
+
import { writeJsonSafe } from '../engine/safety/atomic-writer.js';
|
|
5
6
|
/**
|
|
6
7
|
* Hash a project path into a deterministic projectId using SHA-256.
|
|
7
8
|
*/
|
|
@@ -40,7 +41,7 @@ export async function readJson(filePath, defaultValue) {
|
|
|
40
41
|
export async function writeJson(filePath, data) {
|
|
41
42
|
await ensureDir(filePath);
|
|
42
43
|
try {
|
|
43
|
-
await
|
|
44
|
+
await writeJsonSafe(filePath, data);
|
|
44
45
|
}
|
|
45
46
|
catch (err) {
|
|
46
47
|
/* v8 ignore next 2 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-store.js","sourceRoot":"","sources":["../../src/storage/base-store.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"base-store.js","sourceRoot":"","sources":["../../src/storage/base-store.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAElE;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,SAAS,CAAC,QAAgB;IACvC,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAI,QAAgB,EAAE,YAAe;IACjE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,2BAA2B,QAAQ,iBAAiB,CAAC,CAAC;YACnE,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9C,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,IAAa;IAC7D,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,sBAAsB;QACtB,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,wBAAwB,QAAQ,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,IAAI,KAAK,CACb,2BAA2B,QAAQ,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAC1F,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO,iBAAiB,SAAS,EAAE,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,aAAa,CAAC;AACvB,CAAC;AAMD,SAAS,WAAW,CAAC,GAAY;IAC/B,OAAO,GAAG,YAAY,KAAK,IAAI,MAAM,IAAI,GAAG,CAAC;AAC/C,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { TrashItem } from '../types/index.js';
|
|
2
|
+
import type { TrashCleanupConfig, TrashCleanupResult } from '../types/safety.js';
|
|
2
3
|
/**
|
|
3
4
|
* Load the trash manifest (list of all trashed items).
|
|
4
5
|
*/
|
|
@@ -32,4 +33,13 @@ export declare function countFiles(dirPath: string): Promise<number>;
|
|
|
32
33
|
* Check if a path exists.
|
|
33
34
|
*/
|
|
34
35
|
export declare function pathExists(p: string): Promise<boolean>;
|
|
36
|
+
/**
|
|
37
|
+
* Recursively sum file sizes in a directory.
|
|
38
|
+
*/
|
|
39
|
+
export declare function getDirSize(dirPath: string): Promise<number>;
|
|
40
|
+
/**
|
|
41
|
+
* Auto-clean trash items that exceed age or total size limits.
|
|
42
|
+
* Purges oldest items first. Lazy: call on trash operations.
|
|
43
|
+
*/
|
|
44
|
+
export declare function autoCleanTrash(projectId: string, config?: TrashCleanupConfig): Promise<TrashCleanupResult>;
|
|
35
45
|
//# sourceMappingURL=trash-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trash-store.d.ts","sourceRoot":"","sources":["../../src/storage/trash-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"trash-store.d.ts","sourceRoot":"","sources":["../../src/storage/trash-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAoBjF;;GAEG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAE1E;AASD;;GAEG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,EAC/B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,SAAS,CAAC,CAsBpB;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,EAC/B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,SAAS,CAAC,CAsBpB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAuB3B;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiB7F;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAUtE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAejE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO5D;AAMD;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBjE;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,kBAAwD,GAC/D,OAAO,CAAC,kBAAkB,CAAC,CAgD7B"}
|
|
@@ -160,4 +160,78 @@ export async function pathExists(p) {
|
|
|
160
160
|
return false;
|
|
161
161
|
}
|
|
162
162
|
}
|
|
163
|
+
// ---------------------------------------------------------------------------
|
|
164
|
+
// Trash TTL cleanup (SPEC-094 AC-6)
|
|
165
|
+
// ---------------------------------------------------------------------------
|
|
166
|
+
/**
|
|
167
|
+
* Recursively sum file sizes in a directory.
|
|
168
|
+
*/
|
|
169
|
+
export async function getDirSize(dirPath) {
|
|
170
|
+
try {
|
|
171
|
+
const entries = await readdir(dirPath, { withFileTypes: true });
|
|
172
|
+
let total = 0;
|
|
173
|
+
for (const entry of entries) {
|
|
174
|
+
const full = join(dirPath, entry.name);
|
|
175
|
+
if (entry.isDirectory()) {
|
|
176
|
+
total += await getDirSize(full);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
const s = await stat(full);
|
|
180
|
+
total += s.size;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return total;
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return 0;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Auto-clean trash items that exceed age or total size limits.
|
|
191
|
+
* Purges oldest items first. Lazy: call on trash operations.
|
|
192
|
+
*/
|
|
193
|
+
export async function autoCleanTrash(projectId, config = { maxAgeDays: 30, maxSizeMB: 1024 }) {
|
|
194
|
+
const manifest = await loadManifest(projectId);
|
|
195
|
+
if (manifest.length === 0) {
|
|
196
|
+
return { purgedCount: 0, freedBytes: 0, remainingCount: 0 };
|
|
197
|
+
}
|
|
198
|
+
// Sort oldest first
|
|
199
|
+
manifest.sort((a, b) => Date.parse(a.deletedAt) - Date.parse(b.deletedAt));
|
|
200
|
+
let purgedCount = 0;
|
|
201
|
+
let freedBytes = 0;
|
|
202
|
+
const maxAgeMs = config.maxAgeDays * 86_400_000;
|
|
203
|
+
const now = Date.now();
|
|
204
|
+
// First pass — age
|
|
205
|
+
const remaining = [];
|
|
206
|
+
for (const item of manifest) {
|
|
207
|
+
if (now - Date.parse(item.deletedAt) > maxAgeMs) {
|
|
208
|
+
const size = await getDirSize(item.trashPath);
|
|
209
|
+
await rm(item.trashPath, { recursive: true, force: true });
|
|
210
|
+
freedBytes += size;
|
|
211
|
+
purgedCount++;
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
remaining.push(item);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Second pass — size limit
|
|
218
|
+
const maxBytes = config.maxSizeMB * 1024 * 1024;
|
|
219
|
+
let totalSize = 0;
|
|
220
|
+
for (const item of remaining) {
|
|
221
|
+
totalSize += await getDirSize(item.trashPath);
|
|
222
|
+
}
|
|
223
|
+
while (totalSize > maxBytes && remaining.length > 0) {
|
|
224
|
+
const oldest = remaining.shift();
|
|
225
|
+
if (!oldest) {
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
const size = await getDirSize(oldest.trashPath);
|
|
229
|
+
await rm(oldest.trashPath, { recursive: true, force: true });
|
|
230
|
+
totalSize -= size;
|
|
231
|
+
freedBytes += size;
|
|
232
|
+
purgedCount++;
|
|
233
|
+
}
|
|
234
|
+
await saveManifest(projectId, remaining);
|
|
235
|
+
return { purgedCount, freedBytes, remainingCount: remaining.length };
|
|
236
|
+
}
|
|
163
237
|
//# sourceMappingURL=trash-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trash-store.js","sourceRoot":"","sources":["../../src/storage/trash-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"trash-store.js","sourceRoot":"","sources":["../../src/storage/trash-store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,SAAS,QAAQ,CAAC,SAAiB;IACjC,OAAO,GAAG,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC;AAC/C,CAAC;AAED,SAAS,aAAa,CAAC,SAAiB;IACtC,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,gBAAgB,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAAC,SAAiB;IAC7C,MAAM,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,SAAiB;IAClD,OAAO,QAAQ,CAAc,aAAa,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CAAC,SAAiB,EAAE,KAAkB;IAC/D,MAAM,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAiB,EACjB,QAA+B,EAC/B,MAAc,EACd,UAAkB,EAClB,QAAiC;IAEjC,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAG,GAAG,SAAS,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC;IAExD,MAAM,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAEvD,MAAM,IAAI,GAAc;QACtB,EAAE,EAAE,WAAW;QACf,QAAQ;QACR,YAAY,EAAE,UAAU;QACxB,SAAS,EAAE,QAAQ;QACnB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,QAAQ;KACT,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;IAC/C,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,MAAM,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACxC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAAiB,EACjB,QAA+B,EAC/B,MAAc,EACd,IAAa,EACb,QAAiC;IAEjC,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAG,GAAG,SAAS,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC;IAExD,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;IAEnD,MAAM,IAAI,GAAc;QACtB,EAAE,EAAE,WAAW;QACf,QAAQ;QACR,YAAY,EAAE,GAAG,QAAQ,IAAI,MAAM,EAAE;QACrC,SAAS,EAAE,QAAQ;QACnB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,QAAQ;KACT,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;IAC/C,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,MAAM,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACxC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAAiB,EACjB,WAAmB;IAEnB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC;IAC5D,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3B,sEAAsE;IACtE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gCAAgC;IAChC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACxB,MAAM,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACxC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAiB,EAAE,WAAmB;IACzE,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC;IAC5D,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3B,sEAAsE;IACtE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACxB,MAAM,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACxC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAAiB;IACnD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAClC,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe;IAC9C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,KAAK,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACvD,CAAC;iBAAM,CAAC;gBACN,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,CAAS;IACxC,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,oCAAoC;AACpC,8EAA8E;AAE9E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe;IAC9C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,KAAK,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3B,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC;YAClB,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAAiB,EACjB,SAA6B,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IAEhE,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;IAC9D,CAAC;IAED,oBAAoB;IACpB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAE3E,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,mBAAmB;IACnB,MAAM,SAAS,GAAgB,EAAE,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,QAAQ,EAAE,CAAC;YAChD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,UAAU,IAAI,IAAI,CAAC;YACnB,WAAW,EAAE,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC;IAChD,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,SAAS,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,SAAS,GAAG,QAAQ,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM;QACR,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,SAAS,IAAI,IAAI,CAAC;QAClB,UAAU,IAAI,IAAI,CAAC;QACnB,WAAW,EAAE,CAAC;IAChB,CAAC;IAED,MAAM,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACzC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;AACvE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-config-health.d.ts","sourceRoot":"","sources":["../../src/tools/check-config-health.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAA2C,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"check-config-health.d.ts","sourceRoot":"","sources":["../../src/tools/check-config-health.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAA2C,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAwF7F,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;CACzC,GAAG,OAAO,CAAC,UAAU,CAAC,CAStB;AAMD,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAerE"}
|
|
@@ -7,9 +7,10 @@ import { safeTracked } from './safe-handler.js';
|
|
|
7
7
|
// Zod schema
|
|
8
8
|
// ---------------------------------------------------------------------------
|
|
9
9
|
const checkConfigHealthSchema = {
|
|
10
|
-
projectPath: z.string().describe('Absolute path to the project root to check'),
|
|
10
|
+
projectPath: z.string().max(4096).describe('Absolute path to the project root to check'),
|
|
11
11
|
checks: z
|
|
12
12
|
.array(z.enum(['ts', 'python', 'go', 'rust', 'ci', 'build-tool']))
|
|
13
|
+
.max(100)
|
|
13
14
|
.optional()
|
|
14
15
|
.describe('Subset of check groups to run. Default: all groups (ts, python, go, rust, ci, build-tool)'),
|
|
15
16
|
severity: z
|