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,128 @@
1
+ "use strict";
2
+ /**
3
+ * Code quality checker — flags eslint-disable comments, TypeScript
4
+ * suppressions, TODO/FIXME markers, and excessively long lines.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.runQualityChecks = runQualityChecks;
8
+ const types_1 = require("./types");
9
+ const ESLINT_DISABLE = /(\/\/\s*eslint-disable|\/\*\s*eslint-disable)/;
10
+ const ESLINT_DISABLE_RULE = /eslint-disable(?:-next-line|-once)?\s*(?:\(([^)]+)\))?/;
11
+ const TS_IGNORE = /(@ts-ignore|@ts-expect-error)/;
12
+ const TODO_FIXME = /(TODO|FIXME)\b\s*[:\-]?\s*(.*)/;
13
+ const SKIP_PATHS = /node_modules|dist|generated|\.d\.ts/;
14
+ /**
15
+ * Check for eslint-disable comments and extract the rule being disabled.
16
+ */
17
+ function checkESLintDisables(content, rel) {
18
+ const findings = [];
19
+ const lines = content.split('\n');
20
+ for (let i = 0; i < lines.length; i++) {
21
+ if (!ESLINT_DISABLE.test(lines[i]))
22
+ continue;
23
+ const ruleMatch = lines[i].match(ESLINT_DISABLE_RULE);
24
+ const rule = ruleMatch?.[1] || 'all rules';
25
+ findings.push({
26
+ severity: types_1.Severity.Medium,
27
+ category: types_1.Category.Quality,
28
+ file: rel,
29
+ line: i + 1,
30
+ message: `eslint-disable used — suppressing ${rule}`,
31
+ evidence: lines[i].trim(),
32
+ suggestedFix: 'Fix the underlying issue instead of disabling the lint rule.',
33
+ rule: 'QUA-001',
34
+ });
35
+ }
36
+ return findings;
37
+ }
38
+ /**
39
+ * Check for TypeScript error suppressions.
40
+ */
41
+ function checkTSSuppressions(content, rel) {
42
+ const findings = [];
43
+ const lines = content.split('\n');
44
+ for (let i = 0; i < lines.length; i++) {
45
+ const match = lines[i].match(TS_IGNORE);
46
+ if (!match)
47
+ continue;
48
+ findings.push({
49
+ severity: types_1.Severity.Medium,
50
+ category: types_1.Category.Quality,
51
+ file: rel,
52
+ line: i + 1,
53
+ message: `TypeScript error suppressed with ${match[1]}`,
54
+ evidence: lines[i].trim(),
55
+ suggestedFix: 'Fix the underlying type error instead of suppressing it.',
56
+ rule: 'QUA-002',
57
+ });
58
+ }
59
+ return findings;
60
+ }
61
+ /**
62
+ * Check for TODO and FIXME comments and extract the note text.
63
+ */
64
+ function checkTodoFixme(content, rel) {
65
+ const findings = [];
66
+ const lines = content.split('\n');
67
+ for (let i = 0; i < lines.length; i++) {
68
+ const match = lines[i].match(TODO_FIXME);
69
+ if (!match)
70
+ continue;
71
+ const marker = match[1];
72
+ const note = match[2]?.trim() || '(no description)';
73
+ findings.push({
74
+ severity: types_1.Severity.Low,
75
+ category: types_1.Category.Quality,
76
+ file: rel,
77
+ line: i + 1,
78
+ message: `${marker}: ${note}`,
79
+ evidence: lines[i].trim(),
80
+ rule: 'QUA-003',
81
+ });
82
+ }
83
+ return findings;
84
+ }
85
+ /**
86
+ * Count lines exceeding 120 characters in a file.
87
+ */
88
+ function checkLongLines(content, rel) {
89
+ const findings = [];
90
+ const lines = content.split('\n');
91
+ let longCount = 0;
92
+ for (let i = 0; i < lines.length; i++) {
93
+ if (lines[i].length > 120) {
94
+ longCount++;
95
+ }
96
+ }
97
+ if (longCount > 10) {
98
+ findings.push({
99
+ severity: types_1.Severity.Low,
100
+ category: types_1.Category.Quality,
101
+ file: rel,
102
+ message: `${longCount} lines exceed 120 characters`,
103
+ suggestedFix: 'Break long lines for readability. Consider extracting long strings or arguments.',
104
+ rule: 'QUA-004',
105
+ });
106
+ }
107
+ return findings;
108
+ }
109
+ /**
110
+ * Run all code quality checks against the repository.
111
+ */
112
+ function runQualityChecks(ctx) {
113
+ const findings = [];
114
+ const files = ctx.listFiles('**/*.{ts,tsx}');
115
+ for (const rel of files) {
116
+ if (SKIP_PATHS.test(rel))
117
+ continue;
118
+ const content = ctx.readFile(rel);
119
+ if (!content)
120
+ continue;
121
+ findings.push(...checkESLintDisables(content, rel));
122
+ findings.push(...checkTSSuppressions(content, rel));
123
+ findings.push(...checkTodoFixme(content, rel));
124
+ findings.push(...checkLongLines(content, rel));
125
+ }
126
+ return findings;
127
+ }
128
+ //# sourceMappingURL=quality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality.js","sourceRoot":"","sources":["../../../src/lib/audit/quality.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * RBAC checker — verifies that backend controllers have proper access
3
+ * metadata on every method, that auth guards exist and are registered
4
+ * globally, and that the RBAC constants file is present.
5
+ */
6
+ import type { Finding, CheckerContext } from './types';
7
+ /**
8
+ * Run all RBAC checks against the repository.
9
+ *
10
+ * Type-aware: all checks are NestJS-backend-specific, so they run only
11
+ * when the repo is a backend. Generic repos (repoType "unknown") are not
12
+ * flagged for missing guards/rbac constants they never promised to have.
13
+ */
14
+ export declare function runRBACChecks(ctx: CheckerContext): Finding[];
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ /**
3
+ * RBAC checker — verifies that backend controllers have proper access
4
+ * metadata on every method, that auth guards exist and are registered
5
+ * globally, and that the RBAC constants file is present.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.runRBACChecks = runRBACChecks;
9
+ const types_1 = require("./types");
10
+ const ACCESS_METADATA = [
11
+ /@Permissions\(/,
12
+ /@Public\(/,
13
+ /@UseGuards\(/,
14
+ /@ApiKeyScopes\(/,
15
+ ];
16
+ /**
17
+ * Check a controller file for methods missing access metadata.
18
+ * A method is any line with @Get, @Post, @Put, @Patch, @Delete, @All decorator.
19
+ */
20
+ function checkControllerMethods(content, rel) {
21
+ const findings = [];
22
+ const lines = content.split('\n');
23
+ const METHOD_DECORATORS = /@(Get|Post|Put|Patch|Delete|All)\(/;
24
+ for (let i = 0; i < lines.length; i++) {
25
+ if (!METHOD_DECORATORS.test(lines[i]))
26
+ continue;
27
+ // Scan backwards from the method decorator to find the block start,
28
+ // and forwards to find the method body — check all decorators in between
29
+ let hasAccessControl = false;
30
+ const start = Math.max(0, i - 15);
31
+ const end = Math.min(lines.length - 1, i + 20);
32
+ for (let j = start; j <= end; j++) {
33
+ for (const pattern of ACCESS_METADATA) {
34
+ if (pattern.test(lines[j])) {
35
+ hasAccessControl = true;
36
+ break;
37
+ }
38
+ }
39
+ if (hasAccessControl)
40
+ break;
41
+ }
42
+ if (!hasAccessControl) {
43
+ findings.push({
44
+ severity: types_1.Severity.High,
45
+ category: types_1.Category.RBAC,
46
+ file: rel,
47
+ line: i + 1,
48
+ message: 'Controller method missing access metadata (@Permissions, @Public, or @UseGuards)',
49
+ evidence: lines[i].trim(),
50
+ suggestedFix: 'Add @Permissions(), @Public(), or @UseGuards() to this endpoint.',
51
+ rule: 'RBAC-001',
52
+ });
53
+ }
54
+ }
55
+ return findings;
56
+ }
57
+ /**
58
+ * Check that the RBAC constants file exists.
59
+ */
60
+ function checkRBACConstants(ctx) {
61
+ const findings = [];
62
+ if (!ctx.fileExists('src/common/constants/rbac.ts')) {
63
+ findings.push({
64
+ severity: types_1.Severity.Medium,
65
+ category: types_1.Category.RBAC,
66
+ file: 'src/common/constants/rbac.ts',
67
+ message: 'Missing RBAC constants file — permissions matrix not defined',
68
+ suggestedFix: 'Create src/common/constants/rbac.ts with the roles/permissions matrix.',
69
+ rule: 'RBAC-002',
70
+ });
71
+ }
72
+ return findings;
73
+ }
74
+ /**
75
+ * Check that the JWT auth guard exists.
76
+ */
77
+ function checkJWTGuard(ctx) {
78
+ const findings = [];
79
+ if (!ctx.fileExists('src/common/guards/jwt-auth.guard.ts') &&
80
+ !ctx.fileExists('src/common/guards/jwt.guard.ts')) {
81
+ findings.push({
82
+ severity: types_1.Severity.High,
83
+ category: types_1.Category.RBAC,
84
+ file: 'src/common/guards/jwt-auth.guard.ts',
85
+ message: 'Missing JWT auth guard — authentication cannot be enforced',
86
+ suggestedFix: 'Create src/common/guards/jwt-auth.guard.ts implementing AuthGuard("jwt").',
87
+ rule: 'RBAC-003',
88
+ });
89
+ }
90
+ return findings;
91
+ }
92
+ /**
93
+ * Check that global guards are registered in app.module.ts.
94
+ */
95
+ function checkGlobalGuardRegistration(ctx) {
96
+ const findings = [];
97
+ if (!ctx.fileExists('src/app.module.ts'))
98
+ return findings;
99
+ const content = ctx.readFile('src/app.module.ts');
100
+ if (!content)
101
+ return findings;
102
+ if (!/APP_GUARD/.test(content)) {
103
+ findings.push({
104
+ severity: types_1.Severity.High,
105
+ category: types_1.Category.RBAC,
106
+ file: 'src/app.module.ts',
107
+ message: 'app.module.ts does not register a global APP_GUARD — RBAC not enforced globally',
108
+ suggestedFix: 'Add { provide: APP_GUARD, useClass: RbacGuard } (or JwtAuthGuard) to the providers array.',
109
+ rule: 'RBAC-004',
110
+ });
111
+ }
112
+ return findings;
113
+ }
114
+ /**
115
+ * Run all RBAC checks against the repository.
116
+ *
117
+ * Type-aware: all checks are NestJS-backend-specific, so they run only
118
+ * when the repo is a backend. Generic repos (repoType "unknown") are not
119
+ * flagged for missing guards/rbac constants they never promised to have.
120
+ */
121
+ function runRBACChecks(ctx) {
122
+ const findings = [];
123
+ if (ctx.repoType === 'backend') {
124
+ const controllers = ctx.listFiles('**/*.controller.ts');
125
+ for (const rel of controllers) {
126
+ if (/node_modules|dist|generated/.test(rel))
127
+ continue;
128
+ const content = ctx.readFile(rel);
129
+ if (!content)
130
+ continue;
131
+ findings.push(...checkControllerMethods(content, rel));
132
+ }
133
+ findings.push(...checkRBACConstants(ctx));
134
+ findings.push(...checkJWTGuard(ctx));
135
+ findings.push(...checkGlobalGuardRegistration(ctx));
136
+ }
137
+ return findings;
138
+ }
139
+ //# sourceMappingURL=rbac.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac.js","sourceRoot":"","sources":["../../../src/lib/audit/rbac.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Audit report generator — produces a structured markdown report from AuditResult.
3
+ */
4
+ import type { AuditResult } from './types';
5
+ export declare function generateReport(result: AuditResult): string;
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateReport = generateReport;
4
+ const types_1 = require("./types");
5
+ const SEVERITY_ORDER = [
6
+ types_1.Severity.Critical,
7
+ types_1.Severity.High,
8
+ types_1.Severity.Medium,
9
+ types_1.Severity.Low,
10
+ types_1.Severity.Advisory,
11
+ ];
12
+ const CATEGORY_LABELS = {
13
+ [types_1.Category.Security]: 'Security',
14
+ [types_1.Category.Modularity]: 'Modularity',
15
+ [types_1.Category.RBAC]: 'RBAC / Access Control',
16
+ [types_1.Category.Errors]: 'Error Handling',
17
+ [types_1.Category.Quality]: 'Code Quality',
18
+ [types_1.Category.UX]: 'UX / Loading States',
19
+ [types_1.Category.Docs]: 'Documentation',
20
+ [types_1.Category.Gates]: 'Build Gates',
21
+ };
22
+ function generateReport(result) {
23
+ const lines = [];
24
+ lines.push(`# Audit Report — ${result.repoName}`);
25
+ lines.push('');
26
+ lines.push(`**Date:** ${new Date(result.startedAt).toISOString().slice(0, 10)}`);
27
+ lines.push(`**Path:** ${result.repoPath}`);
28
+ lines.push(`**Type:** ${result.repoType}`);
29
+ lines.push(`**Existing repo:** ${result.isExistingRepo ? 'Yes (advisory findings only for structural issues)' : 'No'}`);
30
+ lines.push(`**Files scanned:** ${result.scannedFiles}`);
31
+ lines.push('');
32
+ // Gate results
33
+ if (result.gateResults.length > 0) {
34
+ lines.push('## Build Gates');
35
+ lines.push('');
36
+ for (const gate of result.gateResults) {
37
+ const icon = gate.passed ? 'PASS' : 'FAIL';
38
+ lines.push(`- **${gate.name}:** ${icon}`);
39
+ if (!gate.passed && gate.error) {
40
+ const snippet = gate.error.split('\n').slice(0, 5).join('\n ');
41
+ lines.push(` \`\`\`\n ${snippet}\n \`\`\``);
42
+ }
43
+ }
44
+ lines.push('');
45
+ }
46
+ // Group findings by severity
47
+ const bySeverity = new Map();
48
+ for (const sev of SEVERITY_ORDER) {
49
+ const items = result.findings.filter((f) => f.severity === sev);
50
+ if (items.length > 0)
51
+ bySeverity.set(sev, items);
52
+ }
53
+ for (const [sev, items] of bySeverity) {
54
+ const label = sev.charAt(0).toUpperCase() + sev.slice(1);
55
+ lines.push(`## ${label} (${items.length})`);
56
+ lines.push('');
57
+ // Group by category within severity
58
+ const byCategory = new Map();
59
+ for (const cat of Object.values(types_1.Category)) {
60
+ const catItems = items.filter((f) => f.category === cat);
61
+ if (catItems.length > 0)
62
+ byCategory.set(cat, catItems);
63
+ }
64
+ for (const [cat, catItems] of byCategory) {
65
+ lines.push(`### ${CATEGORY_LABELS[cat]}`);
66
+ lines.push('');
67
+ for (const f of catItems) {
68
+ const loc = f.line ? `${f.file}:${f.line}` : f.file;
69
+ lines.push(`- **${loc}** — ${f.message}`);
70
+ if (f.evidence)
71
+ lines.push(` Evidence: \`${f.evidence}\``);
72
+ if (f.suggestedFix)
73
+ lines.push(` Fix: ${f.suggestedFix}`);
74
+ if (f.rule)
75
+ lines.push(` Rule: \`${f.rule}\``);
76
+ }
77
+ lines.push('');
78
+ }
79
+ }
80
+ // Summary
81
+ lines.push('## Summary');
82
+ lines.push('');
83
+ const counts = new Map();
84
+ for (const sev of SEVERITY_ORDER) {
85
+ counts.set(sev, result.findings.filter((f) => f.severity === sev).length);
86
+ }
87
+ const total = result.findings.length;
88
+ lines.push(`- **Total findings:** ${total}`);
89
+ lines.push(` - Critical: ${counts.get(types_1.Severity.Critical) ?? 0}`);
90
+ lines.push(` - High: ${counts.get(types_1.Severity.High) ?? 0}`);
91
+ lines.push(` - Medium: ${counts.get(types_1.Severity.Medium) ?? 0}`);
92
+ lines.push(` - Low: ${counts.get(types_1.Severity.Low) ?? 0}`);
93
+ lines.push(` - Advisory: ${counts.get(types_1.Severity.Advisory) ?? 0}`);
94
+ lines.push('');
95
+ const gatePass = result.gateResults.every((g) => g.passed);
96
+ lines.push(`- **Gate status:** ${gatePass ? 'All passing' : 'Some failing'}`);
97
+ for (const gate of result.gateResults) {
98
+ lines.push(` - ${gate.name}: ${gate.passed ? 'PASS' : 'FAIL'}`);
99
+ }
100
+ lines.push('');
101
+ if (result.isExistingRepo) {
102
+ lines.push('**Note:** This is an existing repo. Structural findings are advisory only — no forced restructure.');
103
+ lines.push('');
104
+ }
105
+ return lines.join('\n');
106
+ }
107
+ //# sourceMappingURL=reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../../src/lib/audit/reporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { AuditOptions, AuditResult } from './types';
2
+ export declare function runAudit(options: AuditOptions): Promise<AuditResult>;
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runAudit = runAudit;
4
+ /**
5
+ * Audit runner — orchestrates all checkers and produces an AuditResult.
6
+ */
7
+ const node_fs_1 = require("node:fs");
8
+ const node_path_1 = require("node:path");
9
+ const types_1 = require("./types");
10
+ const security_1 = require("./security");
11
+ const modularity_1 = require("./modularity");
12
+ const rbac_1 = require("./rbac");
13
+ const errors_1 = require("./errors");
14
+ const quality_1 = require("./quality");
15
+ const ux_1 = require("./ux");
16
+ const docs_1 = require("./docs");
17
+ const gates_1 = require("./gates");
18
+ function detectRepoType(root) {
19
+ const pkgPath = (0, node_path_1.join)(root, 'package.json');
20
+ try {
21
+ const pkg = JSON.parse((0, node_fs_1.readFileSync)(pkgPath, 'utf-8'));
22
+ const deps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };
23
+ if (deps['next'] || deps['next.js'])
24
+ return 'web';
25
+ if (deps['@nestjs/core'] || deps['@nestjs/common'])
26
+ return 'backend';
27
+ if (deps['expo'])
28
+ return 'mobile';
29
+ }
30
+ catch { /* no package.json */ }
31
+ // Fallback: check for key files
32
+ try {
33
+ if ((0, node_fs_1.readFileSync)((0, node_path_1.join)(root, 'next.config.ts'), 'utf-8'))
34
+ return 'web';
35
+ }
36
+ catch { /* no next.config */ }
37
+ try {
38
+ if ((0, node_fs_1.readFileSync)((0, node_path_1.join)(root, 'nest-cli.json'), 'utf-8'))
39
+ return 'backend';
40
+ }
41
+ catch { /* no nest-cli */ }
42
+ return 'unknown';
43
+ }
44
+ function collectFiles(root, patterns) {
45
+ const files = [];
46
+ const ignoreDirs = new Set(['node_modules', 'dist', '.next', '.expo', 'generated', '.git', 'coverage']);
47
+ function walk(dir) {
48
+ let entries;
49
+ try {
50
+ entries = (0, node_fs_1.readdirSync)(dir);
51
+ }
52
+ catch {
53
+ return;
54
+ }
55
+ for (const name of entries) {
56
+ if (ignoreDirs.has(name))
57
+ continue;
58
+ const fullPath = (0, node_path_1.join)(dir, name);
59
+ try {
60
+ const stat = (0, node_fs_1.statSync)(fullPath);
61
+ if (stat.isDirectory()) {
62
+ walk(fullPath);
63
+ }
64
+ else if (stat.isFile()) {
65
+ const ext = name.slice(name.lastIndexOf('.'));
66
+ if (patterns.some((p) => ext === p)) {
67
+ files.push(fullPath);
68
+ }
69
+ }
70
+ }
71
+ catch {
72
+ // skip inaccessible files
73
+ }
74
+ }
75
+ }
76
+ walk(root);
77
+ return files;
78
+ }
79
+ function buildContext(root, repoType, isExistingRepo) {
80
+ return {
81
+ root,
82
+ repoType,
83
+ isExistingRepo,
84
+ readFile(relativePath) {
85
+ try {
86
+ return (0, node_fs_1.readFileSync)((0, node_path_1.join)(root, relativePath), 'utf-8');
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ },
92
+ listFiles(glob) {
93
+ // Simple glob: only handles **/*.ext and dir/*.ext
94
+ const ext = glob.includes('*') ? glob.split('*').pop()?.replace('.', '') ?? 'ts' : 'ts';
95
+ const dirPart = glob.split('*')[0];
96
+ const searchDir = dirPart ? (0, node_path_1.join)(root, dirPart) : root;
97
+ const collected = collectFiles(searchDir, ['.' + ext]);
98
+ return collected.map((f) => (0, node_path_1.relative)(root, f));
99
+ },
100
+ fileExists(relativePath) {
101
+ try {
102
+ (0, node_fs_1.statSync)((0, node_path_1.join)(root, relativePath));
103
+ return true;
104
+ }
105
+ catch {
106
+ return false;
107
+ }
108
+ },
109
+ };
110
+ }
111
+ async function runAudit(options) {
112
+ const root = options.path;
113
+ const repoType = options.type === 'auto' || !options.type ? detectRepoType(root) : options.type;
114
+ const isExistingRepo = options.existingRepo ?? false;
115
+ const ctx = buildContext(root, repoType, isExistingRepo);
116
+ const tsFiles = collectFiles(root, ['.ts', '.tsx']);
117
+ const startedAt = new Date().toISOString();
118
+ const findings = [];
119
+ // Run all checkers
120
+ findings.push(...(0, security_1.runSecurityChecks)(ctx));
121
+ findings.push(...(0, modularity_1.runModularityChecks)(ctx));
122
+ findings.push(...(0, rbac_1.runRBACChecks)(ctx));
123
+ findings.push(...(0, errors_1.runErrorChecks)(ctx));
124
+ findings.push(...(0, quality_1.runQualityChecks)(ctx));
125
+ findings.push(...(0, ux_1.runUXChecks)(ctx));
126
+ findings.push(...(0, docs_1.runDocsChecks)(ctx));
127
+ // Downgrade structural findings to Advisory for existing repos
128
+ if (isExistingRepo) {
129
+ for (const f of findings) {
130
+ if (f.category === 'modularity' &&
131
+ (f.rule?.startsWith('structure') || f.message.includes('missing'))) {
132
+ f.severity = types_1.Severity.Advisory;
133
+ }
134
+ }
135
+ }
136
+ // Run gates (may be slow) — skipped on request for fast structural audits
137
+ const gateResults = options.skipGates ? [] : (0, gates_1.runGateChecks)(ctx);
138
+ return {
139
+ repoName: root.split(/[/\\]/).pop() ?? 'unknown',
140
+ repoPath: root,
141
+ repoType,
142
+ isExistingRepo,
143
+ findings,
144
+ gateResults,
145
+ scannedFiles: tsFiles.length,
146
+ startedAt,
147
+ completedAt: new Date().toISOString(),
148
+ };
149
+ }
150
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/lib/audit/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Security checker — scans source files for hardcoded secrets,
3
+ * unguarded public endpoints, and dangerous React patterns.
4
+ */
5
+ import type { Finding, CheckerContext } from './types';
6
+ /**
7
+ * Run all security checks against the repository.
8
+ */
9
+ export declare function runSecurityChecks(ctx: CheckerContext): Finding[];