@iris-code/core 0.1.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 (94) hide show
  1. package/README.md +38 -0
  2. package/dist/config.d.ts +147 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +550 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/csharp/analyser.d.ts +14 -0
  7. package/dist/csharp/analyser.d.ts.map +1 -0
  8. package/dist/csharp/analyser.js +436 -0
  9. package/dist/csharp/analyser.js.map +1 -0
  10. package/dist/csharp/lexer.d.ts +29 -0
  11. package/dist/csharp/lexer.d.ts.map +1 -0
  12. package/dist/csharp/lexer.js +182 -0
  13. package/dist/csharp/lexer.js.map +1 -0
  14. package/dist/duplicates.d.ts +53 -0
  15. package/dist/duplicates.d.ts.map +1 -0
  16. package/dist/duplicates.js +491 -0
  17. package/dist/duplicates.js.map +1 -0
  18. package/dist/fileAnalyser.d.ts +4 -0
  19. package/dist/fileAnalyser.d.ts.map +1 -0
  20. package/dist/fileAnalyser.js +8 -0
  21. package/dist/fileAnalyser.js.map +1 -0
  22. package/dist/fileNaming.d.ts +68 -0
  23. package/dist/fileNaming.d.ts.map +1 -0
  24. package/dist/fileNaming.js +343 -0
  25. package/dist/fileNaming.js.map +1 -0
  26. package/dist/gate.d.ts +49 -0
  27. package/dist/gate.d.ts.map +1 -0
  28. package/dist/gate.js +242 -0
  29. package/dist/gate.js.map +1 -0
  30. package/dist/go/analyser.d.ts +5 -0
  31. package/dist/go/analyser.d.ts.map +1 -0
  32. package/dist/go/analyser.js +576 -0
  33. package/dist/go/analyser.js.map +1 -0
  34. package/dist/guards.d.ts +16 -0
  35. package/dist/guards.d.ts.map +1 -0
  36. package/dist/guards.js +355 -0
  37. package/dist/guards.js.map +1 -0
  38. package/dist/index.d.ts +22 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +110 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/languages.d.ts +46 -0
  43. package/dist/languages.d.ts.map +1 -0
  44. package/dist/languages.js +155 -0
  45. package/dist/languages.js.map +1 -0
  46. package/dist/lines.d.ts +9 -0
  47. package/dist/lines.d.ts.map +1 -0
  48. package/dist/lines.js +58 -0
  49. package/dist/lines.js.map +1 -0
  50. package/dist/python/analyser.d.ts +5 -0
  51. package/dist/python/analyser.d.ts.map +1 -0
  52. package/dist/python/analyser.js +630 -0
  53. package/dist/python/analyser.js.map +1 -0
  54. package/dist/qualitySignals.d.ts +30 -0
  55. package/dist/qualitySignals.d.ts.map +1 -0
  56. package/dist/qualitySignals.js +101 -0
  57. package/dist/qualitySignals.js.map +1 -0
  58. package/dist/ruby/analyser.d.ts +5 -0
  59. package/dist/ruby/analyser.d.ts.map +1 -0
  60. package/dist/ruby/analyser.js +450 -0
  61. package/dist/ruby/analyser.js.map +1 -0
  62. package/dist/scoring.d.ts +4 -0
  63. package/dist/scoring.d.ts.map +1 -0
  64. package/dist/scoring.js +37 -0
  65. package/dist/scoring.js.map +1 -0
  66. package/dist/secrets.d.ts +5 -0
  67. package/dist/secrets.d.ts.map +1 -0
  68. package/dist/secrets.js +245 -0
  69. package/dist/secrets.js.map +1 -0
  70. package/dist/securityContext.d.ts +2 -0
  71. package/dist/securityContext.d.ts.map +1 -0
  72. package/dist/securityContext.js +16 -0
  73. package/dist/securityContext.js.map +1 -0
  74. package/dist/sfc.d.ts +32 -0
  75. package/dist/sfc.d.ts.map +1 -0
  76. package/dist/sfc.js +228 -0
  77. package/dist/sfc.js.map +1 -0
  78. package/dist/slop.d.ts +37 -0
  79. package/dist/slop.d.ts.map +1 -0
  80. package/dist/slop.js +81 -0
  81. package/dist/slop.js.map +1 -0
  82. package/dist/suppressions.d.ts +19 -0
  83. package/dist/suppressions.d.ts.map +1 -0
  84. package/dist/suppressions.js +152 -0
  85. package/dist/suppressions.js.map +1 -0
  86. package/dist/ts/analyser.d.ts +4 -0
  87. package/dist/ts/analyser.d.ts.map +1 -0
  88. package/dist/ts/analyser.js +769 -0
  89. package/dist/ts/analyser.js.map +1 -0
  90. package/dist/types.d.ts +139 -0
  91. package/dist/types.d.ts.map +1 -0
  92. package/dist/types.js +46 -0
  93. package/dist/types.js.map +1 -0
  94. package/package.json +43 -0
package/README.md ADDED
@@ -0,0 +1,38 @@
1
+ # @iris/core
2
+
3
+ Shared analysis engine package for Iris.
4
+
5
+ ## Scope
6
+
7
+ This package is intended to become the single source of truth for:
8
+
9
+ - scoring logic
10
+ - issue normalization
11
+ - shared analysis result types
12
+ - gate evaluation
13
+ - deterministic, density-ranked workspace Quality Signals
14
+ - workspace-wide, path/role-aware, and fallback per-language file naming checks with ordered glob rules, suggestions, and built-in exemptions
15
+ - fixture-backed parity tests used by both the extension and the CLI
16
+ - Vue and Svelte single-file component script extraction with native line preservation
17
+
18
+ ## Extraction notes
19
+
20
+ Keep the package pure where possible. Host-specific concerns should stay outside:
21
+
22
+ - VS Code commands, webviews, and SecretStorage stay in `Iris-extension`
23
+ - CLI argument parsing and output formatting can stay in the CLI shell layer
24
+ - `@iris/core` should receive plain source text and config data, then return structured analysis output
25
+
26
+ ## Publish-ready surface
27
+
28
+ This package now publishes compiled output from `dist/` rather than exposing raw TypeScript source.
29
+
30
+ - `pnpm run build` compiles the package
31
+ - `pnpm run test` runs the fixture-backed packaged-surface tests
32
+ - `pnpm pack` will build and test first via `prepack`
33
+
34
+ ## v1.16 analysis surface
35
+
36
+ `computeQualitySignals` consumes aggregate scan metrics and returns recurring quality signals ranked by density and impact. Each signal preserves its raw count or percentage and carries a simple attention level; it does not create a second workspace score.
37
+
38
+ `checkFileNaming` enforces the workspace naming policy, with a matching language policy taking precedence. `analyseFile` accepts optional `relativePath` and `baselineFiles` context so extension and CLI callers share baseline-aware behavior without core reading the filesystem.
@@ -0,0 +1,147 @@
1
+ import type { LanguagesConfig } from './languages';
2
+ export interface HealthScoreWeights {
3
+ errorWarning: number;
4
+ warningWarning: number;
5
+ anyUsage: number;
6
+ tsIgnore: number;
7
+ consoleLog: number;
8
+ deepNesting: number;
9
+ longParamList: number;
10
+ unusedVar: number;
11
+ unusedFunction: number;
12
+ hardcodedSecret: number;
13
+ evalUsage: number;
14
+ sqlConcatenation: number;
15
+ insecureRandom: number;
16
+ unsafeRegex: number;
17
+ hardcodedLocalhost: number;
18
+ disabledTlsVerification: number;
19
+ debugFlagsEnabled: number;
20
+ weakHashing: number;
21
+ openRedirect: number;
22
+ bareSuppression: number;
23
+ duplicateCode: number;
24
+ fileNaming: number;
25
+ }
26
+ export interface InlineDiagnosticsConfig {
27
+ hardcodedSecrets: boolean;
28
+ securitySmells: boolean;
29
+ duplicateCode: boolean;
30
+ errorWarnings: boolean;
31
+ warningLevelWarnings: boolean;
32
+ tsIgnore: boolean;
33
+ unusedFunctions: boolean;
34
+ anyUsage: boolean;
35
+ consoleLogs: boolean;
36
+ magicNumbers: boolean;
37
+ longParamLists: boolean;
38
+ unusedVars: boolean;
39
+ todos: boolean;
40
+ fileNaming: boolean;
41
+ }
42
+ export type FileNamingConvention = 'snake_case' | 'kebab-case' | 'camelCase' | 'PascalCase';
43
+ export interface FileNamingPolicy {
44
+ convention: FileNamingConvention;
45
+ ignore: string[];
46
+ scope?: 'new-files' | 'all';
47
+ }
48
+ export interface FileNamingOverride {
49
+ /** Workspace-relative globs. Overrides are evaluated in order; the last match wins. */
50
+ files: string[];
51
+ convention: FileNamingConvention;
52
+ scope?: 'new-files' | 'all';
53
+ }
54
+ export interface FileNamingConfig extends FileNamingPolicy {
55
+ /** Role/path rules. Only valid on the top-level workspace policy. */
56
+ overrides?: FileNamingOverride[];
57
+ }
58
+ export interface IrisConfig {
59
+ functionLengthThreshold: number;
60
+ fileLengthThreshold: number;
61
+ maxFunctionsPerFile: number;
62
+ maxImportsPerFile: number;
63
+ maxParameterCount: number;
64
+ complexityThreshold: number;
65
+ enableConsoleLogWarnings: boolean;
66
+ enableMagicNumberDetection: boolean;
67
+ enableTodoDetection: boolean;
68
+ enableLongParamDetection: boolean;
69
+ enableUnusedDetection: boolean;
70
+ enableMissingReturnTypeWarnings: boolean;
71
+ enableSecretsDetection: boolean;
72
+ enableSecuritySmells: boolean;
73
+ enableDuplicateDetection: boolean;
74
+ duplicateBlockMinTokens: number;
75
+ enableCodeLens: boolean;
76
+ enableStatusBar: boolean;
77
+ severityOverrides: Partial<Record<string, 'error' | 'warning' | 'info'>>;
78
+ ignoreFiles: string[];
79
+ ignoreFunctions: string[];
80
+ testConvention: 'colocated' | 'dedicated' | 'both';
81
+ sidebarFontSize: number;
82
+ ignoreSuppressions: boolean;
83
+ enableInlineDiagnostics: boolean;
84
+ inlineDiagnostics: InlineDiagnosticsConfig;
85
+ healthScoreWeights: HealthScoreWeights;
86
+ fileNaming?: FileNamingConfig;
87
+ fileNamingScope: 'new-files' | 'all';
88
+ languages?: LanguagesConfig;
89
+ }
90
+ export type IrisConfigPresetId = 'strict' | 'balanced' | 'legacy' | 'security' | 'typescript' | 'ai-assisted';
91
+ export interface IrisGeneratedConfig extends Omit<Partial<IrisConfig>, 'inlineDiagnostics' | 'healthScoreWeights'> {
92
+ presetId?: IrisConfigPresetId;
93
+ inlineDiagnostics?: Partial<InlineDiagnosticsConfig>;
94
+ healthScoreWeights?: Partial<HealthScoreWeights>;
95
+ minHealthScore?: number;
96
+ trendRegressionThreshold?: number;
97
+ gateBaselineMode?: boolean;
98
+ gateMaxSecrets?: number;
99
+ gateMaxComplexity?: number;
100
+ gateMaxFileLength?: number;
101
+ gateMaxSmellsPerFile?: number;
102
+ gateMaxSecuritySmells?: number;
103
+ gateMaxSuppressions?: number;
104
+ gateMaxDuplicateBlocks?: number;
105
+ gateMaxNamingViolations?: number;
106
+ }
107
+ export interface IrisConfigPresetDefinition {
108
+ id: IrisConfigPresetId;
109
+ label: string;
110
+ description: string;
111
+ recommendedFor: string[];
112
+ config: IrisGeneratedConfig;
113
+ }
114
+ export declare const IRIS_WARNING_TYPES: readonly ["file-too-long", "function-too-long", "too-many-functions", "too-many-imports", "no-exports", "hardcoded-secret", "any-usage", "ts-ignore", "unused-function", "unused-var", "console-log", "magic-number", "long-param-list", "todo", "parse-error", "security-smell", "duplicate-code", "file-naming", "method-missing", "mass-assignment", "god-class", "large-class", "catch-all-exception", "async-void", "linq-abuse"];
115
+ export declare const IRIS_HEALTH_WEIGHT_KEYS: readonly ["errorWarning", "warningWarning", "anyUsage", "tsIgnore", "consoleLog", "deepNesting", "longParamList", "unusedVar", "unusedFunction", "hardcodedSecret", "evalUsage", "sqlConcatenation", "insecureRandom", "unsafeRegex", "hardcodedLocalhost", "disabledTlsVerification", "debugFlagsEnabled", "weakHashing", "openRedirect", "bareSuppression", "duplicateCode", "fileNaming"];
116
+ export declare const IRIS_INLINE_DIAGNOSTIC_KEYS: readonly ["hardcodedSecrets", "securitySmells", "duplicateCode", "errorWarnings", "warningLevelWarnings", "tsIgnore", "unusedFunctions", "anyUsage", "consoleLogs", "magicNumbers", "longParamLists", "unusedVars", "todos", "fileNaming"];
117
+ export declare const DEFAULT_IRIS_CONFIG: IrisConfig;
118
+ export declare const IRIS_CONFIG_PRESETS: Record<IrisConfigPresetId, IrisConfigPresetDefinition>;
119
+ export declare function mergeIrisConfig(overrides?: Partial<IrisConfig>): IrisConfig;
120
+ export declare function getIrisConfigPreset(id: IrisConfigPresetId): IrisConfigPresetDefinition;
121
+ export declare function buildGeneratedConfig(presetId: IrisConfigPresetId, overrides?: IrisGeneratedConfig): IrisGeneratedConfig;
122
+ /**
123
+ * Public URL of the .irisconfig.json JSON schema, written into every generated
124
+ * config as `$schema`.
125
+ *
126
+ * Editors resolve `$schema` themselves, so ONE line in the file gives completion,
127
+ * hover docs, and unknown-key validation in VS Code, JetBrains, Neovim, and
128
+ * anything else that speaks JSON schema. The alternative was per-host plumbing:
129
+ * VS Code contributes `jsonValidation`, and the JetBrains equivalent would have
130
+ * meant Java against an extension point that lives in a backend-only module in
131
+ * 2026.2, unverifiable in a remote-dev split.
132
+ *
133
+ * Versioned on purpose: a breaking config change publishes /v2 and leaves every
134
+ * existing file pointing at a schema that still describes it correctly.
135
+ * Served from Iris-landing/public/schema/v1/ - keep the two in step with
136
+ * `node scripts/copy-schema.js` in the extension repo.
137
+ */
138
+ export declare const IRIS_CONFIG_SCHEMA_URL = "https://www.iriscode.co/schema/v1/irisconfig.schema.json";
139
+ export interface SerializeGeneratedConfigOptions {
140
+ /**
141
+ * Optional schema reference for development/test generated configs. Release
142
+ * callers should omit this so configs point at the versioned public schema.
143
+ */
144
+ schemaUrl?: string;
145
+ }
146
+ export declare function serializeGeneratedConfigJsonc(values: IrisGeneratedConfig, presetId?: IrisConfigPresetId, options?: SerializeGeneratedConfigOptions): string;
147
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}