logicstamp-context 0.2.5 → 0.2.7

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 (56) hide show
  1. package/LLM_CONTEXT.md +2 -2
  2. package/README.md +33 -13
  3. package/dist/cli/commands/context.d.ts.map +1 -1
  4. package/dist/cli/commands/context.js +11 -1
  5. package/dist/cli/commands/context.js.map +1 -1
  6. package/dist/cli/commands/init.d.ts +4 -0
  7. package/dist/cli/commands/init.d.ts.map +1 -1
  8. package/dist/cli/commands/init.js +84 -9
  9. package/dist/cli/commands/init.js.map +1 -1
  10. package/dist/cli/commands/security.d.ts +38 -0
  11. package/dist/cli/commands/security.d.ts.map +1 -0
  12. package/dist/cli/commands/security.js +343 -0
  13. package/dist/cli/commands/security.js.map +1 -0
  14. package/dist/cli/handlers/securityHandler.d.ts +5 -0
  15. package/dist/cli/handlers/securityHandler.d.ts.map +1 -0
  16. package/dist/cli/handlers/securityHandler.js +45 -0
  17. package/dist/cli/handlers/securityHandler.js.map +1 -0
  18. package/dist/cli/parser/argumentParser.d.ts.map +1 -1
  19. package/dist/cli/parser/argumentParser.js +23 -0
  20. package/dist/cli/parser/argumentParser.js.map +1 -1
  21. package/dist/cli/parser/helpText.d.ts +2 -0
  22. package/dist/cli/parser/helpText.d.ts.map +1 -1
  23. package/dist/cli/parser/helpText.js +453 -348
  24. package/dist/cli/parser/helpText.js.map +1 -1
  25. package/dist/cli/stamp.js +55 -1
  26. package/dist/cli/stamp.js.map +1 -1
  27. package/dist/core/astParser/extractors/propExtractor.d.ts.map +1 -1
  28. package/dist/core/astParser/extractors/propExtractor.js +16 -4
  29. package/dist/core/astParser/extractors/propExtractor.js.map +1 -1
  30. package/dist/core/astParser.d.ts +3 -1
  31. package/dist/core/astParser.d.ts.map +1 -1
  32. package/dist/core/astParser.js +109 -0
  33. package/dist/core/astParser.js.map +1 -1
  34. package/dist/core/contractBuilder.d.ts.map +1 -1
  35. package/dist/core/contractBuilder.js +11 -15
  36. package/dist/core/contractBuilder.js.map +1 -1
  37. package/dist/core/manifest.d.ts.map +1 -1
  38. package/dist/core/manifest.js +54 -3
  39. package/dist/core/manifest.js.map +1 -1
  40. package/dist/core/pack.d.ts.map +1 -1
  41. package/dist/core/pack.js +57 -1
  42. package/dist/core/pack.js.map +1 -1
  43. package/dist/utils/gitignore.d.ts +30 -2
  44. package/dist/utils/gitignore.d.ts.map +1 -1
  45. package/dist/utils/gitignore.js +132 -20
  46. package/dist/utils/gitignore.js.map +1 -1
  47. package/dist/utils/secretDetector.d.ts +21 -0
  48. package/dist/utils/secretDetector.d.ts.map +1 -0
  49. package/dist/utils/secretDetector.js +145 -0
  50. package/dist/utils/secretDetector.js.map +1 -0
  51. package/dist/utils/stampignore.d.ts +49 -0
  52. package/dist/utils/stampignore.d.ts.map +1 -0
  53. package/dist/utils/stampignore.js +189 -0
  54. package/dist/utils/stampignore.js.map +1 -0
  55. package/package.json +1 -1
  56. package/schema/logicstamp.context.schema.json +26 -1
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Utilities for managing .stampignore files
3
+ * Similar to .gitignore, but for LogicStamp context generation
4
+ */
5
+ import { readFile, writeFile, access, unlink } from 'node:fs/promises';
6
+ import { join } from 'node:path';
7
+ import { debugError } from './debug.js';
8
+ import { normalizeEntryId } from './fsx.js';
9
+ /**
10
+ * Default .stampignore filename
11
+ */
12
+ export const STAMPIGNORE_FILENAME = '.stampignore';
13
+ /**
14
+ * Check if .stampignore exists in the given directory
15
+ */
16
+ export async function stampignoreExists(targetDir) {
17
+ try {
18
+ await access(join(targetDir, STAMPIGNORE_FILENAME));
19
+ return true;
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ /**
26
+ * Read .stampignore content
27
+ */
28
+ export async function readStampignore(targetDir) {
29
+ const stampignorePath = join(targetDir, STAMPIGNORE_FILENAME);
30
+ try {
31
+ const content = await readFile(stampignorePath, 'utf-8');
32
+ const config = JSON.parse(content);
33
+ // Validate structure
34
+ if (!config || typeof config !== 'object') {
35
+ debugError('stampignore', 'readStampignore', {
36
+ stampignorePath,
37
+ message: 'Invalid config structure',
38
+ });
39
+ return null;
40
+ }
41
+ if (!Array.isArray(config.ignore)) {
42
+ debugError('stampignore', 'readStampignore', {
43
+ stampignorePath,
44
+ message: 'Config.ignore must be an array',
45
+ });
46
+ return null;
47
+ }
48
+ return config;
49
+ }
50
+ catch (error) {
51
+ const err = error;
52
+ if (err.code === 'ENOENT') {
53
+ // File doesn't exist - that's fine, return null
54
+ return null;
55
+ }
56
+ debugError('stampignore', 'readStampignore', {
57
+ stampignorePath,
58
+ message: err.message,
59
+ code: err.code,
60
+ });
61
+ return null;
62
+ }
63
+ }
64
+ /**
65
+ * Write .stampignore content
66
+ */
67
+ export async function writeStampignore(targetDir, config) {
68
+ const stampignorePath = join(targetDir, STAMPIGNORE_FILENAME);
69
+ try {
70
+ const content = JSON.stringify(config, null, 2);
71
+ await writeFile(stampignorePath, content, 'utf-8');
72
+ }
73
+ catch (error) {
74
+ const err = error;
75
+ debugError('stampignore', 'writeStampignore', {
76
+ stampignorePath,
77
+ targetDir,
78
+ message: err.message,
79
+ code: err.code,
80
+ });
81
+ let userMessage;
82
+ switch (err.code) {
83
+ case 'ENOENT':
84
+ userMessage = `Parent directory not found for: "${stampignorePath}"`;
85
+ break;
86
+ case 'EACCES':
87
+ userMessage = `Permission denied writing to: "${stampignorePath}"`;
88
+ break;
89
+ case 'ENOSPC':
90
+ userMessage = `No space left on device. Cannot write: "${stampignorePath}"`;
91
+ break;
92
+ default:
93
+ userMessage = `Failed to write .stampignore file "${stampignorePath}": ${err.message}`;
94
+ }
95
+ throw new Error(userMessage);
96
+ }
97
+ }
98
+ /**
99
+ * Add paths to .stampignore
100
+ * Creates the file if it doesn't exist
101
+ */
102
+ export async function addToStampignore(targetDir, pathsToAdd) {
103
+ const exists = await stampignoreExists(targetDir);
104
+ const config = await readStampignore(targetDir);
105
+ const currentIgnore = config?.ignore || [];
106
+ const normalizedCurrent = currentIgnore.map(p => normalizeEntryId(p));
107
+ // Normalize paths to add and filter out duplicates
108
+ const normalizedToAdd = pathsToAdd
109
+ .map(p => normalizeEntryId(p))
110
+ .filter(p => !normalizedCurrent.includes(p));
111
+ if (normalizedToAdd.length === 0) {
112
+ return { added: false, created: false };
113
+ }
114
+ const newConfig = {
115
+ ignore: [...currentIgnore, ...normalizedToAdd],
116
+ };
117
+ await writeStampignore(targetDir, newConfig);
118
+ return { added: true, created: !exists };
119
+ }
120
+ /**
121
+ * Check if a file path matches any ignore pattern
122
+ * Supports glob patterns and exact paths
123
+ */
124
+ export function matchesIgnorePattern(filePath, patterns, projectRoot) {
125
+ const normalizedPath = normalizeEntryId(filePath);
126
+ const normalizedRoot = normalizeEntryId(projectRoot);
127
+ // Make path relative to project root for matching
128
+ let relativePath = normalizedPath;
129
+ if (normalizedPath.startsWith(normalizedRoot)) {
130
+ relativePath = normalizedPath.slice(normalizedRoot.length).replace(/^\//, '');
131
+ }
132
+ for (const pattern of patterns) {
133
+ const normalizedPattern = normalizeEntryId(pattern);
134
+ // Exact match
135
+ if (normalizedPattern === relativePath || normalizedPattern === normalizedPath) {
136
+ return true;
137
+ }
138
+ // Glob pattern matching (simple implementation)
139
+ // Convert glob to regex
140
+ const regexPattern = normalizedPattern
141
+ .replace(/\./g, '\\.')
142
+ .replace(/\*\*/g, '.*')
143
+ .replace(/\*/g, '[^/]*')
144
+ .replace(/\?/g, '.');
145
+ const regex = new RegExp(`^${regexPattern}$`);
146
+ // Check against relative path
147
+ if (regex.test(relativePath)) {
148
+ return true;
149
+ }
150
+ // Also check against full normalized path
151
+ if (regex.test(normalizedPath)) {
152
+ return true;
153
+ }
154
+ }
155
+ return false;
156
+ }
157
+ /**
158
+ * Filter files based on .stampignore patterns
159
+ */
160
+ export function filterIgnoredFiles(files, patterns, projectRoot) {
161
+ if (patterns.length === 0) {
162
+ return files;
163
+ }
164
+ return files.filter(file => !matchesIgnorePattern(file, patterns, projectRoot));
165
+ }
166
+ /**
167
+ * Delete .stampignore file
168
+ */
169
+ export async function deleteStampignore(targetDir) {
170
+ const stampignorePath = join(targetDir, STAMPIGNORE_FILENAME);
171
+ try {
172
+ await unlink(stampignorePath);
173
+ return true;
174
+ }
175
+ catch (error) {
176
+ const err = error;
177
+ if (err.code === 'ENOENT') {
178
+ // File doesn't exist - that's fine, return false
179
+ return false;
180
+ }
181
+ debugError('stampignore', 'deleteStampignore', {
182
+ stampignorePath,
183
+ message: err.message,
184
+ code: err.code,
185
+ });
186
+ throw new Error(`Failed to delete .stampignore: ${err.message}`);
187
+ }
188
+ }
189
+ //# sourceMappingURL=stampignore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stampignore.js","sourceRoot":"","sources":["../../src/utils/stampignore.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "logicstamp-context",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
4
4
  "description": "Generate AI-friendly context bundles from React codebases with LogicStamp contracts",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -117,7 +117,7 @@
117
117
  "source": {
118
118
  "type": "string",
119
119
  "pattern": "^logicstamp-context@\\d+\\.\\d+\\.\\d+$",
120
- "description": "Generator identifier with version (e.g., 'logicstamp-context@0.2.5'). Used for compatibility tracking and debugging."
120
+ "description": "Generator identifier with version (e.g., 'logicstamp-context@0.2.7'). Used for compatibility tracking and debugging."
121
121
  }
122
122
  },
123
123
  "additionalProperties": false
@@ -199,6 +199,31 @@
199
199
  "$ref": "#/definitions/StyleMetadata",
200
200
  "description": "Optional style metadata (only when --include-style is used)"
201
201
  },
202
+ "exports": {
203
+ "oneOf": [
204
+ {
205
+ "type": "string",
206
+ "enum": ["default", "named"],
207
+ "description": "Export type: 'default' for default export, 'named' for single named export"
208
+ },
209
+ {
210
+ "type": "object",
211
+ "required": ["named"],
212
+ "properties": {
213
+ "named": {
214
+ "type": "array",
215
+ "items": {
216
+ "type": "string"
217
+ },
218
+ "description": "Array of named export names (for multiple named exports)"
219
+ }
220
+ },
221
+ "additionalProperties": false,
222
+ "description": "Multiple named exports with explicit list"
223
+ }
224
+ ],
225
+ "description": "Optional export metadata: export type and exported names"
226
+ },
202
227
  "semanticHash": {
203
228
  "type": "string",
204
229
  "pattern": "^uif:[a-f0-9]{24}$",