@bi-analytics/arness-back 0.0.0-stage → 0.2.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 (55) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/README.md +156 -2
  3. package/bin/arness.mjs +710 -0
  4. package/harness/AGENTS.md +234 -0
  5. package/harness/agents/implementador.md +42 -0
  6. package/harness/agents/lider.md +71 -0
  7. package/harness/agents/revisor.md +62 -0
  8. package/harness/decisiones/README.md +17 -0
  9. package/harness/decisiones/_plantilla.md +24 -0
  10. package/harness/init.sh +696 -0
  11. package/harness/playbooks/add-database.md +16 -0
  12. package/harness/playbooks/new-endpoint.md +88 -0
  13. package/harness/playbooks/new-module.md +21 -0
  14. package/harness/playbooks/new-monitor-widget.md +31 -0
  15. package/harness/playbooks/review.md +40 -0
  16. package/harness/reference/configuracion.md +104 -0
  17. package/harness/reference/contrato-http.md +138 -0
  18. package/harness/reference/novedades.json +107 -0
  19. package/harness/reference/progress-plantilla.md +50 -0
  20. package/harness/skills/commit-hygiene/SKILL.md +137 -0
  21. package/harness/skills/nest-base/SKILL.md +167 -0
  22. package/harness/skills/nest-base/templates/config/configuration.spec.ts +84 -0
  23. package/harness/skills/nest-base/templates/config/configuration.ts +143 -0
  24. package/harness/skills/nest-base/templates/cors/cors.spec.ts +53 -0
  25. package/harness/skills/nest-base/templates/cors/cors.ts +75 -0
  26. package/harness/skills/nest-base/templates/docs/EVOLUTIVO.md +22 -0
  27. package/harness/skills/nest-base/templates/docs/PENDIENTES.md +20 -0
  28. package/harness/skills/nest-base/templates/docs/TECNICO.md +43 -0
  29. package/harness/skills/nest-base/templates/e2e/cors.e2e-spec.ts +60 -0
  30. package/harness/skills/nest-base/templates/e2e/monitor.e2e-spec.ts +134 -0
  31. package/harness/skills/nest-base/templates/editorconfig +12 -0
  32. package/harness/skills/nest-base/templates/eslint.boundaries.mjs +65 -0
  33. package/harness/skills/nest-base/templates/eslint.config.mjs +82 -0
  34. package/harness/skills/nest-base/templates/logging/logger-options.spec.ts +57 -0
  35. package/harness/skills/nest-base/templates/logging/logger-options.ts +85 -0
  36. package/harness/skills/nest-base/templates/monitor/monitor-login-redirect.filter.ts +16 -0
  37. package/harness/skills/nest-base/templates/monitor/monitor-login.dto.ts +8 -0
  38. package/harness/skills/nest-base/templates/monitor/monitor-page.spec.ts +41 -0
  39. package/harness/skills/nest-base/templates/monitor/monitor-page.ts +190 -0
  40. package/harness/skills/nest-base/templates/monitor/monitor-session.guard.spec.ts +46 -0
  41. package/harness/skills/nest-base/templates/monitor/monitor-session.guard.ts +36 -0
  42. package/harness/skills/nest-base/templates/monitor/monitor-session.service.spec.ts +57 -0
  43. package/harness/skills/nest-base/templates/monitor/monitor-session.service.ts +77 -0
  44. package/harness/skills/nest-base/templates/monitor/monitor-widget.interface.ts +18 -0
  45. package/harness/skills/nest-base/templates/monitor/monitor.constants.ts +25 -0
  46. package/harness/skills/nest-base/templates/monitor/monitor.controller.ts +63 -0
  47. package/harness/skills/nest-base/templates/monitor/monitor.decorators.ts +11 -0
  48. package/harness/skills/nest-base/templates/monitor/monitor.module.ts +30 -0
  49. package/harness/skills/nest-base/templates/monitor/monitor.service.spec.ts +55 -0
  50. package/harness/skills/nest-base/templates/monitor/monitor.service.ts +49 -0
  51. package/harness/skills/nest-base/templates/monitor/widgets/endpoints-total.widget.spec.ts +51 -0
  52. package/harness/skills/nest-base/templates/monitor/widgets/endpoints-total.widget.ts +53 -0
  53. package/harness/skills/nest-base/templates/prettierignore +6 -0
  54. package/harness/skills/nest-base/templates/prettierrc.json +8 -0
  55. package/package.json +44 -3
@@ -0,0 +1,51 @@
1
+ // Plantilla del harness → src/common/monitor/widgets/endpoints-total.widget.spec.ts
2
+ import { Controller, Get, Post } from '@nestjs/common';
3
+ import { DiscoveryModule } from '@nestjs/core';
4
+ import { Test } from '@nestjs/testing';
5
+ import { EndpointsTotalWidget } from './endpoints-total.widget';
6
+
7
+ @Controller('cartera/resumen')
8
+ class CarteraController {
9
+ @Get()
10
+ list(): void {}
11
+
12
+ @Get(['detalle', 'detalle-v2'])
13
+ detail(): void {}
14
+
15
+ helper(): void {}
16
+ }
17
+
18
+ @Controller()
19
+ class RecaudoController {
20
+ @Get('recaudo/diario')
21
+ daily(): void {}
22
+ }
23
+
24
+ @Controller('auth')
25
+ class AuthController {
26
+ @Post('login')
27
+ login(): void {}
28
+ }
29
+
30
+ @Controller('health')
31
+ class HealthController {
32
+ @Get()
33
+ check(): void {}
34
+ }
35
+
36
+ describe('EndpointsTotalWidget', () => {
37
+ it('counts routes by module segment and skips auth, health and monitor', async () => {
38
+ const moduleRef = await Test.createTestingModule({
39
+ imports: [DiscoveryModule],
40
+ controllers: [CarteraController, RecaudoController, AuthController, HealthController],
41
+ providers: [EndpointsTotalWidget],
42
+ }).compile();
43
+ await expect(moduleRef.get(EndpointsTotalWidget).collect()).resolves.toEqual({
44
+ value: 4,
45
+ detail: [
46
+ { label: 'cartera', value: 3 },
47
+ { label: 'recaudo', value: 1 },
48
+ ],
49
+ });
50
+ });
51
+ });
@@ -0,0 +1,53 @@
1
+ // Plantilla del harness → src/common/monitor/widgets/endpoints-total.widget.ts
2
+ import { Injectable } from '@nestjs/common';
3
+ import { PATH_METADATA, METHOD_METADATA } from '@nestjs/common/constants';
4
+ import { DiscoveryService, MetadataScanner, Reflector } from '@nestjs/core';
5
+ import { MONITOR_EXCLUDED_SEGMENTS } from '../monitor.constants';
6
+ import { MonitorValue, MonitorWidget } from '../monitor-widget.interface';
7
+
8
+ const toPaths = (value: string | string[] | undefined): string[] =>
9
+ (Array.isArray(value) ? value : [value ?? '']).map((path) => path.replace(/^\/+|\/+$/g, ''));
10
+
11
+ /** Counts the HTTP routes of the API (excluding monitor, health and auth), grouped by module segment. */
12
+ @Injectable()
13
+ export class EndpointsTotalWidget implements MonitorWidget {
14
+ readonly id = 'endpoints-total';
15
+ readonly title = 'Endpoints de la API';
16
+ readonly order = 10;
17
+
18
+ constructor(
19
+ private readonly discovery: DiscoveryService,
20
+ private readonly scanner: MetadataScanner,
21
+ private readonly reflector: Reflector,
22
+ ) {}
23
+
24
+ collect(): Promise<MonitorValue> {
25
+ const byModule = new Map<string, number>();
26
+ for (const { metatype, instance } of this.discovery.getControllers()) {
27
+ if (!metatype || !instance) continue;
28
+ const prefixes = toPaths(
29
+ this.reflector.get<string | string[] | undefined>(PATH_METADATA, metatype),
30
+ );
31
+ const prototype = Object.getPrototypeOf(instance) as Record<string, unknown>;
32
+ for (const name of this.scanner.getAllMethodNames(prototype)) {
33
+ const handler = prototype[name];
34
+ if (typeof handler !== 'function') continue;
35
+ if (this.reflector.get<number | undefined>(METHOD_METADATA, handler) === undefined)
36
+ continue;
37
+ for (const prefix of prefixes) {
38
+ for (const path of toPaths(
39
+ this.reflector.get<string | string[] | undefined>(PATH_METADATA, handler),
40
+ )) {
41
+ const segment = [prefix, path].filter(Boolean).join('/').split('/')[0] || '/';
42
+ if (MONITOR_EXCLUDED_SEGMENTS.has(segment)) continue;
43
+ byModule.set(segment, (byModule.get(segment) ?? 0) + 1);
44
+ }
45
+ }
46
+ }
47
+ }
48
+ const detail = [...byModule.entries()]
49
+ .sort(([a], [b]) => a.localeCompare(b))
50
+ .map(([label, value]) => ({ label, value }));
51
+ return Promise.resolve({ value: detail.reduce((sum, item) => sum + item.value, 0), detail });
52
+ }
53
+ }
@@ -0,0 +1,6 @@
1
+ dist
2
+ coverage
3
+ node_modules
4
+ pnpm-lock.yaml
5
+ postman
6
+ harness
@@ -0,0 +1,8 @@
1
+ {
2
+ "singleQuote": true,
3
+ "trailingComma": "all",
4
+ "printWidth": 100,
5
+ "semi": true,
6
+ "arrowParens": "always",
7
+ "endOfLine": "lf"
8
+ }
package/package.json CHANGED
@@ -1,6 +1,47 @@
1
1
  {
2
2
  "name": "@bi-analytics/arness-back",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.2.0",
4
+ "description": "Harness de agentes IA (Claude Code, Codex, Gemini CLI, Cursor) para backends NestJS de analítica",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/bi-analytics-linktic/harness-back.git"
8
+ },
9
+ "type": "module",
10
+ "homepage": "https://github.com/bi-analytics-linktic/harness-back#readme",
11
+ "publishConfig": {
12
+ "access": "public",
13
+ "registry": "https://registry.npmjs.org/"
14
+ },
15
+ "bin": {
16
+ "arness": "bin/arness.mjs"
17
+ },
18
+ "files": [
19
+ "bin/",
20
+ "harness/",
21
+ "!harness/progress.md",
22
+ "!harness/.arness.json",
23
+ "!harness/arness.config.json",
24
+ "!harness/.arness-backup/",
25
+ "!harness/decisiones/[0-9]*.md",
26
+ "CHANGELOG.md"
27
+ ],
28
+ "engines": {
29
+ "node": ">=20"
30
+ },
31
+ "keywords": [
32
+ "harness",
33
+ "agents",
34
+ "claude-code",
35
+ "codex",
36
+ "nestjs"
37
+ ],
38
+ "license": "UNLICENSED",
39
+ "devDependencies": {
40
+ "eslint": "^9.39.5"
41
+ },
42
+ "scripts": {
43
+ "test": "node --test",
44
+ "verify": "./harness/init.sh",
45
+ "pack:check": "pnpm pack --dry-run"
46
+ }
6
47
  }