@hongmaple0820/scale-engine 0.15.0 → 0.16.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.
Files changed (89) hide show
  1. package/README.en.md +13 -5
  2. package/README.md +13 -5
  3. package/dist/agents/LeadershipPresets.d.ts +16 -0
  4. package/dist/agents/LeadershipPresets.js +152 -0
  5. package/dist/agents/LeadershipPresets.js.map +1 -0
  6. package/dist/api/cli.js +729 -5
  7. package/dist/api/cli.js.map +1 -1
  8. package/dist/api/doctor.d.ts +2 -0
  9. package/dist/api/doctor.js +83 -0
  10. package/dist/api/doctor.js.map +1 -1
  11. package/dist/api/mcp.js +2 -1
  12. package/dist/api/mcp.js.map +1 -1
  13. package/dist/artifact/types.d.ts +4 -0
  14. package/dist/artifact/types.js.map +1 -1
  15. package/dist/capabilities/InstalledSkillsIntegration.d.ts +3 -0
  16. package/dist/capabilities/InstalledSkillsIntegration.js +41 -17
  17. package/dist/capabilities/InstalledSkillsIntegration.js.map +1 -1
  18. package/dist/cli/phaseCommands.d.ts +14 -0
  19. package/dist/cli/phaseCommands.js +214 -5
  20. package/dist/cli/phaseCommands.js.map +1 -1
  21. package/dist/cli/vibeCommands.d.ts +20 -0
  22. package/dist/cli/vibeCommands.js +150 -173
  23. package/dist/cli/vibeCommands.js.map +1 -1
  24. package/dist/core/logger.d.ts +2 -0
  25. package/dist/core/logger.js +33 -1
  26. package/dist/core/logger.js.map +1 -1
  27. package/dist/index.d.ts +4 -0
  28. package/dist/index.js +5 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/output/HTMLDocumentRenderer.js +3 -2
  31. package/dist/output/HTMLDocumentRenderer.js.map +1 -1
  32. package/dist/prompts/VibeTemplateGallery.d.ts +25 -0
  33. package/dist/prompts/VibeTemplateGallery.js +295 -0
  34. package/dist/prompts/VibeTemplateGallery.js.map +1 -0
  35. package/dist/skills/ExternalSkills.js +9 -4
  36. package/dist/skills/ExternalSkills.js.map +1 -1
  37. package/dist/skills/SkillDiscovery.js +5 -3
  38. package/dist/skills/SkillDiscovery.js.map +1 -1
  39. package/dist/skills/SkillDoctor.js +178 -1
  40. package/dist/skills/SkillDoctor.js.map +1 -1
  41. package/dist/skills/SkillInstaller.js +5 -0
  42. package/dist/skills/SkillInstaller.js.map +1 -1
  43. package/dist/skills/SkillRepository.d.ts +63 -0
  44. package/dist/skills/SkillRepository.js +365 -0
  45. package/dist/skills/SkillRepository.js.map +1 -0
  46. package/dist/skills/routing/SkillPolicy.js +168 -5
  47. package/dist/skills/routing/SkillPolicy.js.map +1 -1
  48. package/dist/tools/ToolCapabilityRegistry.d.ts +46 -0
  49. package/dist/tools/ToolCapabilityRegistry.js +223 -0
  50. package/dist/tools/ToolCapabilityRegistry.js.map +1 -0
  51. package/dist/tools/ToolEvidenceGate.d.ts +39 -0
  52. package/dist/tools/ToolEvidenceGate.js +117 -0
  53. package/dist/tools/ToolEvidenceGate.js.map +1 -0
  54. package/dist/tools/ToolEvidenceStore.d.ts +58 -0
  55. package/dist/tools/ToolEvidenceStore.js +129 -0
  56. package/dist/tools/ToolEvidenceStore.js.map +1 -0
  57. package/dist/tools/ToolOrchestrator.d.ts +67 -0
  58. package/dist/tools/ToolOrchestrator.js +193 -0
  59. package/dist/tools/ToolOrchestrator.js.map +1 -0
  60. package/dist/tools/ToolPolicy.d.ts +33 -0
  61. package/dist/tools/ToolPolicy.js +157 -0
  62. package/dist/tools/ToolPolicy.js.map +1 -0
  63. package/dist/tools/index.d.ts +5 -0
  64. package/dist/tools/index.js +6 -0
  65. package/dist/tools/index.js.map +1 -0
  66. package/dist/version.d.ts +3 -0
  67. package/dist/version.js +15 -0
  68. package/dist/version.js.map +1 -0
  69. package/dist/workflow/EngineeringStandards.d.ts +212 -0
  70. package/dist/workflow/EngineeringStandards.js +1021 -0
  71. package/dist/workflow/EngineeringStandards.js.map +1 -0
  72. package/dist/workflow/GovernanceTemplatePacks.d.ts +1 -1
  73. package/dist/workflow/GovernanceTemplatePacks.js +101 -18
  74. package/dist/workflow/GovernanceTemplatePacks.js.map +1 -1
  75. package/dist/workflow/GovernanceTemplates.d.ts +1 -1
  76. package/dist/workflow/GovernanceTemplates.js +225 -37
  77. package/dist/workflow/GovernanceTemplates.js.map +1 -1
  78. package/dist/workflow/ResourceGovernance.d.ts +120 -0
  79. package/dist/workflow/ResourceGovernance.js +512 -0
  80. package/dist/workflow/ResourceGovernance.js.map +1 -0
  81. package/dist/workflow/TaskArtifactScaffolder.js +3 -0
  82. package/dist/workflow/TaskArtifactScaffolder.js.map +1 -1
  83. package/dist/workflow/VerificationProfile.d.ts +2 -0
  84. package/dist/workflow/VerificationProfile.js +7 -0
  85. package/dist/workflow/VerificationProfile.js.map +1 -1
  86. package/dist/workflow/index.d.ts +2 -0
  87. package/dist/workflow/index.js +2 -0
  88. package/dist/workflow/index.js.map +1 -1
  89. package/package.json +2 -2
@@ -0,0 +1,46 @@
1
+ export type ToolCapabilityCategory = 'skill' | 'cli' | 'mcp';
2
+ export type ToolCapabilityStatus = 'installed' | 'missing';
3
+ export interface ToolCatalogEntry {
4
+ id: string;
5
+ name: string;
6
+ category: ToolCapabilityCategory;
7
+ requiredFor: string[];
8
+ recommendedFor?: string[];
9
+ skillId?: string;
10
+ command?: string;
11
+ versionArgs?: string[];
12
+ envFlag?: string;
13
+ source?: string;
14
+ }
15
+ export interface ToolCapabilityEntry extends ToolCatalogEntry {
16
+ installed: boolean;
17
+ status: ToolCapabilityStatus;
18
+ checkedPaths: string[];
19
+ detectedPath?: string;
20
+ version?: string;
21
+ missingReason?: string;
22
+ }
23
+ export interface ToolCapabilitySummary {
24
+ total: number;
25
+ installed: number;
26
+ missing: number;
27
+ }
28
+ export interface ToolCapabilityReport {
29
+ ok: boolean;
30
+ summary: ToolCapabilitySummary;
31
+ tools: ToolCapabilityEntry[];
32
+ }
33
+ export interface ToolCapabilityRegistryOptions {
34
+ projectDir?: string;
35
+ homeDir?: string;
36
+ toolIds?: string[];
37
+ env?: Record<string, string | undefined>;
38
+ commandExists?: (command: string) => boolean;
39
+ runVersion?: (command: string, args: string[]) => {
40
+ ok: boolean;
41
+ stdout?: string;
42
+ stderr?: string;
43
+ };
44
+ }
45
+ export declare const TOOL_CAPABILITY_CATALOG: ToolCatalogEntry[];
46
+ export declare function inspectToolCapabilities(options?: ToolCapabilityRegistryOptions): ToolCapabilityReport;
@@ -0,0 +1,223 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { join, resolve } from 'node:path';
5
+ export const TOOL_CAPABILITY_CATALOG = [
6
+ {
7
+ id: 'web-access',
8
+ name: 'Web Access',
9
+ category: 'skill',
10
+ skillId: 'web-access',
11
+ requiredFor: ['webResearch'],
12
+ recommendedFor: ['browserAutomation'],
13
+ source: 'https://github.com/eze-is/web-access',
14
+ },
15
+ {
16
+ id: 'frontend-design',
17
+ name: 'Frontend Design',
18
+ category: 'skill',
19
+ skillId: 'frontend-design',
20
+ requiredFor: ['ui'],
21
+ source: 'https://github.com/anthropics/skills/tree/main/skills/frontend-design',
22
+ },
23
+ {
24
+ id: 'ui-ux-pro-max',
25
+ name: 'UI/UX Pro Max',
26
+ category: 'skill',
27
+ skillId: 'ui-ux-pro-max',
28
+ requiredFor: ['ui'],
29
+ source: 'https://github.com/nextlevelbuilder/ui-ux-pro-max-skill',
30
+ },
31
+ {
32
+ id: 'awesome-design-md',
33
+ name: 'Awesome Design.md',
34
+ category: 'skill',
35
+ skillId: 'awesome-design-md',
36
+ requiredFor: [],
37
+ recommendedFor: ['ui'],
38
+ source: 'https://github.com/VoltAgent/awesome-design-md',
39
+ },
40
+ {
41
+ id: 'agent-browser',
42
+ name: 'Agent Browser',
43
+ category: 'cli',
44
+ command: 'agent-browser',
45
+ versionArgs: ['--version'],
46
+ requiredFor: ['browserAutomation'],
47
+ recommendedFor: ['ui', 'e2e'],
48
+ source: 'https://github.com/vercel-labs/agent-browser',
49
+ },
50
+ {
51
+ id: 'playwright',
52
+ name: 'Playwright',
53
+ category: 'cli',
54
+ command: 'npx',
55
+ versionArgs: ['playwright', '--version'],
56
+ requiredFor: ['e2e'],
57
+ recommendedFor: ['browserAutomation', 'ui'],
58
+ source: 'https://playwright.dev',
59
+ },
60
+ {
61
+ id: 'mcp-chrome-devtools',
62
+ name: 'Chrome DevTools MCP',
63
+ category: 'mcp',
64
+ envFlag: 'SCALE_MCP_CHROME_DEVTOOLS',
65
+ requiredFor: ['browserAutomation'],
66
+ recommendedFor: ['ui', 'e2e'],
67
+ source: 'https://github.com/ChromeDevTools/chrome-devtools-mcp',
68
+ },
69
+ {
70
+ id: 'desktop-cua',
71
+ name: 'CUA',
72
+ category: 'cli',
73
+ command: 'cua',
74
+ versionArgs: ['--version'],
75
+ requiredFor: ['desktopAutomation'],
76
+ source: 'https://github.com/trycua/cua',
77
+ },
78
+ {
79
+ id: 'codex-cli',
80
+ name: 'Codex CLI',
81
+ category: 'cli',
82
+ command: 'codex',
83
+ versionArgs: ['--version'],
84
+ requiredFor: [],
85
+ recommendedFor: ['externalCli', 'review'],
86
+ source: 'https://github.com/openai/codex',
87
+ },
88
+ {
89
+ id: 'gemini-cli',
90
+ name: 'Gemini CLI',
91
+ category: 'cli',
92
+ command: 'gemini',
93
+ versionArgs: ['--version'],
94
+ requiredFor: [],
95
+ recommendedFor: ['externalCli', 'review'],
96
+ source: 'https://github.com/google-gemini/gemini-cli',
97
+ },
98
+ {
99
+ id: 'opencode-cli',
100
+ name: 'OpenCode CLI',
101
+ category: 'cli',
102
+ command: 'opencode',
103
+ versionArgs: ['--version'],
104
+ requiredFor: [],
105
+ recommendedFor: ['externalCli', 'review'],
106
+ source: 'https://github.com/sst/opencode',
107
+ },
108
+ ];
109
+ export function inspectToolCapabilities(options = {}) {
110
+ const projectDir = resolve(options.projectDir ?? process.cwd());
111
+ const homeDir = options.homeDir ?? homedir();
112
+ const env = options.env ?? process.env;
113
+ const selected = new Set(options.toolIds ?? TOOL_CAPABILITY_CATALOG.map(tool => tool.id));
114
+ const tools = TOOL_CAPABILITY_CATALOG
115
+ .filter(tool => selected.has(tool.id))
116
+ .map(tool => inspectToolCapability(tool, {
117
+ projectDir,
118
+ homeDir,
119
+ env,
120
+ commandExists: options.commandExists ?? defaultCommandExists,
121
+ runVersion: options.runVersion ?? defaultRunVersion,
122
+ }));
123
+ const installed = tools.filter(tool => tool.installed).length;
124
+ const missing = tools.length - installed;
125
+ return {
126
+ ok: missing === 0,
127
+ summary: {
128
+ total: tools.length,
129
+ installed,
130
+ missing,
131
+ },
132
+ tools,
133
+ };
134
+ }
135
+ function inspectToolCapability(tool, deps) {
136
+ if (tool.category === 'skill')
137
+ return inspectSkillTool(tool, deps);
138
+ if (tool.category === 'cli')
139
+ return inspectCliTool(tool, deps);
140
+ return inspectMcpTool(tool, deps);
141
+ }
142
+ function inspectSkillTool(tool, deps) {
143
+ const checkedPaths = skillCandidatePaths(tool.skillId ?? tool.id, deps.projectDir, deps.homeDir);
144
+ const detectedPath = checkedPaths.find(path => existsSync(path));
145
+ return {
146
+ ...tool,
147
+ checkedPaths,
148
+ detectedPath,
149
+ installed: Boolean(detectedPath),
150
+ status: detectedPath ? 'installed' : 'missing',
151
+ missingReason: detectedPath ? undefined : 'SKILL.md was not found in project or user skill directories',
152
+ };
153
+ }
154
+ function inspectCliTool(tool, deps) {
155
+ const command = tool.command ?? tool.id;
156
+ const checkedPaths = [`PATH:${command}`];
157
+ if (!deps.commandExists(command)) {
158
+ return {
159
+ ...tool,
160
+ checkedPaths,
161
+ installed: false,
162
+ status: 'missing',
163
+ missingReason: `Command not found: ${command}`,
164
+ };
165
+ }
166
+ const version = deps.runVersion(command, tool.versionArgs ?? ['--version']);
167
+ return {
168
+ ...tool,
169
+ checkedPaths,
170
+ installed: true,
171
+ status: 'installed',
172
+ version: version.ok ? (version.stdout ?? '').trim() : undefined,
173
+ missingReason: version.ok ? undefined : version.stderr ?? 'Version command failed',
174
+ };
175
+ }
176
+ function inspectMcpTool(tool, deps) {
177
+ const envFlag = tool.envFlag ?? `SCALE_MCP_${tool.id.toUpperCase().replace(/[^A-Z0-9]/g, '_')}`;
178
+ const installed = truthy(deps.env[envFlag]);
179
+ return {
180
+ ...tool,
181
+ checkedPaths: [`env:${envFlag}`],
182
+ installed,
183
+ status: installed ? 'installed' : 'missing',
184
+ missingReason: installed ? undefined : `MCP availability flag is not set: ${envFlag}`,
185
+ };
186
+ }
187
+ function skillCandidatePaths(skillId, projectDir, homeDir) {
188
+ return [
189
+ join(projectDir, '.agents', 'skills', skillId, 'SKILL.md'),
190
+ join(projectDir, '.codex', 'skills', skillId, 'SKILL.md'),
191
+ join(projectDir, '.claude', 'skills', skillId, 'SKILL.md'),
192
+ join(homeDir, '.agents', 'skills', skillId, 'SKILL.md'),
193
+ join(homeDir, '.codex', 'skills', skillId, 'SKILL.md'),
194
+ join(homeDir, '.claude', 'skills', skillId, 'SKILL.md'),
195
+ ];
196
+ }
197
+ function defaultCommandExists(command) {
198
+ try {
199
+ execFileSync(process.platform === 'win32' ? 'where.exe' : 'which', [command], { stdio: 'ignore' });
200
+ return true;
201
+ }
202
+ catch {
203
+ return false;
204
+ }
205
+ }
206
+ function defaultRunVersion(command, args) {
207
+ try {
208
+ const stdout = execFileSync(command, args, { encoding: 'utf-8', timeout: 5000, stdio: ['ignore', 'pipe', 'pipe'] });
209
+ return { ok: true, stdout };
210
+ }
211
+ catch (error) {
212
+ return {
213
+ ok: false,
214
+ stderr: error instanceof Error ? error.message : String(error),
215
+ };
216
+ }
217
+ }
218
+ function truthy(value) {
219
+ if (!value)
220
+ return false;
221
+ return ['1', 'true', 'yes', 'on', 'enabled'].includes(value.toLowerCase());
222
+ }
223
+ //# sourceMappingURL=ToolCapabilityRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolCapabilityRegistry.js","sourceRoot":"","sources":["../../src/tools/ToolCapabilityRegistry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { ToolEvidenceStore, type ToolEvidenceAdapter, type ToolEvidenceStatus } from './ToolEvidenceStore.js';
2
+ import type { ToolExecutionPlan } from './ToolOrchestrator.js';
3
+ import type { ToolOrchestrationMode } from './ToolPolicy.js';
4
+ export type ToolEvidenceGateTaskLevel = 'S' | 'M' | 'L' | 'CRITICAL';
5
+ export interface ToolEvidenceGateItem {
6
+ toolId: string;
7
+ domain: string;
8
+ adapter: ToolEvidenceAdapter;
9
+ required: boolean;
10
+ reason: string;
11
+ evidenceId?: string;
12
+ evidenceStatus?: ToolEvidenceStatus;
13
+ completedAt?: string;
14
+ }
15
+ export interface ToolEvidenceGateResult {
16
+ taskId?: string;
17
+ mode: ToolOrchestrationMode;
18
+ enforceLevels: ToolEvidenceGateTaskLevel[];
19
+ applies: boolean;
20
+ checked: boolean;
21
+ complete: boolean;
22
+ blocked: boolean;
23
+ requiredTools: string[];
24
+ passed: ToolEvidenceGateItem[];
25
+ missing: ToolEvidenceGateItem[];
26
+ failed: ToolEvidenceGateItem[];
27
+ skipped: ToolEvidenceGateItem[];
28
+ warnings: string[];
29
+ }
30
+ export interface EvaluateToolEvidenceGateOptions {
31
+ projectDir?: string;
32
+ level: ToolEvidenceGateTaskLevel;
33
+ plan?: ToolExecutionPlan | null;
34
+ evidenceStore?: ToolEvidenceStore;
35
+ mode?: ToolOrchestrationMode;
36
+ enforceLevels?: ToolEvidenceGateTaskLevel[];
37
+ allowSkipped?: boolean;
38
+ }
39
+ export declare function evaluateToolEvidenceGate(options: EvaluateToolEvidenceGateOptions): ToolEvidenceGateResult;
@@ -0,0 +1,117 @@
1
+ import { ToolEvidenceStore } from './ToolEvidenceStore.js';
2
+ export function evaluateToolEvidenceGate(options) {
3
+ const mode = options.mode ?? options.plan?.mode ?? 'evidence-required';
4
+ const enforceLevels = options.enforceLevels ?? ['M', 'L', 'CRITICAL'];
5
+ const applies = mode !== 'off' && enforceLevels.includes(options.level);
6
+ if (!applies) {
7
+ return {
8
+ taskId: options.plan?.taskId,
9
+ mode,
10
+ enforceLevels,
11
+ applies,
12
+ checked: false,
13
+ complete: true,
14
+ blocked: false,
15
+ requiredTools: [],
16
+ passed: [],
17
+ missing: [],
18
+ failed: [],
19
+ skipped: [],
20
+ warnings: [],
21
+ };
22
+ }
23
+ if (!options.plan) {
24
+ return {
25
+ mode,
26
+ enforceLevels,
27
+ applies,
28
+ checked: true,
29
+ complete: false,
30
+ blocked: blocksOnIncomplete(mode),
31
+ requiredTools: [],
32
+ passed: [],
33
+ missing: [],
34
+ failed: [],
35
+ skipped: [],
36
+ warnings: ['No tool execution plan was provided.'],
37
+ };
38
+ }
39
+ const requiredSteps = options.plan.steps.filter(step => step.required);
40
+ const evidenceStore = options.evidenceStore ?? new ToolEvidenceStore({ projectDir: options.projectDir });
41
+ const latestEvidence = latestEvidenceByTool(evidenceStore.list(options.plan.taskId));
42
+ const passed = [];
43
+ const missing = [];
44
+ const failed = [];
45
+ const skipped = [];
46
+ for (const step of requiredSteps) {
47
+ const evidence = latestEvidence.get(step.toolId);
48
+ const item = evidenceItem(step, evidence);
49
+ if (!evidence) {
50
+ missing.push({
51
+ ...item,
52
+ reason: step.status === 'missing'
53
+ ? step.reason
54
+ : 'No execution evidence was recorded for this required tool.',
55
+ });
56
+ continue;
57
+ }
58
+ if (evidence.status === 'passed') {
59
+ passed.push(item);
60
+ continue;
61
+ }
62
+ if (evidence.status === 'failed') {
63
+ failed.push(item);
64
+ continue;
65
+ }
66
+ if (evidence.status === 'skipped' && options.allowSkipped) {
67
+ passed.push(item);
68
+ }
69
+ else {
70
+ skipped.push({
71
+ ...item,
72
+ reason: 'Skipped or dry-run evidence does not satisfy required tool execution.',
73
+ });
74
+ }
75
+ }
76
+ const complete = missing.length === 0 && failed.length === 0 && skipped.length === 0;
77
+ const blocked = blocksOnIncomplete(mode) && !complete;
78
+ return {
79
+ taskId: options.plan.taskId,
80
+ mode,
81
+ enforceLevels,
82
+ applies,
83
+ checked: true,
84
+ complete,
85
+ blocked,
86
+ requiredTools: requiredSteps.map(step => step.toolId),
87
+ passed,
88
+ missing,
89
+ failed,
90
+ skipped,
91
+ warnings: options.plan.warnings,
92
+ };
93
+ }
94
+ function latestEvidenceByTool(records) {
95
+ const byTool = new Map();
96
+ for (const record of records) {
97
+ if (!byTool.has(record.tool))
98
+ byTool.set(record.tool, record);
99
+ }
100
+ return byTool;
101
+ }
102
+ function evidenceItem(step, evidence) {
103
+ return {
104
+ toolId: step.toolId,
105
+ domain: step.domain,
106
+ adapter: step.adapter,
107
+ required: step.required,
108
+ reason: evidence?.outputSummary ?? step.reason,
109
+ evidenceId: evidence?.id,
110
+ evidenceStatus: evidence?.status,
111
+ completedAt: evidence?.completedAt,
112
+ };
113
+ }
114
+ function blocksOnIncomplete(mode) {
115
+ return mode === 'evidence-required' || mode === 'block';
116
+ }
117
+ //# sourceMappingURL=ToolEvidenceGate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolEvidenceGate.js","sourceRoot":"","sources":["../../src/tools/ToolEvidenceGate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ export type ToolEvidenceAdapter = 'skill' | 'mcp' | 'cli' | 'browser' | 'desktop';
2
+ export type ToolEvidenceStatus = 'passed' | 'failed' | 'skipped';
3
+ export interface ToolRunEvidenceInput {
4
+ taskId: string;
5
+ domain: string;
6
+ tool: string;
7
+ adapter: ToolEvidenceAdapter;
8
+ version?: string;
9
+ command?: string;
10
+ mcpToolName?: string;
11
+ status: ToolEvidenceStatus;
12
+ sanitizedInput: Record<string, unknown>;
13
+ outputSummary: string;
14
+ outputPaths: string[];
15
+ safetyPolicy: string[];
16
+ }
17
+ export interface ToolRunEvidence extends ToolRunEvidenceInput {
18
+ id: string;
19
+ startedAt: string;
20
+ completedAt: string;
21
+ exitCode?: number;
22
+ redactionApplied: boolean;
23
+ sequence: number;
24
+ }
25
+ export interface ToolEvidenceStoreOptions {
26
+ projectDir?: string;
27
+ scaleDir?: string;
28
+ now?: () => Date;
29
+ }
30
+ export interface ToolEvidenceSummary {
31
+ taskId: string;
32
+ total: number;
33
+ passed: number;
34
+ failed: number;
35
+ skipped: number;
36
+ ok: boolean;
37
+ }
38
+ export declare class ToolEvidenceStore {
39
+ private rootDir;
40
+ private now;
41
+ private sequence;
42
+ constructor(options?: ToolEvidenceStoreOptions);
43
+ save(input: ToolRunEvidenceInput & {
44
+ exitCode?: number;
45
+ }): ToolRunEvidence;
46
+ list(taskId: string): ToolRunEvidence[];
47
+ get(taskId: string, id: string): ToolRunEvidence | null;
48
+ summary(taskId: string): ToolEvidenceSummary;
49
+ private taskDir;
50
+ }
51
+ export declare function redactEvidenceValue(value: unknown): {
52
+ value: unknown;
53
+ redacted: boolean;
54
+ };
55
+ export declare function redactEvidenceText(text: string): {
56
+ value: string;
57
+ redacted: boolean;
58
+ };
@@ -0,0 +1,129 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
3
+ import { isAbsolute, join, resolve } from 'node:path';
4
+ const SENSITIVE_KEY_PATTERN = /(?:password|passwd|pwd|token|secret|authorization|cookie|credential|api[_-]?key|private[_-]?key)/i;
5
+ const REDACTED = '[REDACTED]';
6
+ export class ToolEvidenceStore {
7
+ constructor(options = {}) {
8
+ this.sequence = 0;
9
+ const projectDir = resolve(options.projectDir ?? process.cwd());
10
+ const scaleRoot = isAbsolute(options.scaleDir ?? '')
11
+ ? options.scaleDir
12
+ : join(projectDir, options.scaleDir ?? '.scale');
13
+ this.rootDir = join(scaleRoot, 'evidence', 'tool-runs');
14
+ this.now = options.now ?? (() => new Date());
15
+ if (!existsSync(this.rootDir))
16
+ mkdirSync(this.rootDir, { recursive: true });
17
+ }
18
+ save(input) {
19
+ const startedAt = this.now().toISOString();
20
+ const inputRedaction = redactUnknown(input.sanitizedInput);
21
+ const commandRedaction = redactText(input.command ?? '');
22
+ const summaryRedaction = redactText(input.outputSummary);
23
+ const versionRedaction = redactText(input.version ?? '');
24
+ const evidence = {
25
+ ...input,
26
+ id: `TOOL-${Date.now()}-${randomUUID().slice(0, 8)}`,
27
+ startedAt,
28
+ completedAt: this.now().toISOString(),
29
+ sequence: ++this.sequence,
30
+ sanitizedInput: inputRedaction.value,
31
+ command: input.command ? commandRedaction.value : undefined,
32
+ version: input.version ? versionRedaction.value : undefined,
33
+ outputSummary: summaryRedaction.value,
34
+ redactionApplied: inputRedaction.redacted || commandRedaction.redacted || summaryRedaction.redacted || versionRedaction.redacted,
35
+ };
36
+ const dir = this.taskDir(input.taskId);
37
+ if (!existsSync(dir))
38
+ mkdirSync(dir, { recursive: true });
39
+ writeFileSync(join(dir, `${evidence.id}.json`), JSON.stringify(evidence, null, 2), 'utf-8');
40
+ return evidence;
41
+ }
42
+ list(taskId) {
43
+ const dir = this.taskDir(taskId);
44
+ if (!existsSync(dir))
45
+ return [];
46
+ return readdirSync(dir)
47
+ .filter(file => file.endsWith('.json'))
48
+ .map(file => readEvidenceFile(join(dir, file)))
49
+ .filter((record) => Boolean(record))
50
+ .sort((a, b) => {
51
+ const time = Date.parse(b.completedAt) - Date.parse(a.completedAt);
52
+ if (time !== 0)
53
+ return time;
54
+ return b.sequence - a.sequence;
55
+ });
56
+ }
57
+ get(taskId, id) {
58
+ return readEvidenceFile(join(this.taskDir(taskId), `${id}.json`));
59
+ }
60
+ summary(taskId) {
61
+ const records = this.list(taskId);
62
+ const passed = records.filter(record => record.status === 'passed').length;
63
+ const failed = records.filter(record => record.status === 'failed').length;
64
+ const skipped = records.filter(record => record.status === 'skipped').length;
65
+ return {
66
+ taskId,
67
+ total: records.length,
68
+ passed,
69
+ failed,
70
+ skipped,
71
+ ok: failed === 0,
72
+ };
73
+ }
74
+ taskDir(taskId) {
75
+ return join(this.rootDir, safePathSegment(taskId));
76
+ }
77
+ }
78
+ export function redactEvidenceValue(value) {
79
+ return redactUnknown(value);
80
+ }
81
+ export function redactEvidenceText(text) {
82
+ return redactText(text);
83
+ }
84
+ function readEvidenceFile(file) {
85
+ try {
86
+ return JSON.parse(readFileSync(file, 'utf-8'));
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ }
92
+ function redactUnknown(value, key = '') {
93
+ if (SENSITIVE_KEY_PATTERN.test(key))
94
+ return { value: REDACTED, redacted: true };
95
+ if (typeof value === 'string')
96
+ return redactText(value);
97
+ if (Array.isArray(value)) {
98
+ let redacted = false;
99
+ const list = value.map(item => {
100
+ const result = redactUnknown(item);
101
+ redacted = redacted || result.redacted;
102
+ return result.value;
103
+ });
104
+ return { value: list, redacted };
105
+ }
106
+ if (value && typeof value === 'object') {
107
+ let redacted = false;
108
+ const output = {};
109
+ for (const [childKey, childValue] of Object.entries(value)) {
110
+ const result = redactUnknown(childValue, childKey);
111
+ redacted = redacted || result.redacted;
112
+ output[childKey] = result.value;
113
+ }
114
+ return { value: output, redacted };
115
+ }
116
+ return { value, redacted: false };
117
+ }
118
+ function redactText(text) {
119
+ let output = text;
120
+ output = output.replace(/(authorization\s*:\s*bearer\s+)[^\s,;]+/gi, `$1${REDACTED}`);
121
+ output = output.replace(/(--(?:password|token|secret|authorization|cookie|credential|api-key|apikey|private-key)\s+)[^\s]+/gi, `$1${REDACTED}`);
122
+ output = output.replace(/\b(password|passwd|pwd|token|secret|authorization|cookie|credential|api[_-]?key|private[_-]?key)\s*=\s*[^\s,;]+/gi, `$1=${REDACTED}`);
123
+ output = output.replace(/("(?:password|passwd|pwd|token|secret|authorization|cookie|credential|api[_-]?key|private[_-]?key)"\s*:\s*")[^"]+(")/gi, `$1${REDACTED}$2`);
124
+ return { value: output, redacted: output !== text };
125
+ }
126
+ function safePathSegment(value) {
127
+ return value.replace(/[^a-zA-Z0-9._-]/g, '-').slice(0, 120) || 'unknown-task';
128
+ }
129
+ //# sourceMappingURL=ToolEvidenceStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolEvidenceStore.js","sourceRoot":"","sources":["../../src/tools/ToolEvidenceStore.ts"],"names":[],"mappings":"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"}