@fluxyr/quill-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.d.ts +24 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +98 -0
- package/dist/config.js.map +1 -0
- package/dist/conventions.d.ts +4 -0
- package/dist/conventions.d.ts.map +1 -0
- package/dist/conventions.js +51 -0
- package/dist/conventions.js.map +1 -0
- package/dist/engine/codemap.d.ts +3 -0
- package/dist/engine/codemap.d.ts.map +1 -0
- package/dist/engine/codemap.js +113 -0
- package/dist/engine/codemap.js.map +1 -0
- package/dist/engine/fileops.d.ts +18 -0
- package/dist/engine/fileops.d.ts.map +1 -0
- package/dist/engine/fileops.js +194 -0
- package/dist/engine/fileops.js.map +1 -0
- package/dist/engine/generate.d.ts +39 -0
- package/dist/engine/generate.d.ts.map +1 -0
- package/dist/engine/generate.js +126 -0
- package/dist/engine/generate.js.map +1 -0
- package/dist/engine/openrouter.d.ts +36 -0
- package/dist/engine/openrouter.d.ts.map +1 -0
- package/dist/engine/openrouter.js +108 -0
- package/dist/engine/openrouter.js.map +1 -0
- package/dist/engine/repair.d.ts +22 -0
- package/dist/engine/repair.d.ts.map +1 -0
- package/dist/engine/repair.js +37 -0
- package/dist/engine/repair.js.map +1 -0
- package/dist/engine/session.d.ts +26 -0
- package/dist/engine/session.d.ts.map +1 -0
- package/dist/engine/session.js +66 -0
- package/dist/engine/session.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +73 -0
- package/dist/index.js.map +1 -0
- package/dist/ledger/hash.d.ts +8 -0
- package/dist/ledger/hash.d.ts.map +1 -0
- package/dist/ledger/hash.js +95 -0
- package/dist/ledger/hash.js.map +1 -0
- package/dist/ledger/lockfile.d.ts +16 -0
- package/dist/ledger/lockfile.d.ts.map +1 -0
- package/dist/ledger/lockfile.js +101 -0
- package/dist/ledger/lockfile.js.map +1 -0
- package/dist/ledger/snapshot.d.ts +5 -0
- package/dist/ledger/snapshot.d.ts.map +1 -0
- package/dist/ledger/snapshot.js +61 -0
- package/dist/ledger/snapshot.js.map +1 -0
- package/dist/prompt/parse.d.ts +21 -0
- package/dist/prompt/parse.d.ts.map +1 -0
- package/dist/prompt/parse.js +95 -0
- package/dist/prompt/parse.js.map +1 -0
- package/dist/stack/helpers.d.ts +9 -0
- package/dist/stack/helpers.d.ts.map +1 -0
- package/dist/stack/helpers.js +84 -0
- package/dist/stack/helpers.js.map +1 -0
- package/dist/stack/registry.d.ts +10 -0
- package/dist/stack/registry.d.ts.map +1 -0
- package/dist/stack/registry.js +21 -0
- package/dist/stack/registry.js.map +1 -0
- package/dist/types.d.ts +126 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/package.json +39 -0
- package/prompts/000-uuid.md +27 -0
- package/prompts/010-base-model.md +27 -0
- package/prompts/020-routes.md +23 -0
- package/prompts/030-auth.md +16 -0
- package/prompts/040-errors.md +25 -0
|
@@ -0,0 +1,95 @@
|
|
|
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.hashPrompt = hashPrompt;
|
|
37
|
+
exports.hashDir = hashDir;
|
|
38
|
+
/** Content hashing for prompts and generated code trees. */
|
|
39
|
+
const crypto = __importStar(require("crypto"));
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
function sha256(input) {
|
|
43
|
+
return "sha256:" + crypto.createHash("sha256").update(input).digest("hex");
|
|
44
|
+
}
|
|
45
|
+
/** Hash a single prompt's normalized body. */
|
|
46
|
+
function hashPrompt(body) {
|
|
47
|
+
return sha256(body.trim().replace(/\r\n/g, "\n"));
|
|
48
|
+
}
|
|
49
|
+
const IGNORED_DIRS = new Set([
|
|
50
|
+
"__pycache__",
|
|
51
|
+
".git",
|
|
52
|
+
".venv",
|
|
53
|
+
"venv",
|
|
54
|
+
"node_modules",
|
|
55
|
+
".pytest_cache",
|
|
56
|
+
".ruff_cache",
|
|
57
|
+
"instance",
|
|
58
|
+
]);
|
|
59
|
+
const IGNORED_FILES = new Set([".DS_Store"]);
|
|
60
|
+
/**
|
|
61
|
+
* Deterministically hash a directory tree of source files: sorted relative
|
|
62
|
+
* paths + contents. Used for the lockfile codeHash and drift detection.
|
|
63
|
+
*/
|
|
64
|
+
function hashDir(root) {
|
|
65
|
+
if (!fs.existsSync(root))
|
|
66
|
+
return sha256("");
|
|
67
|
+
const files = [];
|
|
68
|
+
const walk = (dir) => {
|
|
69
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
|
|
70
|
+
if (entry.isDirectory()) {
|
|
71
|
+
if (IGNORED_DIRS.has(entry.name))
|
|
72
|
+
continue;
|
|
73
|
+
walk(path.join(dir, entry.name));
|
|
74
|
+
}
|
|
75
|
+
else if (entry.isFile()) {
|
|
76
|
+
if (IGNORED_FILES.has(entry.name))
|
|
77
|
+
continue;
|
|
78
|
+
if (entry.name.endsWith(".pyc") || entry.name.endsWith(".sqlite3"))
|
|
79
|
+
continue;
|
|
80
|
+
files.push(path.join(dir, entry.name));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
walk(root);
|
|
85
|
+
const hash = crypto.createHash("sha256");
|
|
86
|
+
for (const f of files.sort()) {
|
|
87
|
+
const rel = path.relative(root, f).split(path.sep).join("/");
|
|
88
|
+
hash.update(rel);
|
|
89
|
+
hash.update("\0");
|
|
90
|
+
hash.update(fs.readFileSync(f));
|
|
91
|
+
hash.update("\0");
|
|
92
|
+
}
|
|
93
|
+
return "sha256:" + hash.digest("hex");
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/ledger/hash.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,gCAEC;AAmBD,0BA2BC;AA1DD,4DAA4D;AAC5D,+CAAiC;AACjC,uCAAyB;AACzB,2CAA6B;AAE7B,SAAS,MAAM,CAAC,KAAsB;IACpC,OAAO,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,8CAA8C;AAC9C,SAAgB,UAAU,CAAC,IAAY;IACrC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,aAAa;IACb,MAAM;IACN,OAAO;IACP,MAAM;IACN,cAAc;IACd,eAAe;IACf,aAAa;IACb,UAAU;CACX,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAE7C;;;GAGG;AACH,SAAgB,OAAO,CAAC,IAAY;IAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE;QAC3B,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC7E,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAC7B,EAAE,CAAC;YACF,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAC3C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACnC,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC1B,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAC5C,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;oBAAE,SAAS;gBAC7E,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,CAAC;IACX,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Lockfile, AppliedEntry, CheckpointEntry } from "../types";
|
|
2
|
+
export declare const LOCKFILE_NAME = "quill.lock.json";
|
|
3
|
+
export declare function lockfilePath(projectDir: string): string;
|
|
4
|
+
export declare function emptyLockfile(stack: string, model: string): Lockfile;
|
|
5
|
+
export declare function readLockfile(projectDir: string): Lockfile | null;
|
|
6
|
+
export declare function writeLockfile(projectDir: string, lock: Lockfile): void;
|
|
7
|
+
/** Ids of feature prompts already applied, in order. */
|
|
8
|
+
export declare function appliedIds(lock: Lockfile): string[];
|
|
9
|
+
/** The head = id of the last applied prompt, or null. */
|
|
10
|
+
export declare function head(lock: Lockfile): string | null;
|
|
11
|
+
export declare function recordApplied(lock: Lockfile, entry: AppliedEntry): void;
|
|
12
|
+
export declare function upsertCheckpoint(lock: Lockfile, cp: CheckpointEntry): void;
|
|
13
|
+
export declare function findCheckpoint(lock: Lockfile, name: string): CheckpointEntry | undefined;
|
|
14
|
+
/** Truncate the applied ledger back to (and including) a given head id. */
|
|
15
|
+
export declare function truncateTo(lock: Lockfile, headId: string | null): void;
|
|
16
|
+
//# sourceMappingURL=lockfile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockfile.d.ts","sourceRoot":"","sources":["../../src/ledger/lockfile.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEnE,eAAO,MAAM,aAAa,oBAAoB,CAAC;AAE/C,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAEpE;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAIhE;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAEtE;AAED,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,CAEnD;AAED,yDAAyD;AACzD,wBAAgB,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAIvE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,eAAe,GAAG,IAAI,CAI1E;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,MAAM,GACX,eAAe,GAAG,SAAS,CAE7B;AAED,2EAA2E;AAC3E,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAOtE"}
|
|
@@ -0,0 +1,101 @@
|
|
|
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.LOCKFILE_NAME = void 0;
|
|
37
|
+
exports.lockfilePath = lockfilePath;
|
|
38
|
+
exports.emptyLockfile = emptyLockfile;
|
|
39
|
+
exports.readLockfile = readLockfile;
|
|
40
|
+
exports.writeLockfile = writeLockfile;
|
|
41
|
+
exports.appliedIds = appliedIds;
|
|
42
|
+
exports.head = head;
|
|
43
|
+
exports.recordApplied = recordApplied;
|
|
44
|
+
exports.upsertCheckpoint = upsertCheckpoint;
|
|
45
|
+
exports.findCheckpoint = findCheckpoint;
|
|
46
|
+
exports.truncateTo = truncateTo;
|
|
47
|
+
/** Read/write the resolved-state ledger (quill.lock.json). */
|
|
48
|
+
const fs = __importStar(require("fs"));
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
exports.LOCKFILE_NAME = "quill.lock.json";
|
|
51
|
+
function lockfilePath(projectDir) {
|
|
52
|
+
return path.join(projectDir, exports.LOCKFILE_NAME);
|
|
53
|
+
}
|
|
54
|
+
function emptyLockfile(stack, model) {
|
|
55
|
+
return { version: 1, stack, model, applied: [], checkpoints: [] };
|
|
56
|
+
}
|
|
57
|
+
function readLockfile(projectDir) {
|
|
58
|
+
const p = lockfilePath(projectDir);
|
|
59
|
+
if (!fs.existsSync(p))
|
|
60
|
+
return null;
|
|
61
|
+
return JSON.parse(fs.readFileSync(p, "utf8"));
|
|
62
|
+
}
|
|
63
|
+
function writeLockfile(projectDir, lock) {
|
|
64
|
+
fs.writeFileSync(lockfilePath(projectDir), JSON.stringify(lock, null, 2) + "\n");
|
|
65
|
+
}
|
|
66
|
+
/** Ids of feature prompts already applied, in order. */
|
|
67
|
+
function appliedIds(lock) {
|
|
68
|
+
return lock.applied.map((a) => a.id);
|
|
69
|
+
}
|
|
70
|
+
/** The head = id of the last applied prompt, or null. */
|
|
71
|
+
function head(lock) {
|
|
72
|
+
return lock.applied.length ? lock.applied[lock.applied.length - 1].id : null;
|
|
73
|
+
}
|
|
74
|
+
function recordApplied(lock, entry) {
|
|
75
|
+
const idx = lock.applied.findIndex((a) => a.id === entry.id);
|
|
76
|
+
if (idx >= 0)
|
|
77
|
+
lock.applied[idx] = entry;
|
|
78
|
+
else
|
|
79
|
+
lock.applied.push(entry);
|
|
80
|
+
}
|
|
81
|
+
function upsertCheckpoint(lock, cp) {
|
|
82
|
+
const idx = lock.checkpoints.findIndex((c) => c.name === cp.name);
|
|
83
|
+
if (idx >= 0)
|
|
84
|
+
lock.checkpoints[idx] = cp;
|
|
85
|
+
else
|
|
86
|
+
lock.checkpoints.push(cp);
|
|
87
|
+
}
|
|
88
|
+
function findCheckpoint(lock, name) {
|
|
89
|
+
return lock.checkpoints.find((c) => c.name === name);
|
|
90
|
+
}
|
|
91
|
+
/** Truncate the applied ledger back to (and including) a given head id. */
|
|
92
|
+
function truncateTo(lock, headId) {
|
|
93
|
+
if (headId === null) {
|
|
94
|
+
lock.applied = [];
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const idx = lock.applied.findIndex((a) => a.id === headId);
|
|
98
|
+
if (idx >= 0)
|
|
99
|
+
lock.applied = lock.applied.slice(0, idx + 1);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=lockfile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../src/ledger/lockfile.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,oCAEC;AAED,sCAEC;AAED,oCAIC;AAED,sCAEC;AAGD,gCAEC;AAGD,oBAEC;AAED,sCAIC;AAED,4CAIC;AAED,wCAKC;AAGD,gCAOC;AA9DD,8DAA8D;AAC9D,uCAAyB;AACzB,2CAA6B;AAGhB,QAAA,aAAa,GAAG,iBAAiB,CAAC;AAE/C,SAAgB,YAAY,CAAC,UAAkB;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,qBAAa,CAAC,CAAC;AAC9C,CAAC;AAED,SAAgB,aAAa,CAAC,KAAa,EAAE,KAAa;IACxD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;AACpE,CAAC;AAED,SAAgB,YAAY,CAAC,UAAkB;IAC7C,MAAM,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAa,CAAC;AAC5D,CAAC;AAED,SAAgB,aAAa,CAAC,UAAkB,EAAE,IAAc;IAC9D,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACnF,CAAC;AAED,wDAAwD;AACxD,SAAgB,UAAU,CAAC,IAAc;IACvC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,yDAAyD;AACzD,SAAgB,IAAI,CAAC,IAAc;IACjC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/E,CAAC;AAED,SAAgB,aAAa,CAAC,IAAc,EAAE,KAAmB;IAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7D,IAAI,GAAG,IAAI,CAAC;QAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;;QACnC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,SAAgB,gBAAgB,CAAC,IAAc,EAAE,EAAmB;IAClE,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC;IAClE,IAAI,GAAG,IAAI,CAAC;QAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;;QACpC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,SAAgB,cAAc,CAC5B,IAAc,EACd,IAAY;IAEZ,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACvD,CAAC;AAED,2EAA2E;AAC3E,SAAgB,UAAU,CAAC,IAAc,EAAE,MAAqB;IAC9D,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IAC3D,IAAI,GAAG,IAAI,CAAC;QAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Recursively copy `src` to `dest`, skipping caches and build junk. */
|
|
2
|
+
export declare function copyDir(src: string, dest: string): void;
|
|
3
|
+
/** Replace `dest` contents with a copy of the snapshot at `src`. */
|
|
4
|
+
export declare function restoreDir(src: string, dest: string): void;
|
|
5
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/ledger/snapshot.ts"],"names":[],"mappings":"AAMA,wEAAwE;AACxE,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CASvD;AAED,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAG1D"}
|
|
@@ -0,0 +1,61 @@
|
|
|
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.copyDir = copyDir;
|
|
37
|
+
exports.restoreDir = restoreDir;
|
|
38
|
+
/** Filesystem snapshots for checkpoints (copy/restore the generated app). */
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const SKIP = new Set(["__pycache__", ".venv", "venv", ".pytest_cache", ".ruff_cache"]);
|
|
42
|
+
/** Recursively copy `src` to `dest`, skipping caches and build junk. */
|
|
43
|
+
function copyDir(src, dest) {
|
|
44
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
45
|
+
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
46
|
+
if (SKIP.has(entry.name))
|
|
47
|
+
continue;
|
|
48
|
+
const s = path.join(src, entry.name);
|
|
49
|
+
const d = path.join(dest, entry.name);
|
|
50
|
+
if (entry.isDirectory())
|
|
51
|
+
copyDir(s, d);
|
|
52
|
+
else if (entry.isFile())
|
|
53
|
+
fs.copyFileSync(s, d);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/** Replace `dest` contents with a copy of the snapshot at `src`. */
|
|
57
|
+
function restoreDir(src, dest) {
|
|
58
|
+
fs.rmSync(dest, { recursive: true, force: true });
|
|
59
|
+
copyDir(src, dest);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/ledger/snapshot.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,0BASC;AAGD,gCAGC;AAtBD,6EAA6E;AAC7E,uCAAyB;AACzB,2CAA6B;AAE7B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC,CAAC;AAEvF,wEAAwE;AACxE,SAAgB,OAAO,CAAC,GAAW,EAAE,IAAY;IAC/C,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACjE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,KAAK,CAAC,WAAW,EAAE;YAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aAClC,IAAI,KAAK,CAAC,MAAM,EAAE;YAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,SAAgB,UAAU,CAAC,GAAW,EAAE,IAAY;IAClD,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { PromptDoc, PromptKind } from "../types";
|
|
2
|
+
/** Extract the leading numeric order from an id like "0002-add-projects". */
|
|
3
|
+
export declare function orderFromId(id: string): number;
|
|
4
|
+
/** Parse a single micro-prompt from raw markdown content. */
|
|
5
|
+
export declare function parsePrompt(raw: string, fallback: {
|
|
6
|
+
id: string;
|
|
7
|
+
kind: PromptKind;
|
|
8
|
+
filePath?: string;
|
|
9
|
+
}): PromptDoc;
|
|
10
|
+
/** Read one micro-prompt file. */
|
|
11
|
+
export declare function readPromptFile(filePath: string, kind: PromptKind): PromptDoc;
|
|
12
|
+
/** Read every `*.md` in a directory as prompts, sorted by numeric order then id. */
|
|
13
|
+
export declare function readPromptDir(dir: string, kind: PromptKind): PromptDoc[];
|
|
14
|
+
/** Render a prompt file's on-disk contents (frontmatter + body). */
|
|
15
|
+
export declare function renderPromptFile(doc: {
|
|
16
|
+
id: string;
|
|
17
|
+
kind: PromptKind;
|
|
18
|
+
dependsOn?: string[];
|
|
19
|
+
body: string;
|
|
20
|
+
}): string;
|
|
21
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/prompt/parse.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEjD,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED,6DAA6D;AAC7D,wBAAgB,WAAW,CACzB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5D,SAAS,CAeX;AAED,kCAAkC;AAClC,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,SAAS,CAI5E;AAED,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE,CAOxE;AAED,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,MAAM,CAOT"}
|
|
@@ -0,0 +1,95 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.orderFromId = orderFromId;
|
|
40
|
+
exports.parsePrompt = parsePrompt;
|
|
41
|
+
exports.readPromptFile = readPromptFile;
|
|
42
|
+
exports.readPromptDir = readPromptDir;
|
|
43
|
+
exports.renderPromptFile = renderPromptFile;
|
|
44
|
+
/** Parsing of micro-prompt markdown files (frontmatter + body). */
|
|
45
|
+
const fs = __importStar(require("fs"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const gray_matter_1 = __importDefault(require("gray-matter"));
|
|
48
|
+
/** Extract the leading numeric order from an id like "0002-add-projects". */
|
|
49
|
+
function orderFromId(id) {
|
|
50
|
+
const m = /^(\d+)/.exec(id);
|
|
51
|
+
return m ? parseInt(m[1], 10) : 0;
|
|
52
|
+
}
|
|
53
|
+
/** Parse a single micro-prompt from raw markdown content. */
|
|
54
|
+
function parsePrompt(raw, fallback) {
|
|
55
|
+
const { data, content } = (0, gray_matter_1.default)(raw);
|
|
56
|
+
const id = data.id || fallback.id;
|
|
57
|
+
const kind = (data.kind || fallback.kind);
|
|
58
|
+
const dependsOn = Array.isArray(data.depends_on)
|
|
59
|
+
? data.depends_on
|
|
60
|
+
: [];
|
|
61
|
+
return {
|
|
62
|
+
id,
|
|
63
|
+
kind,
|
|
64
|
+
dependsOn,
|
|
65
|
+
order: typeof data.order === "number" ? data.order : orderFromId(id),
|
|
66
|
+
body: content.trim(),
|
|
67
|
+
filePath: fallback.filePath,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/** Read one micro-prompt file. */
|
|
71
|
+
function readPromptFile(filePath, kind) {
|
|
72
|
+
const raw = fs.readFileSync(filePath, "utf8");
|
|
73
|
+
const id = path.basename(filePath).replace(/\.md$/, "");
|
|
74
|
+
return parsePrompt(raw, { id, kind, filePath });
|
|
75
|
+
}
|
|
76
|
+
/** Read every `*.md` in a directory as prompts, sorted by numeric order then id. */
|
|
77
|
+
function readPromptDir(dir, kind) {
|
|
78
|
+
if (!fs.existsSync(dir))
|
|
79
|
+
return [];
|
|
80
|
+
return fs
|
|
81
|
+
.readdirSync(dir)
|
|
82
|
+
.filter((f) => f.endsWith(".md"))
|
|
83
|
+
.map((f) => readPromptFile(path.join(dir, f), kind))
|
|
84
|
+
.sort((a, b) => a.order - b.order || a.id.localeCompare(b.id));
|
|
85
|
+
}
|
|
86
|
+
/** Render a prompt file's on-disk contents (frontmatter + body). */
|
|
87
|
+
function renderPromptFile(doc) {
|
|
88
|
+
const fm = gray_matter_1.default.stringify(`\n${doc.body}\n`, {
|
|
89
|
+
id: doc.id,
|
|
90
|
+
kind: doc.kind,
|
|
91
|
+
depends_on: doc.dependsOn ?? [],
|
|
92
|
+
});
|
|
93
|
+
return fm;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/prompt/parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { FileTemplate, PromptDoc } from "../types";
|
|
2
|
+
/** Recursively read every file under `dir` into FileTemplate[] (paths relative to dir). */
|
|
3
|
+
export declare function readTemplatesDir(dir: string): FileTemplate[];
|
|
4
|
+
/**
|
|
5
|
+
* Compose a stack's system prompt: the shared header, the core conventions, then
|
|
6
|
+
* the stack's framework binding.
|
|
7
|
+
*/
|
|
8
|
+
export declare function composeStackSystemPrompt(corePrompts: PromptDoc[], binding: string): string;
|
|
9
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/stack/helpers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEnD,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,EAAE,CAiB5D;AAiBD;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,SAAS,EAAE,EACxB,OAAO,EAAE,MAAM,GACd,MAAM,CAGR"}
|
|
@@ -0,0 +1,84 @@
|
|
|
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.readTemplatesDir = readTemplatesDir;
|
|
37
|
+
exports.composeStackSystemPrompt = composeStackSystemPrompt;
|
|
38
|
+
/** Shared helpers for building stack adapters. */
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
/** Recursively read every file under `dir` into FileTemplate[] (paths relative to dir). */
|
|
42
|
+
function readTemplatesDir(dir) {
|
|
43
|
+
const out = [];
|
|
44
|
+
const walk = (cur) => {
|
|
45
|
+
if (!fs.existsSync(cur))
|
|
46
|
+
return;
|
|
47
|
+
for (const entry of fs.readdirSync(cur, { withFileTypes: true })) {
|
|
48
|
+
const full = path.join(cur, entry.name);
|
|
49
|
+
if (entry.isDirectory())
|
|
50
|
+
walk(full);
|
|
51
|
+
else if (entry.isFile()) {
|
|
52
|
+
out.push({
|
|
53
|
+
path: path.relative(dir, full).split(path.sep).join("/"),
|
|
54
|
+
content: fs.readFileSync(full, "utf8"),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
walk(dir);
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
const HEADER = [
|
|
63
|
+
"# Quill — application conventions",
|
|
64
|
+
"",
|
|
65
|
+
"You are evolving a web application from a stack of micro-prompts. The",
|
|
66
|
+
"CONVENTIONS section is the durable, framework-independent contract for this app.",
|
|
67
|
+
"The FRAMEWORK BINDING section says how to realize those conventions in this",
|
|
68
|
+
"project's stack — follow both exactly. Some load-bearing files are already",
|
|
69
|
+
"provided; anything a convention or the binding says to implement, you generate.",
|
|
70
|
+
"New resource and route modules are auto-discovered; do not edit the app's",
|
|
71
|
+
"bootstrap/registration.",
|
|
72
|
+
"",
|
|
73
|
+
"## Conventions (framework-independent)",
|
|
74
|
+
"",
|
|
75
|
+
].join("\n");
|
|
76
|
+
/**
|
|
77
|
+
* Compose a stack's system prompt: the shared header, the core conventions, then
|
|
78
|
+
* the stack's framework binding.
|
|
79
|
+
*/
|
|
80
|
+
function composeStackSystemPrompt(corePrompts, binding) {
|
|
81
|
+
const conventions = corePrompts.map((p) => p.body).join("\n\n---\n\n");
|
|
82
|
+
return `${HEADER}${conventions}\n\n## Framework binding\n\n${binding}\n`;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/stack/helpers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,4CAiBC;AAqBD,4DAMC;AAlDD,kDAAkD;AAClD,uCAAyB;AACzB,2CAA6B;AAG7B,2FAA2F;AAC3F,SAAgB,gBAAgB,CAAC,GAAW;IAC1C,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE;QAC3B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO;QAChC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACjE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,KAAK,CAAC,WAAW,EAAE;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;iBAC/B,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBACxB,GAAG,CAAC,IAAI,CAAC;oBACP,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;oBACxD,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC;iBACvC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,MAAM,GAAG;IACb,mCAAmC;IACnC,EAAE;IACF,uEAAuE;IACvE,kFAAkF;IAClF,6EAA6E;IAC7E,4EAA4E;IAC5E,iFAAiF;IACjF,2EAA2E;IAC3E,yBAAyB;IACzB,EAAE;IACF,wCAAwC;IACxC,EAAE;CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb;;;GAGG;AACH,SAAgB,wBAAwB,CACtC,WAAwB,EACxB,OAAe;IAEf,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACvE,OAAO,GAAG,MAAM,GAAG,WAAW,+BAA+B,OAAO,IAAI,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stack adapter registry. Core owns the registry; concrete stacks (e.g.
|
|
3
|
+
* @fluxyr/quill-stack-flask) register themselves and the CLI wires them in. This keeps
|
|
4
|
+
* the dependency arrow pointing stacks -> core, never the reverse.
|
|
5
|
+
*/
|
|
6
|
+
import { StackAdapter } from "../types";
|
|
7
|
+
export declare function registerStack(adapter: StackAdapter): void;
|
|
8
|
+
export declare function getStack(name: string): StackAdapter;
|
|
9
|
+
export declare function listStacks(): string[];
|
|
10
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/stack/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAIxC,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAEzD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAOnD;AAED,wBAAgB,UAAU,IAAI,MAAM,EAAE,CAErC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerStack = registerStack;
|
|
4
|
+
exports.getStack = getStack;
|
|
5
|
+
exports.listStacks = listStacks;
|
|
6
|
+
const registry = new Map();
|
|
7
|
+
function registerStack(adapter) {
|
|
8
|
+
registry.set(adapter.name, adapter);
|
|
9
|
+
}
|
|
10
|
+
function getStack(name) {
|
|
11
|
+
const s = registry.get(name);
|
|
12
|
+
if (!s) {
|
|
13
|
+
const known = [...registry.keys()].join(", ") || "(none registered)";
|
|
14
|
+
throw new Error(`Unknown stack '${name}'. Registered stacks: ${known}`);
|
|
15
|
+
}
|
|
16
|
+
return s;
|
|
17
|
+
}
|
|
18
|
+
function listStacks() {
|
|
19
|
+
return [...registry.keys()];
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/stack/registry.ts"],"names":[],"mappings":";;AASA,sCAEC;AAED,4BAOC;AAED,gCAEC;AAjBD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEjD,SAAgB,aAAa,CAAC,OAAqB;IACjD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC;AAED,SAAgB,QAAQ,CAAC,IAAY;IACnC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,yBAAyB,KAAK,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAgB,UAAU;IACxB,OAAO,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9B,CAAC"}
|