@aiready/core 0.1.0 โ†’ 0.1.2

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.
@@ -0,0 +1,110 @@
1
+ # Contributing to @aiready/core
2
+
3
+ Thank you for your interest in contributing to AIReady Core! We welcome bug reports, feature requests, and code contributions.
4
+
5
+ ## ๐Ÿ› Reporting Issues
6
+
7
+ Found a bug or have a feature request? [Open an issue](https://github.com/caopengau/aiready-core/issues) with:
8
+ - Clear description of the problem or feature
9
+ - Steps to reproduce (for bugs)
10
+ - Expected vs actual behavior
11
+ - Your environment (Node version, OS)
12
+
13
+ ## ๐Ÿ”ง Development Setup
14
+
15
+ ```bash
16
+ # Clone your fork
17
+ git clone https://github.com/YOUR_USERNAME/aiready-core
18
+ cd aiready-core
19
+
20
+ # Install dependencies
21
+ pnpm install
22
+
23
+ # Build
24
+ pnpm build
25
+
26
+ # Run tests
27
+ pnpm test
28
+
29
+ # Run linter
30
+ pnpm lint
31
+ ```
32
+
33
+ ## ๐Ÿ“ Making Changes
34
+
35
+ 1. **Fork the repository** and create a new branch:
36
+ ```bash
37
+ git checkout -b fix/your-bug-fix
38
+ # or
39
+ git checkout -b feat/your-new-feature
40
+ ```
41
+
42
+ 2. **Make your changes** following our code style:
43
+ - Use TypeScript strict mode
44
+ - Add JSDoc comments for public APIs
45
+ - Write tests for new functionality
46
+ - Keep functions pure and focused
47
+
48
+ 3. **Test your changes**:
49
+ ```bash
50
+ pnpm build
51
+ pnpm test
52
+ pnpm lint
53
+ ```
54
+
55
+ 4. **Commit using conventional commits**:
56
+ ```bash
57
+ git commit -m "fix: resolve token estimation edge case"
58
+ git commit -m "feat: add new similarity algorithm"
59
+ ```
60
+
61
+ 5. **Push and open a PR**:
62
+ ```bash
63
+ git push origin fix/your-bug-fix
64
+ ```
65
+
66
+ ## ๐Ÿ“‹ Commit Convention
67
+
68
+ We use [Conventional Commits](https://www.conventionalcommits.org/):
69
+
70
+ - `feat:` - New feature
71
+ - `fix:` - Bug fix
72
+ - `docs:` - Documentation changes
73
+ - `chore:` - Maintenance tasks
74
+ - `refactor:` - Code refactoring
75
+ - `test:` - Test updates
76
+
77
+ ## ๐Ÿงช Testing Guidelines
78
+
79
+ - Add tests for new functions in `src/__tests__/`
80
+ - Ensure all tests pass: `pnpm test`
81
+ - Aim for >80% code coverage
82
+
83
+ ## ๐Ÿ“š Documentation
84
+
85
+ - Update README.md if adding new public APIs
86
+ - Add JSDoc comments for exported functions
87
+ - Include usage examples for new features
88
+
89
+ ## ๐Ÿ” Code Review
90
+
91
+ - Automated checks must pass (build, tests, lint)
92
+ - Maintainers will review within 2 business days
93
+ - Address feedback and update your PR
94
+ - Once approved, we'll merge and publish
95
+
96
+ ## ๐ŸŽฏ What to Contribute
97
+
98
+ Good first contributions:
99
+ - Fix typos in documentation
100
+ - Add missing tests
101
+ - Improve error messages
102
+ - Optimize existing utilities
103
+
104
+ ## โ“ Questions?
105
+
106
+ Open an issue or reach out to the maintainers. We're here to help!
107
+
108
+ ---
109
+
110
+ **Thank you for contributing!** ๐Ÿ’™
package/README.md ADDED
@@ -0,0 +1,131 @@
1
+ # @aiready/core
2
+
3
+ > **Shared utilities and types for AIReady analysis tools**
4
+
5
+ This package provides common utilities, type definitions, and helper functions used across all AIReady tools. It's designed as a foundational library for building code analysis tools focused on AI-readiness.
6
+
7
+ ## ๐Ÿ“ฆ Installation
8
+
9
+ ```bash
10
+ npm install @aiready/core
11
+ # or
12
+ pnpm add @aiready/core
13
+ ```
14
+
15
+ ## ๐Ÿ”ง Usage
16
+
17
+ ### File Scanning
18
+
19
+ ```typescript
20
+ import { scanFiles } from '@aiready/core';
21
+
22
+ const files = await scanFiles({
23
+ rootDir: './src',
24
+ include: ['**/*.ts', '**/*.tsx'],
25
+ exclude: ['**/*.test.ts', '**/node_modules/**'],
26
+ maxDepth: 10,
27
+ });
28
+
29
+ console.log(`Found ${files.length} files`);
30
+ ```
31
+
32
+ ### Token Estimation
33
+
34
+ ```typescript
35
+ import { estimateTokens } from '@aiready/core';
36
+
37
+ const code = `
38
+ function hello() {
39
+ return "world";
40
+ }
41
+ `;
42
+
43
+ const tokenCount = estimateTokens(code);
44
+ console.log(`Estimated tokens: ${tokenCount}`);
45
+ ```
46
+
47
+ ### Similarity Detection
48
+
49
+ ```typescript
50
+ import { similarityScore, levenshteinDistance } from '@aiready/core';
51
+
52
+ const code1 = 'function handleUser(user) { ... }';
53
+ const code2 = 'function handlePost(post) { ... }';
54
+
55
+ const similarity = similarityScore(code1, code2);
56
+ console.log(`Similarity: ${(similarity * 100).toFixed(1)}%`);
57
+
58
+ const distance = levenshteinDistance(code1, code2);
59
+ console.log(`Edit distance: ${distance}`);
60
+ ```
61
+
62
+ ### TypeScript Types
63
+
64
+ ```typescript
65
+ import type {
66
+ AnalysisResult,
67
+ Issue,
68
+ IssueType,
69
+ Location,
70
+ Metrics,
71
+ ScanOptions,
72
+ Report,
73
+ } from '@aiready/core';
74
+
75
+ const result: AnalysisResult = {
76
+ fileName: 'src/utils/helper.ts',
77
+ issues: [
78
+ {
79
+ type: 'duplicate-pattern',
80
+ severity: 'major',
81
+ message: 'Similar pattern found',
82
+ location: {
83
+ file: 'src/utils/helper.ts',
84
+ line: 15,
85
+ column: 5,
86
+ },
87
+ suggestion: 'Extract to shared utility',
88
+ },
89
+ ],
90
+ metrics: {
91
+ tokenCost: 250,
92
+ consistencyScore: 0.85,
93
+ },
94
+ };
95
+ ```
96
+
97
+ ## ๐Ÿ“š API Reference
98
+
99
+ ### File Operations
100
+
101
+ - **`scanFiles(options: ScanOptions): Promise<string[]>`** - Scan directory for files matching patterns
102
+ - **`readFileContent(filePath: string): Promise<string>`** - Read file contents
103
+
104
+ ### Metrics
105
+
106
+ - **`estimateTokens(text: string): number`** - Estimate token count (~4 chars = 1 token)
107
+ - **`levenshteinDistance(str1: string, str2: string): number`** - Calculate edit distance
108
+ - **`similarityScore(str1: string, str2: string): number`** - Calculate similarity (0-1)
109
+
110
+ ### AST Parsing
111
+
112
+ - **`parseTypeScript(code: string): SourceFile`** - Parse TypeScript/JavaScript code to AST
113
+ - **`extractFunctions(ast: SourceFile): FunctionNode[]`** - Extract function declarations
114
+
115
+ ### Types
116
+
117
+ All shared TypeScript interfaces and types for analysis results, issues, metrics, and configuration options.
118
+
119
+ ## ๐Ÿ”— Related Packages
120
+
121
+ - **[@aiready/pattern-detect](https://www.npmjs.com/package/@aiready/pattern-detect)** - Semantic duplicate pattern detection
122
+ - **@aiready/context-analyzer** - Token cost and context fragmentation analysis _(coming soon)_
123
+ - **@aiready/doc-drift** - Documentation freshness tracking _(coming soon)_
124
+
125
+ ## ๐Ÿ“ License
126
+
127
+ MIT - See [LICENSE](./LICENSE)
128
+
129
+ ---
130
+
131
+ **Part of the [AIReady](https://github.com/aiready) toolkit** | [Documentation](https://aiready.dev) | [GitHub](https://github.com/caopengau/aiready-core)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aiready/core",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Shared utilities for AIReady analysis tools",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -27,6 +27,12 @@
27
27
  "bugs": {
28
28
  "url": "https://github.com/caopengau/aiready-core/issues"
29
29
  },
30
+ "files": [
31
+ "dist",
32
+ "README.md",
33
+ "LICENSE",
34
+ "CONTRIBUTING.md"
35
+ ],
30
36
  "devDependencies": {
31
37
  "tsup": "^8.3.5",
32
38
  "eslint": "^9.17.0"
@@ -1,61 +0,0 @@
1
-
2
- 
3
- > @aiready/core@0.1.0 build /Users/pengcao/projects/aiready/packages/core
4
- > tsup src/index.ts --format cjs,esm --dts
5
-
6
- CLI Building entry: src/index.ts
7
- CLI Using tsconfig: tsconfig.json
8
- CLI tsup v8.5.1
9
- CLI Target: es2020
10
- CJS Build start
11
- ESM Build start
12
- DTS Build start
13
-
14
- [12:59:20 AM]  WARN  โ–ฒ [WARNING] The condition "types" here will never be used as it comes after both "import" and "require" [package.json]
15
-
16
- package.json:12:6:
17
-  12 โ”‚ "types": "./dist/index.d.ts"
18
- โ•ต ~~~~~~~
19
-
20
- The "import" condition comes earlier and will be used for all "import" statements:
21
-
22
- package.json:11:6:
23
-  11 โ”‚ "import": "./dist/index.mjs",
24
- โ•ต ~~~~~~~~
25
-
26
- The "require" condition comes earlier and will be used for all "require" calls:
27
-
28
- package.json:10:6:
29
-  10 โ”‚ "require": "./dist/index.js",
30
- โ•ต ~~~~~~~~~
31
-
32
-
33
-
34
-
35
- [12:59:20 AM]  WARN  โ–ฒ [WARNING] The condition "types" here will never be used as it comes after both "import" and "require" [package.json]
36
-
37
- package.json:12:6:
38
-  12 โ”‚ "types": "./dist/index.d.ts"
39
- โ•ต ~~~~~~~
40
-
41
- The "import" condition comes earlier and will be used for all "import" statements:
42
-
43
- package.json:11:6:
44
-  11 โ”‚ "import": "./dist/index.mjs",
45
- โ•ต ~~~~~~~~
46
-
47
- The "require" condition comes earlier and will be used for all "require" calls:
48
-
49
- package.json:10:6:
50
-  10 โ”‚ "require": "./dist/index.js",
51
- โ•ต ~~~~~~~~~
52
-
53
-
54
-
55
- ESM dist/index.mjs 2.02 KB
56
- ESM โšก๏ธ Build success in 273ms
57
- CJS dist/index.js 3.42 KB
58
- CJS โšก๏ธ Build success in 274ms
59
- DTS โšก๏ธ Build success in 435ms
60
- DTS dist/index.d.ts 2.48 KB
61
- DTS dist/index.d.mts 2.48 KB
@@ -1,13 +0,0 @@
1
-
2
- 
3
- > @aiready/core@0.1.0 test /Users/pengcao/projects/aiready/packages/core
4
- > vitest run
5
-
6
-
7
-  RUN  v2.1.9 /Users/pengcao/projects/aiready/packages/core
8
-
9
- include: **/*.{test,spec}.?(c|m)[jt]s?(x)
10
- exclude: **/node_modules/**, **/dist/**, **/cypress/**, **/.{idea,git,cache,output,temp}/**, **/{karma,rollup,webpack,vite,vitest,jest,ava,babel,nyc,cypress,tsup,build,eslint,prettier}.config.*
11
- 
12
- No test files found, exiting with code 1
13
- [?25hโ€‰ELIFECYCLEโ€‰ Test failed. See above for more details.
package/src/index.ts DELETED
@@ -1,4 +0,0 @@
1
- export * from './types';
2
- export * from './utils/file-scanner';
3
- export * from './utils/ast-parser';
4
- export * from './utils/metrics';
package/src/types.ts DELETED
@@ -1,59 +0,0 @@
1
- export interface AnalysisResult {
2
- fileName: string;
3
- issues: Issue[];
4
- metrics: Metrics;
5
- }
6
-
7
- export interface Issue {
8
- type: IssueType;
9
- severity: 'critical' | 'major' | 'minor' | 'info';
10
- message: string;
11
- location: Location;
12
- suggestion?: string;
13
- }
14
-
15
- export type IssueType =
16
- | 'duplicate-pattern'
17
- | 'context-fragmentation'
18
- | 'doc-drift'
19
- | 'naming-inconsistency'
20
- | 'dead-code'
21
- | 'circular-dependency'
22
- | 'missing-types';
23
-
24
- export interface Location {
25
- file: string;
26
- line: number;
27
- column?: number;
28
- endLine?: number;
29
- endColumn?: number;
30
- }
31
-
32
- export interface Metrics {
33
- tokenCost?: number;
34
- complexityScore?: number;
35
- consistencyScore?: number;
36
- docFreshnessScore?: number;
37
- }
38
-
39
- export interface ScanOptions {
40
- rootDir: string;
41
- include?: string[];
42
- exclude?: string[];
43
- maxDepth?: number;
44
- }
45
-
46
- export interface Report {
47
- summary: {
48
- totalFiles: number;
49
- totalIssues: number;
50
- criticalIssues: number;
51
- majorIssues: number;
52
- };
53
- results: AnalysisResult[];
54
- metrics: {
55
- overallScore: number;
56
- tokenCostTotal: number;
57
- avgConsistency: number;
58
- };
59
- }
@@ -1,28 +0,0 @@
1
- // Placeholder for AST parsing utilities
2
- // Will be implemented with specific parsers (TypeScript, Babel, etc.)
3
-
4
- export interface ASTNode {
5
- type: string;
6
- loc?: {
7
- start: { line: number; column: number };
8
- end: { line: number; column: number };
9
- };
10
- }
11
-
12
- export function parseCode(code: string, language: string): ASTNode | null {
13
- // TODO: Implement language-specific parsing
14
- // TypeScript: @typescript-eslint/parser
15
- // JavaScript: @babel/parser
16
- // Python: tree-sitter-python
17
- return null;
18
- }
19
-
20
- export function extractFunctions(ast: ASTNode): ASTNode[] {
21
- // TODO: Extract function declarations
22
- return [];
23
- }
24
-
25
- export function extractImports(ast: ASTNode): string[] {
26
- // TODO: Extract import statements
27
- return [];
28
- }
@@ -1,42 +0,0 @@
1
- import { glob } from 'glob';
2
- import { readFile } from 'fs/promises';
3
- import { ScanOptions } from '../types';
4
-
5
- const DEFAULT_EXCLUDE = [
6
- '**/node_modules/**',
7
- '**/dist/**',
8
- '**/build/**',
9
- '**/.git/**',
10
- '**/coverage/**',
11
- '**/*.min.js',
12
- '**/*.bundle.js',
13
- ];
14
-
15
- export async function scanFiles(options: ScanOptions): Promise<string[]> {
16
- const {
17
- rootDir,
18
- include = ['**/*.{ts,tsx,js,jsx,py,java}'],
19
- exclude = DEFAULT_EXCLUDE,
20
- } = options;
21
-
22
- const files = await glob(include, {
23
- cwd: rootDir,
24
- ignore: exclude,
25
- absolute: true,
26
- });
27
-
28
- return files;
29
- }
30
-
31
- export async function readFileContent(filePath: string): Promise<string> {
32
- return readFile(filePath, 'utf-8');
33
- }
34
-
35
- export function getFileExtension(filePath: string): string {
36
- return filePath.split('.').pop() || '';
37
- }
38
-
39
- export function isSourceFile(filePath: string): boolean {
40
- const ext = getFileExtension(filePath);
41
- return ['ts', 'tsx', 'js', 'jsx', 'py', 'java', 'go', 'rs'].includes(ext);
42
- }
@@ -1,47 +0,0 @@
1
- /**
2
- * Estimate token count for text (rough approximation)
3
- * ~1 token โ‰ˆ 4 characters for code
4
- */
5
- export function estimateTokens(text: string): number {
6
- return Math.ceil(text.length / 4);
7
- }
8
-
9
- /**
10
- * Calculate Levenshtein distance between two strings
11
- * Useful for similarity detection
12
- */
13
- export function levenshteinDistance(str1: string, str2: string): number {
14
- const len1 = str1.length;
15
- const len2 = str2.length;
16
- const matrix: number[][] = [];
17
-
18
- for (let i = 0; i <= len1; i++) {
19
- matrix[i] = [i];
20
- }
21
-
22
- for (let j = 0; j <= len2; j++) {
23
- matrix[0][j] = j;
24
- }
25
-
26
- for (let i = 1; i <= len1; i++) {
27
- for (let j = 1; j <= len2; j++) {
28
- const cost = str1[i - 1] === str2[j - 1] ? 0 : 1;
29
- matrix[i][j] = Math.min(
30
- matrix[i - 1][j] + 1,
31
- matrix[i][j - 1] + 1,
32
- matrix[i - 1][j - 1] + cost
33
- );
34
- }
35
- }
36
-
37
- return matrix[len1][len2];
38
- }
39
-
40
- /**
41
- * Calculate similarity score (0-1) between two strings
42
- */
43
- export function similarityScore(str1: string, str2: string): number {
44
- const distance = levenshteinDistance(str1, str2);
45
- const maxLength = Math.max(str1.length, str2.length);
46
- return maxLength === 0 ? 1 : 1 - distance / maxLength;
47
- }
package/tsconfig.json DELETED
@@ -1,20 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2020",
4
- "module": "ESNext",
5
- "lib": ["ES2020"],
6
- "moduleResolution": "bundler",
7
- "declaration": true,
8
- "declarationMap": true,
9
- "sourceMap": true,
10
- "outDir": "./dist",
11
- "rootDir": "./src",
12
- "strict": true,
13
- "esModuleInterop": true,
14
- "skipLibCheck": true,
15
- "forceConsistentCasingInFileNames": true,
16
- "resolveJsonModule": true
17
- },
18
- "include": ["src/**/*"],
19
- "exclude": ["node_modules", "dist"]
20
- }