teamshare-bridge 0.2.5 → 0.4.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/bridge/daemon.js +36 -0
- package/dist/bridge/daemon.js.map +1 -1
- package/dist/bridge/local-server.d.ts +1 -1
- package/dist/bridge/spawn.d.ts +2 -0
- package/dist/bridge/spawn.js +17 -0
- package/dist/bridge/spawn.js.map +1 -1
- package/dist/cli/commands/audit.d.ts +1 -0
- package/dist/cli/commands/audit.js +75 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/build.js +24 -8
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/chat.js +1 -1
- package/dist/cli/commands/chat.js.map +1 -1
- package/dist/cli/commands/doc.js +2 -2
- package/dist/cli/commands/doc.js.map +1 -1
- package/dist/cli/commands/harness.js +1 -1
- package/dist/cli/commands/harness.js.map +1 -1
- package/dist/cli/commands/run.js +19 -4
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/scaffold.d.ts +1 -0
- package/dist/cli/commands/scaffold.js +111 -0
- package/dist/cli/commands/scaffold.js.map +1 -0
- package/dist/cli/commands/worker.d.ts +2 -0
- package/dist/cli/commands/worker.js +110 -0
- package/dist/cli/commands/worker.js.map +1 -0
- package/dist/cli/index.js +16 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/lib/api.d.ts +35 -4
- package/dist/lib/api.js +20 -3
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/audit/docs.d.ts +5 -0
- package/dist/lib/audit/docs.js +52 -0
- package/dist/lib/audit/docs.js.map +1 -0
- package/dist/lib/audit/errors.d.ts +15 -0
- package/dist/lib/audit/errors.js +154 -0
- package/dist/lib/audit/errors.js.map +1 -0
- package/dist/lib/audit/gates.d.ts +2 -0
- package/dist/lib/audit/gates.js +57 -0
- package/dist/lib/audit/gates.js.map +1 -0
- package/dist/lib/audit/modularity.d.ts +13 -0
- package/dist/lib/audit/modularity.js +200 -0
- package/dist/lib/audit/modularity.js.map +1 -0
- package/dist/lib/audit/quality.d.ts +9 -0
- package/dist/lib/audit/quality.js +128 -0
- package/dist/lib/audit/quality.js.map +1 -0
- package/dist/lib/audit/rbac.d.ts +14 -0
- package/dist/lib/audit/rbac.js +139 -0
- package/dist/lib/audit/rbac.js.map +1 -0
- package/dist/lib/audit/reporter.d.ts +5 -0
- package/dist/lib/audit/reporter.js +107 -0
- package/dist/lib/audit/reporter.js.map +1 -0
- package/dist/lib/audit/runner.d.ts +2 -0
- package/dist/lib/audit/runner.js +150 -0
- package/dist/lib/audit/runner.js.map +1 -0
- package/dist/lib/audit/security.d.ts +9 -0
- package/dist/lib/audit/security.js +151 -0
- package/dist/lib/audit/security.js.map +1 -0
- package/dist/lib/audit/types.d.ts +67 -0
- package/dist/lib/audit/types.js +26 -0
- package/dist/lib/audit/types.js.map +1 -0
- package/dist/lib/audit/ux.d.ts +9 -0
- package/dist/lib/audit/ux.js +112 -0
- package/dist/lib/audit/ux.js.map +1 -0
- package/dist/lib/brief.d.ts +4 -0
- package/dist/lib/brief.js +78 -40
- package/dist/lib/brief.js.map +1 -1
- package/dist/lib/chat-reply.js +2 -2
- package/dist/lib/chat-reply.js.map +1 -1
- package/dist/lib/config.d.ts +1 -1
- package/dist/lib/config.js +1 -1
- package/dist/lib/doc-reply.js +1 -1
- package/dist/lib/doc-reply.js.map +1 -1
- package/dist/lib/harness-adapter.d.ts +3 -1
- package/dist/lib/harness-adapter.js +19 -16
- package/dist/lib/harness-adapter.js.map +1 -1
- package/dist/lib/harness.d.ts +3 -1
- package/dist/lib/harness.js +8 -5
- package/dist/lib/harness.js.map +1 -1
- package/dist/lib/llm.js +87 -9
- package/dist/lib/llm.js.map +1 -1
- package/dist/lib/lock.d.ts +1 -1
- package/dist/lib/scaffold/renderer.d.ts +7 -0
- package/dist/lib/scaffold/renderer.js +37 -0
- package/dist/lib/scaffold/renderer.js.map +1 -0
- package/dist/lib/scaffold/structure.d.ts +3 -0
- package/dist/lib/scaffold/structure.js +73 -0
- package/dist/lib/scaffold/structure.js.map +1 -0
- package/dist/lib/scaffold/types.d.ts +34 -0
- package/dist/lib/scaffold/types.js +6 -0
- package/dist/lib/scaffold/types.js.map +1 -0
- package/dist/lib/scaffold/verify.d.ts +9 -0
- package/dist/lib/scaffold/verify.js +48 -0
- package/dist/lib/scaffold/verify.js.map +1 -0
- package/dist/lib/skills.d.ts +2 -2
- package/dist/lib/skills.js +2 -1
- package/dist/lib/skills.js.map +1 -1
- package/package.json +3 -2
- package/skills/teamshare-orchestrator-ask/SKILL.md +14 -0
- package/skills/teamshare-scaffold/SKILL.md +133 -0
- package/templates/backend/.env.example.tpl +13 -0
- package/templates/backend/nest-cli.json.tpl +8 -0
- package/templates/backend/package.json.tpl +41 -0
- package/templates/backend/prisma/schema.prisma.tpl +39 -0
- package/templates/backend/src/app.module.ts.tpl +24 -0
- package/templates/backend/src/common/filters/all-exceptions.filter.ts.tpl +59 -0
- package/templates/backend/src/common/guards/jwt-auth.guard.ts.tpl +27 -0
- package/templates/backend/src/common/guards/rbac.guard.ts.tpl +48 -0
- package/templates/backend/src/common/interceptors/transform.interceptor.ts.tpl +44 -0
- package/templates/backend/src/common/pipes/zod-validation.pipe.ts.tpl +29 -0
- package/templates/backend/src/common/swagger/envelope.schemas.ts.tpl +53 -0
- package/templates/backend/src/common/swagger/error.schemas.ts.tpl +62 -0
- package/templates/backend/src/main.ts.tpl +27 -0
- package/templates/backend/src/modules/example/example.controller.ts.tpl +102 -0
- package/templates/backend/src/modules/example/example.dto.ts.tpl +14 -0
- package/templates/backend/src/modules/example/example.module.ts.tpl +10 -0
- package/templates/backend/src/modules/example/example.service.ts.tpl +45 -0
- package/templates/backend/tsconfig.json.tpl +26 -0
- package/templates/common/.gitignore.tpl +42 -0
- package/templates/common/AGENTS.md.tpl +58 -0
- package/templates/common/docs/adr/README.md +25 -0
- package/templates/common/docs/api-contract.md.tpl +72 -0
- package/templates/web/next.config.ts.tpl +7 -0
- package/templates/web/package.json.tpl +37 -0
- package/templates/web/src/app/globals.css.tpl +48 -0
- package/templates/web/src/app/layout.tsx.tpl +25 -0
- package/templates/web/src/components/shared/app-button.tsx.tpl +59 -0
- package/templates/web/src/components/shared/app-empty-state.tsx.tpl +39 -0
- package/templates/web/src/components/shared/app-list-toolbar.tsx.tpl +63 -0
- package/templates/web/src/components/shared/app-skeleton.tsx.tpl +14 -0
- package/templates/web/src/components/shared/app-table.tsx.tpl +128 -0
- package/templates/web/src/components/shared/index.ts.tpl +5 -0
- package/templates/web/src/hooks/use-list-state.ts.tpl +72 -0
- package/templates/web/src/hooks/use-url-tab.ts.tpl +25 -0
- package/templates/web/src/lib/api/client.ts.tpl +123 -0
- package/templates/web/src/lib/providers.tsx.tpl +35 -0
- package/templates/web/src/lib/query-keys.ts.tpl +21 -0
- package/templates/web/src/lib/utils.ts.tpl +7 -0
- package/templates/web/src/lib/validation/schemas.ts.tpl +15 -0
- package/templates/web/src/modules/example/views/example-list-view.tsx.tpl +98 -0
- package/templates/web/tsconfig.json.tpl +23 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Security checker — scans source files for hardcoded secrets,
|
|
4
|
+
* unguarded public endpoints, and dangerous React patterns.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.runSecurityChecks = runSecurityChecks;
|
|
8
|
+
const types_1 = require("./types");
|
|
9
|
+
const SECRET_PATTERNS = [
|
|
10
|
+
{ pattern: /sk_live_[A-Za-z0-9]+/, name: 'Stripe live key', severity: types_1.Severity.Critical },
|
|
11
|
+
{ pattern: /sk_test_[A-Za-z0-9]+/, name: 'Stripe test key', severity: types_1.Severity.High },
|
|
12
|
+
{ pattern: /AIza[A-Za-z0-9_-]+/, name: 'Google API key', severity: types_1.Severity.Critical },
|
|
13
|
+
{ pattern: /Bearer\s+[A-Za-z0-9]/, name: 'Hardcoded bearer token', severity: types_1.Severity.Critical },
|
|
14
|
+
{ pattern: /PASSWORD\s*=\s*['"][^'"]+['"]/, name: 'Hardcoded password', severity: types_1.Severity.Critical },
|
|
15
|
+
{ pattern: /SECRET\s*=\s*['"][^'"]+['"]/, name: 'Hardcoded secret', severity: types_1.Severity.Critical },
|
|
16
|
+
{ pattern: /KEY\s*=\s*['"][^'"]+['"]/, name: 'Hardcoded key', severity: types_1.Severity.High },
|
|
17
|
+
{
|
|
18
|
+
pattern: /['"][0-9a-f]{32,}['"]/,
|
|
19
|
+
name: 'Potential hex secret',
|
|
20
|
+
severity: types_1.Severity.Medium,
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
/**
|
|
24
|
+
* TeamShare agent keys start with `ts_` followed by alphanumerics.
|
|
25
|
+
* We exclude lines that look like type imports or enum values.
|
|
26
|
+
*/
|
|
27
|
+
const TS_KEY_PATTERN = /\bts_[A-Za-z0-9]{16,}\b/;
|
|
28
|
+
const TS_KEY_EXCLUSION = /import\s|type\s|enum\s|\/\//;
|
|
29
|
+
const SKIP_PATHS = /node_modules|\.env\.example|\.test\.|\.spec\.|__tests__|generated\//;
|
|
30
|
+
function shouldSkipFile(rel) {
|
|
31
|
+
return SKIP_PATHS.test(rel);
|
|
32
|
+
}
|
|
33
|
+
function isTypeDefinition(rel) {
|
|
34
|
+
return /\.d\.ts$/.test(rel);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check a single line for secret patterns.
|
|
38
|
+
*/
|
|
39
|
+
function checkLineForSecrets(line, rel, lineNum) {
|
|
40
|
+
const findings = [];
|
|
41
|
+
// ts_ key pattern — skip type imports and comments
|
|
42
|
+
if (TS_KEY_PATTERN.test(line) && !TS_KEY_EXCLUSION.test(line)) {
|
|
43
|
+
findings.push({
|
|
44
|
+
severity: types_1.Severity.Critical,
|
|
45
|
+
category: types_1.Category.Security,
|
|
46
|
+
file: rel,
|
|
47
|
+
line: lineNum,
|
|
48
|
+
message: 'Potential TeamShare agent key found in source code',
|
|
49
|
+
evidence: line.trim(),
|
|
50
|
+
suggestedFix: 'Move secrets to environment variables or the Vault; never hardcode keys.',
|
|
51
|
+
rule: 'SEC-001',
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
for (const { pattern, name, severity } of SECRET_PATTERNS) {
|
|
55
|
+
if (pattern.test(line)) {
|
|
56
|
+
findings.push({
|
|
57
|
+
severity,
|
|
58
|
+
category: types_1.Category.Security,
|
|
59
|
+
file: rel,
|
|
60
|
+
line: lineNum,
|
|
61
|
+
message: `${name} detected in source code`,
|
|
62
|
+
evidence: line.trim(),
|
|
63
|
+
suggestedFix: 'Move secrets to environment variables or a secrets manager.',
|
|
64
|
+
rule: 'SEC-002',
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return findings;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Check a controller file for @Public() without any guard.
|
|
72
|
+
*/
|
|
73
|
+
function checkUnguardedPublic(content, rel) {
|
|
74
|
+
const findings = [];
|
|
75
|
+
const lines = content.split('\n');
|
|
76
|
+
const hasPublicDecorator = /@Public\(\)/.test(content);
|
|
77
|
+
if (!hasPublicDecorator)
|
|
78
|
+
return findings;
|
|
79
|
+
const hasGuard = /@UseGuards\(/.test(content) ||
|
|
80
|
+
/AgentsDualAuthGuard/.test(content) ||
|
|
81
|
+
/ApiKeyGuard/.test(content);
|
|
82
|
+
if (hasGuard)
|
|
83
|
+
return findings;
|
|
84
|
+
// Find the line with @Public()
|
|
85
|
+
for (let i = 0; i < lines.length; i++) {
|
|
86
|
+
if (/@Public\(\)/.test(lines[i])) {
|
|
87
|
+
findings.push({
|
|
88
|
+
severity: types_1.Severity.Critical,
|
|
89
|
+
category: types_1.Category.Security,
|
|
90
|
+
file: rel,
|
|
91
|
+
line: i + 1,
|
|
92
|
+
message: '@Public() decorator used without any guard — endpoint is completely unprotected',
|
|
93
|
+
evidence: lines[i].trim(),
|
|
94
|
+
suggestedFix: 'Add @UseGuards(AuthGuard) or @UseGuards(AgentsDualAuthGuard) to protect this endpoint.',
|
|
95
|
+
rule: 'SEC-003',
|
|
96
|
+
});
|
|
97
|
+
break; // Only report once per file
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return findings;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Check for dangerouslySetInnerHTML in React components.
|
|
104
|
+
*/
|
|
105
|
+
function checkDangerouslySetInnerHTML(content, rel) {
|
|
106
|
+
const findings = [];
|
|
107
|
+
const lines = content.split('\n');
|
|
108
|
+
for (let i = 0; i < lines.length; i++) {
|
|
109
|
+
if (/dangerouslySetInnerHTML/.test(lines[i])) {
|
|
110
|
+
findings.push({
|
|
111
|
+
severity: types_1.Severity.Medium,
|
|
112
|
+
category: types_1.Category.Security,
|
|
113
|
+
file: rel,
|
|
114
|
+
line: i + 1,
|
|
115
|
+
message: 'dangerouslySetInnerHTML used — potential XSS vector',
|
|
116
|
+
evidence: lines[i].trim(),
|
|
117
|
+
suggestedFix: 'Sanitize HTML input or use a library like DOMPurify before rendering.',
|
|
118
|
+
rule: 'SEC-004',
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return findings;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Run all security checks against the repository.
|
|
126
|
+
*/
|
|
127
|
+
function runSecurityChecks(ctx) {
|
|
128
|
+
const findings = [];
|
|
129
|
+
const files = ctx.listFiles('**/*.{ts,tsx}');
|
|
130
|
+
for (const rel of files) {
|
|
131
|
+
if (shouldSkipFile(rel) || isTypeDefinition(rel))
|
|
132
|
+
continue;
|
|
133
|
+
const content = ctx.readFile(rel);
|
|
134
|
+
if (!content)
|
|
135
|
+
continue;
|
|
136
|
+
const lines = content.split('\n');
|
|
137
|
+
for (let i = 0; i < lines.length; i++) {
|
|
138
|
+
findings.push(...checkLineForSecrets(lines[i], rel, i + 1));
|
|
139
|
+
}
|
|
140
|
+
// Controller guard check — only for backend controllers
|
|
141
|
+
if (rel.includes('.controller.ts')) {
|
|
142
|
+
findings.push(...checkUnguardedPublic(content, rel));
|
|
143
|
+
}
|
|
144
|
+
// dangerouslySetInnerHTML — only for TSX files
|
|
145
|
+
if (rel.endsWith('.tsx')) {
|
|
146
|
+
findings.push(...checkDangerouslySetInnerHTML(content, rel));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return findings;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../../src/lib/audit/security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit engine types — finding severity, categories, and the audit manifest.
|
|
3
|
+
*/
|
|
4
|
+
export declare enum Severity {
|
|
5
|
+
Critical = "critical",
|
|
6
|
+
High = "high",
|
|
7
|
+
Medium = "medium",
|
|
8
|
+
Low = "low",
|
|
9
|
+
Advisory = "advisory"
|
|
10
|
+
}
|
|
11
|
+
export declare enum Category {
|
|
12
|
+
Security = "security",
|
|
13
|
+
Modularity = "modularity",
|
|
14
|
+
RBAC = "rbac",
|
|
15
|
+
Errors = "errors",
|
|
16
|
+
Quality = "quality",
|
|
17
|
+
UX = "ux",
|
|
18
|
+
Docs = "docs",
|
|
19
|
+
Gates = "gates"
|
|
20
|
+
}
|
|
21
|
+
export interface Finding {
|
|
22
|
+
severity: Severity;
|
|
23
|
+
category: Category;
|
|
24
|
+
file: string;
|
|
25
|
+
line?: number;
|
|
26
|
+
column?: number;
|
|
27
|
+
message: string;
|
|
28
|
+
evidence?: string;
|
|
29
|
+
suggestedFix?: string;
|
|
30
|
+
rule?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface AuditResult {
|
|
33
|
+
repoName: string;
|
|
34
|
+
repoPath: string;
|
|
35
|
+
repoType: 'web' | 'backend' | 'mobile' | 'unknown';
|
|
36
|
+
isExistingRepo: boolean;
|
|
37
|
+
findings: Finding[];
|
|
38
|
+
gateResults: GateResult[];
|
|
39
|
+
scannedFiles: number;
|
|
40
|
+
startedAt: string;
|
|
41
|
+
completedAt: string;
|
|
42
|
+
}
|
|
43
|
+
export interface GateResult {
|
|
44
|
+
name: string;
|
|
45
|
+
passed: boolean;
|
|
46
|
+
output?: string;
|
|
47
|
+
error?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface AuditOptions {
|
|
50
|
+
path: string;
|
|
51
|
+
type?: 'auto' | 'web' | 'backend' | 'mobile';
|
|
52
|
+
reportPath?: string;
|
|
53
|
+
upload?: boolean;
|
|
54
|
+
taskId?: string;
|
|
55
|
+
deep?: boolean;
|
|
56
|
+
existingRepo?: boolean;
|
|
57
|
+
/** Skip build/typecheck gates (fast structural-only audit). */
|
|
58
|
+
skipGates?: boolean;
|
|
59
|
+
}
|
|
60
|
+
export interface CheckerContext {
|
|
61
|
+
root: string;
|
|
62
|
+
repoType: 'web' | 'backend' | 'mobile' | 'unknown';
|
|
63
|
+
isExistingRepo: boolean;
|
|
64
|
+
readFile: (relativePath: string) => string | null;
|
|
65
|
+
listFiles: (glob: string) => string[];
|
|
66
|
+
fileExists: (relativePath: string) => boolean;
|
|
67
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Audit engine types — finding severity, categories, and the audit manifest.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Category = exports.Severity = void 0;
|
|
7
|
+
var Severity;
|
|
8
|
+
(function (Severity) {
|
|
9
|
+
Severity["Critical"] = "critical";
|
|
10
|
+
Severity["High"] = "high";
|
|
11
|
+
Severity["Medium"] = "medium";
|
|
12
|
+
Severity["Low"] = "low";
|
|
13
|
+
Severity["Advisory"] = "advisory";
|
|
14
|
+
})(Severity || (exports.Severity = Severity = {}));
|
|
15
|
+
var Category;
|
|
16
|
+
(function (Category) {
|
|
17
|
+
Category["Security"] = "security";
|
|
18
|
+
Category["Modularity"] = "modularity";
|
|
19
|
+
Category["RBAC"] = "rbac";
|
|
20
|
+
Category["Errors"] = "errors";
|
|
21
|
+
Category["Quality"] = "quality";
|
|
22
|
+
Category["UX"] = "ux";
|
|
23
|
+
Category["Docs"] = "docs";
|
|
24
|
+
Category["Gates"] = "gates";
|
|
25
|
+
})(Category || (exports.Category = Category = {}));
|
|
26
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/audit/types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,IAAY,QAMX;AAND,WAAY,QAAQ;IAClB,iCAAqB,CAAA;IACrB,yBAAa,CAAA;IACb,6BAAiB,CAAA;IACjB,uBAAW,CAAA;IACX,iCAAqB,CAAA;AACvB,CAAC,EANW,QAAQ,wBAAR,QAAQ,QAMnB;AAED,IAAY,QASX;AATD,WAAY,QAAQ;IAClB,iCAAqB,CAAA;IACrB,qCAAyB,CAAA;IACzB,yBAAa,CAAA;IACb,6BAAiB,CAAA;IACjB,+BAAmB,CAAA;IACnB,qBAAS,CAAA;IACT,yBAAa,CAAA;IACb,2BAAe,CAAA;AACjB,CAAC,EATW,QAAQ,wBAAR,QAAQ,QASnB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UX / loading-state checker — verifies that frontend views handling
|
|
3
|
+
* async data have proper loading, error, and empty states.
|
|
4
|
+
*/
|
|
5
|
+
import type { Finding, CheckerContext } from './types';
|
|
6
|
+
/**
|
|
7
|
+
* Run all UX / loading-state checks against the repository.
|
|
8
|
+
*/
|
|
9
|
+
export declare function runUXChecks(ctx: CheckerContext): Finding[];
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* UX / loading-state checker — verifies that frontend views handling
|
|
4
|
+
* async data have proper loading, error, and empty states.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.runUXChecks = runUXChecks;
|
|
8
|
+
const types_1 = require("./types");
|
|
9
|
+
const VIEW_FILE = /src\/modules\/[^/]+\/views\/[^/]+\.tsx$/;
|
|
10
|
+
const HAS_USE_QUERY = /useQuery|useSuspenseQuery|useInfiniteQuery/;
|
|
11
|
+
// A view satisfies the loading requirement either by rendering a Skeleton
|
|
12
|
+
// itself or by passing loading={...} down to a table/list that does.
|
|
13
|
+
const HAS_SKELETON = /Skeleton|loading\s*=\s*\{/;
|
|
14
|
+
const HAS_ERROR_STATE = /ErrorState|\bisError\b|error\s*[=?:]|catch\s*\(/;
|
|
15
|
+
// emptyTitle/emptyDescription/emptyIcon props delegate empty handling to
|
|
16
|
+
// the table; a direct EmptyState render also counts.
|
|
17
|
+
const HAS_EMPTY_STATE = /EmptyState|emptyTitle|emptyDescription|emptyIcon|data\.length\s*===\s*0/;
|
|
18
|
+
/**
|
|
19
|
+
* Check a single view file for query usage and required UX states.
|
|
20
|
+
*/
|
|
21
|
+
function checkViewFile(content, rel) {
|
|
22
|
+
const findings = [];
|
|
23
|
+
const isQueryView = HAS_USE_QUERY.test(content);
|
|
24
|
+
if (!isQueryView)
|
|
25
|
+
return findings;
|
|
26
|
+
if (!HAS_SKELETON.test(content)) {
|
|
27
|
+
findings.push({
|
|
28
|
+
severity: types_1.Severity.Medium,
|
|
29
|
+
category: types_1.Category.UX,
|
|
30
|
+
file: rel,
|
|
31
|
+
message: 'Query view missing loading skeleton — no loading state shown to user',
|
|
32
|
+
suggestedFix: 'Render a Skeleton (or pass loading= to a table that renders one) while the query is loading.',
|
|
33
|
+
rule: 'UX-001',
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
if (!HAS_ERROR_STATE.test(content)) {
|
|
37
|
+
findings.push({
|
|
38
|
+
severity: types_1.Severity.Medium,
|
|
39
|
+
category: types_1.Category.UX,
|
|
40
|
+
file: rel,
|
|
41
|
+
message: 'Query view missing error state — query failures not communicated to user',
|
|
42
|
+
suggestedFix: 'Check query.isError and render an ErrorState component with retry action.',
|
|
43
|
+
rule: 'UX-002',
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
if (!HAS_EMPTY_STATE.test(content)) {
|
|
47
|
+
findings.push({
|
|
48
|
+
severity: types_1.Severity.Medium,
|
|
49
|
+
category: types_1.Category.UX,
|
|
50
|
+
file: rel,
|
|
51
|
+
message: 'Query view missing empty state — empty results not communicated to user',
|
|
52
|
+
suggestedFix: 'Check data.length === 0 and render an EmptyState with a helpful message.',
|
|
53
|
+
rule: 'UX-003',
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return findings;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check that shared UX components exist.
|
|
60
|
+
*
|
|
61
|
+
* Naming-agnostic: matches any *-empty-state / *-skeleton file so both
|
|
62
|
+
* TeamShare's ts-* and scaffolded app-* (or any user) naming pass.
|
|
63
|
+
*/
|
|
64
|
+
function checkSharedUXComponents(ctx) {
|
|
65
|
+
const findings = [];
|
|
66
|
+
const sharedDir = 'src/components/shared';
|
|
67
|
+
const sharedFiles = new Set(ctx
|
|
68
|
+
.listFiles(`${sharedDir}/*.tsx`)
|
|
69
|
+
.map((f) => f.toLowerCase()));
|
|
70
|
+
const hasFile = (suffix) => [...sharedFiles].some((f) => f.endsWith(suffix));
|
|
71
|
+
if (!hasFile('empty-state.tsx')) {
|
|
72
|
+
findings.push({
|
|
73
|
+
severity: types_1.Severity.Low,
|
|
74
|
+
category: types_1.Category.UX,
|
|
75
|
+
file: `${sharedDir}/`,
|
|
76
|
+
message: 'Missing shared empty state component',
|
|
77
|
+
suggestedFix: `Create ${sharedDir}/empty-state.tsx with a reusable EmptyState component.`,
|
|
78
|
+
rule: 'UX-004',
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
if (!hasFile('skeleton.tsx')) {
|
|
82
|
+
findings.push({
|
|
83
|
+
severity: types_1.Severity.Low,
|
|
84
|
+
category: types_1.Category.UX,
|
|
85
|
+
file: `${sharedDir}/`,
|
|
86
|
+
message: 'Missing shared skeleton component',
|
|
87
|
+
suggestedFix: `Create ${sharedDir}/skeleton.tsx with a reusable Skeleton component.`,
|
|
88
|
+
rule: 'UX-005',
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return findings;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Run all UX / loading-state checks against the repository.
|
|
95
|
+
*/
|
|
96
|
+
function runUXChecks(ctx) {
|
|
97
|
+
const findings = [];
|
|
98
|
+
if (ctx.repoType !== 'web' && ctx.repoType !== 'mobile')
|
|
99
|
+
return findings;
|
|
100
|
+
const viewFiles = ctx.listFiles('src/modules/*/views/*.tsx');
|
|
101
|
+
for (const rel of viewFiles) {
|
|
102
|
+
if (/node_modules|dist/.test(rel))
|
|
103
|
+
continue;
|
|
104
|
+
const content = ctx.readFile(rel);
|
|
105
|
+
if (!content)
|
|
106
|
+
continue;
|
|
107
|
+
findings.push(...checkViewFile(content, rel));
|
|
108
|
+
}
|
|
109
|
+
findings.push(...checkSharedUXComponents(ctx));
|
|
110
|
+
return findings;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=ux.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ux.js","sourceRoot":"","sources":["../../../src/lib/audit/ux.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/brief.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Task-brief fetching + session reporting helpers shared by the CLI, daemon
|
|
3
3
|
* and protocol handler (contract section 5, "CLI session").
|
|
4
|
+
*
|
|
5
|
+
* Compact brief: sends only essential metadata (~500-800 tokens) and lets
|
|
6
|
+
* agents fetch additional context on-demand via MCP/REST tools.
|
|
4
7
|
*/
|
|
5
8
|
import { TeamshareApi, Task } from './api';
|
|
6
9
|
export interface BriefOptions {
|
|
10
|
+
/** Legacy: no longer used for doc content (names-only in compact brief). */
|
|
7
11
|
maxDocChars?: number;
|
|
8
12
|
}
|
|
9
13
|
/** Builds the Markdown brief the working session sees. */
|
package/dist/lib/brief.js
CHANGED
|
@@ -4,10 +4,36 @@ exports.fetchTaskBrief = fetchTaskBrief;
|
|
|
4
4
|
exports.reportStatus = reportStatus;
|
|
5
5
|
exports.postClosingComment = postClosingComment;
|
|
6
6
|
exports.waitForTaskCompletion = waitForTaskCompletion;
|
|
7
|
-
|
|
7
|
+
/** Safety cap: descriptions beyond this are truncated with a hint. */
|
|
8
|
+
const TRUNC_DESC_CHARS = 5_000;
|
|
9
|
+
/** Only the last N comments are included (summary format). */
|
|
10
|
+
const MAX_COMMENTS_IN_BRIEF = 3;
|
|
11
|
+
/** Only unchecked checklist items shown (up to this many). */
|
|
12
|
+
const MAX_UNCHECKED_CHECKLIST = 10;
|
|
13
|
+
/** Max document names listed. */
|
|
14
|
+
const MAX_DOC_NAMES = 15;
|
|
15
|
+
/** Estimate token count from characters (conservative). */
|
|
16
|
+
function estimateChars(text) {
|
|
17
|
+
return text.length;
|
|
18
|
+
}
|
|
19
|
+
/** Count total + done subtask nodes recursively. */
|
|
20
|
+
function countSubtasks(nodes) {
|
|
21
|
+
let total = 0;
|
|
22
|
+
let done = 0;
|
|
23
|
+
for (const node of nodes) {
|
|
24
|
+
total++;
|
|
25
|
+
if (node.done)
|
|
26
|
+
done++;
|
|
27
|
+
if (node.children?.length) {
|
|
28
|
+
const child = countSubtasks(node.children);
|
|
29
|
+
total += child.total;
|
|
30
|
+
done += child.done;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return { total, done };
|
|
34
|
+
}
|
|
8
35
|
/** Builds the Markdown brief the working session sees. */
|
|
9
36
|
async function fetchTaskBrief(api, taskId, opts = {}) {
|
|
10
|
-
const maxDocChars = opts.maxDocChars ?? MAX_DOC_CHARS;
|
|
11
37
|
const task = await api.getTask(taskId);
|
|
12
38
|
const lines = [];
|
|
13
39
|
lines.push(`# Task: ${task.title}`);
|
|
@@ -19,86 +45,98 @@ async function fetchTaskBrief(api, taskId, opts = {}) {
|
|
|
19
45
|
if (task.project)
|
|
20
46
|
lines.push(`- **Project:** ${task.project.name} (${task.projectId})`);
|
|
21
47
|
lines.push('');
|
|
48
|
+
// Description — truncated at safety cap to prevent token waste on long specs.
|
|
22
49
|
if (task.description) {
|
|
23
50
|
lines.push('## Description');
|
|
24
51
|
lines.push('');
|
|
25
|
-
|
|
52
|
+
if (task.description.length > TRUNC_DESC_CHARS) {
|
|
53
|
+
lines.push(`${task.description.slice(0, TRUNC_DESC_CHARS)}…`);
|
|
54
|
+
lines.push('');
|
|
55
|
+
lines.push(`*(truncated — use get_task for full description)*`);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
lines.push(task.description);
|
|
59
|
+
}
|
|
26
60
|
lines.push('');
|
|
27
61
|
}
|
|
28
|
-
// Verification checklist —
|
|
62
|
+
// Verification checklist — only unchecked items (max 10).
|
|
63
|
+
// The agent can fetch the full list via list_checklist_items.
|
|
29
64
|
const checklist = await api.listChecklistItems(taskId).catch(() => []);
|
|
65
|
+
const unchecked = checklist.filter((item) => !item.done);
|
|
30
66
|
if (checklist.length > 0) {
|
|
31
|
-
|
|
67
|
+
const doneCount = checklist.length - unchecked.length;
|
|
68
|
+
lines.push(`## Verification Checklist`);
|
|
32
69
|
lines.push('');
|
|
33
|
-
lines.push(
|
|
70
|
+
lines.push(`You MUST verify each criterion below. Check them off as you complete them.`);
|
|
34
71
|
lines.push('');
|
|
35
|
-
for (const item of
|
|
36
|
-
lines.push(`- [
|
|
72
|
+
for (const item of unchecked.slice(0, MAX_UNCHECKED_CHECKLIST)) {
|
|
73
|
+
lines.push(`- [ ] ${item.title}`);
|
|
74
|
+
}
|
|
75
|
+
const remaining = unchecked.length - MAX_UNCHECKED_CHECKLIST;
|
|
76
|
+
if (remaining > 0) {
|
|
77
|
+
lines.push(`- *(${remaining} more unchecked — use list_checklist_items for full list)*`);
|
|
78
|
+
}
|
|
79
|
+
if (doneCount > 0) {
|
|
80
|
+
lines.push(`- *(${doneCount} already done)*`);
|
|
37
81
|
}
|
|
38
82
|
lines.push('');
|
|
39
83
|
}
|
|
84
|
+
// Comments — last 3 only (summary format).
|
|
85
|
+
// The agent can fetch the full thread via get_task.
|
|
40
86
|
const comments = await api.listComments(taskId);
|
|
41
87
|
if (comments.length > 0) {
|
|
42
|
-
|
|
88
|
+
const lastN = comments.slice(-MAX_COMMENTS_IN_BRIEF);
|
|
89
|
+
lines.push(`## Comments`);
|
|
43
90
|
lines.push('');
|
|
44
|
-
for (const c of
|
|
91
|
+
for (const c of lastN) {
|
|
45
92
|
const author = c.author?.name ?? c.authorId ?? 'unknown';
|
|
46
93
|
lines.push(`- **${author}** (${c.createdAt}): ${c.body.replace(/\s+/g, ' ')}`);
|
|
47
94
|
}
|
|
95
|
+
if (comments.length > MAX_COMMENTS_IN_BRIEF) {
|
|
96
|
+
lines.push(`- *(${comments.length - MAX_COMMENTS_IN_BRIEF} older comments — use get_task for full thread)*`);
|
|
97
|
+
}
|
|
48
98
|
lines.push('');
|
|
49
99
|
}
|
|
50
|
-
//
|
|
100
|
+
// Subtasks — count + summary (no tree).
|
|
101
|
+
// The agent can fetch the full tree via list_subtasks.
|
|
51
102
|
const subtasks = await api.listSubtasks(taskId).catch(() => []);
|
|
52
103
|
if (subtasks.length > 0) {
|
|
53
|
-
|
|
104
|
+
const { total, done } = countSubtasks(subtasks);
|
|
105
|
+
const pending = total - done;
|
|
106
|
+
lines.push(`## Subtasks`);
|
|
54
107
|
lines.push('');
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
(node.assignee?.name ? ` (assignee: ${node.assignee.name})` : ''));
|
|
59
|
-
if (node.children?.length)
|
|
60
|
-
render(node.children, depth + 1);
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
render(subtasks, 0);
|
|
108
|
+
lines.push(`**${total} total** — ${done} done, ${pending} pending`);
|
|
109
|
+
lines.push('');
|
|
110
|
+
lines.push(`*(use list_subtasks for full breakdown)*`);
|
|
64
111
|
lines.push('');
|
|
65
112
|
}
|
|
113
|
+
// Project documents — names only (no content fetch).
|
|
114
|
+
// The agent can read documents via list_documents + read_document.
|
|
66
115
|
if (task.projectId) {
|
|
67
116
|
const docsResult = await api.listDocuments(task.projectId);
|
|
68
117
|
const allDocs = docsResult.items ?? [];
|
|
69
|
-
// Smart filtering: only include relevant docs in the brief.
|
|
70
|
-
// The agent can read others via MCP tools (list_documents, read_document).
|
|
71
118
|
const relevantDocs = allDocs.filter((doc) => {
|
|
72
119
|
const folder = doc.folderPath || '/';
|
|
73
|
-
// Task-specific: agents/*/tasks/<taskId>/ or agents/*/tasks/<taskId>
|
|
74
120
|
if (folder.includes(`/tasks/${taskId}`) || folder.endsWith(`tasks/${taskId}`))
|
|
75
121
|
return true;
|
|
76
|
-
// Shared knowledge: docs/ folder and subfolders
|
|
77
122
|
if (folder.startsWith('docs/') || folder === 'docs')
|
|
78
123
|
return true;
|
|
79
|
-
// Root level
|
|
80
124
|
if (folder === '/')
|
|
81
125
|
return true;
|
|
82
126
|
return false;
|
|
83
127
|
});
|
|
84
128
|
if (relevantDocs.length > 0) {
|
|
129
|
+
const shown = relevantDocs.slice(0, MAX_DOC_NAMES);
|
|
85
130
|
lines.push('## Project files');
|
|
86
131
|
lines.push('');
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
continue;
|
|
94
|
-
}
|
|
95
|
-
const body = content.length > remain ? `${content.slice(0, remain)}…` : content;
|
|
96
|
-
used += body.length;
|
|
97
|
-
lines.push(`### ${doc.name}${doc.mime ? ` (${doc.mime})` : ''}`);
|
|
98
|
-
lines.push('');
|
|
99
|
-
lines.push(body);
|
|
100
|
-
lines.push('');
|
|
132
|
+
for (const doc of shown) {
|
|
133
|
+
const path = doc.folderPath && doc.folderPath !== '/' ? `${doc.folderPath}/` : '';
|
|
134
|
+
lines.push(`- ${path}${doc.name}${doc.mime ? ` (${doc.mime})` : ''}`);
|
|
135
|
+
}
|
|
136
|
+
if (relevantDocs.length > MAX_DOC_NAMES) {
|
|
137
|
+
lines.push(`- *(${relevantDocs.length - MAX_DOC_NAMES} more — use list_documents for full list)*`);
|
|
101
138
|
}
|
|
139
|
+
lines.push('');
|
|
102
140
|
}
|
|
103
141
|
}
|
|
104
142
|
return lines.join('\n');
|
package/dist/lib/brief.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brief.js","sourceRoot":"","sources":["../../src/lib/brief.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"brief.js","sourceRoot":"","sources":["../../src/lib/brief.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/chat-reply.js
CHANGED
|
@@ -61,7 +61,7 @@ async function generateReply(agentName, target, prompt, projectId, opts, project
|
|
|
61
61
|
title: `TeamShare chat ${projectId}`,
|
|
62
62
|
agentKey: opts.api?.apiKey,
|
|
63
63
|
apiBaseUrl: opts.api?.baseUrl,
|
|
64
|
-
}), { opencodeAgentKey: opts.api?.apiKey, opencodeMcpUrl: opts.api?.baseUrl });
|
|
64
|
+
}), { opencodeAgentKey: opts.api?.apiKey, opencodeMcpUrl: opts.api?.baseUrl, opencodeSessionMode: 'chat' });
|
|
65
65
|
}
|
|
66
66
|
throw new Error('harness-only model requires a harness (install one of: opencode, claude, codex, gemini, copilot, goose, openhands)');
|
|
67
67
|
}
|
|
@@ -94,7 +94,7 @@ async function generateReply(agentName, target, prompt, projectId, opts, project
|
|
|
94
94
|
title: `TeamShare chat ${projectId}`,
|
|
95
95
|
agentKey: opts.api?.apiKey,
|
|
96
96
|
apiBaseUrl: opts.api?.baseUrl,
|
|
97
|
-
}), { opencodeAgentKey: opts.api?.apiKey, opencodeMcpUrl: opts.api?.baseUrl });
|
|
97
|
+
}), { opencodeAgentKey: opts.api?.apiKey, opencodeMcpUrl: opts.api?.baseUrl, opencodeSessionMode: 'chat' });
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
100
|
throw new Error('No harness found (install one of: opencode, claude, codex, gemini, copilot, goose, openhands, or use --self with LLM_API_KEY)');
|