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.
Files changed (140) hide show
  1. package/dist/bridge/daemon.js +36 -0
  2. package/dist/bridge/daemon.js.map +1 -1
  3. package/dist/bridge/local-server.d.ts +1 -1
  4. package/dist/bridge/spawn.d.ts +2 -0
  5. package/dist/bridge/spawn.js +17 -0
  6. package/dist/bridge/spawn.js.map +1 -1
  7. package/dist/cli/commands/audit.d.ts +1 -0
  8. package/dist/cli/commands/audit.js +75 -0
  9. package/dist/cli/commands/audit.js.map +1 -0
  10. package/dist/cli/commands/build.js +24 -8
  11. package/dist/cli/commands/build.js.map +1 -1
  12. package/dist/cli/commands/chat.js +1 -1
  13. package/dist/cli/commands/chat.js.map +1 -1
  14. package/dist/cli/commands/doc.js +2 -2
  15. package/dist/cli/commands/doc.js.map +1 -1
  16. package/dist/cli/commands/harness.js +1 -1
  17. package/dist/cli/commands/harness.js.map +1 -1
  18. package/dist/cli/commands/run.js +19 -4
  19. package/dist/cli/commands/run.js.map +1 -1
  20. package/dist/cli/commands/scaffold.d.ts +1 -0
  21. package/dist/cli/commands/scaffold.js +111 -0
  22. package/dist/cli/commands/scaffold.js.map +1 -0
  23. package/dist/cli/commands/worker.d.ts +2 -0
  24. package/dist/cli/commands/worker.js +110 -0
  25. package/dist/cli/commands/worker.js.map +1 -0
  26. package/dist/cli/index.js +16 -0
  27. package/dist/cli/index.js.map +1 -1
  28. package/dist/lib/api.d.ts +35 -4
  29. package/dist/lib/api.js +20 -3
  30. package/dist/lib/api.js.map +1 -1
  31. package/dist/lib/audit/docs.d.ts +5 -0
  32. package/dist/lib/audit/docs.js +52 -0
  33. package/dist/lib/audit/docs.js.map +1 -0
  34. package/dist/lib/audit/errors.d.ts +15 -0
  35. package/dist/lib/audit/errors.js +154 -0
  36. package/dist/lib/audit/errors.js.map +1 -0
  37. package/dist/lib/audit/gates.d.ts +2 -0
  38. package/dist/lib/audit/gates.js +57 -0
  39. package/dist/lib/audit/gates.js.map +1 -0
  40. package/dist/lib/audit/modularity.d.ts +13 -0
  41. package/dist/lib/audit/modularity.js +200 -0
  42. package/dist/lib/audit/modularity.js.map +1 -0
  43. package/dist/lib/audit/quality.d.ts +9 -0
  44. package/dist/lib/audit/quality.js +128 -0
  45. package/dist/lib/audit/quality.js.map +1 -0
  46. package/dist/lib/audit/rbac.d.ts +14 -0
  47. package/dist/lib/audit/rbac.js +139 -0
  48. package/dist/lib/audit/rbac.js.map +1 -0
  49. package/dist/lib/audit/reporter.d.ts +5 -0
  50. package/dist/lib/audit/reporter.js +107 -0
  51. package/dist/lib/audit/reporter.js.map +1 -0
  52. package/dist/lib/audit/runner.d.ts +2 -0
  53. package/dist/lib/audit/runner.js +150 -0
  54. package/dist/lib/audit/runner.js.map +1 -0
  55. package/dist/lib/audit/security.d.ts +9 -0
  56. package/dist/lib/audit/security.js +151 -0
  57. package/dist/lib/audit/security.js.map +1 -0
  58. package/dist/lib/audit/types.d.ts +67 -0
  59. package/dist/lib/audit/types.js +26 -0
  60. package/dist/lib/audit/types.js.map +1 -0
  61. package/dist/lib/audit/ux.d.ts +9 -0
  62. package/dist/lib/audit/ux.js +112 -0
  63. package/dist/lib/audit/ux.js.map +1 -0
  64. package/dist/lib/brief.d.ts +4 -0
  65. package/dist/lib/brief.js +78 -40
  66. package/dist/lib/brief.js.map +1 -1
  67. package/dist/lib/chat-reply.js +2 -2
  68. package/dist/lib/chat-reply.js.map +1 -1
  69. package/dist/lib/config.d.ts +1 -1
  70. package/dist/lib/config.js +1 -1
  71. package/dist/lib/doc-reply.js +1 -1
  72. package/dist/lib/doc-reply.js.map +1 -1
  73. package/dist/lib/harness-adapter.d.ts +3 -1
  74. package/dist/lib/harness-adapter.js +19 -16
  75. package/dist/lib/harness-adapter.js.map +1 -1
  76. package/dist/lib/harness.d.ts +3 -1
  77. package/dist/lib/harness.js +8 -5
  78. package/dist/lib/harness.js.map +1 -1
  79. package/dist/lib/llm.js +87 -9
  80. package/dist/lib/llm.js.map +1 -1
  81. package/dist/lib/lock.d.ts +1 -1
  82. package/dist/lib/scaffold/renderer.d.ts +7 -0
  83. package/dist/lib/scaffold/renderer.js +37 -0
  84. package/dist/lib/scaffold/renderer.js.map +1 -0
  85. package/dist/lib/scaffold/structure.d.ts +3 -0
  86. package/dist/lib/scaffold/structure.js +73 -0
  87. package/dist/lib/scaffold/structure.js.map +1 -0
  88. package/dist/lib/scaffold/types.d.ts +34 -0
  89. package/dist/lib/scaffold/types.js +6 -0
  90. package/dist/lib/scaffold/types.js.map +1 -0
  91. package/dist/lib/scaffold/verify.d.ts +9 -0
  92. package/dist/lib/scaffold/verify.js +48 -0
  93. package/dist/lib/scaffold/verify.js.map +1 -0
  94. package/dist/lib/skills.d.ts +2 -2
  95. package/dist/lib/skills.js +2 -1
  96. package/dist/lib/skills.js.map +1 -1
  97. package/package.json +3 -2
  98. package/skills/teamshare-orchestrator-ask/SKILL.md +14 -0
  99. package/skills/teamshare-scaffold/SKILL.md +133 -0
  100. package/templates/backend/.env.example.tpl +13 -0
  101. package/templates/backend/nest-cli.json.tpl +8 -0
  102. package/templates/backend/package.json.tpl +41 -0
  103. package/templates/backend/prisma/schema.prisma.tpl +39 -0
  104. package/templates/backend/src/app.module.ts.tpl +24 -0
  105. package/templates/backend/src/common/filters/all-exceptions.filter.ts.tpl +59 -0
  106. package/templates/backend/src/common/guards/jwt-auth.guard.ts.tpl +27 -0
  107. package/templates/backend/src/common/guards/rbac.guard.ts.tpl +48 -0
  108. package/templates/backend/src/common/interceptors/transform.interceptor.ts.tpl +44 -0
  109. package/templates/backend/src/common/pipes/zod-validation.pipe.ts.tpl +29 -0
  110. package/templates/backend/src/common/swagger/envelope.schemas.ts.tpl +53 -0
  111. package/templates/backend/src/common/swagger/error.schemas.ts.tpl +62 -0
  112. package/templates/backend/src/main.ts.tpl +27 -0
  113. package/templates/backend/src/modules/example/example.controller.ts.tpl +102 -0
  114. package/templates/backend/src/modules/example/example.dto.ts.tpl +14 -0
  115. package/templates/backend/src/modules/example/example.module.ts.tpl +10 -0
  116. package/templates/backend/src/modules/example/example.service.ts.tpl +45 -0
  117. package/templates/backend/tsconfig.json.tpl +26 -0
  118. package/templates/common/.gitignore.tpl +42 -0
  119. package/templates/common/AGENTS.md.tpl +58 -0
  120. package/templates/common/docs/adr/README.md +25 -0
  121. package/templates/common/docs/api-contract.md.tpl +72 -0
  122. package/templates/web/next.config.ts.tpl +7 -0
  123. package/templates/web/package.json.tpl +37 -0
  124. package/templates/web/src/app/globals.css.tpl +48 -0
  125. package/templates/web/src/app/layout.tsx.tpl +25 -0
  126. package/templates/web/src/components/shared/app-button.tsx.tpl +59 -0
  127. package/templates/web/src/components/shared/app-empty-state.tsx.tpl +39 -0
  128. package/templates/web/src/components/shared/app-list-toolbar.tsx.tpl +63 -0
  129. package/templates/web/src/components/shared/app-skeleton.tsx.tpl +14 -0
  130. package/templates/web/src/components/shared/app-table.tsx.tpl +128 -0
  131. package/templates/web/src/components/shared/index.ts.tpl +5 -0
  132. package/templates/web/src/hooks/use-list-state.ts.tpl +72 -0
  133. package/templates/web/src/hooks/use-url-tab.ts.tpl +25 -0
  134. package/templates/web/src/lib/api/client.ts.tpl +123 -0
  135. package/templates/web/src/lib/providers.tsx.tpl +35 -0
  136. package/templates/web/src/lib/query-keys.ts.tpl +21 -0
  137. package/templates/web/src/lib/utils.ts.tpl +7 -0
  138. package/templates/web/src/lib/validation/schemas.ts.tpl +15 -0
  139. package/templates/web/src/modules/example/views/example-list-view.tsx.tpl +98 -0
  140. 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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"}
@@ -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
- const MAX_DOC_CHARS = 20_000;
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
- lines.push(task.description);
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 — predefined criteria the agent must verify.
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
- lines.push('## Verification Checklist');
67
+ const doneCount = checklist.length - unchecked.length;
68
+ lines.push(`## Verification Checklist`);
32
69
  lines.push('');
33
- lines.push('You MUST verify each criterion below. Check them off as you complete them.');
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 checklist) {
36
- lines.push(`- [${item.done ? 'x' : ' '}] ${item.title}`);
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
- lines.push('## Comments');
88
+ const lastN = comments.slice(-MAX_COMMENTS_IN_BRIEF);
89
+ lines.push(`## Comments`);
43
90
  lines.push('');
44
- for (const c of comments.slice(-25)) {
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
- // Subtask breakdown (existing or to-be-created) - the agent's progress plan.
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
- lines.push('## Subtasks');
104
+ const { total, done } = countSubtasks(subtasks);
105
+ const pending = total - done;
106
+ lines.push(`## Subtasks`);
54
107
  lines.push('');
55
- const render = (nodes, depth) => {
56
- for (const node of nodes) {
57
- lines.push(`${' '.repeat(depth)}- [${node.done ? 'x' : ' '}] ${node.title}` +
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
- let used = 0;
88
- for (const doc of relevantDocs.slice(0, 20)) {
89
- const content = await api.getDocumentContent(doc);
90
- const remain = maxDocChars - used;
91
- if (remain <= 0) {
92
- lines.push(`- ${doc.name}: (omitted - budget reached)`);
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');
@@ -1 +1 @@
1
- {"version":3,"file":"brief.js","sourceRoot":"","sources":["../../src/lib/brief.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brief.js","sourceRoot":"","sources":["../../src/lib/brief.ts"],"names":[],"mappings":"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"}
@@ -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)');