@refrakt-md/cli 0.8.5 → 0.9.1

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 (51) hide show
  1. package/dist/bin.js +56 -98
  2. package/dist/bin.js.map +1 -1
  3. package/dist/commands/inspect.d.ts +2 -0
  4. package/dist/commands/inspect.d.ts.map +1 -1
  5. package/dist/commands/inspect.js +50 -5
  6. package/dist/commands/inspect.js.map +1 -1
  7. package/dist/lib/dimension-audit.d.ts +48 -0
  8. package/dist/lib/dimension-audit.d.ts.map +1 -0
  9. package/dist/lib/dimension-audit.js +186 -0
  10. package/dist/lib/dimension-audit.js.map +1 -0
  11. package/dist/lib/format.d.ts +10 -0
  12. package/dist/lib/format.d.ts.map +1 -1
  13. package/dist/lib/format.js +246 -2
  14. package/dist/lib/format.js.map +1 -1
  15. package/dist/lib/meta-audit.d.ts +43 -0
  16. package/dist/lib/meta-audit.d.ts.map +1 -0
  17. package/dist/lib/meta-audit.js +116 -0
  18. package/dist/lib/meta-audit.js.map +1 -0
  19. package/package.json +6 -9
  20. package/dist/commands/extract.d.ts +0 -10
  21. package/dist/commands/extract.d.ts.map +0 -1
  22. package/dist/commands/extract.js +0 -161
  23. package/dist/commands/extract.js.map +0 -1
  24. package/dist/extractors/index.d.ts +0 -3
  25. package/dist/extractors/index.d.ts.map +0 -1
  26. package/dist/extractors/index.js +0 -17
  27. package/dist/extractors/index.js.map +0 -1
  28. package/dist/extractors/python-docstring.d.ts +0 -26
  29. package/dist/extractors/python-docstring.d.ts.map +0 -1
  30. package/dist/extractors/python-docstring.js +0 -396
  31. package/dist/extractors/python-docstring.js.map +0 -1
  32. package/dist/extractors/python.d.ts +0 -21
  33. package/dist/extractors/python.d.ts.map +0 -1
  34. package/dist/extractors/python.js +0 -560
  35. package/dist/extractors/python.js.map +0 -1
  36. package/dist/extractors/types.d.ts +0 -55
  37. package/dist/extractors/types.d.ts.map +0 -1
  38. package/dist/extractors/types.js +0 -2
  39. package/dist/extractors/types.js.map +0 -1
  40. package/dist/extractors/typescript.d.ts +0 -28
  41. package/dist/extractors/typescript.d.ts.map +0 -1
  42. package/dist/extractors/typescript.js +0 -566
  43. package/dist/extractors/typescript.js.map +0 -1
  44. package/dist/lib/layout-generator.d.ts +0 -8
  45. package/dist/lib/layout-generator.d.ts.map +0 -1
  46. package/dist/lib/layout-generator.js +0 -22
  47. package/dist/lib/layout-generator.js.map +0 -1
  48. package/dist/lib/symbol-generator.d.ts +0 -14
  49. package/dist/lib/symbol-generator.d.ts.map +0 -1
  50. package/dist/lib/symbol-generator.js +0 -201
  51. package/dist/lib/symbol-generator.js.map +0 -1
@@ -0,0 +1,116 @@
1
+ import { readdirSync, readFileSync, existsSync } from 'node:fs';
2
+ import { join, dirname } from 'node:path';
3
+ import { createRequire } from 'node:module';
4
+ import postcss from 'postcss';
5
+ /** Walk all rune configs and collect structure entries with metadata annotations */
6
+ export function collectMetadata(config) {
7
+ const fields = [];
8
+ const typeCount = {};
9
+ const rankCount = {};
10
+ let withSentiment = 0;
11
+ let withoutSentiment = 0;
12
+ for (const [runeKey, runeConfig] of Object.entries(config.runes)) {
13
+ if (!runeConfig.structure)
14
+ continue;
15
+ for (const [key, entry] of Object.entries(runeConfig.structure)) {
16
+ collectFromEntry(entry, key, runeKey, runeConfig.block, fields);
17
+ }
18
+ }
19
+ for (const field of fields) {
20
+ typeCount[field.metaType] = (typeCount[field.metaType] || 0) + 1;
21
+ if (field.metaRank) {
22
+ rankCount[field.metaRank] = (rankCount[field.metaRank] || 0) + 1;
23
+ }
24
+ if (field.hasSentiment) {
25
+ withSentiment++;
26
+ }
27
+ else {
28
+ withoutSentiment++;
29
+ }
30
+ }
31
+ return { fields, typeCount, rankCount, withSentiment, withoutSentiment };
32
+ }
33
+ /** Recursively collect metadata fields from a structure entry and its children */
34
+ function collectFromEntry(entry, key, runeKey, block, fields) {
35
+ if (entry.metaType) {
36
+ fields.push({
37
+ rune: runeKey,
38
+ block,
39
+ ref: entry.ref ?? key,
40
+ metaType: entry.metaType,
41
+ metaRank: entry.metaRank,
42
+ hasSentiment: !!entry.sentimentMap,
43
+ sentimentValues: entry.sentimentMap ? Object.keys(entry.sentimentMap) : undefined,
44
+ });
45
+ }
46
+ if (entry.children) {
47
+ for (const child of entry.children) {
48
+ if (typeof child !== 'string') {
49
+ collectFromEntry(child, child.ref ?? '', runeKey, block, fields);
50
+ }
51
+ }
52
+ }
53
+ }
54
+ const META_ATTR_RE = /\[data-meta-[\w-]+(?:="[^"]*")?\]/g;
55
+ /** Check CSS files for metadata dimension selectors */
56
+ export function checkMetaCss(cssDir) {
57
+ const selectors = new Map();
58
+ // Check both runes/ and dimensions/ directories
59
+ const dirs = [cssDir];
60
+ const dimensionsDir = join(dirname(cssDir), 'dimensions');
61
+ if (existsSync(dimensionsDir)) {
62
+ dirs.push(dimensionsDir);
63
+ }
64
+ // Also try resolving from @refrakt-md/lumina
65
+ try {
66
+ const require = createRequire(import.meta.url);
67
+ const luminaPkg = require.resolve('@refrakt-md/lumina/package.json');
68
+ const luminaDimDir = join(dirname(luminaPkg), 'styles', 'dimensions');
69
+ if (existsSync(luminaDimDir) && !dirs.includes(luminaDimDir)) {
70
+ dirs.push(luminaDimDir);
71
+ }
72
+ }
73
+ catch {
74
+ // Package not found
75
+ }
76
+ for (const dir of dirs) {
77
+ if (!existsSync(dir))
78
+ continue;
79
+ const files = readdirSync(dir).filter(f => f.endsWith('.css'));
80
+ for (const file of files) {
81
+ const content = readFileSync(join(dir, file), 'utf-8');
82
+ const root = postcss.parse(content);
83
+ root.walkRules((rule) => {
84
+ const line = rule.source?.start?.line ?? 0;
85
+ for (const m of rule.selector.matchAll(META_ATTR_RE)) {
86
+ if (!selectors.has(m[0])) {
87
+ selectors.set(m[0], { file, line });
88
+ }
89
+ }
90
+ });
91
+ }
92
+ }
93
+ const EXPECTED_TYPES = ['status', 'category', 'quantity', 'temporal', 'tag', 'id'];
94
+ const EXPECTED_SENTIMENTS = ['positive', 'negative', 'caution', 'neutral'];
95
+ const EXPECTED_RANKS = ['primary', 'secondary'];
96
+ const types = {};
97
+ for (const type of EXPECTED_TYPES) {
98
+ const sel = `[data-meta-type="${type}"]`;
99
+ const match = selectors.get(sel);
100
+ types[type] = match ? { styled: true, file: match.file, line: match.line } : { styled: false };
101
+ }
102
+ const sentiments = {};
103
+ for (const sentiment of EXPECTED_SENTIMENTS) {
104
+ const sel = `[data-meta-sentiment="${sentiment}"]`;
105
+ const match = selectors.get(sel);
106
+ sentiments[sentiment] = match ? { styled: true, file: match.file, line: match.line } : { styled: false };
107
+ }
108
+ const ranks = {};
109
+ for (const rank of EXPECTED_RANKS) {
110
+ const sel = `[data-meta-rank="${rank}"]`;
111
+ const match = selectors.get(sel);
112
+ ranks[rank] = match ? { styled: true, file: match.file, line: match.line } : { styled: false };
113
+ }
114
+ return { types, sentiments, ranks };
115
+ }
116
+ //# sourceMappingURL=meta-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-audit.js","sourceRoot":"","sources":["../../src/lib/meta-audit.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@refrakt-md/cli",
3
3
  "description": "CLI tools for refrakt.md",
4
- "version": "0.8.5",
4
+ "version": "0.9.1",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -25,13 +25,10 @@
25
25
  },
26
26
  "dependencies": {
27
27
  "@markdoc/markdoc": "0.4.0",
28
- "@refrakt-md/ai": "0.8.5",
29
- "@refrakt-md/editor": "0.8.5",
30
- "@refrakt-md/runes": "0.8.5",
31
- "@refrakt-md/transform": "0.8.5",
32
- "postcss": "^8.4.0",
33
- "tree-sitter-wasms": "^0.1.13",
34
- "typescript": "^5.4.0",
35
- "web-tree-sitter": "^0.24.7"
28
+ "@refrakt-md/ai": "0.9.1",
29
+ "@refrakt-md/editor": "0.9.1",
30
+ "@refrakt-md/runes": "0.9.1",
31
+ "@refrakt-md/transform": "0.9.1",
32
+ "postcss": "^8.4.0"
36
33
  }
37
34
  }
@@ -1,10 +0,0 @@
1
- export interface ExtractOptions {
2
- input: string;
3
- output: string;
4
- lang?: 'typescript' | 'python';
5
- validate?: boolean;
6
- sourceUrl?: string;
7
- title?: string;
8
- }
9
- export declare function extractCommand(opts: ExtractOptions): Promise<void>;
10
- //# sourceMappingURL=extract.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/commands/extract.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AA8DD,wBAAsB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA2GxE"}
@@ -1,161 +0,0 @@
1
- import { resolve, join, relative, dirname } from 'node:path';
2
- import { writeFileSync, readFileSync, existsSync, mkdirSync, readdirSync, statSync } from 'node:fs';
3
- import { loadExtractor } from '../extractors/index.js';
4
- import { generateSymbolMarkdown, toSlug } from '../lib/symbol-generator.js';
5
- import { generateLayoutMarkdown } from '../lib/layout-generator.js';
6
- function detectLanguage(inputPath) {
7
- const abs = resolve(inputPath);
8
- // Check if input is a single file
9
- if (existsSync(abs) && statSync(abs).isFile()) {
10
- if (abs.endsWith('.ts') || abs.endsWith('.tsx'))
11
- return 'typescript';
12
- if (abs.endsWith('.py'))
13
- return 'python';
14
- }
15
- // Check for tsconfig.json
16
- if (existsSync(join(abs, 'tsconfig.json')) ||
17
- existsSync(join(dirname(abs), 'tsconfig.json'))) {
18
- return 'typescript';
19
- }
20
- // Check directory contents
21
- if (existsSync(abs) && statSync(abs).isDirectory()) {
22
- try {
23
- const files = readdirSync(abs);
24
- if (files.some(f => f.endsWith('.ts') || f.endsWith('.tsx')))
25
- return 'typescript';
26
- if (files.some(f => f.endsWith('.py')))
27
- return 'python';
28
- }
29
- catch {
30
- // fall through
31
- }
32
- }
33
- return 'typescript';
34
- }
35
- function findSourceFiles(inputPath, lang) {
36
- const abs = resolve(inputPath);
37
- if (!existsSync(abs))
38
- return [];
39
- const stat = statSync(abs);
40
- if (stat.isFile())
41
- return [abs];
42
- const ext = lang === 'typescript' ? /\.tsx?$/ : /\.py$/;
43
- return walkFiles(abs, ext);
44
- }
45
- function walkFiles(dir, ext) {
46
- const files = [];
47
- const entries = readdirSync(dir);
48
- for (const entry of entries) {
49
- if (entry === 'node_modules' || entry === '__pycache__' || entry.startsWith('.'))
50
- continue;
51
- const fullPath = resolve(dir, entry);
52
- const stat = statSync(fullPath);
53
- if (stat.isDirectory()) {
54
- files.push(...walkFiles(fullPath, ext));
55
- }
56
- else if (ext.test(entry)
57
- && !entry.endsWith('.d.ts') && !entry.endsWith('.test.ts') && !entry.endsWith('.spec.ts')
58
- && !entry.startsWith('test_') && !entry.endsWith('_test.py')
59
- && entry !== 'conftest.py' && entry !== 'setup.py') {
60
- files.push(fullPath);
61
- }
62
- }
63
- return files;
64
- }
65
- export async function extractCommand(opts) {
66
- const inputPath = resolve(opts.input);
67
- const outputPath = resolve(opts.output);
68
- const lang = opts.lang ?? detectLanguage(inputPath);
69
- if (!existsSync(inputPath)) {
70
- console.error(`Error: Input path does not exist: ${inputPath}`);
71
- process.exit(1);
72
- }
73
- // Use the directory as rootDir for the extractor (even if input is a single file)
74
- const extractorRoot = statSync(inputPath).isDirectory() ? inputPath : dirname(inputPath);
75
- // Load the appropriate extractor
76
- const extractor = await loadExtractor(lang, extractorRoot, opts.sourceUrl);
77
- // Find all source files
78
- const sourceFiles = findSourceFiles(inputPath, lang);
79
- if (sourceFiles.length === 0) {
80
- console.error(`No ${lang} source files found in ${inputPath}`);
81
- process.exit(1);
82
- }
83
- // Extract symbols from all files
84
- const allSymbols = [];
85
- for (const file of sourceFiles) {
86
- const result = extractor.extractFile(file);
87
- allSymbols.push(...result.symbols);
88
- }
89
- if (allSymbols.length === 0) {
90
- console.log('No exported symbols found.');
91
- return;
92
- }
93
- console.log(`Found ${allSymbols.length} symbols in ${sourceFiles.length} files`);
94
- // Detect slug collisions and resolve them
95
- const slugMap = new Map();
96
- for (const doc of allSymbols) {
97
- const slug = toSlug(doc.name);
98
- const existing = slugMap.get(slug) ?? [];
99
- existing.push(doc);
100
- slugMap.set(slug, existing);
101
- }
102
- // Generate Markdown for each symbol
103
- const generated = new Map();
104
- for (const [slug, docs] of slugMap) {
105
- if (docs.length === 1) {
106
- const filePath = join(outputPath, `${slug}.md`);
107
- generated.set(filePath, generateSymbolMarkdown(docs[0], { lang }));
108
- }
109
- else {
110
- // Resolve collisions by appending kind
111
- for (const doc of docs) {
112
- const uniqueSlug = `${slug}-${doc.kind}`;
113
- const filePath = join(outputPath, `${uniqueSlug}.md`);
114
- generated.set(filePath, generateSymbolMarkdown(doc, { lang }));
115
- }
116
- }
117
- }
118
- // Generate _layout.md
119
- const layoutPath = join(outputPath, '_layout.md');
120
- const layoutContent = generateLayoutMarkdown(allSymbols, { title: opts.title });
121
- generated.set(layoutPath, layoutContent);
122
- // Validate mode: compare generated to existing
123
- if (opts.validate) {
124
- let stale = false;
125
- for (const [filePath, content] of generated) {
126
- if (!existsSync(filePath)) {
127
- console.error(`MISSING: ${relative(process.cwd(), filePath)}`);
128
- stale = true;
129
- }
130
- else {
131
- const existing = readFileSync(filePath, 'utf-8');
132
- if (existing !== content) {
133
- console.error(`STALE: ${relative(process.cwd(), filePath)}`);
134
- stale = true;
135
- }
136
- }
137
- }
138
- if (stale) {
139
- console.error('\nAPI reference is out of date. Run `refrakt extract` to regenerate.');
140
- process.exit(1);
141
- }
142
- else {
143
- console.log(`OK: ${generated.size} files up to date (${allSymbols.length} symbols)`);
144
- }
145
- return;
146
- }
147
- // Write mode
148
- if (!existsSync(outputPath)) {
149
- mkdirSync(outputPath, { recursive: true });
150
- }
151
- let written = 0;
152
- for (const [filePath, content] of generated) {
153
- const dir = dirname(filePath);
154
- if (!existsSync(dir))
155
- mkdirSync(dir, { recursive: true });
156
- writeFileSync(filePath, content);
157
- written++;
158
- }
159
- console.log(`Written ${written} files to ${relative(process.cwd(), outputPath)}`);
160
- }
161
- //# sourceMappingURL=extract.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/commands/extract.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- export type { SymbolDoc, SymbolExtractor, ExtractorResult, SymbolKind, SymbolParameter, SymbolReturn, SymbolThrows, SymbolMemberDoc, SymbolGroupDoc, } from './types.js';
2
- export declare function loadExtractor(lang: 'typescript' | 'python', rootDir: string, sourceUrl?: string): Promise<import('./types.js').SymbolExtractor>;
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extractors/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACX,SAAS,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EACvD,eAAe,EAAE,YAAY,EAAE,YAAY,EAC3C,eAAe,EAAE,cAAc,GAC/B,MAAM,YAAY,CAAC;AAEpB,wBAAsB,aAAa,CAClC,IAAI,EAAE,YAAY,GAAG,QAAQ,EAC7B,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,YAAY,EAAE,eAAe,CAAC,CAe/C"}
@@ -1,17 +0,0 @@
1
- export async function loadExtractor(lang, rootDir, sourceUrl) {
2
- switch (lang) {
3
- case 'typescript': {
4
- const { TypeScriptExtractor } = await import('./typescript.js');
5
- return new TypeScriptExtractor(rootDir, sourceUrl);
6
- }
7
- case 'python': {
8
- const { PythonExtractor } = await import('./python.js');
9
- const extractor = new PythonExtractor(rootDir, sourceUrl);
10
- await extractor.init();
11
- return extractor;
12
- }
13
- default:
14
- throw new Error(`Unsupported language: ${lang}`);
15
- }
16
- }
17
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extractors/index.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,IAA6B,EAC7B,OAAe,EACf,SAAkB;IAElB,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,YAAY,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAChE,OAAO,IAAI,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACpD,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACf,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YACxD,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAC1D,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;YACvB,OAAO,SAAS,CAAC;QAClB,CAAC;QACD;YACC,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;AACF,CAAC"}
@@ -1,26 +0,0 @@
1
- /**
2
- * Python docstring parser — supports Google, NumPy, and Sphinx (reST) conventions.
3
- * Auto-detects the format and extracts parameters, returns, raises, since, and deprecated.
4
- */
5
- export interface DocstringParam {
6
- type: string;
7
- description: string;
8
- }
9
- export interface DocstringInfo {
10
- description: string;
11
- params: Map<string, DocstringParam>;
12
- returns?: {
13
- type: string;
14
- description: string;
15
- };
16
- raises: Array<{
17
- type: string;
18
- description: string;
19
- }>;
20
- since?: string;
21
- deprecated?: string;
22
- }
23
- export type DocstringStyle = 'google' | 'numpy' | 'sphinx' | 'plain';
24
- export declare function detectStyle(raw: string): DocstringStyle;
25
- export declare function parseDocstring(raw: string): DocstringInfo;
26
- //# sourceMappingURL=python-docstring.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"python-docstring.d.ts","sourceRoot":"","sources":["../../src/extractors/python-docstring.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAQrE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAMvD;AAID,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAazD"}