logicstamp-context 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 (89) hide show
  1. package/LICENSE +21 -0
  2. package/LLM_CONTEXT.md +260 -0
  3. package/README.md +949 -0
  4. package/dist/cli/commands/clean.d.ts +15 -0
  5. package/dist/cli/commands/clean.d.ts.map +1 -0
  6. package/dist/cli/commands/clean.js +142 -0
  7. package/dist/cli/commands/clean.js.map +1 -0
  8. package/dist/cli/commands/compare.d.ts +88 -0
  9. package/dist/cli/commands/compare.d.ts.map +1 -0
  10. package/dist/cli/commands/compare.js +519 -0
  11. package/dist/cli/commands/compare.js.map +1 -0
  12. package/dist/cli/commands/context.d.ts +24 -0
  13. package/dist/cli/commands/context.d.ts.map +1 -0
  14. package/dist/cli/commands/context.js +576 -0
  15. package/dist/cli/commands/context.js.map +1 -0
  16. package/dist/cli/commands/init.d.ts +14 -0
  17. package/dist/cli/commands/init.d.ts.map +1 -0
  18. package/dist/cli/commands/init.js +71 -0
  19. package/dist/cli/commands/init.js.map +1 -0
  20. package/dist/cli/commands/validate.d.ts +52 -0
  21. package/dist/cli/commands/validate.d.ts.map +1 -0
  22. package/dist/cli/commands/validate.js +368 -0
  23. package/dist/cli/commands/validate.js.map +1 -0
  24. package/dist/cli/index.d.ts +7 -0
  25. package/dist/cli/index.d.ts.map +1 -0
  26. package/dist/cli/index.js +223 -0
  27. package/dist/cli/index.js.map +1 -0
  28. package/dist/cli/stamp.d.ts +7 -0
  29. package/dist/cli/stamp.d.ts.map +1 -0
  30. package/dist/cli/stamp.js +961 -0
  31. package/dist/cli/stamp.js.map +1 -0
  32. package/dist/cli/validate-index.d.ts +7 -0
  33. package/dist/cli/validate-index.d.ts.map +1 -0
  34. package/dist/cli/validate-index.js +55 -0
  35. package/dist/cli/validate-index.js.map +1 -0
  36. package/dist/core/astParser.d.ts +47 -0
  37. package/dist/core/astParser.d.ts.map +1 -0
  38. package/dist/core/astParser.js +417 -0
  39. package/dist/core/astParser.js.map +1 -0
  40. package/dist/core/contractBuilder.d.ts +48 -0
  41. package/dist/core/contractBuilder.d.ts.map +1 -0
  42. package/dist/core/contractBuilder.js +120 -0
  43. package/dist/core/contractBuilder.js.map +1 -0
  44. package/dist/core/manifest.d.ts +75 -0
  45. package/dist/core/manifest.d.ts.map +1 -0
  46. package/dist/core/manifest.js +173 -0
  47. package/dist/core/manifest.js.map +1 -0
  48. package/dist/core/pack.d.ts +190 -0
  49. package/dist/core/pack.d.ts.map +1 -0
  50. package/dist/core/pack.js +438 -0
  51. package/dist/core/pack.js.map +1 -0
  52. package/dist/core/signature.d.ts +47 -0
  53. package/dist/core/signature.d.ts.map +1 -0
  54. package/dist/core/signature.js +208 -0
  55. package/dist/core/signature.js.map +1 -0
  56. package/dist/index.d.ts +27 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +23 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/types/UIFContract.d.ts +112 -0
  61. package/dist/types/UIFContract.d.ts.map +1 -0
  62. package/dist/types/UIFContract.js +36 -0
  63. package/dist/types/UIFContract.js.map +1 -0
  64. package/dist/utils/config.d.ts +34 -0
  65. package/dist/utils/config.d.ts.map +1 -0
  66. package/dist/utils/config.js +62 -0
  67. package/dist/utils/config.js.map +1 -0
  68. package/dist/utils/fsx.d.ts +85 -0
  69. package/dist/utils/fsx.d.ts.map +1 -0
  70. package/dist/utils/fsx.js +181 -0
  71. package/dist/utils/fsx.js.map +1 -0
  72. package/dist/utils/gitignore.d.ts +62 -0
  73. package/dist/utils/gitignore.d.ts.map +1 -0
  74. package/dist/utils/gitignore.js +183 -0
  75. package/dist/utils/gitignore.js.map +1 -0
  76. package/dist/utils/hash.d.ts +73 -0
  77. package/dist/utils/hash.d.ts.map +1 -0
  78. package/dist/utils/hash.js +159 -0
  79. package/dist/utils/hash.js.map +1 -0
  80. package/dist/utils/llmContext.d.ts +34 -0
  81. package/dist/utils/llmContext.d.ts.map +1 -0
  82. package/dist/utils/llmContext.js +136 -0
  83. package/dist/utils/llmContext.js.map +1 -0
  84. package/dist/utils/tokens.d.ts +23 -0
  85. package/dist/utils/tokens.d.ts.map +1 -0
  86. package/dist/utils/tokens.js +29 -0
  87. package/dist/utils/tokens.js.map +1 -0
  88. package/package.json +69 -0
  89. package/schema/logicstamp.context.schema.json +430 -0
@@ -0,0 +1,208 @@
1
+ /**
2
+ * @uif Contract 0.3
3
+ *
4
+ * Description: signature - Presentational component
5
+ *
6
+ * Version (Component Composition):
7
+ * variables: []
8
+ * hooks: []
9
+ * components: []
10
+ * functions: ["applyDisplayOnlyPreset","applyNavOnlyPreset","applySubmitOnlyPreset","buildLogicSignature","generateBehavioralPredictions","inferDescription"]
11
+ * imports: ["../types/UIFContract.js","./astParser.js"]
12
+ *
13
+ * Logic Signature:
14
+ * props: {}
15
+ * emits: {}
16
+ * state: {}
17
+ *
18
+ * Predictions:
19
+ * (none)
20
+ *
21
+ * Hashes (informational only - authoritative values in .uif.json):
22
+ * semantic: uif:9a5a412d07f6985e03fda241 (informational)
23
+ * file: uif:64d7d3b1474878658358e5a8
24
+ */
25
+ /**
26
+ * Build logic signature with preset validation
27
+ */
28
+ export function buildLogicSignature(ast, preset) {
29
+ const signature = {
30
+ props: ast.props,
31
+ emits: ast.emits,
32
+ state: Object.keys(ast.state).length > 0 ? ast.state : undefined,
33
+ };
34
+ const prediction = [];
35
+ const violations = [];
36
+ // Apply preset-specific rules
37
+ switch (preset) {
38
+ case 'submit-only':
39
+ applySubmitOnlyPreset(ast, prediction, violations);
40
+ break;
41
+ case 'nav-only':
42
+ applyNavOnlyPreset(ast, prediction, violations);
43
+ break;
44
+ case 'display-only':
45
+ applyDisplayOnlyPreset(ast, prediction, violations);
46
+ break;
47
+ case 'none':
48
+ // No preset constraints
49
+ break;
50
+ }
51
+ return { signature, prediction, violations };
52
+ }
53
+ /**
54
+ * Submit-only preset: only onSubmit event allowed
55
+ */
56
+ function applySubmitOnlyPreset(ast, prediction, violations) {
57
+ prediction.push('Contract preset: submit-only');
58
+ const allowedEvents = ['onSubmit'];
59
+ const eventKeys = Object.keys(ast.emits);
60
+ const forbidden = eventKeys.filter((key) => !allowedEvents.includes(key));
61
+ if (forbidden.length > 0) {
62
+ violations.push(`Submit-only contract violated: remove events [${forbidden.join(', ')}]`);
63
+ }
64
+ if (eventKeys.includes('onSubmit')) {
65
+ prediction.push('When loading=true, submit button should be disabled');
66
+ prediction.push('onSubmit is the only permitted action handler');
67
+ }
68
+ // Check for loading/busy state
69
+ if (ast.state.loading || ast.state.busy || ast.state.isLoading) {
70
+ prediction.push('Loading state controls button disabled state');
71
+ }
72
+ }
73
+ /**
74
+ * Nav-only preset: only onClick navigation allowed
75
+ */
76
+ function applyNavOnlyPreset(ast, prediction, violations) {
77
+ prediction.push('Contract preset: nav-only');
78
+ const allowedEvents = ['onClick'];
79
+ const eventKeys = Object.keys(ast.emits);
80
+ const forbidden = eventKeys.filter((key) => !allowedEvents.includes(key));
81
+ if (forbidden.length > 0) {
82
+ violations.push(`Nav-only contract violated: remove events [${forbidden.join(', ')}]`);
83
+ }
84
+ if (!eventKeys.includes('onClick')) {
85
+ violations.push('Nav-only contract expects an onClick navigation handler');
86
+ }
87
+ prediction.push('Component handles navigation only, no form submission or data mutation');
88
+ // Check for href prop (for link-like components)
89
+ if ('href' in ast.props || 'to' in ast.props) {
90
+ prediction.push('Navigation target specified via href/to prop');
91
+ }
92
+ }
93
+ /**
94
+ * Display-only preset: no events allowed
95
+ */
96
+ function applyDisplayOnlyPreset(ast, prediction, violations) {
97
+ prediction.push('Contract preset: display-only');
98
+ const eventKeys = Object.keys(ast.emits);
99
+ if (eventKeys.length > 0) {
100
+ violations.push(`Display-only contract violated: no events permitted, found [${eventKeys.join(', ')}]`);
101
+ }
102
+ prediction.push('Component is purely presentational with no event handlers');
103
+ prediction.push('All behavior driven by props only');
104
+ // Check for derived state
105
+ const stateKeys = Object.keys(ast.state);
106
+ if (stateKeys.length > 0) {
107
+ violations.push(`Display-only contract should minimize internal state, found [${stateKeys.join(', ')}]`);
108
+ }
109
+ }
110
+ /**
111
+ * Generate additional behavioral predictions based on common patterns
112
+ */
113
+ export function generateBehavioralPredictions(ast) {
114
+ const predictions = [];
115
+ // Form handling patterns
116
+ if (ast.hooks.includes('useForm') || ast.functions.some((f) => f.includes('validate'))) {
117
+ predictions.push('Includes form validation logic');
118
+ }
119
+ // Side effects
120
+ if (ast.hooks.includes('useEffect')) {
121
+ predictions.push('Has side effects managed by useEffect');
122
+ }
123
+ // Data fetching
124
+ if (ast.hooks.some((h) => h.includes('Query') || h.includes('Mutation')) ||
125
+ ast.functions.some((f) => f.includes('fetch') || f.includes('load'))) {
126
+ predictions.push('Fetches or mutates external data');
127
+ }
128
+ // Memoization
129
+ if (ast.hooks.includes('useMemo') || ast.hooks.includes('useCallback')) {
130
+ predictions.push('Uses memoization for performance optimization');
131
+ }
132
+ // Context usage
133
+ if (ast.hooks.includes('useContext')) {
134
+ predictions.push('Consumes React Context for shared state');
135
+ }
136
+ // Refs
137
+ if (ast.hooks.includes('useRef')) {
138
+ predictions.push('Uses refs for DOM access or mutable values');
139
+ }
140
+ // Loading states
141
+ const stateKeys = Object.keys(ast.state);
142
+ if (stateKeys.some((k) => k.includes('loading') || k.includes('pending'))) {
143
+ predictions.push('Manages loading/pending UI states');
144
+ }
145
+ // Error states
146
+ if (stateKeys.some((k) => k.includes('error'))) {
147
+ predictions.push('Handles and displays error states');
148
+ }
149
+ return predictions;
150
+ }
151
+ /**
152
+ * Infer component description from file name and structure
153
+ */
154
+ export function inferDescription(filePath, ast) {
155
+ const fileName = filePath.split(/[/\\]/).pop()?.replace(/\.(tsx?|jsx?)$/, '') || 'Component';
156
+ // Check kind first - non-React files should get appropriate labels
157
+ if (ast.kind === 'node:cli') {
158
+ return `${fileName} - CLI entry point`;
159
+ }
160
+ if (ast.kind === 'ts:module') {
161
+ // Check for common utility patterns
162
+ if (fileName.toLowerCase().includes('util') || fileName.toLowerCase().includes('helper')) {
163
+ return `${fileName} - Utility module`;
164
+ }
165
+ if (fileName.toLowerCase().includes('config')) {
166
+ return `${fileName} - Configuration module`;
167
+ }
168
+ if (fileName.toLowerCase().includes('type') || fileName.toLowerCase().includes('interface')) {
169
+ return `${fileName} - Type definitions`;
170
+ }
171
+ return `${fileName} - TypeScript module`;
172
+ }
173
+ // React component patterns (kind === 'react:component')
174
+ if (fileName.toLowerCase().includes('button')) {
175
+ return `${fileName} - Interactive button component`;
176
+ }
177
+ if (fileName.toLowerCase().includes('form')) {
178
+ return `${fileName} - Form component with validation`;
179
+ }
180
+ if (fileName.toLowerCase().includes('modal') || fileName.toLowerCase().includes('dialog')) {
181
+ return `${fileName} - Modal/dialog component`;
182
+ }
183
+ if (fileName.toLowerCase().includes('input') || fileName.toLowerCase().includes('field')) {
184
+ return `${fileName} - Form input field`;
185
+ }
186
+ if (fileName.toLowerCase().includes('card')) {
187
+ return `${fileName} - Card display component`;
188
+ }
189
+ if (fileName.toLowerCase().includes('nav') || fileName.toLowerCase().includes('menu')) {
190
+ return `${fileName} - Navigation component`;
191
+ }
192
+ // Default description based on state and emits
193
+ const hasState = Object.keys(ast.state).length > 0;
194
+ const hasEmits = Object.keys(ast.emits).length > 0;
195
+ if (hasState && hasEmits) {
196
+ return `${fileName} - Interactive component with internal state`;
197
+ }
198
+ else if (hasState) {
199
+ return `${fileName} - Stateful component`;
200
+ }
201
+ else if (hasEmits) {
202
+ return `${fileName} - Interactive component`;
203
+ }
204
+ else {
205
+ return `${fileName} - Presentational component`;
206
+ }
207
+ }
208
+ //# sourceMappingURL=signature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature.js","sourceRoot":"","sources":["../../src/core/signature.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * LogicStamp Context - Main entry point
3
+ *
4
+ * This package provides tools for generating AI-friendly context bundles
5
+ * from React/TypeScript codebases.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { extractFromFile, buildContract, pack } from 'logicstamp-context';
10
+ * ```
11
+ */
12
+ export type { UIFContract, NextJSMetadata, LogicSignature, ContractKind, PropType, EventType } from './types/UIFContract.js';
13
+ export type { LogicStampBundle, BundleNode, PackOptions, CodeInclusionMode, BundleFormat, MissingDependency } from './core/pack.js';
14
+ export type { ProjectManifest, ComponentNode } from './core/manifest.js';
15
+ export type { AstExtract } from './core/astParser.js';
16
+ export type { ContractBuildResult, ContractBuildParams } from './core/contractBuilder.js';
17
+ export type { SignatureResult } from './core/signature.js';
18
+ export { extractFromFile } from './core/astParser.js';
19
+ export { buildContract } from './core/contractBuilder.js';
20
+ export { pack, computeBundleHash, validateHashLock } from './core/pack.js';
21
+ export { buildLogicSignature } from './core/signature.js';
22
+ export { contextCommand, type ContextOptions } from './cli/commands/context.js';
23
+ export { compareCommand, type CompareOptions } from './cli/commands/compare.js';
24
+ export { validateCommand } from './cli/commands/validate.js';
25
+ export { init } from './cli/commands/init.js';
26
+ export { cleanCommand } from './cli/commands/clean.js';
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC7H,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACpI,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACzE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAC1F,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG1D,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,23 @@
1
+ /**
2
+ * LogicStamp Context - Main entry point
3
+ *
4
+ * This package provides tools for generating AI-friendly context bundles
5
+ * from React/TypeScript codebases.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { extractFromFile, buildContract, pack } from 'logicstamp-context';
10
+ * ```
11
+ */
12
+ // Core functions
13
+ export { extractFromFile } from './core/astParser.js';
14
+ export { buildContract } from './core/contractBuilder.js';
15
+ export { pack, computeBundleHash, validateHashLock } from './core/pack.js';
16
+ export { buildLogicSignature } from './core/signature.js';
17
+ // CLI commands (for programmatic use)
18
+ export { contextCommand } from './cli/commands/context.js';
19
+ export { compareCommand } from './cli/commands/compare.js';
20
+ export { validateCommand } from './cli/commands/validate.js';
21
+ export { init } from './cli/commands/init.js';
22
+ export { cleanCommand } from './cli/commands/clean.js';
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,iBAAiB;AACjB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,sCAAsC;AACtC,OAAO,EAAE,cAAc,EAAuB,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,cAAc,EAAuB,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * @uif Contract 0.3
3
+ *
4
+ * Description: UIFContract - Presentational component
5
+ *
6
+ * Version (Component Composition):
7
+ * variables: []
8
+ * hooks: []
9
+ * components: []
10
+ * functions: ["isUIFContract"]
11
+ * imports: []
12
+ *
13
+ * Logic Signature:
14
+ * props: {}
15
+ * emits: {}
16
+ * state: {}
17
+ *
18
+ * Predictions:
19
+ * (none)
20
+ *
21
+ * Hashes (informational only - authoritative values in .uif.json):
22
+ * semantic: uif:84f4985dd25893f9bb7e43f6 (informational)
23
+ * file: uif:f1297e88a770031270331b9b
24
+ */
25
+ /**
26
+ * Core type definition for UI Forge Contract
27
+ * Schema version 0.3
28
+ */
29
+ export type ContractPreset = 'submit-only' | 'nav-only' | 'display-only' | 'none';
30
+ export type ContractKind = 'react:component' | 'ts:module' | 'node:cli';
31
+ export interface ComponentVersion {
32
+ variables: string[];
33
+ hooks: string[];
34
+ components: string[];
35
+ functions: string[];
36
+ imports?: string[];
37
+ }
38
+ /**
39
+ * Prop type descriptors
40
+ */
41
+ export type PropType = string | string[] | {
42
+ type: 'literal-union' | 'function' | 'object' | 'array' | string;
43
+ optional?: boolean;
44
+ literals?: string[];
45
+ signature?: string;
46
+ };
47
+ /**
48
+ * Event type descriptors
49
+ */
50
+ export type EventType = string | {
51
+ type: 'function';
52
+ signature: string;
53
+ optional?: boolean;
54
+ };
55
+ export interface LogicSignature {
56
+ props: Record<string, PropType>;
57
+ emits: Record<string, EventType>;
58
+ state?: Record<string, string>;
59
+ }
60
+ export interface A11yMetrics {
61
+ contrastMin?: number;
62
+ role?: string;
63
+ }
64
+ export interface LatencyMetrics {
65
+ clientP95Ms?: number;
66
+ }
67
+ export interface CoverageMetrics {
68
+ lines?: number;
69
+ branches?: number;
70
+ }
71
+ export interface ContractMetrics {
72
+ a11y?: A11yMetrics;
73
+ latency?: LatencyMetrics;
74
+ coverage?: CoverageMetrics;
75
+ }
76
+ export interface ContractLinks {
77
+ tokens?: string;
78
+ figma?: string;
79
+ spec?: string;
80
+ }
81
+ export interface NextJSMetadata {
82
+ isInAppDir?: boolean;
83
+ directive?: 'client' | 'server';
84
+ }
85
+ export type ExportMetadata = 'default' | 'named' | {
86
+ named: string[];
87
+ };
88
+ export interface UIFContract {
89
+ type: 'UIFContract';
90
+ schemaVersion: '0.3';
91
+ kind: ContractKind;
92
+ entryId: string;
93
+ entryPathAbs?: string;
94
+ entryPathRel?: string;
95
+ os?: 'win32' | 'posix';
96
+ description: string;
97
+ usedIn?: string[];
98
+ version: ComponentVersion;
99
+ logicSignature: LogicSignature;
100
+ exports?: ExportMetadata;
101
+ prediction?: string[];
102
+ metrics?: ContractMetrics;
103
+ links?: ContractLinks;
104
+ nextjs?: NextJSMetadata;
105
+ semanticHash: string;
106
+ fileHash: string;
107
+ }
108
+ /**
109
+ * Utility type guards
110
+ */
111
+ export declare function isUIFContract(obj: unknown): obj is UIFContract;
112
+ //# sourceMappingURL=UIFContract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UIFContract.d.ts","sourceRoot":"","sources":["../../src/types/UIFContract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @uif Contract 0.3
3
+ *
4
+ * Description: UIFContract - Presentational component
5
+ *
6
+ * Version (Component Composition):
7
+ * variables: []
8
+ * hooks: []
9
+ * components: []
10
+ * functions: ["isUIFContract"]
11
+ * imports: []
12
+ *
13
+ * Logic Signature:
14
+ * props: {}
15
+ * emits: {}
16
+ * state: {}
17
+ *
18
+ * Predictions:
19
+ * (none)
20
+ *
21
+ * Hashes (informational only - authoritative values in .uif.json):
22
+ * semantic: uif:84f4985dd25893f9bb7e43f6 (informational)
23
+ * file: uif:f1297e88a770031270331b9b
24
+ */
25
+ /**
26
+ * Utility type guards
27
+ */
28
+ export function isUIFContract(obj) {
29
+ return (typeof obj === 'object' &&
30
+ obj !== null &&
31
+ 'type' in obj &&
32
+ obj.type === 'UIFContract' &&
33
+ 'schemaVersion' in obj &&
34
+ obj.schemaVersion === '0.3');
35
+ }
36
+ //# sourceMappingURL=UIFContract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UIFContract.js","sourceRoot":"","sources":["../../src/types/UIFContract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AA0GH;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,MAAM,IAAI,GAAG;QACb,GAAG,CAAC,IAAI,KAAK,aAAa;QAC1B,eAAe,IAAI,GAAG;QACtB,GAAG,CAAC,aAAa,KAAK,KAAK,CAC5B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Utilities for managing LogicStamp configuration
3
+ */
4
+ export interface LogicStampConfig {
5
+ /** User's preference for .gitignore management: "added" | "skipped" */
6
+ gitignorePreference?: 'added' | 'skipped';
7
+ /** User's preference for LLM_CONTEXT.md generation: "added" | "skipped" */
8
+ llmContextPreference?: 'added' | 'skipped';
9
+ }
10
+ /**
11
+ * Get the config directory path for a project
12
+ */
13
+ export declare function getConfigDir(projectRoot: string): string;
14
+ /**
15
+ * Get the config file path for a project
16
+ */
17
+ export declare function getConfigPath(projectRoot: string): string;
18
+ /**
19
+ * Check if config file exists
20
+ */
21
+ export declare function configExists(projectRoot: string): Promise<boolean>;
22
+ /**
23
+ * Read config from disk
24
+ */
25
+ export declare function readConfig(projectRoot: string): Promise<LogicStampConfig>;
26
+ /**
27
+ * Write config to disk
28
+ */
29
+ export declare function writeConfig(projectRoot: string, config: LogicStampConfig): Promise<void>;
30
+ /**
31
+ * Update config with new values (merges with existing)
32
+ */
33
+ export declare function updateConfig(projectRoot: string, updates: Partial<LogicStampConfig>): Promise<void>;
34
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,mBAAmB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1C,2EAA2E;IAC3E,oBAAoB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC5C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOxE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAQ/E;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAS9F;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAIzG"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Utilities for managing LogicStamp configuration
3
+ */
4
+ import { readFile, writeFile, mkdir, access } from 'node:fs/promises';
5
+ import { join } from 'node:path';
6
+ /**
7
+ * Get the config directory path for a project
8
+ */
9
+ export function getConfigDir(projectRoot) {
10
+ return join(projectRoot, '.logicstamp');
11
+ }
12
+ /**
13
+ * Get the config file path for a project
14
+ */
15
+ export function getConfigPath(projectRoot) {
16
+ return join(getConfigDir(projectRoot), 'config.json');
17
+ }
18
+ /**
19
+ * Check if config file exists
20
+ */
21
+ export async function configExists(projectRoot) {
22
+ try {
23
+ await access(getConfigPath(projectRoot));
24
+ return true;
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
30
+ /**
31
+ * Read config from disk
32
+ */
33
+ export async function readConfig(projectRoot) {
34
+ try {
35
+ const configPath = getConfigPath(projectRoot);
36
+ const content = await readFile(configPath, 'utf-8');
37
+ return JSON.parse(content);
38
+ }
39
+ catch {
40
+ return {};
41
+ }
42
+ }
43
+ /**
44
+ * Write config to disk
45
+ */
46
+ export async function writeConfig(projectRoot, config) {
47
+ const configDir = getConfigDir(projectRoot);
48
+ const configPath = getConfigPath(projectRoot);
49
+ // Ensure config directory exists
50
+ await mkdir(configDir, { recursive: true });
51
+ // Write config file
52
+ await writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8');
53
+ }
54
+ /**
55
+ * Update config with new values (merges with existing)
56
+ */
57
+ export async function updateConfig(projectRoot, updates) {
58
+ const existing = await readConfig(projectRoot);
59
+ const merged = { ...existing, ...updates };
60
+ await writeConfig(projectRoot, merged);
61
+ }
62
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,IAAI,EAAW,MAAM,WAAW,CAAC;AAS1C;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,WAAmB;IAC9C,OAAO,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,WAAmB;IAClD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB,EAAE,MAAwB;IAC7E,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAE9C,iCAAiC;IACjC,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,oBAAoB;IACpB,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB,EAAE,OAAkC;IACxF,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC;IAC3C,MAAM,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * @uif Contract 0.3
3
+ *
4
+ * Description: fsx - Presentational component
5
+ *
6
+ * Version (Component Composition):
7
+ * variables: []
8
+ * hooks: []
9
+ * components: []
10
+ * functions: ["deleteSidecar","fileExists","findSidecarFiles","getRelativePath","getSidecarPath","globFiles","normalizeEntryId","readFileWithText","resolvePath"]
11
+ * imports: ["glob","node:fs/promises","node:path"]
12
+ *
13
+ * Logic Signature:
14
+ * props: {}
15
+ * events: {}
16
+ * state: {}
17
+ *
18
+ * Predictions:
19
+ * (none)
20
+ *
21
+ * Hashes (informational only - authoritative values in .uif.json):
22
+ * semantic: uif:80b91273520265259cc8e40e (informational)
23
+ * file: uif:f6ee3958ee861ee956f6b5c9
24
+ */
25
+ export interface FileWithText {
26
+ path: string;
27
+ text: string;
28
+ }
29
+ /**
30
+ * Find files matching glob patterns
31
+ */
32
+ export declare function globFiles(searchPath: string, extensions?: string): Promise<string[]>;
33
+ /**
34
+ * Read file and return path + content
35
+ */
36
+ export declare function readFileWithText(filePath: string): Promise<FileWithText>;
37
+ /**
38
+ * Find all sidecar files (*.uif.json) in a directory
39
+ */
40
+ export declare function findSidecarFiles(searchPath: string): Promise<string[]>;
41
+ /**
42
+ * Delete a sidecar file
43
+ */
44
+ export declare function deleteSidecar(sidecarPath: string): Promise<void>;
45
+ /**
46
+ * Get relative path from base directory
47
+ */
48
+ export declare function getRelativePath(from: string, to: string): string;
49
+ /**
50
+ * Resolve absolute path
51
+ */
52
+ export declare function resolvePath(...paths: string[]): string;
53
+ /**
54
+ * Check if file exists
55
+ */
56
+ export declare function fileExists(filePath: string): Promise<boolean>;
57
+ /**
58
+ * Get sidecar path for a source file
59
+ */
60
+ export declare function getSidecarPath(sourcePath: string, outRoot: string): string;
61
+ /**
62
+ * Normalize a file path for cross-platform consistency
63
+ * This is the canonical path normalization used throughout the codebase.
64
+ * Rules:
65
+ * - Convert backslashes to forward slashes (POSIX-style)
66
+ * - Use Node's normalize() to resolve .. and . segments
67
+ * - On Windows: preserve drive letter but normalize case
68
+ * - Remove leading ./ if present
69
+ * - Result should match manifest keys exactly
70
+ *
71
+ * This function is the single source of truth for path normalization.
72
+ * All entryId fields in contracts and manifest keys use this normalization.
73
+ */
74
+ export declare function normalizeEntryId(entryId: string): string;
75
+ /**
76
+ * Get the folder path for a given file (parent directory)
77
+ * Returns normalized folder path
78
+ */
79
+ export declare function getFolderPath(filePath: string): string;
80
+ /**
81
+ * Group files by their containing folder
82
+ * Returns a Map of folderPath -> array of file paths
83
+ */
84
+ export declare function groupFilesByFolder(files: string[], projectRoot: string): Map<string, string[]>;
85
+ //# sourceMappingURL=fsx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fsx.d.ts","sourceRoot":"","sources":["../../src/utils/fsx.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAUH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,MAAmB,GAC9B,OAAO,CAAC,MAAM,EAAE,CAAC,CAmCnB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAG9E;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAM5E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAStE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAEtD;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ1E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQxD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAe9F"}