@devflow-tools/plugin-react 0.18.21 → 0.18.23
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.
|
@@ -12,6 +12,12 @@ export interface RunnerOutput {
|
|
|
12
12
|
changedFiles: string[];
|
|
13
13
|
findings: string[];
|
|
14
14
|
runnerVersion: string;
|
|
15
|
+
role?: 'analyzer' | 'designer' | 'executor' | 'verifier';
|
|
16
|
+
pluginName?: string;
|
|
17
|
+
pluginVersion?: string;
|
|
18
|
+
manifestHash?: string;
|
|
19
|
+
outputHash?: string;
|
|
20
|
+
output?: Record<string, unknown>;
|
|
15
21
|
}
|
|
16
22
|
export declare function runCapability(input: RunnerInput): RunnerOutput;
|
|
17
23
|
//# sourceMappingURL=capability-runner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability-runner.d.ts","sourceRoot":"","sources":["../src/capability-runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"capability-runner.d.ts","sourceRoot":"","sources":["../src/capability-runner.ts"],"names":[],"mappings":"AAEA,sFAAsF;AACtF,MAAM,WAAW,WAAW;IAAG,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE;AAC5J,MAAM,WAAW,YAAY;IAAG,UAAU,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE;AAEzT,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,CAS9D"}
|
|
@@ -1,8 +1,54 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
1
2
|
export function runCapability(input) {
|
|
2
3
|
const changedFiles = [...new Set((input.changedFiles ?? []).filter(file => typeof file === 'string'))].sort();
|
|
3
4
|
const allowed = input.allowedFiles ?? [];
|
|
4
5
|
const outside = changedFiles.filter(file => !allowed.some(pattern => pattern === file || (pattern.endsWith('/**') && file.startsWith(pattern.slice(0, -3)))));
|
|
5
|
-
|
|
6
|
+
const base = { capability: input.capability, ok: outside.length === 0, changedFiles, findings: outside.map(file => `Changed file is outside authority: ${file}`), runnerVersion: 'react-runner.v1' };
|
|
7
|
+
if (['analyze-component', 'clarify-component', 'analyzer'].includes(input.capability))
|
|
8
|
+
return withReceipt({ ...base, role: 'analyzer', output: analyzeComponent(input) });
|
|
9
|
+
if (['design-component', 'designer'].includes(input.capability))
|
|
10
|
+
return withReceipt({ ...base, role: 'designer', output: designComponent(input) });
|
|
11
|
+
if (['verify-component', 'verifier'].includes(input.capability))
|
|
12
|
+
return withReceipt({ ...base, role: 'verifier', output: verifyComponent(input) });
|
|
13
|
+
return base;
|
|
14
|
+
}
|
|
15
|
+
function analyzeComponent(input) {
|
|
16
|
+
const request = String(input.input?.request ?? '');
|
|
17
|
+
const files = Array.isArray(input.input?.existingFiles) ? input.input.existingFiles.map(String) : [];
|
|
18
|
+
const conventions = Array.isArray(input.input?.conventions) ? input.input.conventions.map(String) : ['function components', 'TypeScript props interfaces'];
|
|
19
|
+
const componentName = /\bcomponent\s+([A-Z][A-Za-z0-9_-]*)/iu.exec(request)?.[1] ?? /\b([A-Z][A-Za-z0-9_-]*)\s+component\b/u.exec(request)?.[1] ?? /\b([A-Z][A-Za-z0-9_-]*)\b/.exec(request)?.[1] ?? 'Component';
|
|
20
|
+
return { kind: 'react-component-analysis', componentName, conventions, existingEvidence: files.filter(file => /\.(tsx|jsx)$/u.test(file)).sort(), unknowns: ['placement', 'reuse', 'props', 'events', 'state', 'error', 'accessibility', 'responsive', 'testing'].map(dimension => ({ dimension, blocking: true })) };
|
|
21
|
+
}
|
|
22
|
+
function designComponent(input) {
|
|
23
|
+
const name = String(input.input?.componentName ?? 'Component');
|
|
24
|
+
return { kind: 'react-component-design', componentName: name, options: [
|
|
25
|
+
{ id: 'controlled-presentational', title: 'Controlled presentational component', boundary: 'props and callbacks', dataFlow: 'parent owns state', risk: 'low', verification: 'component and interaction tests' },
|
|
26
|
+
{ id: 'domain-aware', title: 'Domain-aware component', boundary: 'component owns validation and loading state', dataFlow: 'auth/domain service adapter', risk: 'medium', verification: 'service contract and component tests' },
|
|
27
|
+
{ id: 'page-composed', title: 'Page-composed feature', boundary: 'route/page owns navigation', dataFlow: 'page loader and action', risk: 'higher', verification: 'route-level end-to-end test' },
|
|
28
|
+
] };
|
|
29
|
+
}
|
|
30
|
+
function verifyComponent(input) {
|
|
31
|
+
const files = [...new Set((input.changedFiles ?? []).filter(file => /\.(tsx|jsx|ts)$/u.test(file)))].sort();
|
|
32
|
+
const findings = [];
|
|
33
|
+
if (files.length === 0)
|
|
34
|
+
findings.push('No React or TypeScript implementation file was provided.');
|
|
35
|
+
if (files.some(file => /(^|\/)index\.(tsx|jsx)$/u.test(file)) && !files.some(file => /test|spec/u.test(file)))
|
|
36
|
+
findings.push('A public React entrypoint changed without a nearby test file.');
|
|
37
|
+
return { kind: 'react-component-verification', passed: findings.length === 0, checkedFiles: files, findings };
|
|
38
|
+
}
|
|
39
|
+
function withReceipt(output) {
|
|
40
|
+
const pluginName = '@devflow-tools/plugin-react';
|
|
41
|
+
const pluginVersion = 'react-capabilities.v1';
|
|
42
|
+
const manifestHash = createHash('sha256').update(JSON.stringify({ pluginName, pluginVersion, role: output.role })).digest('hex');
|
|
43
|
+
const outputHash = createHash('sha256').update(stableJson(output.output ?? {})).digest('hex');
|
|
44
|
+
return { ...output, pluginName, pluginVersion, manifestHash, outputHash };
|
|
45
|
+
}
|
|
46
|
+
function stableJson(value) {
|
|
47
|
+
if (value === null || typeof value !== 'object')
|
|
48
|
+
return JSON.stringify(value);
|
|
49
|
+
if (Array.isArray(value))
|
|
50
|
+
return `[${value.map(stableJson).join(',')}]`;
|
|
51
|
+
return `{${Object.entries(value).sort(([a], [b]) => a.localeCompare(b)).map(([key, item]) => `${JSON.stringify(key)}:${stableJson(item)}`).join(',')}}`;
|
|
6
52
|
}
|
|
7
53
|
if (process.argv[1]?.endsWith('capability-runner.js')) {
|
|
8
54
|
let body = '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability-runner.js","sourceRoot":"","sources":["../src/capability-runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"capability-runner.js","sourceRoot":"","sources":["../src/capability-runner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devflow-tools/plugin-react",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.23",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"clean": "rm -rf dist"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@devflow-tools/sdk": "0.18.
|
|
20
|
+
"@devflow-tools/sdk": "0.18.23"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"typescript": "^5.5.0",
|