docspec 0.2.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 (80) hide show
  1. package/README.md +64 -142
  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 +34 -142
  7. package/dist/__tests__/cli.test.js.map +1 -1
  8. package/dist/__tests__/create.test.d.ts +2 -0
  9. package/dist/__tests__/create.test.d.ts.map +1 -0
  10. package/dist/__tests__/create.test.js +122 -0
  11. package/dist/__tests__/create.test.js.map +1 -0
  12. package/dist/__tests__/generate.test.d.ts +2 -0
  13. package/dist/__tests__/generate.test.d.ts.map +1 -0
  14. package/dist/__tests__/generate.test.js +113 -0
  15. package/dist/__tests__/generate.test.js.map +1 -0
  16. package/dist/__tests__/generator.test.js +26 -22
  17. package/dist/__tests__/generator.test.js.map +1 -1
  18. package/dist/__tests__/path-utils.test.d.ts +2 -0
  19. package/dist/__tests__/path-utils.test.d.ts.map +1 -0
  20. package/dist/__tests__/path-utils.test.js +49 -0
  21. package/dist/__tests__/path-utils.test.js.map +1 -0
  22. package/dist/__tests__/template.test.d.ts +2 -0
  23. package/dist/__tests__/template.test.d.ts.map +1 -0
  24. package/dist/__tests__/template.test.js +95 -0
  25. package/dist/__tests__/template.test.js.map +1 -0
  26. package/dist/changed.d.ts +25 -0
  27. package/dist/changed.d.ts.map +1 -0
  28. package/dist/changed.js +210 -0
  29. package/dist/changed.js.map +1 -0
  30. package/dist/cli.js +89 -72
  31. package/dist/cli.js.map +1 -1
  32. package/dist/constants.d.ts +2 -0
  33. package/dist/constants.d.ts.map +1 -1
  34. package/dist/constants.js +118 -15
  35. package/dist/constants.js.map +1 -1
  36. package/dist/create.d.ts +12 -0
  37. package/dist/create.d.ts.map +1 -0
  38. package/dist/create.js +93 -0
  39. package/dist/create.js.map +1 -0
  40. package/dist/docspec-changed.d.ts +25 -0
  41. package/dist/docspec-changed.d.ts.map +1 -0
  42. package/dist/docspec-changed.js +210 -0
  43. package/dist/docspec-changed.js.map +1 -0
  44. package/dist/docspec-generate.d.ts +22 -0
  45. package/dist/docspec-generate.d.ts.map +1 -0
  46. package/dist/docspec-generate.js +171 -0
  47. package/dist/docspec-generate.js.map +1 -0
  48. package/dist/format-parser.d.ts +2 -1
  49. package/dist/format-parser.d.ts.map +1 -1
  50. package/dist/format-parser.js +45 -15
  51. package/dist/format-parser.js.map +1 -1
  52. package/dist/generate.d.ts +26 -0
  53. package/dist/generate.d.ts.map +1 -0
  54. package/dist/generate.js +175 -0
  55. package/dist/generate.js.map +1 -0
  56. package/dist/generator.d.ts +4 -3
  57. package/dist/generator.d.ts.map +1 -1
  58. package/dist/generator.js +35 -12
  59. package/dist/generator.js.map +1 -1
  60. package/dist/index.d.ts +8 -4
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +16 -7
  63. package/dist/index.js.map +1 -1
  64. package/dist/logger.d.ts +40 -0
  65. package/dist/logger.d.ts.map +1 -0
  66. package/dist/logger.js +74 -0
  67. package/dist/logger.js.map +1 -0
  68. package/dist/path-utils.d.ts +17 -0
  69. package/dist/path-utils.d.ts.map +1 -0
  70. package/dist/path-utils.js +76 -0
  71. package/dist/path-utils.js.map +1 -0
  72. package/dist/template.d.ts +20 -0
  73. package/dist/template.d.ts.map +1 -0
  74. package/dist/template.js +151 -0
  75. package/dist/template.js.map +1 -0
  76. package/dist/validator.d.ts.map +1 -1
  77. package/dist/validator.js +34 -1
  78. package/dist/validator.js.map +1 -1
  79. package/package.json +1 -1
  80. package/README.docspec.md +0 -180
package/dist/logger.js ADDED
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ /**
3
+ * Simple logger utility with support for different log levels and verbose mode
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.logger = exports.LogLevel = void 0;
7
+ var LogLevel;
8
+ (function (LogLevel) {
9
+ LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
10
+ LogLevel[LogLevel["INFO"] = 1] = "INFO";
11
+ LogLevel[LogLevel["WARN"] = 2] = "WARN";
12
+ LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
13
+ })(LogLevel || (exports.LogLevel = LogLevel = {}));
14
+ class Logger {
15
+ constructor() {
16
+ this.verbose = false;
17
+ this.logLevel = LogLevel.INFO;
18
+ }
19
+ /**
20
+ * Enable or disable verbose mode
21
+ */
22
+ setVerbose(enabled) {
23
+ this.verbose = enabled;
24
+ if (enabled) {
25
+ this.logLevel = LogLevel.DEBUG;
26
+ }
27
+ else {
28
+ this.logLevel = LogLevel.INFO;
29
+ }
30
+ }
31
+ /**
32
+ * Log a debug message (only shown in verbose mode)
33
+ */
34
+ debug(message, ...args) {
35
+ if (this.logLevel <= LogLevel.DEBUG) {
36
+ console.debug(`[DEBUG] ${message}`, ...args);
37
+ }
38
+ }
39
+ /**
40
+ * Log an info message
41
+ */
42
+ info(message, ...args) {
43
+ if (this.logLevel <= LogLevel.INFO) {
44
+ console.log(message, ...args);
45
+ }
46
+ }
47
+ /**
48
+ * Log a warning message
49
+ */
50
+ warn(message, ...args) {
51
+ if (this.logLevel <= LogLevel.WARN) {
52
+ console.warn(`⚠️ ${message}`, ...args);
53
+ }
54
+ }
55
+ /**
56
+ * Log an error message
57
+ */
58
+ error(message, ...args) {
59
+ if (this.logLevel <= LogLevel.ERROR) {
60
+ console.error(`❌ ${message}`, ...args);
61
+ }
62
+ }
63
+ /**
64
+ * Log a success message
65
+ */
66
+ success(message, ...args) {
67
+ if (this.logLevel <= LogLevel.INFO) {
68
+ console.log(`✅ ${message}`, ...args);
69
+ }
70
+ }
71
+ }
72
+ // Export a singleton instance
73
+ exports.logger = new Logger();
74
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,yCAAS,CAAA;IACT,uCAAQ,CAAA;IACR,uCAAQ,CAAA;IACR,yCAAS,CAAA;AACX,CAAC,EALW,QAAQ,wBAAR,QAAQ,QAKnB;AAED,MAAM,MAAM;IAAZ;QACU,YAAO,GAAY,KAAK,CAAC;QACzB,aAAQ,GAAa,QAAQ,CAAC,IAAI,CAAC;IA0D7C,CAAC;IAxDC;;OAEG;IACH,UAAU,CAAC,OAAgB;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC;QAChC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW;QACnC,IAAI,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpC,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW;QAClC,IAAI,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW;QAClC,IAAI,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,OAAO,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW;QACnC,IAAI,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpC,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,OAAe,EAAE,GAAG,IAAW;QACrC,IAAI,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;CACF;AAED,8BAA8B;AACjB,QAAA,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Convert a markdown file path to its docspec path under .docspec/.
3
+ * e.g. README.md -> .docspec/README.docspec.md, docs/deploy.md -> .docspec/docs/deploy.docspec.md
4
+ * Absolute paths (e.g. /var/folders/.../file.md) are mapped to .docspec/<basename>.docspec.md
5
+ * so we never create .docspec/var/... under the repo.
6
+ */
7
+ export declare function markdownToDocspecPath(mdPath: string): string;
8
+ /**
9
+ * Convert a docspec file path (under .docspec/) to its target markdown path.
10
+ * e.g. .docspec/README.docspec.md -> README.md, .docspec/docs/deploy.docspec.md -> docs/deploy.md
11
+ */
12
+ export declare function docspecToMarkdownPath(docspecPath: string): string;
13
+ /**
14
+ * Check if a path is under .docspec/ and ends with .docspec.md
15
+ */
16
+ export declare function isDocspecPath(filePath: string): boolean;
17
+ //# sourceMappingURL=path-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-utils.d.ts","sourceRoot":"","sources":["../src/path-utils.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAK5D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CASjE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAKvD"}
@@ -0,0 +1,76 @@
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.markdownToDocspecPath = markdownToDocspecPath;
37
+ exports.docspecToMarkdownPath = docspecToMarkdownPath;
38
+ exports.isDocspecPath = isDocspecPath;
39
+ const path = __importStar(require("path"));
40
+ const DOCSPEC_DIR = ".docspec";
41
+ const DOCSPEC_EXT = ".docspec.md";
42
+ const MD_EXT = ".md";
43
+ /**
44
+ * Convert a markdown file path to its docspec path under .docspec/.
45
+ * e.g. README.md -> .docspec/README.docspec.md, docs/deploy.md -> .docspec/docs/deploy.docspec.md
46
+ * Absolute paths (e.g. /var/folders/.../file.md) are mapped to .docspec/<basename>.docspec.md
47
+ * so we never create .docspec/var/... under the repo.
48
+ */
49
+ function markdownToDocspecPath(mdPath) {
50
+ const normalized = path.normalize(mdPath).replace(/\\/g, "/");
51
+ const base = path.isAbsolute(normalized) ? path.basename(normalized) : normalized;
52
+ const withoutExt = base.endsWith(MD_EXT) ? base.slice(0, -MD_EXT.length) : base;
53
+ return path.join(DOCSPEC_DIR, withoutExt + DOCSPEC_EXT).replace(/\\/g, "/");
54
+ }
55
+ /**
56
+ * Convert a docspec file path (under .docspec/) to its target markdown path.
57
+ * e.g. .docspec/README.docspec.md -> README.md, .docspec/docs/deploy.docspec.md -> docs/deploy.md
58
+ */
59
+ function docspecToMarkdownPath(docspecPath) {
60
+ const normalized = path.normalize(docspecPath).replace(/\\/g, "/");
61
+ const withoutPrefix = normalized.startsWith(DOCSPEC_DIR + "/")
62
+ ? normalized.slice((DOCSPEC_DIR + "/").length)
63
+ : normalized;
64
+ if (!withoutPrefix.endsWith(DOCSPEC_EXT)) {
65
+ return normalized; // not a docspec path, return as-is
66
+ }
67
+ return withoutPrefix.slice(0, -DOCSPEC_EXT.length) + MD_EXT;
68
+ }
69
+ /**
70
+ * Check if a path is under .docspec/ and ends with .docspec.md
71
+ */
72
+ function isDocspecPath(filePath) {
73
+ const normalized = path.normalize(filePath).replace(/\\/g, "/");
74
+ return (normalized.startsWith(DOCSPEC_DIR + "/") && normalized.endsWith(DOCSPEC_EXT));
75
+ }
76
+ //# sourceMappingURL=path-utils.js.map
@@ -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,17 +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();
106
128
  // Skip AGENT INSTRUCTIONS section - don't validate it
107
129
  if (sectionName === "AGENT INSTRUCTIONS") {
130
+ logger_1.logger.debug("Skipping AGENT INSTRUCTIONS section");
108
131
  currentSection = null;
109
132
  continue;
110
133
  }
111
134
  // Remove leading number and period (e.g., "1. Purpose" -> "Purpose")
112
135
  sectionName = sectionName.replace(/^\d+\.\s*/, "");
136
+ logger_1.logger.debug(`Found section header: "${sectionName}" at line ${i + 1}`);
113
137
  currentSection = {
114
138
  name: sectionName,
115
139
  content: "",
@@ -127,6 +151,7 @@ function parseSections(content) {
127
151
  }
128
152
  // Add the last section
129
153
  if (currentSection) {
154
+ logger_1.logger.debug(`Closing final section "${currentSection.name}" with ${currentSection.content.length} characters`);
130
155
  sections.push(currentSection);
131
156
  }
132
157
  return sections;
@@ -137,8 +162,10 @@ function parseSections(content) {
137
162
  function validateSectionContent(section) {
138
163
  const boilerplate = constants_1.SECTION_BOILERPLATE[section.name];
139
164
  if (!boilerplate) {
165
+ logger_1.logger.debug(`No boilerplate found for section "${section.name}", skipping content validation`);
140
166
  return null; // Not a required section, skip validation
141
167
  }
168
+ logger_1.logger.debug(`Validating content for "${section.name}" (boilerplate length: ${boilerplate.length})`);
142
169
  // Clean content: remove separator lines (---) and trim
143
170
  let content = section.content
144
171
  .split("\n")
@@ -146,24 +173,30 @@ function validateSectionContent(section) {
146
173
  .join("\n")
147
174
  .trim();
148
175
  const boilerplateTrimmed = boilerplate.trim();
176
+ logger_1.logger.debug(`Section content length: ${content.length} characters`);
149
177
  // Check if content is empty
150
178
  if (!content) {
179
+ logger_1.logger.debug(`Section "${section.name}" is empty`);
151
180
  return `Section "${section.name}" (line ${section.lineNumber}) is empty`;
152
181
  }
153
182
  // Check if content matches boilerplate exactly
154
183
  if (content === boilerplateTrimmed) {
184
+ logger_1.logger.debug(`Section "${section.name}" matches boilerplate exactly`);
155
185
  return `Section "${section.name}" (line ${section.lineNumber}) contains only boilerplate text and has not been customized`;
156
186
  }
157
187
  // Check if content is too similar to boilerplate (only whitespace differences)
158
188
  const normalizedContent = normalizeWhitespace(content);
159
189
  const normalizedBoilerplate = normalizeWhitespace(boilerplateTrimmed);
160
190
  if (normalizedContent === normalizedBoilerplate) {
191
+ logger_1.logger.debug(`Section "${section.name}" is too similar to boilerplate (only whitespace differences)`);
161
192
  return `Section "${section.name}" (line ${section.lineNumber}) is too similar to boilerplate (only whitespace differences)`;
162
193
  }
163
194
  // Check if content is just a subset of boilerplate (very short)
164
195
  if (content.length < 50) {
196
+ logger_1.logger.debug(`Section "${section.name}" is too short (${content.length} < 50 characters)`);
165
197
  return `Section "${section.name}" (line ${section.lineNumber}) appears to be incomplete (too short)`;
166
198
  }
199
+ logger_1.logger.debug(`Section "${section.name}" content validation passed`);
167
200
  return null;
168
201
  }
169
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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "docspec",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
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",