docspec 0.1.0 → 0.3.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 (84) hide show
  1. package/README.md +69 -51
  2. package/dist/__tests__/changed.test.d.ts +2 -0
  3. package/dist/__tests__/changed.test.d.ts.map +1 -0
  4. package/dist/__tests__/changed.test.js +98 -0
  5. package/dist/__tests__/changed.test.js.map +1 -0
  6. package/dist/__tests__/cli.test.js +38 -158
  7. package/dist/__tests__/cli.test.js.map +1 -1
  8. package/dist/__tests__/constants.test.js +8 -18
  9. package/dist/__tests__/constants.test.js.map +1 -1
  10. package/dist/__tests__/create.test.d.ts +2 -0
  11. package/dist/__tests__/create.test.d.ts.map +1 -0
  12. package/dist/__tests__/create.test.js +122 -0
  13. package/dist/__tests__/create.test.js.map +1 -0
  14. package/dist/__tests__/generate.test.d.ts +2 -0
  15. package/dist/__tests__/generate.test.d.ts.map +1 -0
  16. package/dist/__tests__/generate.test.js +113 -0
  17. package/dist/__tests__/generate.test.js.map +1 -0
  18. package/dist/__tests__/generator.test.js +36 -32
  19. package/dist/__tests__/generator.test.js.map +1 -1
  20. package/dist/__tests__/path-utils.test.d.ts +2 -0
  21. package/dist/__tests__/path-utils.test.d.ts.map +1 -0
  22. package/dist/__tests__/path-utils.test.js +49 -0
  23. package/dist/__tests__/path-utils.test.js.map +1 -0
  24. package/dist/__tests__/template.test.d.ts +2 -0
  25. package/dist/__tests__/template.test.d.ts.map +1 -0
  26. package/dist/__tests__/template.test.js +95 -0
  27. package/dist/__tests__/template.test.js.map +1 -0
  28. package/dist/__tests__/validator.test.js +50 -94
  29. package/dist/__tests__/validator.test.js.map +1 -1
  30. package/dist/changed.d.ts +25 -0
  31. package/dist/changed.d.ts.map +1 -0
  32. package/dist/changed.js +210 -0
  33. package/dist/changed.js.map +1 -0
  34. package/dist/cli.js +89 -73
  35. package/dist/cli.js.map +1 -1
  36. package/dist/constants.d.ts +5 -2
  37. package/dist/constants.d.ts.map +1 -1
  38. package/dist/constants.js +155 -40
  39. package/dist/constants.js.map +1 -1
  40. package/dist/create.d.ts +12 -0
  41. package/dist/create.d.ts.map +1 -0
  42. package/dist/create.js +93 -0
  43. package/dist/create.js.map +1 -0
  44. package/dist/docspec-changed.d.ts +25 -0
  45. package/dist/docspec-changed.d.ts.map +1 -0
  46. package/dist/docspec-changed.js +210 -0
  47. package/dist/docspec-changed.js.map +1 -0
  48. package/dist/docspec-generate.d.ts +22 -0
  49. package/dist/docspec-generate.d.ts.map +1 -0
  50. package/dist/docspec-generate.js +171 -0
  51. package/dist/docspec-generate.js.map +1 -0
  52. package/dist/format-parser.d.ts +24 -0
  53. package/dist/format-parser.d.ts.map +1 -0
  54. package/dist/format-parser.js +205 -0
  55. package/dist/format-parser.js.map +1 -0
  56. package/dist/generate.d.ts +26 -0
  57. package/dist/generate.d.ts.map +1 -0
  58. package/dist/generate.js +175 -0
  59. package/dist/generate.js.map +1 -0
  60. package/dist/generator.d.ts +6 -6
  61. package/dist/generator.d.ts.map +1 -1
  62. package/dist/generator.js +38 -26
  63. package/dist/generator.js.map +1 -1
  64. package/dist/index.d.ts +8 -4
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +16 -7
  67. package/dist/index.js.map +1 -1
  68. package/dist/logger.d.ts +40 -0
  69. package/dist/logger.d.ts.map +1 -0
  70. package/dist/logger.js +74 -0
  71. package/dist/logger.js.map +1 -0
  72. package/dist/path-utils.d.ts +17 -0
  73. package/dist/path-utils.d.ts.map +1 -0
  74. package/dist/path-utils.js +76 -0
  75. package/dist/path-utils.js.map +1 -0
  76. package/dist/template.d.ts +20 -0
  77. package/dist/template.d.ts.map +1 -0
  78. package/dist/template.js +151 -0
  79. package/dist/template.js.map +1 -0
  80. package/dist/validator.d.ts.map +1 -1
  81. package/dist/validator.js +39 -1
  82. package/dist/validator.js.map +1 -1
  83. package/docspec-format.md +45 -0
  84. package/package.json +4 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../src/path-utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,sDAKC;AAMD,sDASC;AAKD,sCAKC;AA1CD,2CAA6B;AAE7B,MAAM,WAAW,GAAG,UAAU,CAAC;AAC/B,MAAM,WAAW,GAAG,aAAa,CAAC;AAClC,MAAM,MAAM,GAAG,KAAK,CAAC;AAErB;;;;;GAKG;AACH,SAAgB,qBAAqB,CAAC,MAAc;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAClF,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChF,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,WAAW,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC9E,CAAC;AAED;;;GAGG;AACH,SAAgB,qBAAqB,CAAC,WAAmB;IACvD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC,WAAW,GAAG,GAAG,CAAC;QAC5D,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;QAC9C,CAAC,CAAC,UAAU,CAAC;IACf,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACzC,OAAO,UAAU,CAAC,CAAC,mCAAmC;IACxD,CAAC;IACD,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,QAAgB;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAChE,OAAO,CACL,UAAU,CAAC,UAAU,CAAC,WAAW,GAAG,GAAG,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC7E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ interface ParsedSection {
2
+ name: string;
3
+ boilerplate: string;
4
+ number: number;
5
+ }
6
+ export interface ParsedFormat {
7
+ sections: ParsedSection[];
8
+ template: string;
9
+ agentInstructions?: string;
10
+ }
11
+ /**
12
+ * Parse the docspec template file (.docspec/docspec.md) into structure and sections.
13
+ */
14
+ export declare function parseFormatFile(formatFilePath: string): ParsedFormat;
15
+ /**
16
+ * Path to the template file (.docspec/docspec.md). Seeds from bundled default if missing.
17
+ */
18
+ export declare function getFormatFilePath(): string;
19
+ export {};
20
+ //# sourceMappingURL=template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"AAGA,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY,CAGpE;AA4GD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAK1C"}
@@ -0,0 +1,151 @@
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.parseFormatFile = parseFormatFile;
37
+ exports.getFormatFilePath = getFormatFilePath;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ /**
41
+ * Parse the docspec template file (.docspec/docspec.md) into structure and sections.
42
+ */
43
+ function parseFormatFile(formatFilePath) {
44
+ const content = fs.readFileSync(formatFilePath, "utf-8");
45
+ return parseFormatContent(content);
46
+ }
47
+ function parseFormatContent(content) {
48
+ const lines = content.split("\n");
49
+ // Look for AGENT INSTRUCTIONS section first
50
+ let agentInstructions;
51
+ let agentInstructionsStart = -1;
52
+ let agentInstructionsEnd = -1;
53
+ for (let i = 0; i < lines.length; i++) {
54
+ if (lines[i].trim() === "## AGENT INSTRUCTIONS") {
55
+ agentInstructionsStart = i;
56
+ break;
57
+ }
58
+ }
59
+ if (agentInstructionsStart >= 0) {
60
+ for (let i = agentInstructionsStart + 1; i < lines.length; i++) {
61
+ const trimmedLine = lines[i].trim();
62
+ if (trimmedLine.match(/^##\s+/)) {
63
+ agentInstructionsEnd = i;
64
+ break;
65
+ }
66
+ }
67
+ if (agentInstructionsEnd < 0)
68
+ agentInstructionsEnd = lines.length;
69
+ const agentLines = lines.slice(agentInstructionsStart + 1, agentInstructionsEnd);
70
+ let agentContent = agentLines.join("\n");
71
+ agentContent = agentContent
72
+ .split("\n")
73
+ .filter((line) => line.trim() !== "---")
74
+ .join("\n")
75
+ .trim();
76
+ if (agentContent)
77
+ agentInstructions = agentContent;
78
+ }
79
+ // Find all section headers: ## N. Section Name
80
+ const sectionHeaderRegex = /^##\s+(\d+)\.\s+(.+)$/;
81
+ const sectionHeaders = [];
82
+ for (let i = 0; i < lines.length; i++) {
83
+ if (lines[i].trim() === "## AGENT INSTRUCTIONS")
84
+ continue;
85
+ const match = lines[i].match(sectionHeaderRegex);
86
+ if (match) {
87
+ sectionHeaders.push({
88
+ lineIndex: i,
89
+ number: parseInt(match[1], 10),
90
+ name: match[2].trim(),
91
+ });
92
+ }
93
+ }
94
+ if (sectionHeaders.length === 0) {
95
+ throw new Error("No section headers found in template. Expected format: ## N. Section Name");
96
+ }
97
+ const firstSectionLine = sectionHeaders[0].lineIndex;
98
+ const templateBeforeSections = agentInstructionsStart >= 0 && agentInstructionsStart < firstSectionLine
99
+ ? lines.slice(0, agentInstructionsStart).join("\n").trim()
100
+ : lines.slice(0, firstSectionLine).join("\n").trim();
101
+ const template = templateBeforeSections + "\n\n{{AGENT_INSTRUCTIONS}}\n\n{{SECTIONS}}\n";
102
+ const sections = [];
103
+ for (let i = 0; i < sectionHeaders.length; i++) {
104
+ const header = sectionHeaders[i];
105
+ const nextHeaderLine = i < sectionHeaders.length - 1 ? sectionHeaders[i + 1].lineIndex : lines.length;
106
+ const sectionLines = lines.slice(header.lineIndex + 1, nextHeaderLine);
107
+ let sectionContent = sectionLines.join("\n");
108
+ sectionContent = sectionContent
109
+ .split("\n")
110
+ .filter((line) => line.trim() !== "---")
111
+ .join("\n")
112
+ .trim();
113
+ sections.push({
114
+ name: header.name,
115
+ boilerplate: sectionContent,
116
+ number: header.number,
117
+ });
118
+ }
119
+ sections.sort((a, b) => a.number - b.number);
120
+ return {
121
+ sections,
122
+ template,
123
+ agentInstructions,
124
+ };
125
+ }
126
+ /**
127
+ * Seed .docspec/docspec.md from the bundled docspec-format.md if it doesn't exist.
128
+ */
129
+ function seedDefaultFormatFile() {
130
+ const cwd = process.cwd();
131
+ const userPath = path.join(cwd, ".docspec", "docspec.md");
132
+ const defaultPath = path.join(__dirname, "..", "docspec-format.md");
133
+ if (!fs.existsSync(defaultPath)) {
134
+ throw new Error(`Default template not found at ${defaultPath}. ` +
135
+ `Create .docspec/docspec.md in your project or ensure the docspec package is installed correctly.`);
136
+ }
137
+ fs.mkdirSync(path.join(cwd, ".docspec"), { recursive: true });
138
+ fs.copyFileSync(defaultPath, userPath);
139
+ return userPath;
140
+ }
141
+ /**
142
+ * Path to the template file (.docspec/docspec.md). Seeds from bundled default if missing.
143
+ */
144
+ function getFormatFilePath() {
145
+ const cwd = process.cwd();
146
+ const userPath = path.join(cwd, ".docspec", "docspec.md");
147
+ if (fs.existsSync(userPath))
148
+ return userPath;
149
+ return seedDefaultFormatFile();
150
+ }
151
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAkB,MAAM,SAAS,CAAC;AAG3D;;;GAGG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+CjF"}
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAkB,MAAM,SAAS,CAAC;AAI3D;;;GAGG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAmEjF"}
package/dist/validator.js CHANGED
@@ -36,41 +36,61 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.validateDocspec = validateDocspec;
37
37
  const fs = __importStar(require("fs/promises"));
38
38
  const constants_1 = require("./constants");
39
+ const logger_1 = require("./logger");
39
40
  /**
40
41
  * Validate a docspec file
41
42
  * @param filePath Path to the docspec file to validate
42
43
  */
43
44
  async function validateDocspec(filePath) {
44
45
  const errors = [];
46
+ logger_1.logger.debug(`Reading file: ${filePath}`);
45
47
  try {
46
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");
47
51
  const sections = parseSections(content);
52
+ logger_1.logger.debug(`Found ${sections.length} section(s)`);
48
53
  // Check for all required sections
49
54
  const foundSections = new Set();
50
55
  for (const section of sections) {
51
56
  foundSections.add(section.name);
57
+ logger_1.logger.debug(`Found section: "${section.name}" (line ${section.lineNumber})`);
52
58
  }
59
+ logger_1.logger.debug(`Checking for ${constants_1.REQUIRED_SECTIONS.length} required section(s)`);
53
60
  // Check for missing sections
54
61
  for (const requiredSection of constants_1.REQUIRED_SECTIONS) {
55
62
  if (!foundSections.has(requiredSection)) {
63
+ logger_1.logger.debug(`Missing required section: "${requiredSection}"`);
56
64
  errors.push(`Missing required section: "${requiredSection}"`);
57
65
  }
66
+ else {
67
+ logger_1.logger.debug(`✓ Required section found: "${requiredSection}"`);
68
+ }
58
69
  }
59
70
  // Validate each section's content
71
+ logger_1.logger.debug("Validating section content");
60
72
  for (const section of sections) {
61
73
  if (constants_1.REQUIRED_SECTIONS.includes(section.name)) {
74
+ logger_1.logger.debug(`Validating content for section: "${section.name}"`);
62
75
  const validationError = validateSectionContent(section);
63
76
  if (validationError) {
77
+ logger_1.logger.debug(`Validation error for "${section.name}": ${validationError}`);
64
78
  errors.push(validationError);
65
79
  }
80
+ else {
81
+ logger_1.logger.debug(`✓ Section "${section.name}" content is valid`);
82
+ }
66
83
  }
67
84
  }
85
+ const isValid = errors.length === 0;
86
+ logger_1.logger.debug(`Validation ${isValid ? "passed" : "failed"} with ${errors.length} error(s)`);
68
87
  return {
69
- valid: errors.length === 0,
88
+ valid: isValid,
70
89
  errors,
71
90
  };
72
91
  }
73
92
  catch (error) {
93
+ logger_1.logger.debug(`Error reading file: ${error instanceof Error ? error.message : String(error)}`);
74
94
  if (error instanceof Error) {
75
95
  return {
76
96
  valid: false,
@@ -89,6 +109,7 @@ async function validateDocspec(filePath) {
89
109
  function parseSections(content) {
90
110
  const sections = [];
91
111
  const lines = content.split("\n");
112
+ logger_1.logger.debug(`Parsing ${lines.length} lines for sections`);
92
113
  let currentSection = null;
93
114
  let lineNumber = 1;
94
115
  for (let i = 0; i < lines.length; i++) {
@@ -99,12 +120,20 @@ function parseSections(content) {
99
120
  if (headerMatch) {
100
121
  // Save previous section if exists
101
122
  if (currentSection) {
123
+ logger_1.logger.debug(`Closing section "${currentSection.name}" with ${currentSection.content.length} characters`);
102
124
  sections.push(currentSection);
103
125
  }
104
126
  // Extract section name (remove section number if present)
105
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
+ }
106
134
  // Remove leading number and period (e.g., "1. Purpose" -> "Purpose")
107
135
  sectionName = sectionName.replace(/^\d+\.\s*/, "");
136
+ logger_1.logger.debug(`Found section header: "${sectionName}" at line ${i + 1}`);
108
137
  currentSection = {
109
138
  name: sectionName,
110
139
  content: "",
@@ -122,6 +151,7 @@ function parseSections(content) {
122
151
  }
123
152
  // Add the last section
124
153
  if (currentSection) {
154
+ logger_1.logger.debug(`Closing final section "${currentSection.name}" with ${currentSection.content.length} characters`);
125
155
  sections.push(currentSection);
126
156
  }
127
157
  return sections;
@@ -132,8 +162,10 @@ function parseSections(content) {
132
162
  function validateSectionContent(section) {
133
163
  const boilerplate = constants_1.SECTION_BOILERPLATE[section.name];
134
164
  if (!boilerplate) {
165
+ logger_1.logger.debug(`No boilerplate found for section "${section.name}", skipping content validation`);
135
166
  return null; // Not a required section, skip validation
136
167
  }
168
+ logger_1.logger.debug(`Validating content for "${section.name}" (boilerplate length: ${boilerplate.length})`);
137
169
  // Clean content: remove separator lines (---) and trim
138
170
  let content = section.content
139
171
  .split("\n")
@@ -141,24 +173,30 @@ function validateSectionContent(section) {
141
173
  .join("\n")
142
174
  .trim();
143
175
  const boilerplateTrimmed = boilerplate.trim();
176
+ logger_1.logger.debug(`Section content length: ${content.length} characters`);
144
177
  // Check if content is empty
145
178
  if (!content) {
179
+ logger_1.logger.debug(`Section "${section.name}" is empty`);
146
180
  return `Section "${section.name}" (line ${section.lineNumber}) is empty`;
147
181
  }
148
182
  // Check if content matches boilerplate exactly
149
183
  if (content === boilerplateTrimmed) {
184
+ logger_1.logger.debug(`Section "${section.name}" matches boilerplate exactly`);
150
185
  return `Section "${section.name}" (line ${section.lineNumber}) contains only boilerplate text and has not been customized`;
151
186
  }
152
187
  // Check if content is too similar to boilerplate (only whitespace differences)
153
188
  const normalizedContent = normalizeWhitespace(content);
154
189
  const normalizedBoilerplate = normalizeWhitespace(boilerplateTrimmed);
155
190
  if (normalizedContent === normalizedBoilerplate) {
191
+ logger_1.logger.debug(`Section "${section.name}" is too similar to boilerplate (only whitespace differences)`);
156
192
  return `Section "${section.name}" (line ${section.lineNumber}) is too similar to boilerplate (only whitespace differences)`;
157
193
  }
158
194
  // Check if content is just a subset of boilerplate (very short)
159
195
  if (content.length < 50) {
196
+ logger_1.logger.debug(`Section "${section.name}" is too short (${content.length} < 50 characters)`);
160
197
  return `Section "${section.name}" (line ${section.lineNumber}) appears to be incomplete (too short)`;
161
198
  }
199
+ logger_1.logger.debug(`Section "${section.name}" content validation passed`);
162
200
  return null;
163
201
  }
164
202
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"validator.js","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ # DOCSPEC: [{{TARGET_FILE}}](/{{TARGET_FILE}})
2
+
3
+ > A specification that defines how the target document should be maintained by agents.
4
+
5
+ ## AGENT INSTRUCTIONS
6
+
7
+ **Target document:** `{{TARGET_FILE}}`
8
+
9
+ **Your task:**
10
+
11
+ * Compare the target document against this docspec.
12
+ * Update the target document to satisfy this docspec.
13
+ * Make the smallest changes necessary.
14
+ * Preserve existing content that already complies.
15
+ * Do not invent content, sections, or facts not implied by this docspec or the repository.
16
+
17
+ ## 1. Document Purpose
18
+
19
+ What this document exists to explain or enable.
20
+ What questions it must reliably answer.
21
+ What kind of doc it is (overview, agent guide, spec, tutorial, etc.).
22
+
23
+ ## 2. Update Triggers
24
+
25
+ What kinds of changes should cause this document to be updated.
26
+ Describe in terms of detectable changes (structure, APIs, workflows, behavior).
27
+ Also note changes that **should not** trigger updates.
28
+
29
+ ## 3. Expected Structure
30
+
31
+ The sections this document should contain.
32
+ For each section: what it covers at a high level and any constraints
33
+ (e.g., "high-level only", "no exhaustive lists", "link out instead of duplicating").
34
+
35
+ ## 4. Editing Guidelines
36
+
37
+ How edits to this document should be made.
38
+ Local rules for tone, level of detail, and scope.
39
+ Explicit do/don't guidance to avoid drift, speculation, or redundancy.
40
+
41
+ ## 5. Intentional Omissions
42
+
43
+ What this document deliberately does not cover.
44
+ Where that information lives instead, if applicable.
45
+
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "docspec",
3
- "version": "0.1.0",
4
- "description": "Generate and validate docspec files (*.docspec.md) with standardized format",
3
+ "version": "0.3.0",
4
+ "description": "Docspec is a specification format and toolchain for documentation that is maintained by agents.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "bin": {
@@ -23,7 +23,8 @@
23
23
  "license": "MIT",
24
24
  "files": [
25
25
  "dist",
26
- "README.md"
26
+ "README.md",
27
+ "docspec-format.md"
27
28
  ],
28
29
  "devDependencies": {
29
30
  "@types/jest": "^30.0.0",