archprint 0.8.2 → 0.9.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 (92) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +88 -11
  3. package/dist/cli/adopted-rules.d.ts +49 -0
  4. package/dist/cli/adopted-rules.d.ts.map +1 -0
  5. package/dist/cli/adopted-rules.js +159 -0
  6. package/dist/cli/adopted-rules.js.map +1 -0
  7. package/dist/cli/check-diff.d.ts +19 -0
  8. package/dist/cli/check-diff.d.ts.map +1 -0
  9. package/dist/cli/check-diff.js +41 -0
  10. package/dist/cli/check-diff.js.map +1 -0
  11. package/dist/cli/check-evaluate.d.ts +10 -0
  12. package/dist/cli/check-evaluate.d.ts.map +1 -0
  13. package/dist/cli/check-evaluate.js +83 -0
  14. package/dist/cli/check-evaluate.js.map +1 -0
  15. package/dist/cli/check-git.d.ts +12 -0
  16. package/dist/cli/check-git.d.ts.map +1 -0
  17. package/dist/cli/check-git.js +87 -0
  18. package/dist/cli/check-git.js.map +1 -0
  19. package/dist/cli/check-locate.d.ts +3 -0
  20. package/dist/cli/check-locate.d.ts.map +1 -0
  21. package/dist/cli/check-locate.js +29 -0
  22. package/dist/cli/check-locate.js.map +1 -0
  23. package/dist/cli/check.d.ts +41 -0
  24. package/dist/cli/check.d.ts.map +1 -0
  25. package/dist/cli/check.js +230 -0
  26. package/dist/cli/check.js.map +1 -0
  27. package/dist/cli/generate.d.ts +5 -0
  28. package/dist/cli/generate.d.ts.map +1 -1
  29. package/dist/cli/generate.js +37 -11
  30. package/dist/cli/generate.js.map +1 -1
  31. package/dist/cli/git-env.d.ts +2 -0
  32. package/dist/cli/git-env.d.ts.map +1 -0
  33. package/dist/cli/git-env.js +14 -0
  34. package/dist/cli/git-env.js.map +1 -0
  35. package/dist/cli/layout.d.ts +2 -0
  36. package/dist/cli/layout.d.ts.map +1 -1
  37. package/dist/cli/layout.js +3 -1
  38. package/dist/cli/layout.js.map +1 -1
  39. package/dist/cli/migrate.d.ts.map +1 -1
  40. package/dist/cli/migrate.js +1 -0
  41. package/dist/cli/migrate.js.map +1 -1
  42. package/dist/cli/program.d.ts.map +1 -1
  43. package/dist/cli/program.js +52 -0
  44. package/dist/cli/program.js.map +1 -1
  45. package/dist/cli/recommend.d.ts +2 -0
  46. package/dist/cli/recommend.d.ts.map +1 -1
  47. package/dist/cli/recommend.js +8 -2
  48. package/dist/cli/recommend.js.map +1 -1
  49. package/dist/cli/report.d.ts +1 -1
  50. package/dist/cli/report.d.ts.map +1 -1
  51. package/dist/cli/report.js +26 -18
  52. package/dist/cli/report.js.map +1 -1
  53. package/dist/cli/rule-guidance.js +3 -3
  54. package/dist/cli/rule-guidance.js.map +1 -1
  55. package/dist/cli/scan.d.ts.map +1 -1
  56. package/dist/cli/scan.js +6 -3
  57. package/dist/cli/scan.js.map +1 -1
  58. package/dist/detector/marker-inference.d.ts +3 -0
  59. package/dist/detector/marker-inference.d.ts.map +1 -1
  60. package/dist/detector/marker-inference.js +26 -18
  61. package/dist/detector/marker-inference.js.map +1 -1
  62. package/dist/detector/pattern-detector.d.ts +1 -0
  63. package/dist/detector/pattern-detector.d.ts.map +1 -1
  64. package/dist/detector/pattern-detector.js +7 -4
  65. package/dist/detector/pattern-detector.js.map +1 -1
  66. package/dist/generator/public-api-emitters.d.ts +1 -0
  67. package/dist/generator/public-api-emitters.d.ts.map +1 -1
  68. package/dist/generator/public-api-emitters.js +2 -1
  69. package/dist/generator/public-api-emitters.js.map +1 -1
  70. package/dist/generator/rule-generator.d.ts.map +1 -1
  71. package/dist/generator/rule-generator.js +51 -29
  72. package/dist/generator/rule-generator.js.map +1 -1
  73. package/dist/mcp/remote/server.d.ts +21 -0
  74. package/dist/mcp/remote/server.d.ts.map +1 -1
  75. package/dist/mcp/remote/server.js +12 -0
  76. package/dist/mcp/remote/server.js.map +1 -1
  77. package/dist/mcp/server.d.ts +24 -3
  78. package/dist/mcp/server.d.ts.map +1 -1
  79. package/dist/mcp/server.js +24 -3
  80. package/dist/mcp/server.js.map +1 -1
  81. package/dist/mcp/tools.d.ts.map +1 -1
  82. package/dist/mcp/tools.js +12 -1
  83. package/dist/mcp/tools.js.map +1 -1
  84. package/dist/scanner/file-walker.d.ts +5 -0
  85. package/dist/scanner/file-walker.d.ts.map +1 -1
  86. package/dist/scanner/file-walker.js +8 -2
  87. package/dist/scanner/file-walker.js.map +1 -1
  88. package/dist/scanner/import-graph.d.ts +2 -0
  89. package/dist/scanner/import-graph.d.ts.map +1 -1
  90. package/dist/scanner/import-graph.js +1 -1
  91. package/dist/scanner/import-graph.js.map +1 -1
  92. package/package.json +3 -1
@@ -1,6 +1,6 @@
1
1
  import { createImportAnalyzer, walkRepo } from '../scanner/file-walker.js';
2
2
  import { evaluateGate } from './confidence-gate.js';
3
- import { inferDbClientMarkers, inferUiLayerMarkers, KNOWN_DB_LIBRARIES, } from './marker-inference.js';
3
+ import { inferDbClientMarkers, inferUiLayerMarkers, KNOWN_DB_EXAMPLES, KNOWN_DB_LIBRARIES, } from './marker-inference.js';
4
4
  export const REQUEST_ENTRY_ROLES = [
5
5
  'CONTROLLER',
6
6
  'ROUTE_HANDLER',
@@ -107,9 +107,10 @@ export function detectUiLayerInServerEntry(appDir) {
107
107
  const result = detectForbiddenImport(appDir, {
108
108
  id: 'AP-002',
109
109
  name: 'no-ui-layer-in-server-entry',
110
- description: 'A server-entry file must not import from the UI layer (inferred from where components live in this repo).',
110
+ description: 'A request handler must not import UI components (found from where components live in this repo).',
111
111
  roles: REQUEST_ENTRY_ROLES,
112
112
  forbidden: inferredUi.markers,
113
+ examples: inferredUi.examples,
113
114
  });
114
115
  if (inferredUi.markers.length === 0) {
115
116
  result.gate = { ...result.gate, status: 'REJECT', passes: false };
@@ -121,9 +122,10 @@ export function detectDbClientInRequestEntry(appDir) {
121
122
  const result = detectForbiddenImport(appDir, {
122
123
  id: 'AP-001',
123
124
  name: 'no-db-client-in-request-entry',
124
- description: 'A request-entry file must not import the database client directly; go through a service or data-access layer.',
125
+ description: 'A request handler must not import the database client directly; go through a service or data-access layer.',
125
126
  roles: REQUEST_ENTRY_ROLES,
126
127
  forbidden: inferredDb.markers,
128
+ examples: inferredDb.examples,
127
129
  });
128
130
  return { ...result, inferredDb };
129
131
  }
@@ -131,9 +133,10 @@ export function detectNoDbInRequestEntry(appDir, options = {}) {
131
133
  return detectForbiddenImport(appDir, {
132
134
  id: 'AP-001',
133
135
  name: 'no-direct-db-in-request-entry',
134
- description: 'Request-entry files must not import a database client directly; go through a service or data-access layer.',
136
+ description: 'Request handlers must not import a database client directly; go through a service or data-access layer.',
135
137
  roles: REQUEST_ENTRY_ROLES,
136
138
  forbidden: options.dbMarkers ?? DEFAULT_DB_MARKERS,
139
+ ...(options.dbMarkers === undefined && { examples: KNOWN_DB_EXAMPLES }),
137
140
  });
138
141
  }
139
142
  //# sourceMappingURL=pattern-detector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pattern-detector.js","sourceRoot":"","sources":["../../src/detector/pattern-detector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pattern-detector.js","sourceRoot":"","sources":["../../src/detector/pattern-detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAuB,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAEhG,OAAO,EAAE,YAAY,EAAmB,MAAM,sBAAsB,CAAC;AACrE,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,GAGnB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,CAAC,MAAM,mBAAmB,GAAoB;IAClD,YAAY;IACZ,eAAe;IACf,eAAe;IACf,aAAa;IACb,aAAa;CACd,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAsB,kBAAkB,CAAC;AAExE,MAAM,UAAU,GAAG,+EAA+E,CAAC;AAmCnG,MAAM,YAAY,GAAG,wBAAwB,CAAC;AAE9C,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,OAA0B,EAAW,EAAE,CACvE,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAE9C,SAAS,6BAA6B,CACpC,GAA8E,EAC9E,SAA4B;IAE5B,IAAI,GAAG,CAAC,eAAe,IAAI,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC;QAAE,OAAO,GAAG,CAAC,SAAS,CAAC;IACtF,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,CAAC,IAAI,CAClC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAClE,CAAC;IACF,OAAO,IAAI,IAAI,IAAI,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAc,EAAE,MAAqB;IACzE,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAE7C,MAAM,UAAU,GAAgB,EAAE,CAAC;IACnC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,aAAa,IAAI,IAAI,CAAC,UAAU,CAAC;QACjC,IAAI,OAAyB,CAAC;QAC9B,IAAI,CAAC;YACH,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,oFAAoF;YACpF,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,6BAA6B,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAClE,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7E,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,YAAY,CACnB,MAAqB,EACrB,UAAuB,EACvB,aAAqB,EACrB,aAAqB;IAErB,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnF,MAAM,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC;IACjD,MAAM,cAAc,GAAG,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,aAAa,CAAC;IAC/E,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,aAAa,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAC,CAAC;IACjF,MAAM,eAAe,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/E,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE;YACL,aAAa;YACb,mBAAmB,EAAE,aAAa,GAAG,kBAAkB;YACvD,kBAAkB;YAClB,KAAK,EAAE,IAAI,CAAC,mBAAmB;YAC/B,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,KAAK;SACrD;QACD,IAAI;QACJ,UAAU;QACV,YAAY,EAAE,kBAAkB,GAAG,CAAC,IAAI,eAAe,CAAC,MAAM,KAAK,kBAAkB;QACrF,eAAe;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,MAAc,EACd,OAAiC,EACjC,UAAiC,EAAE;IAEnC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9E,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC;IAEnF,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC5C,MAAM;QACN,UAAU,EAAE,EAAiB;QAC7B,aAAa,EAAE,CAAC;QAChB,aAAa,EAAE,CAAC;KACjB,CAAC,CAAC,CAAC;IACJ,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,OAAyB,CAAC;QAC9B,IAAI,CAAC;YACH,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,oFAAoF;YACpF,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;QACD,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC5D,WAAW,CAAC,aAAa,IAAI,CAAC,CAAC;YAC/B,WAAW,CAAC,aAAa,IAAI,IAAI,CAAC,UAAU,CAAC;YAC7C,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,6BAA6B,CAAC,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC9E,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;oBAClB,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBACzF,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CACtC,YAAY,CACV,WAAW,CAAC,MAAM,EAClB,WAAW,CAAC,UAAU,EACtB,WAAW,CAAC,aAAa,EACzB,WAAW,CAAC,aAAa,CAC1B,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,MAAc;IAEd,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,EAAE;QAC3C,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,6BAA6B;QACnC,WAAW,EACT,kGAAkG;QACpG,KAAK,EAAE,mBAAmB;QAC1B,SAAS,EAAE,UAAU,CAAC,OAAO;QAC7B,QAAQ,EAAE,UAAU,CAAC,QAAQ;KAC9B,CAAC,CAAC;IACH,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACpE,CAAC;IACD,OAAO,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,MAAc;IAEd,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,EAAE;QAC3C,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,+BAA+B;QACrC,WAAW,EACT,4GAA4G;QAC9G,KAAK,EAAE,mBAAmB;QAC1B,SAAS,EAAE,UAAU,CAAC,OAAO;QAC7B,QAAQ,EAAE,UAAU,CAAC,QAAQ;KAC9B,CAAC,CAAC;IACH,OAAO,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,MAAc,EACd,UAA6C,EAAE;IAE/C,OAAO,qBAAqB,CAAC,MAAM,EAAE;QACnC,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,+BAA+B;QACrC,WAAW,EACT,yGAAyG;QAC3G,KAAK,EAAE,mBAAmB;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,kBAAkB;QAClD,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;KACxE,CAAC,CAAC;AACL,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import type { GenerationStatus } from '../detector/confidence-gate.js';
2
2
  import type { PublicApiGroup } from '../detector/public-api-detector.js';
3
+ export declare const publicApiRuleName: (dir: string) => string;
3
4
  export interface DeepImportRule {
4
5
  name: string;
5
6
  comment: string;
@@ -1 +1 @@
1
- {"version":3,"file":"public-api-emitters.d.ts","sourceRoot":"","sources":["../../src/generator/public-api-emitters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAUzE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACpC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAC;IACrC,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,cAAc,EAAE,CAAC;CAC7B;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,SAAS,cAAc,EAAE,EACjC,OAAO,GAAE,SAAS,gBAAgB,EAAa,GAC9C,gBAAgB,CAclB"}
1
+ {"version":3,"file":"public-api-emitters.d.ts","sourceRoot":"","sources":["../../src/generator/public-api-emitters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAOzE,eAAO,MAAM,iBAAiB,GAAI,KAAK,MAAM,KAAG,MAAuC,CAAC;AAKxF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACpC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAC;IACrC,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,cAAc,EAAE,CAAC;CAC7B;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,SAAS,cAAc,EAAE,EACjC,OAAO,GAAE,SAAS,gBAAgB,EAAa,GAC9C,gBAAgB,CAclB"}
@@ -1,6 +1,7 @@
1
1
  import { exemptDepcruiseFrom, TEST_ROLE_REGEX } from './depcruise-exempt.js';
2
2
  const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
3
3
  const slug = (dir) => dir.replace(/[^a-zA-Z0-9]+/g, '-').replace(/^-|-$/g, '');
4
+ export const publicApiRuleName = (dir) => `no-deep-import-${slug(dir)}`;
4
5
  const confidencePct = (group) => `${(group.gate.conditions.confidence.value * 100).toFixed(0)}%`;
5
6
  export function toDependencyCruiserPublicApi(groups, include = ['AUTO']) {
6
7
  const forbidden = groups
@@ -8,7 +9,7 @@ export function toDependencyCruiserPublicApi(groups, include = ['AUTO']) {
8
9
  .map((group) => {
9
10
  const dir = escapeRegExp(group.dir);
10
11
  return {
11
- name: `no-deep-import-${slug(group.dir)}`,
12
+ name: publicApiRuleName(group.dir),
12
13
  comment: `Archprint inferred public API: files outside "${group.dir}" import it through its barrel (${group.consumerCount - group.deepImporterCount}/${group.consumerCount} consumers); deep imports into its internals are forbidden (confidence ${confidencePct(group)}).`,
13
14
  severity: 'error',
14
15
  from: { pathNot: exemptDepcruiseFrom([TEST_ROLE_REGEX, `^${dir}/`], group.violations) },
@@ -1 +1 @@
1
- {"version":3,"file":"public-api-emitters.js","sourceRoot":"","sources":["../../src/generator/public-api-emitters.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7E,MAAM,YAAY,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAE7F,MAAM,IAAI,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAE/F,MAAM,aAAa,GAAG,CAAC,KAAqB,EAAU,EAAE,CACtD,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AAclE,MAAM,UAAU,4BAA4B,CAC1C,MAAiC,EACjC,UAAuC,CAAC,MAAM,CAAC;IAE/C,MAAM,SAAS,GAAG,MAAM;SACrB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SACtD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO;YACL,IAAI,EAAE,kBAAkB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YACzC,OAAO,EAAE,iDAAiD,KAAK,CAAC,GAAG,mCAAmC,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,aAAa,0EAA0E,aAAa,CAAC,KAAK,CAAC,IAAI;YAC5Q,QAAQ,EAAE,OAAgB;YAC1B,IAAI,EAAE,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,eAAe,EAAE,IAAI,GAAG,GAAG,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE;YACvF,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,GAAG,EAAE,OAAO,EAAE,IAAI,GAAG,oBAAoB,EAAE;SAC/D,CAAC;IACJ,CAAC,CAAC,CAAC;IACL,OAAO,EAAE,SAAS,EAAE,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"public-api-emitters.js","sourceRoot":"","sources":["../../src/generator/public-api-emitters.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7E,MAAM,YAAY,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAE7F,MAAM,IAAI,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAE/F,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,kBAAkB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAExF,MAAM,aAAa,GAAG,CAAC,KAAqB,EAAU,EAAE,CACtD,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AAclE,MAAM,UAAU,4BAA4B,CAC1C,MAAiC,EACjC,UAAuC,CAAC,MAAM,CAAC;IAE/C,MAAM,SAAS,GAAG,MAAM;SACrB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SACtD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO;YACL,IAAI,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC;YAClC,OAAO,EAAE,iDAAiD,KAAK,CAAC,GAAG,mCAAmC,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,aAAa,0EAA0E,aAAa,CAAC,KAAK,CAAC,IAAI;YAC5Q,QAAQ,EAAE,OAAgB;YAC1B,IAAI,EAAE,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,eAAe,EAAE,IAAI,GAAG,GAAG,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE;YACvF,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,GAAG,EAAE,OAAO,EAAE,IAAI,GAAG,oBAAoB,EAAE;SAC/D,CAAC;IACJ,CAAC,CAAC,CAAC;IACL,OAAO,EAAE,SAAS,EAAE,CAAC;AACvB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"rule-generator.d.ts","sourceRoot":"","sources":["../../src/generator/rule-generator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAErE,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;CACvF;AAmKD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,UAAU,SAAK,GACd,aAAa,CAUf;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,EACd,UAAU,SAAK,GACd,MAAM,CASR"}
1
+ {"version":3,"file":"rule-generator.d.ts","sourceRoot":"","sources":["../../src/generator/rule-generator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAErE,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;CACvF;AAuMD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,UAAU,SAAK,GACd,aAAa,CAWf;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,EACd,UAAU,SAAK,GACd,MAAM,CASR"}
@@ -2,6 +2,26 @@ import { mkdirSync, writeFileSync } from 'node:fs';
2
2
  import * as path from 'node:path';
3
3
  import { ROLE_PATTERNS } from '../scanner/role-classifier.js';
4
4
  const asRegexArray = (sources) => `[${sources.map((source) => `/${source}/`).join(', ')}]`;
5
+ const PASSING_IMPORTS = ['next/server', '@/utils/user'];
6
+ const withoutFullStop = (text) => text.replace(/\.$/, '');
7
+ const isForbidden = (config, specifier) => config.forbidden.some((pattern) => pattern.test(specifier));
8
+ function forbiddenSpecifier(config, result) {
9
+ const candidates = [
10
+ ...result.violations.map((violation) => violation.specifier),
11
+ ...(config.examples ?? []),
12
+ ];
13
+ const specifier = candidates.find((candidate) => isForbidden(config, candidate));
14
+ if (specifier === undefined) {
15
+ throw new Error(`${config.id}: no known import matches its forbidden patterns, so its failing fixture cannot be written.`);
16
+ }
17
+ return specifier;
18
+ }
19
+ function assertPassingFixtureAllowed(config) {
20
+ const clash = PASSING_IMPORTS.find((specifier) => isForbidden(config, specifier));
21
+ if (clash !== undefined) {
22
+ throw new Error(`${config.id}: its forbidden patterns match "${clash}", so its passing fixture would fail.`);
23
+ }
24
+ }
5
25
  function renderRule(config, result) {
6
26
  const entryPatterns = config.roles
7
27
  .flatMap((role) => ROLE_PATTERNS.get(role) ?? [])
@@ -15,7 +35,7 @@ function renderRule(config, result) {
15
35
  const conform = (ratio * 100).toFixed(1);
16
36
  return `/**
17
37
  * @fileoverview ${config.id} ${config.name}: GENERATED BY ARCHPRINT. Do not edit by hand.
18
- * Inferred from the real import graph: ${roleFileCount - violatingFileCount}/${roleFileCount} server-entry files (${conform}%) already follow this.
38
+ * Inferred from the real import graph: ${roleFileCount - violatingFileCount}/${roleFileCount} request handlers (${conform}%) already follow this.
19
39
  * Evidence and provenance: ./${config.name}.md
20
40
  */
21
41
  import type { Rule } from 'eslint';
@@ -57,8 +77,7 @@ const rule: Rule.RuleModule = {
57
77
  },
58
78
  schema: [],
59
79
  messages: {
60
- forbidden:
61
- '${config.id}: a server-entry file must not import the UI components/ layer (imported "{{specifier}}"). Move shared logic into a non-UI module.',
80
+ forbidden: ${JSON.stringify(`${config.id}: ${withoutFullStop(config.description)} (imported "{{specifier}}").`)},
62
81
  },
63
82
  },
64
83
  create(context) {
@@ -78,7 +97,7 @@ const rule: Rule.RuleModule = {
78
97
  export default rule;
79
98
  `;
80
99
  }
81
- function renderCard(config, result, provenance) {
100
+ function renderCard(config, result, provenance, failingSpecifier) {
82
101
  const { roleFileCount, violatingFileCount, ratio, roleConfidence } = result.stats;
83
102
  const example = result.violations[0];
84
103
  const gate = result.gate.conditions;
@@ -91,9 +110,10 @@ function renderCard(config, result, provenance) {
91
110
 
92
111
  ${config.description}
93
112
 
94
- **Scope (server-entry roles):** ${config.roles.join(', ')}. Semantics: **direct import**. A violation
95
- is a server-entry file that directly imports the \`components/\` layer. Transitive reach (importing a
96
- module that itself imports a component) is out of scope.
113
+ **Applies to request handlers:** ${config.roles.join(', ')}. A violation is a request handler that
114
+ directly imports something matching a forbidden pattern:
115
+ ${config.forbidden.map((pattern) => `\`/${pattern.source}/\``).join(', ')}. It checks **direct imports** only:
116
+ importing a module that itself imports a forbidden target is out of scope.
97
117
 
98
118
  ## Evidence (why Archprint generated this)
99
119
 
@@ -114,50 +134,52 @@ ${example
114
134
  This is a lightweight, self-contained ESLint rule. It enforces at the **import-specifier** level, which
115
135
  is narrower than the graph-based inference that generated it:
116
136
 
117
- - **Alias/barrel false negative:** an import whose specifier does not contain \`components\` but resolves
118
- to the UI layer (e.g. \`@/lib/shared-ui\` aliased to a component) is **not** caught. The detector
119
- resolves such imports to their leaf; the rule does not. A future alias-aware or dependency-cruiser
120
- emission would close this.
121
- - **External false positive:** a specifier literally containing \`components\` that resolves inside
122
- \`node_modules\` would be flagged. Not relevant to this repo, but disclosed.
123
- - **Server-entry scope:** mirrors the classifier. A file with a \`"use server"\` directive is treated as
124
- server-entry only when it is otherwise unclassified; named roles (service, repository, worker, db /
137
+ - **Alias/barrel false negative:** an import whose text matches no forbidden pattern but resolves to a
138
+ forbidden target (through an alias or a re-exporting barrel) is **not** caught. The detector resolves
139
+ such imports to the file they reach; the rule matches only the import text.
140
+ - **Text-match false positive:** an unrelated import whose text happens to match a forbidden pattern is
141
+ flagged too.
142
+ - **Request-handler scope:** mirrors the classifier. A file with a \`"use server"\` directive is treated as
143
+ a request handler only when it is otherwise unclassified; named roles (service, repository, worker, db /
125
144
  data-access, shared, test) keep their role and are out of scope.
126
145
 
127
146
  ## Fixtures
128
147
 
129
- - \`fixtures/passing.ts\`: a server-entry file that does not import the UI layer (rule stays silent).
130
- - \`fixtures/failing.ts\`: a server-entry file that imports the UI layer (rule reports).
148
+ - \`fixtures/passing.ts\`: a request handler with no forbidden import (rule stays silent).
149
+ - \`fixtures/failing.ts\`: a request handler that imports \`${failingSpecifier}\` (rule reports).
131
150
  `;
132
151
  }
133
- function renderPassingFixture() {
134
- return `// app/api/example/route.ts (PASSING): a route handler with no UI-layer import.
135
- import { NextResponse } from 'next/server';
136
- import { getUser } from '@/utils/user';
152
+ function renderPassingFixture(config) {
153
+ assertPassingFixtureAllowed(config);
154
+ const [server, user] = PASSING_IMPORTS;
155
+ return `// app/api/example/route.ts (PASSING): a request handler with no import ${config.id} forbids.
156
+ import { NextResponse } from '${server}';
157
+ import { getUser } from '${user}';
137
158
 
138
159
  export async function GET(): Promise<Response> {
139
160
  return NextResponse.json(await getUser());
140
161
  }
141
162
  `;
142
163
  }
143
- function renderFailingFixture() {
144
- return `// app/api/chat/route.ts (FAILING): a route handler importing the components/ (UI) layer.
164
+ function renderFailingFixture(config, specifier) {
165
+ return `// app/api/example/route.ts (FAILING): a request handler importing "${specifier}", which ${config.id} forbids.
145
166
  import { NextResponse } from 'next/server';
146
- import { convertToUIMessages } from '@/components/assistant-chat/helpers';
167
+ import * as forbidden from '${specifier}';
147
168
 
148
- export async function POST(): Promise<Response> {
149
- return NextResponse.json(convertToUIMessages([]));
169
+ export async function GET(): Promise<Response> {
170
+ return NextResponse.json(Object.keys(forbidden));
150
171
  }
151
172
  `;
152
173
  }
153
174
  export function generateRuleArtifacts(config, result, provenance = '') {
175
+ const failingSpecifier = forbiddenSpecifier(config, result);
154
176
  return {
155
177
  ruleName: config.name,
156
178
  files: {
157
179
  rule: renderRule(config, result),
158
- card: renderCard(config, result, provenance),
159
- passingFixture: renderPassingFixture(),
160
- failingFixture: renderFailingFixture(),
180
+ card: renderCard(config, result, provenance, failingSpecifier),
181
+ passingFixture: renderPassingFixture(config),
182
+ failingFixture: renderFailingFixture(config, failingSpecifier),
161
183
  },
162
184
  };
163
185
  }
@@ -1 +1 @@
1
- {"version":3,"file":"rule-generator.js","sourceRoot":"","sources":["../../src/generator/rule-generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rule-generator.js","sourceRoot":"","sources":["../../src/generator/rule-generator.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,13 @@ import { type ToolResponse } from '../tool-response.js';
3
3
  import { type RemoteTools } from './tools.js';
4
4
  export declare const REMOTE_TOOLS: readonly [{
5
5
  readonly name: "archprint_scan";
6
+ readonly title: "Scan architecture rules";
7
+ readonly annotations: {
8
+ readonly readOnlyHint: true;
9
+ readonly destructiveHint: false;
10
+ readonly idempotentHint: true;
11
+ readonly openWorldHint: true;
12
+ };
6
13
  readonly description: "Clone a public repository by URL (read-only, ephemeral) and list the architecture rules it already follows, with the evidence: which families are AUTO (clears the confidence gate) or SUGGEST (worth review), how many files conform vs. break each, and the confidence.";
7
14
  readonly inputSchema: {
8
15
  readonly type: "object";
@@ -24,6 +31,13 @@ export declare const REMOTE_TOOLS: readonly [{
24
31
  };
25
32
  }, {
26
33
  readonly name: "archprint_recommend";
34
+ readonly title: "Recommend architecture rules";
35
+ readonly annotations: {
36
+ readonly readOnlyHint: true;
37
+ readonly destructiveHint: false;
38
+ readonly idempotentHint: true;
39
+ readonly openWorldHint: true;
40
+ };
27
41
  readonly description: "Clone a public repository by URL (read-only, ephemeral) and recommend an architecture rule set from its evidence and stack: what to enforce now, what the code already follows that archprint reports but does not write a rule for yet (reportOnly), what to review before enforcing, and what comparable repos commonly adopt that this one does not yet.";
28
42
  readonly inputSchema: {
29
43
  readonly type: "object";
@@ -41,6 +55,13 @@ export declare const REMOTE_TOOLS: readonly [{
41
55
  };
42
56
  }, {
43
57
  readonly name: "archprint_explain";
58
+ readonly title: "Explain an architecture rule";
59
+ readonly annotations: {
60
+ readonly readOnlyHint: true;
61
+ readonly destructiveHint: false;
62
+ readonly idempotentHint: true;
63
+ readonly openWorldHint: true;
64
+ };
44
65
  readonly description: "Clone a public repository by URL (read-only, ephemeral) and explain the confidence-gate evidence behind one inferred rule id (e.g. AP-002): its gate status, conformance stats, and the files that violate it.";
45
66
  readonly inputSchema: {
46
67
  readonly type: "object";
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/remote/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAEnE,OAAO,EAA6B,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAa/D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiCf,CAAC;AAEX,wBAAsB,aAAa,CACjC,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,OAAO,CAAC,CAmBlB;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,YAAY,CAAC,CAMvB;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,WAA+B,GACrC,MAAM,CAYR"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/remote/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAEnE,OAAO,EAA6B,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAoB/D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuCf,CAAC;AAEX,wBAAsB,aAAa,CACjC,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,OAAO,CAAC,CAmBlB;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,YAAY,CAAC,CAMvB;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,WAA+B,GACrC,MAAM,CAYR"}
@@ -12,9 +12,17 @@ const repoProperty = {
12
12
  description: 'branch or tag to scan (optional; defaults to the repo default branch)',
13
13
  },
14
14
  };
15
+ const READ_ONLY_REMOTE = {
16
+ readOnlyHint: true,
17
+ destructiveHint: false,
18
+ idempotentHint: true,
19
+ openWorldHint: true,
20
+ };
15
21
  export const REMOTE_TOOLS = [
16
22
  {
17
23
  name: 'archprint_scan',
24
+ title: 'Scan architecture rules',
25
+ annotations: READ_ONLY_REMOTE,
18
26
  description: 'Clone a public repository by URL (read-only, ephemeral) and list the architecture rules it already follows, with the evidence: which families are AUTO (clears the confidence gate) or SUGGEST (worth review), how many files conform vs. break each, and the confidence.',
19
27
  inputSchema: {
20
28
  type: 'object',
@@ -30,11 +38,15 @@ export const REMOTE_TOOLS = [
30
38
  },
31
39
  {
32
40
  name: 'archprint_recommend',
41
+ title: 'Recommend architecture rules',
42
+ annotations: READ_ONLY_REMOTE,
33
43
  description: 'Clone a public repository by URL (read-only, ephemeral) and recommend an architecture rule set from its evidence and stack: what to enforce now, what the code already follows that archprint reports but does not write a rule for yet (reportOnly), what to review before enforcing, and what comparable repos commonly adopt that this one does not yet.',
34
44
  inputSchema: { type: 'object', properties: { ...repoProperty }, required: ['repo'] },
35
45
  },
36
46
  {
37
47
  name: 'archprint_explain',
48
+ title: 'Explain an architecture rule',
49
+ annotations: READ_ONLY_REMOTE,
38
50
  description: 'Clone a public repository by URL (read-only, ephemeral) and explain the confidence-gate evidence behind one inferred rule id (e.g. AP-002): its gate status, conformance stats, and the files that violate it.',
39
51
  inputSchema: {
40
52
  type: 'object',
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/remote/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/remote/server.ts"],"names":[],"mappings":"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"}
@@ -2,13 +2,20 @@ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
2
  import { type ToolResponse } from './tool-response.js';
3
3
  export declare const TOOLS: readonly [{
4
4
  readonly name: "archprint_scan";
5
+ readonly title: "Scan architecture rules";
6
+ readonly annotations: {
7
+ readonly readOnlyHint: true;
8
+ readonly destructiveHint: false;
9
+ readonly idempotentHint: true;
10
+ readonly openWorldHint: false;
11
+ };
5
12
  readonly description: "List the architecture rules this TypeScript repo already follows, with the evidence: each rule stated in plain words, whether it is AUTO (clears the confidence gate) or SUGGEST (short of it, worth review), how many files conform vs. break it, the files that break it, and the confidence. Read-only. `path` defaults to \".\" and a monorepo root scans every app.";
6
13
  readonly inputSchema: {
7
14
  readonly type: "object";
8
15
  readonly properties: {
9
16
  readonly path: {
10
17
  readonly type: "string";
11
- readonly description: "app or monorepo-root directory (default \".\")";
18
+ readonly description: "app or monorepo-root directory on this machine (default \".\"), not a URL";
12
19
  };
13
20
  readonly deep: {
14
21
  readonly type: "boolean";
@@ -18,18 +25,32 @@ export declare const TOOLS: readonly [{
18
25
  };
19
26
  }, {
20
27
  readonly name: "archprint_recommend";
28
+ readonly title: "Recommend architecture rules";
29
+ readonly annotations: {
30
+ readonly readOnlyHint: true;
31
+ readonly destructiveHint: false;
32
+ readonly idempotentHint: true;
33
+ readonly openWorldHint: false;
34
+ };
21
35
  readonly description: "Recommend an architecture rule set for this repo from its evidence and detected stack: what to enforce now, what the code already follows that archprint reports but does not write a rule for yet (reportOnly), what to review before enforcing, and what comparable repos commonly adopt that this repo does not yet. Read-only.";
22
36
  readonly inputSchema: {
23
37
  readonly type: "object";
24
38
  readonly properties: {
25
39
  readonly path: {
26
40
  readonly type: "string";
27
- readonly description: "app or monorepo-root directory (default \".\")";
41
+ readonly description: "app or monorepo-root directory on this machine (default \".\"), not a URL";
28
42
  };
29
43
  };
30
44
  };
31
45
  }, {
32
46
  readonly name: "archprint_explain";
47
+ readonly title: "Explain an architecture rule";
48
+ readonly annotations: {
49
+ readonly readOnlyHint: true;
50
+ readonly destructiveHint: false;
51
+ readonly idempotentHint: true;
52
+ readonly openWorldHint: false;
53
+ };
33
54
  readonly description: "Explain the confidence-gate evidence behind one rule from archprint_scan, by its label (e.g. AP-002, env-access, or \"lib !-> app\"): its statement, gate status, conformance stats, and every file that breaks it. Read-only.";
34
55
  readonly inputSchema: {
35
56
  readonly type: "object";
@@ -40,7 +61,7 @@ export declare const TOOLS: readonly [{
40
61
  };
41
62
  readonly path: {
42
63
  readonly type: "string";
43
- readonly description: "app or monorepo-root directory (default \".\")";
64
+ readonly description: "app or monorepo-root directory on this machine (default \".\"), not a URL";
44
65
  };
45
66
  };
46
67
  readonly required: readonly ["id"];
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAInE,OAAO,EAA6B,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElF,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2CR,CAAC;AAEX,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAe5E;AAED,YAAY,EAAE,YAAY,EAAE,CAAC;AAE7B,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAMlF;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQpD;AAGD,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAInE,OAAO,EAA6B,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AASlF,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0DR,CAAC;AAEX,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAe5E;AAED,YAAY,EAAE,YAAY,EAAE,CAAC;AAE7B,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAMlF;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQpD;AAGD,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE"}
@@ -3,14 +3,25 @@ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
3
3
  import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
4
4
  import { explainTool, recommendTool, scanTool } from './tools.js';
5
5
  import { errorResponse, okResponse } from './tool-response.js';
6
+ const READ_ONLY = {
7
+ readOnlyHint: true,
8
+ destructiveHint: false,
9
+ idempotentHint: true,
10
+ openWorldHint: false,
11
+ };
6
12
  export const TOOLS = [
7
13
  {
8
14
  name: 'archprint_scan',
15
+ title: 'Scan architecture rules',
16
+ annotations: READ_ONLY,
9
17
  description: 'List the architecture rules this TypeScript repo already follows, with the evidence: each rule stated in plain words, whether it is AUTO (clears the confidence gate) or SUGGEST (short of it, worth review), how many files conform vs. break it, the files that break it, and the confidence. Read-only. `path` defaults to "." and a monorepo root scans every app.',
10
18
  inputSchema: {
11
19
  type: 'object',
12
20
  properties: {
13
- path: { type: 'string', description: 'app or monorepo-root directory (default ".")' },
21
+ path: {
22
+ type: 'string',
23
+ description: 'app or monorepo-root directory on this machine (default "."), not a URL',
24
+ },
14
25
  deep: {
15
26
  type: 'boolean',
16
27
  description: 'resolve imports through barrels and aliases (slower, more accurate)',
@@ -20,16 +31,23 @@ export const TOOLS = [
20
31
  },
21
32
  {
22
33
  name: 'archprint_recommend',
34
+ title: 'Recommend architecture rules',
35
+ annotations: READ_ONLY,
23
36
  description: 'Recommend an architecture rule set for this repo from its evidence and detected stack: what to enforce now, what the code already follows that archprint reports but does not write a rule for yet (reportOnly), what to review before enforcing, and what comparable repos commonly adopt that this repo does not yet. Read-only.',
24
37
  inputSchema: {
25
38
  type: 'object',
26
39
  properties: {
27
- path: { type: 'string', description: 'app or monorepo-root directory (default ".")' },
40
+ path: {
41
+ type: 'string',
42
+ description: 'app or monorepo-root directory on this machine (default "."), not a URL',
43
+ },
28
44
  },
29
45
  },
30
46
  },
31
47
  {
32
48
  name: 'archprint_explain',
49
+ title: 'Explain an architecture rule',
50
+ annotations: READ_ONLY,
33
51
  description: 'Explain the confidence-gate evidence behind one rule from archprint_scan, by its label (e.g. AP-002, env-access, or "lib !-> app"): its statement, gate status, conformance stats, and every file that breaks it. Read-only.',
34
52
  inputSchema: {
35
53
  type: 'object',
@@ -38,7 +56,10 @@ export const TOOLS = [
38
56
  type: 'string',
39
57
  description: 'rule label from archprint_scan, e.g. AP-002 or env-access',
40
58
  },
41
- path: { type: 'string', description: 'app or monorepo-root directory (default ".")' },
59
+ path: {
60
+ type: 'string',
61
+ description: 'app or monorepo-root directory on this machine (default "."), not a URL',
62
+ },
42
63
  },
43
64
  required: ['id'],
44
65
  },
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAqC,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAevE,MAAM,WAAW,OAAQ,SAAQ,WAAW;IAC1C,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,UAAQ,GAAG,OAAO,EAAE,CAM/D;AAED,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACzD,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAMjE;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAmBpE"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAqC,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AA4BvE,MAAM,WAAW,OAAQ,SAAQ,WAAW;IAC1C,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,UAAQ,GAAG,OAAO,EAAE,CAM/D;AAED,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACzD,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAMjE;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAmBpE"}
package/dist/mcp/tools.js CHANGED
@@ -1,11 +1,22 @@
1
1
  import * as path from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
2
3
  import { discoverAppDirs } from '../scanner/app-dirs.js';
3
4
  import { detectEnforcers } from '../scanner/enforcers.js';
4
5
  import { scanRepo } from '../cli/scan.js';
5
6
  import { summarizeRules, toScanSummary, } from '../cli/summary.js';
6
7
  import { buildRecommendations, detectStack } from '../cli/recommend.js';
8
+ const URL_SCHEME = /^[a-z][a-z0-9+.-]*:\/\//i;
9
+ const localPath = (input) => {
10
+ const trimmed = input.trim();
11
+ if (trimmed.toLowerCase().startsWith('file://'))
12
+ return fileURLToPath(trimmed);
13
+ if (URL_SCHEME.test(trimmed)) {
14
+ throw new Error(`"${input}" is a URL, but this server reads directories on the machine it runs on. Clone the repository and pass its directory, or run \`archprint mcp --http\` to scan a public repository by URL.`);
15
+ }
16
+ return trimmed;
17
+ };
7
18
  function resolveAppDirs(input) {
8
- const root = path.resolve(input);
19
+ const root = path.resolve(localPath(input));
9
20
  const dirs = discoverAppDirs(root);
10
21
  if (dirs.length === 0) {
11
22
  throw new Error(`No tsconfig.json found under ${root}. Point archprint at an app directory (a directory with a tsconfig.json); a monorepo root is fine.`);
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,11 @@ export interface ResolvedImport {
14
14
  }
15
15
  export declare function listSourceFiles(rootDir: string): string[];
16
16
  export declare function walkRepo(rootDir: string): WalkedFile[];
17
+ export interface ImportLocation {
18
+ specifier: string;
19
+ line: number;
20
+ }
21
+ export declare function importLocations(absoluteFilePath: string): ImportLocation[];
17
22
  export declare function isWorkspacePackagePath(filePath: string, workspacePackages: readonly string[]): boolean;
18
23
  export declare function createImportAnalyzer(appDir: string, options?: {
19
24
  resolve?: boolean;