docspec 0.3.0 → 0.4.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 (48) hide show
  1. package/dist/__tests__/cli.test.js +14 -3
  2. package/dist/__tests__/cli.test.js.map +1 -1
  3. package/dist/__tests__/generate.test.js +39 -0
  4. package/dist/__tests__/generate.test.js.map +1 -1
  5. package/dist/changed.d.ts.map +1 -1
  6. package/dist/changed.js +1 -2
  7. package/dist/changed.js.map +1 -1
  8. package/dist/cli.js +1 -1
  9. package/dist/create.d.ts +3 -1
  10. package/dist/create.d.ts.map +1 -1
  11. package/dist/create.js +10 -6
  12. package/dist/create.js.map +1 -1
  13. package/dist/generate.d.ts.map +1 -1
  14. package/dist/generate.js +4 -3
  15. package/dist/generate.js.map +1 -1
  16. package/package.json +1 -1
  17. package/dist/__tests__/generator.test.d.ts +0 -2
  18. package/dist/__tests__/generator.test.d.ts.map +0 -1
  19. package/dist/__tests__/generator.test.js +0 -122
  20. package/dist/__tests__/generator.test.js.map +0 -1
  21. package/dist/__tests__/validator.test.d.ts +0 -2
  22. package/dist/__tests__/validator.test.d.ts.map +0 -1
  23. package/dist/__tests__/validator.test.js +0 -331
  24. package/dist/__tests__/validator.test.js.map +0 -1
  25. package/dist/docspec-changed.d.ts +0 -25
  26. package/dist/docspec-changed.d.ts.map +0 -1
  27. package/dist/docspec-changed.js +0 -210
  28. package/dist/docspec-changed.js.map +0 -1
  29. package/dist/docspec-generate.d.ts +0 -22
  30. package/dist/docspec-generate.d.ts.map +0 -1
  31. package/dist/docspec-generate.js +0 -171
  32. package/dist/docspec-generate.js.map +0 -1
  33. package/dist/format-parser.d.ts +0 -24
  34. package/dist/format-parser.d.ts.map +0 -1
  35. package/dist/format-parser.js +0 -205
  36. package/dist/format-parser.js.map +0 -1
  37. package/dist/generator.d.ts +0 -12
  38. package/dist/generator.d.ts.map +0 -1
  39. package/dist/generator.js +0 -89
  40. package/dist/generator.js.map +0 -1
  41. package/dist/types.d.ts +0 -16
  42. package/dist/types.d.ts.map +0 -1
  43. package/dist/types.js +0 -3
  44. package/dist/types.js.map +0 -1
  45. package/dist/validator.d.ts +0 -7
  46. package/dist/validator.d.ts.map +0 -1
  47. package/dist/validator.js +0 -211
  48. package/dist/validator.js.map +0 -1
package/dist/validator.js DELETED
@@ -1,211 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.validateDocspec = validateDocspec;
37
- const fs = __importStar(require("fs/promises"));
38
- const constants_1 = require("./constants");
39
- const logger_1 = require("./logger");
40
- /**
41
- * Validate a docspec file
42
- * @param filePath Path to the docspec file to validate
43
- */
44
- async function validateDocspec(filePath) {
45
- const errors = [];
46
- logger_1.logger.debug(`Reading file: ${filePath}`);
47
- try {
48
- const content = await fs.readFile(filePath, "utf-8");
49
- logger_1.logger.debug(`File read successfully, ${content.length} characters`);
50
- logger_1.logger.debug("Parsing sections from content");
51
- const sections = parseSections(content);
52
- logger_1.logger.debug(`Found ${sections.length} section(s)`);
53
- // Check for all required sections
54
- const foundSections = new Set();
55
- for (const section of sections) {
56
- foundSections.add(section.name);
57
- logger_1.logger.debug(`Found section: "${section.name}" (line ${section.lineNumber})`);
58
- }
59
- logger_1.logger.debug(`Checking for ${constants_1.REQUIRED_SECTIONS.length} required section(s)`);
60
- // Check for missing sections
61
- for (const requiredSection of constants_1.REQUIRED_SECTIONS) {
62
- if (!foundSections.has(requiredSection)) {
63
- logger_1.logger.debug(`Missing required section: "${requiredSection}"`);
64
- errors.push(`Missing required section: "${requiredSection}"`);
65
- }
66
- else {
67
- logger_1.logger.debug(`✓ Required section found: "${requiredSection}"`);
68
- }
69
- }
70
- // Validate each section's content
71
- logger_1.logger.debug("Validating section content");
72
- for (const section of sections) {
73
- if (constants_1.REQUIRED_SECTIONS.includes(section.name)) {
74
- logger_1.logger.debug(`Validating content for section: "${section.name}"`);
75
- const validationError = validateSectionContent(section);
76
- if (validationError) {
77
- logger_1.logger.debug(`Validation error for "${section.name}": ${validationError}`);
78
- errors.push(validationError);
79
- }
80
- else {
81
- logger_1.logger.debug(`✓ Section "${section.name}" content is valid`);
82
- }
83
- }
84
- }
85
- const isValid = errors.length === 0;
86
- logger_1.logger.debug(`Validation ${isValid ? "passed" : "failed"} with ${errors.length} error(s)`);
87
- return {
88
- valid: isValid,
89
- errors,
90
- };
91
- }
92
- catch (error) {
93
- logger_1.logger.debug(`Error reading file: ${error instanceof Error ? error.message : String(error)}`);
94
- if (error instanceof Error) {
95
- return {
96
- valid: false,
97
- errors: [`Failed to read file: ${error.message}`],
98
- };
99
- }
100
- return {
101
- valid: false,
102
- errors: [`Failed to read file: ${String(error)}`],
103
- };
104
- }
105
- }
106
- /**
107
- * Parse markdown content into sections
108
- */
109
- function parseSections(content) {
110
- const sections = [];
111
- const lines = content.split("\n");
112
- logger_1.logger.debug(`Parsing ${lines.length} lines for sections`);
113
- let currentSection = null;
114
- let lineNumber = 1;
115
- for (let i = 0; i < lines.length; i++) {
116
- const line = lines[i];
117
- const trimmedLine = line.trim();
118
- // Check for section headers (## or ###)
119
- const headerMatch = trimmedLine.match(/^#{2,}\s+(.+)$/);
120
- if (headerMatch) {
121
- // Save previous section if exists
122
- if (currentSection) {
123
- logger_1.logger.debug(`Closing section "${currentSection.name}" with ${currentSection.content.length} characters`);
124
- sections.push(currentSection);
125
- }
126
- // Extract section name (remove section number if present)
127
- let sectionName = headerMatch[1].trim();
128
- // Skip AGENT INSTRUCTIONS section - don't validate it
129
- if (sectionName === "AGENT INSTRUCTIONS") {
130
- logger_1.logger.debug("Skipping AGENT INSTRUCTIONS section");
131
- currentSection = null;
132
- continue;
133
- }
134
- // Remove leading number and period (e.g., "1. Purpose" -> "Purpose")
135
- sectionName = sectionName.replace(/^\d+\.\s*/, "");
136
- logger_1.logger.debug(`Found section header: "${sectionName}" at line ${i + 1}`);
137
- currentSection = {
138
- name: sectionName,
139
- content: "",
140
- lineNumber: i + 1,
141
- };
142
- }
143
- else if (currentSection) {
144
- // Accumulate content for current section
145
- if (currentSection.content) {
146
- currentSection.content += "\n";
147
- }
148
- currentSection.content += line;
149
- }
150
- lineNumber++;
151
- }
152
- // Add the last section
153
- if (currentSection) {
154
- logger_1.logger.debug(`Closing final section "${currentSection.name}" with ${currentSection.content.length} characters`);
155
- sections.push(currentSection);
156
- }
157
- return sections;
158
- }
159
- /**
160
- * Validate that section content differs from boilerplate
161
- */
162
- function validateSectionContent(section) {
163
- const boilerplate = constants_1.SECTION_BOILERPLATE[section.name];
164
- if (!boilerplate) {
165
- logger_1.logger.debug(`No boilerplate found for section "${section.name}", skipping content validation`);
166
- return null; // Not a required section, skip validation
167
- }
168
- logger_1.logger.debug(`Validating content for "${section.name}" (boilerplate length: ${boilerplate.length})`);
169
- // Clean content: remove separator lines (---) and trim
170
- let content = section.content
171
- .split("\n")
172
- .filter(line => line.trim() !== "---")
173
- .join("\n")
174
- .trim();
175
- const boilerplateTrimmed = boilerplate.trim();
176
- logger_1.logger.debug(`Section content length: ${content.length} characters`);
177
- // Check if content is empty
178
- if (!content) {
179
- logger_1.logger.debug(`Section "${section.name}" is empty`);
180
- return `Section "${section.name}" (line ${section.lineNumber}) is empty`;
181
- }
182
- // Check if content matches boilerplate exactly
183
- if (content === boilerplateTrimmed) {
184
- logger_1.logger.debug(`Section "${section.name}" matches boilerplate exactly`);
185
- return `Section "${section.name}" (line ${section.lineNumber}) contains only boilerplate text and has not been customized`;
186
- }
187
- // Check if content is too similar to boilerplate (only whitespace differences)
188
- const normalizedContent = normalizeWhitespace(content);
189
- const normalizedBoilerplate = normalizeWhitespace(boilerplateTrimmed);
190
- if (normalizedContent === normalizedBoilerplate) {
191
- logger_1.logger.debug(`Section "${section.name}" is too similar to boilerplate (only whitespace differences)`);
192
- return `Section "${section.name}" (line ${section.lineNumber}) is too similar to boilerplate (only whitespace differences)`;
193
- }
194
- // Check if content is just a subset of boilerplate (very short)
195
- if (content.length < 50) {
196
- logger_1.logger.debug(`Section "${section.name}" is too short (${content.length} < 50 characters)`);
197
- return `Section "${section.name}" (line ${section.lineNumber}) appears to be incomplete (too short)`;
198
- }
199
- logger_1.logger.debug(`Section "${section.name}" content validation passed`);
200
- return null;
201
- }
202
- /**
203
- * Normalize whitespace for comparison
204
- */
205
- function normalizeWhitespace(text) {
206
- return text
207
- .replace(/\s+/g, " ")
208
- .replace(/\n+/g, "\n")
209
- .trim();
210
- }
211
- //# sourceMappingURL=validator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validator.js","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"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"}