@applica-software-guru/sdd-core 0.1.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/dist/config/config-manager.d.ts +9 -0
- package/dist/config/config-manager.d.ts.map +1 -0
- package/dist/config/config-manager.js +44 -0
- package/dist/config/config-manager.js.map +1 -0
- package/dist/delta/delta-engine.d.ts +3 -0
- package/dist/delta/delta-engine.d.ts.map +1 -0
- package/dist/delta/delta-engine.js +18 -0
- package/dist/delta/delta-engine.js.map +1 -0
- package/dist/delta/hasher.d.ts +2 -0
- package/dist/delta/hasher.d.ts.map +1 -0
- package/dist/delta/hasher.js +8 -0
- package/dist/delta/hasher.js.map +1 -0
- package/dist/errors.d.ts +13 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +32 -0
- package/dist/errors.js.map +1 -0
- package/dist/git/git.d.ts +12 -0
- package/dist/git/git.d.ts.map +1 -0
- package/dist/git/git.js +125 -0
- package/dist/git/git.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/lock/lock-manager.d.ts +6 -0
- package/dist/lock/lock-manager.d.ts.map +1 -0
- package/dist/lock/lock-manager.js +39 -0
- package/dist/lock/lock-manager.js.map +1 -0
- package/dist/parser/cr-parser.d.ts +8 -0
- package/dist/parser/cr-parser.d.ts.map +1 -0
- package/dist/parser/cr-parser.js +45 -0
- package/dist/parser/cr-parser.js.map +1 -0
- package/dist/parser/frontmatter.d.ts +7 -0
- package/dist/parser/frontmatter.d.ts.map +1 -0
- package/dist/parser/frontmatter.js +25 -0
- package/dist/parser/frontmatter.js.map +1 -0
- package/dist/parser/ref-extractor.d.ts +2 -0
- package/dist/parser/ref-extractor.d.ts.map +1 -0
- package/dist/parser/ref-extractor.js +17 -0
- package/dist/parser/ref-extractor.js.map +1 -0
- package/dist/parser/section-extractor.d.ts +4 -0
- package/dist/parser/section-extractor.d.ts.map +1 -0
- package/dist/parser/section-extractor.js +37 -0
- package/dist/parser/section-extractor.js.map +1 -0
- package/dist/parser/story-parser.d.ts +5 -0
- package/dist/parser/story-parser.d.ts.map +1 -0
- package/dist/parser/story-parser.js +41 -0
- package/dist/parser/story-parser.js.map +1 -0
- package/dist/prompt/prompt-generator.d.ts +3 -0
- package/dist/prompt/prompt-generator.d.ts.map +1 -0
- package/dist/prompt/prompt-generator.js +40 -0
- package/dist/prompt/prompt-generator.js.map +1 -0
- package/dist/scaffold/init.d.ts +3 -0
- package/dist/scaffold/init.d.ts.map +1 -0
- package/dist/scaffold/init.js +64 -0
- package/dist/scaffold/init.js.map +1 -0
- package/dist/scaffold/templates.d.ts +6 -0
- package/dist/scaffold/templates.d.ts.map +1 -0
- package/dist/scaffold/templates.js +164 -0
- package/dist/scaffold/templates.js.map +1 -0
- package/dist/sdd.d.ts +20 -0
- package/dist/sdd.d.ts.map +1 -0
- package/dist/sdd.js +110 -0
- package/dist/sdd.js.map +1 -0
- package/dist/types.d.ts +65 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/validate/validator.d.ts +3 -0
- package/dist/validate/validator.d.ts.map +1 -0
- package/dist/validate/validator.js +44 -0
- package/dist/validate/validator.js.map +1 -0
- package/package.json +18 -0
- package/src/config/config-manager.ts +39 -0
- package/src/delta/delta-engine.ts +18 -0
- package/src/errors.ts +27 -0
- package/src/git/git.ts +113 -0
- package/src/index.ts +19 -0
- package/src/parser/cr-parser.ts +41 -0
- package/src/parser/frontmatter.ts +24 -0
- package/src/parser/ref-extractor.ts +14 -0
- package/src/parser/section-extractor.ts +38 -0
- package/src/parser/story-parser.ts +40 -0
- package/src/prompt/prompt-generator.ts +49 -0
- package/src/scaffold/init.ts +71 -0
- package/src/scaffold/templates.ts +166 -0
- package/src/sdd.ts +123 -0
- package/src/types.ts +76 -0
- package/src/validate/validator.ts +46 -0
- package/tests/cr.test.ts +172 -0
- package/tests/delta.test.ts +94 -0
- package/tests/integration.test.ts +132 -0
- package/tests/parser.test.ts +92 -0
- package/tests/prompt.test.ts +57 -0
- package/tests/validator.test.ts +54 -0
- package/tsconfig.json +8 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SDDConfig } from '../types.js';
|
|
2
|
+
export declare const SDD_DIR = ".sdd";
|
|
3
|
+
export declare const CONFIG_FILENAME = "config.yaml";
|
|
4
|
+
export declare function sddDirPath(root: string): string;
|
|
5
|
+
export declare function configFilePath(root: string): string;
|
|
6
|
+
export declare function isSDDProject(root: string): boolean;
|
|
7
|
+
export declare function readConfig(root: string): Promise<SDDConfig>;
|
|
8
|
+
export declare function writeConfig(root: string, config: SDDConfig): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=config-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/config/config-manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,eAAO,MAAM,OAAO,SAAS,CAAC;AAC9B,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAE7C,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAQjE;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhF"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CONFIG_FILENAME = exports.SDD_DIR = void 0;
|
|
7
|
+
exports.sddDirPath = sddDirPath;
|
|
8
|
+
exports.configFilePath = configFilePath;
|
|
9
|
+
exports.isSDDProject = isSDDProject;
|
|
10
|
+
exports.readConfig = readConfig;
|
|
11
|
+
exports.writeConfig = writeConfig;
|
|
12
|
+
const promises_1 = require("node:fs/promises");
|
|
13
|
+
const node_fs_1 = require("node:fs");
|
|
14
|
+
const node_path_1 = require("node:path");
|
|
15
|
+
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
16
|
+
exports.SDD_DIR = '.sdd';
|
|
17
|
+
exports.CONFIG_FILENAME = 'config.yaml';
|
|
18
|
+
function sddDirPath(root) {
|
|
19
|
+
return (0, node_path_1.resolve)(root, exports.SDD_DIR);
|
|
20
|
+
}
|
|
21
|
+
function configFilePath(root) {
|
|
22
|
+
return (0, node_path_1.resolve)(root, exports.SDD_DIR, exports.CONFIG_FILENAME);
|
|
23
|
+
}
|
|
24
|
+
function isSDDProject(root) {
|
|
25
|
+
return (0, node_fs_1.existsSync)(sddDirPath(root));
|
|
26
|
+
}
|
|
27
|
+
async function readConfig(root) {
|
|
28
|
+
const path = configFilePath(root);
|
|
29
|
+
if (!(0, node_fs_1.existsSync)(path)) {
|
|
30
|
+
return { description: '' };
|
|
31
|
+
}
|
|
32
|
+
const content = await (0, promises_1.readFile)(path, 'utf-8');
|
|
33
|
+
const parsed = js_yaml_1.default.load(content);
|
|
34
|
+
return parsed ?? { description: '' };
|
|
35
|
+
}
|
|
36
|
+
async function writeConfig(root, config) {
|
|
37
|
+
const dir = sddDirPath(root);
|
|
38
|
+
if (!(0, node_fs_1.existsSync)(dir)) {
|
|
39
|
+
await (0, promises_1.mkdir)(dir, { recursive: true });
|
|
40
|
+
}
|
|
41
|
+
const content = js_yaml_1.default.dump(config, { sortKeys: true, lineWidth: -1 });
|
|
42
|
+
await (0, promises_1.writeFile)(configFilePath(root), content, 'utf-8');
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=config-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/config/config-manager.ts"],"names":[],"mappings":";;;;;;AASA,gCAEC;AAED,wCAEC;AAED,oCAEC;AAED,gCAQC;AAED,kCAOC;AAtCD,+CAA8D;AAC9D,qCAAqC;AACrC,yCAAoC;AACpC,sDAA2B;AAGd,QAAA,OAAO,GAAG,MAAM,CAAC;AACjB,QAAA,eAAe,GAAG,aAAa,CAAC;AAE7C,SAAgB,UAAU,CAAC,IAAY;IACrC,OAAO,IAAA,mBAAO,EAAC,IAAI,EAAE,eAAO,CAAC,CAAC;AAChC,CAAC;AAED,SAAgB,cAAc,CAAC,IAAY;IACzC,OAAO,IAAA,mBAAO,EAAC,IAAI,EAAE,eAAO,EAAE,uBAAe,CAAC,CAAC;AACjD,CAAC;AAED,SAAgB,YAAY,CAAC,IAAY;IACvC,OAAO,IAAA,oBAAU,EAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;AACtC,CAAC;AAEM,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,IAAA,oBAAU,EAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAC7B,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,iBAAI,CAAC,IAAI,CAAC,OAAO,CAAqB,CAAC;IACtD,OAAO,MAAM,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;AACvC,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,MAAiB;IAC/D,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAA,oBAAU,EAAC,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAA,gBAAK,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,OAAO,GAAG,iBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACrE,MAAM,IAAA,oBAAS,EAAC,cAAc,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delta-engine.d.ts","sourceRoot":"","sources":["../../src/delta/delta-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAa,MAAM,aAAa,CAAC;AAGpD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,KAAK,CAc/E"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.computeDelta = computeDelta;
|
|
4
|
+
const git_js_1 = require("../git/git.js");
|
|
5
|
+
function computeDelta(root, lastSyncCommit) {
|
|
6
|
+
const changed = (0, git_js_1.getChangedFiles)(root, lastSyncCommit);
|
|
7
|
+
const diff = (0, git_js_1.getGitDiff)(root, lastSyncCommit);
|
|
8
|
+
const files = changed.map((f) => ({
|
|
9
|
+
relativePath: f.path,
|
|
10
|
+
status: f.status,
|
|
11
|
+
}));
|
|
12
|
+
return {
|
|
13
|
+
hasChanges: files.length > 0,
|
|
14
|
+
files,
|
|
15
|
+
diff,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=delta-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delta-engine.js","sourceRoot":"","sources":["../../src/delta/delta-engine.ts"],"names":[],"mappings":";;AAGA,oCAcC;AAhBD,0CAA4D;AAE5D,SAAgB,YAAY,CAAC,IAAY,EAAE,cAA6B;IACtE,MAAM,OAAO,GAAG,IAAA,wBAAe,EAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAE9C,MAAM,KAAK,GAAgB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7C,YAAY,EAAE,CAAC,CAAC,IAAI;QACpB,MAAM,EAAE,CAAC,CAAC,MAAM;KACjB,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,UAAU,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC;QAC5B,KAAK;QACL,IAAI;KACL,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hasher.d.ts","sourceRoot":"","sources":["../../src/delta/hasher.ts"],"names":[],"mappings":"AAEA,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9C"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sha256 = sha256;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
function sha256(content) {
|
|
6
|
+
return (0, node_crypto_1.createHash)('sha256').update(content).digest('hex');
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=hasher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hasher.js","sourceRoot":"","sources":["../../src/delta/hasher.ts"],"names":[],"mappings":";;AAEA,wBAEC;AAJD,6CAAyC;AAEzC,SAAgB,MAAM,CAAC,OAAe;IACpC,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class SDDError extends Error {
|
|
2
|
+
constructor(message: string);
|
|
3
|
+
}
|
|
4
|
+
export declare class LockFileNotFoundError extends SDDError {
|
|
5
|
+
constructor(path: string);
|
|
6
|
+
}
|
|
7
|
+
export declare class ParseError extends SDDError {
|
|
8
|
+
constructor(filePath: string, reason: string);
|
|
9
|
+
}
|
|
10
|
+
export declare class ProjectNotInitializedError extends SDDError {
|
|
11
|
+
constructor(root: string);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAS,SAAQ,KAAK;gBACrB,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,qBAAsB,SAAQ,QAAQ;gBACrC,IAAI,EAAE,MAAM;CAIzB;AAED,qBAAa,UAAW,SAAQ,QAAQ;gBAC1B,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAI7C;AAED,qBAAa,0BAA2B,SAAQ,QAAQ;gBAC1C,IAAI,EAAE,MAAM;CAIzB"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProjectNotInitializedError = exports.ParseError = exports.LockFileNotFoundError = exports.SDDError = void 0;
|
|
4
|
+
class SDDError extends Error {
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'SDDError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.SDDError = SDDError;
|
|
11
|
+
class LockFileNotFoundError extends SDDError {
|
|
12
|
+
constructor(path) {
|
|
13
|
+
super(`Lock file not found: ${path}`);
|
|
14
|
+
this.name = 'LockFileNotFoundError';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.LockFileNotFoundError = LockFileNotFoundError;
|
|
18
|
+
class ParseError extends SDDError {
|
|
19
|
+
constructor(filePath, reason) {
|
|
20
|
+
super(`Failed to parse ${filePath}: ${reason}`);
|
|
21
|
+
this.name = 'ParseError';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.ParseError = ParseError;
|
|
25
|
+
class ProjectNotInitializedError extends SDDError {
|
|
26
|
+
constructor(root) {
|
|
27
|
+
super(`No SDD project found at ${root}. Run 'sdd init' first.`);
|
|
28
|
+
this.name = 'ProjectNotInitializedError';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.ProjectNotInitializedError = ProjectNotInitializedError;
|
|
32
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA,MAAa,QAAS,SAAQ,KAAK;IACjC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AALD,4BAKC;AAED,MAAa,qBAAsB,SAAQ,QAAQ;IACjD,YAAY,IAAY;QACtB,KAAK,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AALD,sDAKC;AAED,MAAa,UAAW,SAAQ,QAAQ;IACtC,YAAY,QAAgB,EAAE,MAAc;QAC1C,KAAK,CAAC,mBAAmB,QAAQ,KAAK,MAAM,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AALD,gCAKC;AAED,MAAa,0BAA2B,SAAQ,QAAQ;IACtD,YAAY,IAAY;QACtB,KAAK,CAAC,2BAA2B,IAAI,yBAAyB,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AALD,gEAKC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function isGitRepo(root: string): boolean;
|
|
2
|
+
export declare function gitInit(root: string): void;
|
|
3
|
+
export declare function gitAddAndCommit(root: string, files: string[], message: string): void;
|
|
4
|
+
export declare function getCurrentCommit(root: string): string | null;
|
|
5
|
+
export declare function getGitDiff(root: string, fromCommit: string | null): string;
|
|
6
|
+
export declare function getFileDiff(root: string, filePath: string): string;
|
|
7
|
+
export declare function getGitModifiedFiles(root: string): Set<string>;
|
|
8
|
+
export declare function getChangedFiles(root: string, fromCommit: string | null): Array<{
|
|
9
|
+
path: string;
|
|
10
|
+
status: 'new' | 'modified' | 'deleted';
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/git/git.ts"],"names":[],"mappings":"AAQA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CASpF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM5D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAoB1E;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUlE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAgB7D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,KAAK,GAAG,UAAU,GAAG,SAAS,CAAA;CAAE,CAAC,CAyBxI"}
|
package/dist/git/git.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isGitRepo = isGitRepo;
|
|
4
|
+
exports.gitInit = gitInit;
|
|
5
|
+
exports.gitAddAndCommit = gitAddAndCommit;
|
|
6
|
+
exports.getCurrentCommit = getCurrentCommit;
|
|
7
|
+
exports.getGitDiff = getGitDiff;
|
|
8
|
+
exports.getFileDiff = getFileDiff;
|
|
9
|
+
exports.getGitModifiedFiles = getGitModifiedFiles;
|
|
10
|
+
exports.getChangedFiles = getChangedFiles;
|
|
11
|
+
const node_child_process_1 = require("node:child_process");
|
|
12
|
+
const node_fs_1 = require("node:fs");
|
|
13
|
+
const node_path_1 = require("node:path");
|
|
14
|
+
function run(cmd, cwd) {
|
|
15
|
+
return (0, node_child_process_1.execSync)(cmd, { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
16
|
+
}
|
|
17
|
+
function isGitRepo(root) {
|
|
18
|
+
return (0, node_fs_1.existsSync)((0, node_path_1.resolve)(root, '.git'));
|
|
19
|
+
}
|
|
20
|
+
function gitInit(root) {
|
|
21
|
+
run('git init', root);
|
|
22
|
+
}
|
|
23
|
+
function gitAddAndCommit(root, files, message) {
|
|
24
|
+
try {
|
|
25
|
+
for (const f of files) {
|
|
26
|
+
run(`git add -- ${f}`, root);
|
|
27
|
+
}
|
|
28
|
+
run(`git commit -m "${message}"`, root);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// ignore — no changes to commit or no git user configured
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function getCurrentCommit(root) {
|
|
35
|
+
try {
|
|
36
|
+
return run('git rev-parse HEAD', root) || null;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function getGitDiff(root, fromCommit) {
|
|
43
|
+
const paths = '-- product/ system/';
|
|
44
|
+
try {
|
|
45
|
+
if (!fromCommit) {
|
|
46
|
+
// No previous sync — show all tracked + untracked files as new
|
|
47
|
+
const tracked = run(`git diff HEAD ${paths}`, root);
|
|
48
|
+
const untracked = run('git ls-files --others --exclude-standard product/ system/', root);
|
|
49
|
+
const parts = [];
|
|
50
|
+
if (tracked)
|
|
51
|
+
parts.push(tracked);
|
|
52
|
+
if (untracked) {
|
|
53
|
+
for (const file of untracked.split('\n').filter(Boolean)) {
|
|
54
|
+
parts.push(`new file: ${file}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return parts.join('\n') || '';
|
|
58
|
+
}
|
|
59
|
+
return run(`git diff ${fromCommit} HEAD ${paths}`, root);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return '';
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function getFileDiff(root, filePath) {
|
|
66
|
+
try {
|
|
67
|
+
// Show diff of file vs last committed version
|
|
68
|
+
const diff = run(`git diff HEAD -- ${filePath}`, root);
|
|
69
|
+
if (diff)
|
|
70
|
+
return diff;
|
|
71
|
+
// If no unstaged changes, try diff vs previous commit
|
|
72
|
+
return run(`git diff HEAD~1 HEAD -- ${filePath}`, root);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return '';
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function getGitModifiedFiles(root) {
|
|
79
|
+
const modified = new Set();
|
|
80
|
+
try {
|
|
81
|
+
// Unstaged changes
|
|
82
|
+
const unstaged = run('git diff --name-only -- product/ system/', root);
|
|
83
|
+
for (const f of unstaged.split('\n').filter(Boolean))
|
|
84
|
+
modified.add(f);
|
|
85
|
+
// Staged changes
|
|
86
|
+
const staged = run('git diff --cached --name-only -- product/ system/', root);
|
|
87
|
+
for (const f of staged.split('\n').filter(Boolean))
|
|
88
|
+
modified.add(f);
|
|
89
|
+
// Untracked files
|
|
90
|
+
const untracked = run('git ls-files --others --exclude-standard product/ system/', root);
|
|
91
|
+
for (const f of untracked.split('\n').filter(Boolean))
|
|
92
|
+
modified.add(f);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// not a git repo or no commits — ignore
|
|
96
|
+
}
|
|
97
|
+
return modified;
|
|
98
|
+
}
|
|
99
|
+
function getChangedFiles(root, fromCommit) {
|
|
100
|
+
try {
|
|
101
|
+
if (!fromCommit) {
|
|
102
|
+
// All files in product/ and system/ are "new"
|
|
103
|
+
const files = run('git ls-files product/ system/', root);
|
|
104
|
+
const untracked = run('git ls-files --others --exclude-standard product/ system/', root);
|
|
105
|
+
const all = [...files.split('\n'), ...untracked.split('\n')].filter(Boolean);
|
|
106
|
+
const unique = [...new Set(all)];
|
|
107
|
+
return unique.map((p) => ({ path: p, status: 'new' }));
|
|
108
|
+
}
|
|
109
|
+
const output = run(`git diff --name-status ${fromCommit} HEAD -- product/ system/`, root);
|
|
110
|
+
if (!output)
|
|
111
|
+
return [];
|
|
112
|
+
return output.split('\n').filter(Boolean).map((line) => {
|
|
113
|
+
const [flag, ...pathParts] = line.split('\t');
|
|
114
|
+
const path = pathParts.join('\t');
|
|
115
|
+
const status = flag === 'A' ? 'new'
|
|
116
|
+
: flag === 'D' ? 'deleted'
|
|
117
|
+
: 'modified';
|
|
118
|
+
return { path, status };
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/git/git.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { SDD } from './sdd.js';
|
|
2
|
+
export type { StoryFrontmatter, StoryFile, PendingItem, Delta, DeltaFile, ValidationResult, ValidationIssue, StoryStatus, StoryFileStatus, SDDConfig, ChangeRequest, ChangeRequestFrontmatter, ChangeRequestStatus, } from './types.js';
|
|
3
|
+
export { SDDError, LockFileNotFoundError, ParseError, ProjectNotInitializedError } from './errors.js';
|
|
4
|
+
export type { ProjectInfo } from './scaffold/templates.js';
|
|
5
|
+
export { isSDDProject, readConfig } from './config/config-manager.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,YAAY,EACV,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,KAAK,EACL,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,eAAe,EACf,SAAS,EACT,aAAa,EACb,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,UAAU,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACtG,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readConfig = exports.isSDDProject = exports.ProjectNotInitializedError = exports.ParseError = exports.LockFileNotFoundError = exports.SDDError = exports.SDD = void 0;
|
|
4
|
+
var sdd_js_1 = require("./sdd.js");
|
|
5
|
+
Object.defineProperty(exports, "SDD", { enumerable: true, get: function () { return sdd_js_1.SDD; } });
|
|
6
|
+
var errors_js_1 = require("./errors.js");
|
|
7
|
+
Object.defineProperty(exports, "SDDError", { enumerable: true, get: function () { return errors_js_1.SDDError; } });
|
|
8
|
+
Object.defineProperty(exports, "LockFileNotFoundError", { enumerable: true, get: function () { return errors_js_1.LockFileNotFoundError; } });
|
|
9
|
+
Object.defineProperty(exports, "ParseError", { enumerable: true, get: function () { return errors_js_1.ParseError; } });
|
|
10
|
+
Object.defineProperty(exports, "ProjectNotInitializedError", { enumerable: true, get: function () { return errors_js_1.ProjectNotInitializedError; } });
|
|
11
|
+
var config_manager_js_1 = require("./config/config-manager.js");
|
|
12
|
+
Object.defineProperty(exports, "isSDDProject", { enumerable: true, get: function () { return config_manager_js_1.isSDDProject; } });
|
|
13
|
+
Object.defineProperty(exports, "readConfig", { enumerable: true, get: function () { return config_manager_js_1.readConfig; } });
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAA+B;AAAtB,6FAAA,GAAG,OAAA;AAgBZ,yCAAsG;AAA7F,qGAAA,QAAQ,OAAA;AAAE,kHAAA,qBAAqB,OAAA;AAAE,uGAAA,UAAU,OAAA;AAAE,uHAAA,0BAA0B,OAAA;AAEhF,gEAAsE;AAA7D,iHAAA,YAAY,OAAA;AAAE,+GAAA,UAAU,OAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { LockFile } from '../types.js';
|
|
2
|
+
export declare function lockFilePath(root: string): string;
|
|
3
|
+
export declare function readLockFile(root: string): Promise<LockFile>;
|
|
4
|
+
export declare function writeLockFile(root: string, lock: LockFile): Promise<void>;
|
|
5
|
+
export declare function createEmptyLock(): LockFile;
|
|
6
|
+
//# sourceMappingURL=lock-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock-manager.d.ts","sourceRoot":"","sources":["../../src/lock/lock-manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAK5C,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAQlE;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAI/E;AAED,wBAAgB,eAAe,IAAI,QAAQ,CAK1C"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.lockFilePath = lockFilePath;
|
|
7
|
+
exports.readLockFile = readLockFile;
|
|
8
|
+
exports.writeLockFile = writeLockFile;
|
|
9
|
+
exports.createEmptyLock = createEmptyLock;
|
|
10
|
+
const promises_1 = require("node:fs/promises");
|
|
11
|
+
const node_fs_1 = require("node:fs");
|
|
12
|
+
const node_path_1 = require("node:path");
|
|
13
|
+
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
14
|
+
const config_manager_js_1 = require("../config/config-manager.js");
|
|
15
|
+
const LOCK_FILENAME = 'lock.yaml';
|
|
16
|
+
function lockFilePath(root) {
|
|
17
|
+
return (0, node_path_1.resolve)(root, config_manager_js_1.SDD_DIR, LOCK_FILENAME);
|
|
18
|
+
}
|
|
19
|
+
async function readLockFile(root) {
|
|
20
|
+
const path = lockFilePath(root);
|
|
21
|
+
if (!(0, node_fs_1.existsSync)(path)) {
|
|
22
|
+
return createEmptyLock();
|
|
23
|
+
}
|
|
24
|
+
const content = await (0, promises_1.readFile)(path, 'utf-8');
|
|
25
|
+
const parsed = js_yaml_1.default.load(content);
|
|
26
|
+
return parsed ?? createEmptyLock();
|
|
27
|
+
}
|
|
28
|
+
async function writeLockFile(root, lock) {
|
|
29
|
+
const path = lockFilePath(root);
|
|
30
|
+
const content = js_yaml_1.default.dump(lock, { sortKeys: true, lineWidth: -1 });
|
|
31
|
+
await (0, promises_1.writeFile)(path, content, 'utf-8');
|
|
32
|
+
}
|
|
33
|
+
function createEmptyLock() {
|
|
34
|
+
return {
|
|
35
|
+
'synced-at': new Date().toISOString(),
|
|
36
|
+
files: {},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=lock-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock-manager.js","sourceRoot":"","sources":["../../src/lock/lock-manager.ts"],"names":[],"mappings":";;;;;AASA,oCAEC;AAED,oCAQC;AAED,sCAIC;AAED,0CAKC;AAlCD,+CAAuD;AACvD,qCAAqC;AACrC,yCAAoC;AACpC,sDAA2B;AAE3B,mEAAsD;AAEtD,MAAM,aAAa,GAAG,WAAW,CAAC;AAElC,SAAgB,YAAY,CAAC,IAAY;IACvC,OAAO,IAAA,mBAAO,EAAC,IAAI,EAAE,2BAAO,EAAE,aAAa,CAAC,CAAC;AAC/C,CAAC;AAEM,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,IAAA,oBAAU,EAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,eAAe,EAAE,CAAC;IAC3B,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,iBAAI,CAAC,IAAI,CAAC,OAAO,CAAoB,CAAC;IACrD,OAAO,MAAM,IAAI,eAAe,EAAE,CAAC;AACrC,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,IAAc;IAC9D,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,iBAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACnE,MAAM,IAAA,oBAAS,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,SAAgB,eAAe;IAC7B,OAAO;QACL,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,KAAK,EAAE,EAAE;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ChangeRequest, ChangeRequestFrontmatter } from '../types.js';
|
|
2
|
+
export declare function discoverCRFiles(root: string): Promise<string[]>;
|
|
3
|
+
export declare function parseCRFile(filePath: string, content: string): {
|
|
4
|
+
frontmatter: ChangeRequestFrontmatter;
|
|
5
|
+
body: string;
|
|
6
|
+
};
|
|
7
|
+
export declare function parseAllCRFiles(root: string): Promise<ChangeRequest[]>;
|
|
8
|
+
//# sourceMappingURL=cr-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cr-parser.d.ts","sourceRoot":"","sources":["../../src/parser/cr-parser.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAG3E,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAIrE;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG;IAAE,WAAW,EAAE,wBAAwB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAatH;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAY5E"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.discoverCRFiles = discoverCRFiles;
|
|
7
|
+
exports.parseCRFile = parseCRFile;
|
|
8
|
+
exports.parseAllCRFiles = parseAllCRFiles;
|
|
9
|
+
const promises_1 = require("node:fs/promises");
|
|
10
|
+
const node_path_1 = require("node:path");
|
|
11
|
+
const glob_1 = require("glob");
|
|
12
|
+
const gray_matter_1 = __importDefault(require("gray-matter"));
|
|
13
|
+
const errors_js_1 = require("../errors.js");
|
|
14
|
+
async function discoverCRFiles(root) {
|
|
15
|
+
const pattern = 'change-requests/*.md';
|
|
16
|
+
const matches = await (0, glob_1.glob)(pattern, { cwd: root, absolute: true });
|
|
17
|
+
return matches.sort();
|
|
18
|
+
}
|
|
19
|
+
function parseCRFile(filePath, content) {
|
|
20
|
+
try {
|
|
21
|
+
const { data, content: body } = (0, gray_matter_1.default)(content);
|
|
22
|
+
const frontmatter = {
|
|
23
|
+
title: data.title ?? '',
|
|
24
|
+
status: data.status ?? 'draft',
|
|
25
|
+
author: data.author ?? '',
|
|
26
|
+
'created-at': data['created-at'] ?? '',
|
|
27
|
+
};
|
|
28
|
+
return { frontmatter, body };
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
throw new errors_js_1.ParseError(filePath, err.message);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function parseAllCRFiles(root) {
|
|
35
|
+
const paths = await discoverCRFiles(root);
|
|
36
|
+
const results = [];
|
|
37
|
+
for (const absPath of paths) {
|
|
38
|
+
const content = await (0, promises_1.readFile)(absPath, 'utf-8');
|
|
39
|
+
const relPath = (0, node_path_1.relative)(root, absPath);
|
|
40
|
+
const { frontmatter, body } = parseCRFile(relPath, content);
|
|
41
|
+
results.push({ relativePath: relPath, frontmatter, body });
|
|
42
|
+
}
|
|
43
|
+
return results;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=cr-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cr-parser.js","sourceRoot":"","sources":["../../src/parser/cr-parser.ts"],"names":[],"mappings":";;;;;AAOA,0CAIC;AAED,kCAaC;AAED,0CAYC;AAxCD,+CAA4C;AAC5C,yCAA8C;AAC9C,+BAA4B;AAC5B,8DAAiC;AAEjC,4CAA0C;AAEnC,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,MAAM,OAAO,GAAG,sBAAsB,CAAC;IACvC,MAAM,OAAO,GAAG,MAAM,IAAA,WAAI,EAAC,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;AACxB,CAAC;AAED,SAAgB,WAAW,CAAC,QAAgB,EAAE,OAAe;IAC3D,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAA,qBAAM,EAAC,OAAO,CAAC,CAAC;QAChD,MAAM,WAAW,GAA6B;YAC5C,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,OAAO;YAC9B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;YACzB,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;SACvC,CAAC;QACF,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,sBAAU,CAAC,QAAQ,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,IAAA,oBAAQ,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { StoryFrontmatter } from '../types.js';
|
|
2
|
+
export interface ParsedFile {
|
|
3
|
+
frontmatter: StoryFrontmatter;
|
|
4
|
+
body: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function parseFrontmatter(filePath: string, content: string): ParsedFile;
|
|
7
|
+
//# sourceMappingURL=frontmatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/parser/frontmatter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CAc9E"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.parseFrontmatter = parseFrontmatter;
|
|
7
|
+
const gray_matter_1 = __importDefault(require("gray-matter"));
|
|
8
|
+
const errors_js_1 = require("../errors.js");
|
|
9
|
+
function parseFrontmatter(filePath, content) {
|
|
10
|
+
try {
|
|
11
|
+
const { data, content: body } = (0, gray_matter_1.default)(content);
|
|
12
|
+
const frontmatter = {
|
|
13
|
+
title: data.title ?? '',
|
|
14
|
+
status: data.status ?? 'draft',
|
|
15
|
+
author: data.author ?? '',
|
|
16
|
+
'last-modified': data['last-modified'] ?? '',
|
|
17
|
+
version: data.version ?? '1.0',
|
|
18
|
+
};
|
|
19
|
+
return { frontmatter, body };
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
throw new errors_js_1.ParseError(filePath, err.message);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=frontmatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/parser/frontmatter.ts"],"names":[],"mappings":";;;;;AASA,4CAcC;AAvBD,8DAAiC;AAEjC,4CAA0C;AAO1C,SAAgB,gBAAgB,CAAC,QAAgB,EAAE,OAAe;IAChE,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAA,qBAAM,EAAC,OAAO,CAAC,CAAC;QAChD,MAAM,WAAW,GAAqB;YACpC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,OAAO;YAC9B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;YACzB,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;YAC5C,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;SAC/B,CAAC;QACF,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,sBAAU,CAAC,QAAQ,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ref-extractor.d.ts","sourceRoot":"","sources":["../../src/parser/ref-extractor.ts"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAWvD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractCrossRefs = extractCrossRefs;
|
|
4
|
+
const REF_RE = /\[\[([^\]]+)\]\]/g;
|
|
5
|
+
function extractCrossRefs(body) {
|
|
6
|
+
const refs = [];
|
|
7
|
+
let match;
|
|
8
|
+
const re = new RegExp(REF_RE.source, REF_RE.flags);
|
|
9
|
+
while ((match = re.exec(body)) !== null) {
|
|
10
|
+
const ref = match[1].trim();
|
|
11
|
+
if (!refs.includes(ref)) {
|
|
12
|
+
refs.push(ref);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return refs;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=ref-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ref-extractor.js","sourceRoot":"","sources":["../../src/parser/ref-extractor.ts"],"names":[],"mappings":";;AAEA,4CAWC;AAbD,MAAM,MAAM,GAAG,mBAAmB,CAAC;AAEnC,SAAgB,gBAAgB,CAAC,IAAY;IAC3C,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,KAA6B,CAAC;IAClC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACnD,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-extractor.d.ts","sourceRoot":"","sources":["../../src/parser/section-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAc/D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG7D"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractPendingItems = extractPendingItems;
|
|
4
|
+
exports.extractAgentNotes = extractAgentNotes;
|
|
5
|
+
const CHECKBOX_RE = /^- \[([ xX])\] (.+)$/gm;
|
|
6
|
+
function extractPendingItems(body) {
|
|
7
|
+
const section = extractSection(body, 'Pending Changes');
|
|
8
|
+
if (!section)
|
|
9
|
+
return [];
|
|
10
|
+
const items = [];
|
|
11
|
+
let match;
|
|
12
|
+
const re = new RegExp(CHECKBOX_RE.source, CHECKBOX_RE.flags);
|
|
13
|
+
while ((match = re.exec(section)) !== null) {
|
|
14
|
+
items.push({
|
|
15
|
+
checked: match[1] !== ' ',
|
|
16
|
+
text: match[2].trim(),
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
return items;
|
|
20
|
+
}
|
|
21
|
+
function extractAgentNotes(body) {
|
|
22
|
+
const section = extractSection(body, 'Agent Notes');
|
|
23
|
+
return section ? section.trim() : null;
|
|
24
|
+
}
|
|
25
|
+
function extractSection(body, heading) {
|
|
26
|
+
const headingRe = new RegExp(`^## ${escapeRegex(heading)}\\s*$`, 'm');
|
|
27
|
+
const match = headingRe.exec(body);
|
|
28
|
+
if (!match)
|
|
29
|
+
return null;
|
|
30
|
+
const start = match.index + match[0].length;
|
|
31
|
+
const nextHeading = body.indexOf('\n## ', start);
|
|
32
|
+
return nextHeading === -1 ? body.slice(start) : body.slice(start, nextHeading);
|
|
33
|
+
}
|
|
34
|
+
function escapeRegex(s) {
|
|
35
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=section-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-extractor.js","sourceRoot":"","sources":["../../src/parser/section-extractor.ts"],"names":[],"mappings":";;AAIA,kDAcC;AAED,8CAGC;AArBD,MAAM,WAAW,GAAG,wBAAwB,CAAC;AAE7C,SAAgB,mBAAmB,CAAC,IAAY;IAC9C,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IACxD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,IAAI,KAA6B,CAAC;IAClC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7D,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC;YACT,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;YACzB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,iBAAiB,CAAC,IAAY;IAC5C,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACpD,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,OAAe;IACnD,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,OAAO,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACjD,OAAO,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { StoryFile } from '../types.js';
|
|
2
|
+
export declare function discoverStoryFiles(root: string): Promise<string[]>;
|
|
3
|
+
export declare function parseStoryFile(root: string, absolutePath: string): Promise<StoryFile>;
|
|
4
|
+
export declare function parseAllStoryFiles(root: string): Promise<StoryFile[]>;
|
|
5
|
+
//# sourceMappingURL=story-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"story-parser.d.ts","sourceRoot":"","sources":["../../src/parser/story-parser.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAK7C,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQxE;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAe3F;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAG3E"}
|