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.
- package/README.md +64 -142
- package/dist/__tests__/changed.test.d.ts +2 -0
- package/dist/__tests__/changed.test.d.ts.map +1 -0
- package/dist/__tests__/changed.test.js +98 -0
- package/dist/__tests__/changed.test.js.map +1 -0
- package/dist/__tests__/cli.test.js +34 -142
- package/dist/__tests__/cli.test.js.map +1 -1
- package/dist/__tests__/create.test.d.ts +2 -0
- package/dist/__tests__/create.test.d.ts.map +1 -0
- package/dist/__tests__/create.test.js +122 -0
- package/dist/__tests__/create.test.js.map +1 -0
- package/dist/__tests__/generate.test.d.ts +2 -0
- package/dist/__tests__/generate.test.d.ts.map +1 -0
- package/dist/__tests__/generate.test.js +113 -0
- package/dist/__tests__/generate.test.js.map +1 -0
- package/dist/__tests__/generator.test.js +26 -22
- package/dist/__tests__/generator.test.js.map +1 -1
- package/dist/__tests__/path-utils.test.d.ts +2 -0
- package/dist/__tests__/path-utils.test.d.ts.map +1 -0
- package/dist/__tests__/path-utils.test.js +49 -0
- package/dist/__tests__/path-utils.test.js.map +1 -0
- package/dist/__tests__/template.test.d.ts +2 -0
- package/dist/__tests__/template.test.d.ts.map +1 -0
- package/dist/__tests__/template.test.js +95 -0
- package/dist/__tests__/template.test.js.map +1 -0
- package/dist/changed.d.ts +25 -0
- package/dist/changed.d.ts.map +1 -0
- package/dist/changed.js +210 -0
- package/dist/changed.js.map +1 -0
- package/dist/cli.js +89 -72
- package/dist/cli.js.map +1 -1
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +118 -15
- package/dist/constants.js.map +1 -1
- package/dist/create.d.ts +12 -0
- package/dist/create.d.ts.map +1 -0
- package/dist/create.js +93 -0
- package/dist/create.js.map +1 -0
- package/dist/docspec-changed.d.ts +25 -0
- package/dist/docspec-changed.d.ts.map +1 -0
- package/dist/docspec-changed.js +210 -0
- package/dist/docspec-changed.js.map +1 -0
- package/dist/docspec-generate.d.ts +22 -0
- package/dist/docspec-generate.d.ts.map +1 -0
- package/dist/docspec-generate.js +171 -0
- package/dist/docspec-generate.js.map +1 -0
- package/dist/format-parser.d.ts +2 -1
- package/dist/format-parser.d.ts.map +1 -1
- package/dist/format-parser.js +45 -15
- package/dist/format-parser.js.map +1 -1
- package/dist/generate.d.ts +26 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +175 -0
- package/dist/generate.js.map +1 -0
- package/dist/generator.d.ts +4 -3
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js +35 -12
- package/dist/generator.js.map +1 -1
- package/dist/index.d.ts +8 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -7
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +40 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +74 -0
- package/dist/logger.js.map +1 -0
- package/dist/path-utils.d.ts +17 -0
- package/dist/path-utils.d.ts.map +1 -0
- package/dist/path-utils.js +76 -0
- package/dist/path-utils.js.map +1 -0
- package/dist/template.d.ts +20 -0
- package/dist/template.d.ts.map +1 -0
- package/dist/template.js +151 -0
- package/dist/template.js.map +1 -0
- package/dist/validator.d.ts.map +1 -1
- package/dist/validator.js +34 -1
- package/dist/validator.js.map +1 -1
- package/package.json +1 -1
- 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"}
|
package/dist/template.js
ADDED
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,0CAGC;AA+GD,8CAKC;AAzID,uCAAyB;AACzB,2CAA6B;AAc7B;;GAEG;AACH,SAAgB,eAAe,CAAC,cAAsB;IACpD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IACzD,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,4CAA4C;IAC5C,IAAI,iBAAqC,CAAC;IAC1C,IAAI,sBAAsB,GAAG,CAAC,CAAC,CAAC;IAChC,IAAI,oBAAoB,GAAG,CAAC,CAAC,CAAC;IAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,uBAAuB,EAAE,CAAC;YAChD,sBAAsB,GAAG,CAAC,CAAC;YAC3B,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,sBAAsB,IAAI,CAAC,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,sBAAsB,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/D,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACpC,IAAI,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChC,oBAAoB,GAAG,CAAC,CAAC;gBACzB,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,oBAAoB,GAAG,CAAC;YAAE,oBAAoB,GAAG,KAAK,CAAC,MAAM,CAAC;QAClE,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,sBAAsB,GAAG,CAAC,EAAE,oBAAoB,CAAC,CAAC;QACjF,IAAI,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,YAAY,GAAG,YAAY;aACxB,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC;aACvC,IAAI,CAAC,IAAI,CAAC;aACV,IAAI,EAAE,CAAC;QACV,IAAI,YAAY;YAAE,iBAAiB,GAAG,YAAY,CAAC;IACrD,CAAC;IAED,+CAA+C;IAC/C,MAAM,kBAAkB,GAAG,uBAAuB,CAAC;IACnD,MAAM,cAAc,GAA+D,EAAE,CAAC;IAEtF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,uBAAuB;YAAE,SAAS;QAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACjD,IAAI,KAAK,EAAE,CAAC;YACV,cAAc,CAAC,IAAI,CAAC;gBAClB,SAAS,EAAE,CAAC;gBACZ,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC9B,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,gBAAgB,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrD,MAAM,sBAAsB,GAC1B,sBAAsB,IAAI,CAAC,IAAI,sBAAsB,GAAG,gBAAgB;QACtE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;QAC1D,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,MAAM,QAAQ,GAAG,sBAAsB,GAAG,8CAA8C,CAAC;IAEzF,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,cAAc,GAClB,CAAC,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QACjF,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,EAAE,cAAc,CAAC,CAAC;QACvE,IAAI,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,cAAc,GAAG,cAAc;aAC5B,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC;aACvC,IAAI,CAAC,IAAI,CAAC;aACV,IAAI,EAAE,CAAC;QACV,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,WAAW,EAAE,cAAc;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;IACL,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAE7C,OAAO;QACL,QAAQ;QACR,QAAQ;QACR,iBAAiB;KAClB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB;IAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,mBAAmB,CAAC,CAAC;IACpE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,iCAAiC,WAAW,IAAI;YAC9C,kGAAkG,CACrG,CAAC;IACJ,CAAC;IACD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACvC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB;IAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC7C,OAAO,qBAAqB,EAAE,CAAC;AACjC,CAAC"}
|
package/dist/validator.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAkB,MAAM,SAAS,CAAC;
|
|
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:
|
|
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
|
/**
|
package/dist/validator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,0CAmEC;AA5ED,gDAAkC;AAElC,2CAAqE;AACrE,qCAAkC;AAElC;;;GAGG;AACI,KAAK,UAAU,eAAe,CAAC,QAAgB;IACpD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,eAAM,CAAC,KAAK,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;IAE1C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,eAAM,CAAC,KAAK,CAAC,2BAA2B,OAAO,CAAC,MAAM,aAAa,CAAC,CAAC;QAErE,eAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QACxC,eAAM,CAAC,KAAK,CAAC,SAAS,QAAQ,CAAC,MAAM,aAAa,CAAC,CAAC;QAEpD,kCAAkC;QAClC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;QAExC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAChC,eAAM,CAAC,KAAK,CAAC,mBAAmB,OAAO,CAAC,IAAI,WAAW,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC;QAChF,CAAC;QAED,eAAM,CAAC,KAAK,CAAC,gBAAgB,6BAAiB,CAAC,MAAM,sBAAsB,CAAC,CAAC;QAC7E,6BAA6B;QAC7B,KAAK,MAAM,eAAe,IAAI,6BAAiB,EAAE,CAAC;YAChD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;gBACxC,eAAM,CAAC,KAAK,CAAC,8BAA8B,eAAe,GAAG,CAAC,CAAC;gBAC/D,MAAM,CAAC,IAAI,CAAC,8BAA8B,eAAe,GAAG,CAAC,CAAC;YAChE,CAAC;iBAAM,CAAC;gBACN,eAAM,CAAC,KAAK,CAAC,8BAA8B,eAAe,GAAG,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,eAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC3C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,6BAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAW,CAAC,EAAE,CAAC;gBACpD,eAAM,CAAC,KAAK,CAAC,oCAAoC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;gBAClE,MAAM,eAAe,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;gBACxD,IAAI,eAAe,EAAE,CAAC;oBACpB,eAAM,CAAC,KAAK,CAAC,yBAAyB,OAAO,CAAC,IAAI,MAAM,eAAe,EAAE,CAAC,CAAC;oBAC3E,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBAC/B,CAAC;qBAAM,CAAC;oBACN,eAAM,CAAC,KAAK,CAAC,cAAc,OAAO,CAAC,IAAI,oBAAoB,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;QACpC,eAAM,CAAC,KAAK,CAAC,cAAc,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,WAAW,CAAC,CAAC;QAE3F,OAAO;YACL,KAAK,EAAE,OAAO;YACd,MAAM;SACP,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,KAAK,CAAC,uBAAuB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9F,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,CAAC,wBAAwB,KAAK,CAAC,OAAO,EAAE,CAAC;aAClD,CAAC;QACJ,CAAC;QACD,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,CAAC,wBAAwB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;SAClD,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,OAAe;IACpC,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,eAAM,CAAC,KAAK,CAAC,WAAW,KAAK,CAAC,MAAM,qBAAqB,CAAC,CAAC;IAE3D,IAAI,cAAc,GAA0B,IAAI,CAAC;IACjD,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAEhC,wCAAwC;QACxC,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACxD,IAAI,WAAW,EAAE,CAAC;YAChB,kCAAkC;YAClC,IAAI,cAAc,EAAE,CAAC;gBACnB,eAAM,CAAC,KAAK,CAAC,oBAAoB,cAAc,CAAC,IAAI,UAAU,cAAc,CAAC,OAAO,CAAC,MAAM,aAAa,CAAC,CAAC;gBAC1G,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAChC,CAAC;YAED,0DAA0D;YAC1D,IAAI,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAExC,sDAAsD;YACtD,IAAI,WAAW,KAAK,oBAAoB,EAAE,CAAC;gBACzC,eAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBACpD,cAAc,GAAG,IAAI,CAAC;gBACtB,SAAS;YACX,CAAC;YAED,qEAAqE;YACrE,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAEnD,eAAM,CAAC,KAAK,CAAC,0BAA0B,WAAW,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACxE,cAAc,GAAG;gBACf,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,EAAE;gBACX,UAAU,EAAE,CAAC,GAAG,CAAC;aAClB,CAAC;QACJ,CAAC;aAAM,IAAI,cAAc,EAAE,CAAC;YAC1B,yCAAyC;YACzC,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;gBAC3B,cAAc,CAAC,OAAO,IAAI,IAAI,CAAC;YACjC,CAAC;YACD,cAAc,CAAC,OAAO,IAAI,IAAI,CAAC;QACjC,CAAC;QAED,UAAU,EAAE,CAAC;IACf,CAAC;IAED,uBAAuB;IACvB,IAAI,cAAc,EAAE,CAAC;QACnB,eAAM,CAAC,KAAK,CAAC,0BAA0B,cAAc,CAAC,IAAI,UAAU,cAAc,CAAC,OAAO,CAAC,MAAM,aAAa,CAAC,CAAC;QAChH,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,OAAuB;IACrD,MAAM,WAAW,GAAG,+BAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,eAAM,CAAC,KAAK,CAAC,qCAAqC,OAAO,CAAC,IAAI,gCAAgC,CAAC,CAAC;QAChG,OAAO,IAAI,CAAC,CAAC,0CAA0C;IACzD,CAAC;IAED,eAAM,CAAC,KAAK,CAAC,2BAA2B,OAAO,CAAC,IAAI,0BAA0B,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IAErG,uDAAuD;IACvD,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO;SAC1B,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC;SACrC,IAAI,CAAC,IAAI,CAAC;SACV,IAAI,EAAE,CAAC;IACV,MAAM,kBAAkB,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IAE9C,eAAM,CAAC,KAAK,CAAC,2BAA2B,OAAO,CAAC,MAAM,aAAa,CAAC,CAAC;IAErE,4BAA4B;IAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,eAAM,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,IAAI,YAAY,CAAC,CAAC;QACnD,OAAO,YAAY,OAAO,CAAC,IAAI,WAAW,OAAO,CAAC,UAAU,YAAY,CAAC;IAC3E,CAAC;IAED,+CAA+C;IAC/C,IAAI,OAAO,KAAK,kBAAkB,EAAE,CAAC;QACnC,eAAM,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,IAAI,+BAA+B,CAAC,CAAC;QACtE,OAAO,YAAY,OAAO,CAAC,IAAI,WAAW,OAAO,CAAC,UAAU,8DAA8D,CAAC;IAC7H,CAAC;IAED,+EAA+E;IAC/E,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,qBAAqB,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;IAEtE,IAAI,iBAAiB,KAAK,qBAAqB,EAAE,CAAC;QAChD,eAAM,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,IAAI,+DAA+D,CAAC,CAAC;QACtG,OAAO,YAAY,OAAO,CAAC,IAAI,WAAW,OAAO,CAAC,UAAU,+DAA+D,CAAC;IAC9H,CAAC;IAED,gEAAgE;IAChE,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACxB,eAAM,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,IAAI,mBAAmB,OAAO,CAAC,MAAM,mBAAmB,CAAC,CAAC;QAC3F,OAAO,YAAY,OAAO,CAAC,IAAI,WAAW,OAAO,CAAC,UAAU,wCAAwC,CAAC;IACvG,CAAC;IAED,eAAM,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,IAAI,6BAA6B,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAAY;IACvC,OAAO,IAAI;SACR,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;SACrB,IAAI,EAAE,CAAC;AACZ,CAAC"}
|
package/package.json
CHANGED