strikethroo 3.0.2 → 3.2.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 +18 -2
- package/dist/cli.js +28 -0
- package/dist/cli.js.map +1 -1
- package/dist/serve/archive.d.ts +43 -0
- package/dist/serve/archive.d.ts.map +1 -0
- package/dist/serve/archive.js +124 -0
- package/dist/serve/archive.js.map +1 -0
- package/dist/serve/derivation.d.ts +78 -0
- package/dist/serve/derivation.d.ts.map +1 -0
- package/dist/serve/derivation.js +237 -0
- package/dist/serve/derivation.js.map +1 -0
- package/dist/serve/events.d.ts +41 -0
- package/dist/serve/events.d.ts.map +1 -0
- package/dist/serve/events.js +91 -0
- package/dist/serve/events.js.map +1 -0
- package/dist/serve/markdown.d.ts +75 -0
- package/dist/serve/markdown.d.ts.map +1 -0
- package/dist/serve/markdown.js +221 -0
- package/dist/serve/markdown.js.map +1 -0
- package/dist/serve/root.d.ts +48 -0
- package/dist/serve/root.d.ts.map +1 -0
- package/dist/serve/root.js +110 -0
- package/dist/serve/root.js.map +1 -0
- package/dist/serve/self-review.d.ts +70 -0
- package/dist/serve/self-review.d.ts.map +1 -0
- package/dist/serve/self-review.js +164 -0
- package/dist/serve/self-review.js.map +1 -0
- package/dist/serve/server.d.ts +70 -0
- package/dist/serve/server.d.ts.map +1 -0
- package/dist/serve/server.js +368 -0
- package/dist/serve/server.js.map +1 -0
- package/dist/serve/watcher.d.ts +32 -0
- package/dist/serve/watcher.d.ts.map +1 -0
- package/dist/serve/watcher.js +99 -0
- package/dist/serve/watcher.js.map +1 -0
- package/dist/serve/workspace-model.d.ts +80 -0
- package/dist/serve/workspace-model.d.ts.map +1 -0
- package/dist/serve/workspace-model.js +176 -0
- package/dist/serve/workspace-model.js.map +1 -0
- package/dist/skill-scripts/shared/frontmatter.d.ts +2 -0
- package/dist/skill-scripts/shared/frontmatter.d.ts.map +1 -0
- package/dist/skill-scripts/shared/frontmatter.js +37 -0
- package/dist/skill-scripts/shared/frontmatter.js.map +1 -0
- package/dist/skill-scripts/shared/plan-scan.d.ts +10 -0
- package/dist/skill-scripts/shared/plan-scan.d.ts.map +1 -0
- package/dist/skill-scripts/shared/plan-scan.js +91 -0
- package/dist/skill-scripts/shared/plan-scan.js.map +1 -0
- package/dist/skill-scripts/shared/root.d.ts +2 -0
- package/dist/skill-scripts/shared/root.d.ts.map +1 -0
- package/dist/skill-scripts/shared/root.js +104 -0
- package/dist/skill-scripts/shared/root.js.map +1 -0
- package/dist-web/assets/Fraunces-Italic-VariableFont_SOFT_WONK_opsz_wght-CuXX_kIb.ttf +0 -0
- package/dist-web/assets/Fraunces-VariableFont_SOFT_WONK_opsz_wght-DLWfSgHL.ttf +0 -0
- package/dist-web/assets/Outfit-VariableFont_wght-B6lQlNBM.ttf +0 -0
- package/dist-web/assets/SFMonoBold-DXHgGUoo.otf +0 -0
- package/dist-web/assets/SFMonoBoldItalic-CdGEImHi.otf +0 -0
- package/dist-web/assets/SFMonoHeavy-DL92f7rT.otf +0 -0
- package/dist-web/assets/SFMonoHeavyItalic-DnE00LFH.otf +0 -0
- package/dist-web/assets/SFMonoLight-CaMC1gg-.otf +0 -0
- package/dist-web/assets/SFMonoLightItalic-DG3Owzn7.otf +0 -0
- package/dist-web/assets/SFMonoMedium-ypRDCKSo.otf +0 -0
- package/dist-web/assets/SFMonoMediumItalic-DkJk-c-x.otf +0 -0
- package/dist-web/assets/SFMonoRegular-77Uh1IPk.otf +0 -0
- package/dist-web/assets/SFMonoRegularItalic-Cn01bACm.otf +0 -0
- package/dist-web/assets/SFMonoSemibold-CvhtzcyM.otf +0 -0
- package/dist-web/assets/SFMonoSemiboldItalic-D75NMH13.otf +0 -0
- package/dist-web/assets/arc-JkuhZ_PU.js +1 -0
- package/dist-web/assets/architectureDiagram-3BPJPVTR-DwCgGxAM.js +36 -0
- package/dist-web/assets/blockDiagram-GPEHLZMM-BCwcsKdi.js +132 -0
- package/dist-web/assets/c4Diagram-AAUBKEIU-Cm1cMFQT.js +10 -0
- package/dist-web/assets/channel-8UZd6AbH.js +1 -0
- package/dist-web/assets/chunk-2J33WTMH-BHDreu9q.js +1 -0
- package/dist-web/assets/chunk-4BX2VUAB-CvH1iMKB.js +1 -0
- package/dist-web/assets/chunk-55IACEB6-C02LfbKU.js +1 -0
- package/dist-web/assets/chunk-727SXJPM-BYDaeCJW.js +206 -0
- package/dist-web/assets/chunk-AQP2D5EJ-CW-sdA3M.js +231 -0
- package/dist-web/assets/chunk-FMBD7UC4-BE3hNKOn.js +15 -0
- package/dist-web/assets/chunk-ND2GUHAM-BosLJTdj.js +1 -0
- package/dist-web/assets/chunk-QZHKN3VN-Bf44xttm.js +1 -0
- package/dist-web/assets/classDiagram-4FO5ZUOK-D7aMNqbH.js +1 -0
- package/dist-web/assets/classDiagram-v2-Q7XG4LA2-D7aMNqbH.js +1 -0
- package/dist-web/assets/cose-bilkent-S5V4N54A-BZS-xBec.js +1 -0
- package/dist-web/assets/cytoscape.esm-BHYC38rz.js +331 -0
- package/dist-web/assets/dagre-BM42HDAG-Be_HyeG7.js +4 -0
- package/dist-web/assets/defaultLocale-CrowFXzY.js +1 -0
- package/dist-web/assets/diagram-2AECGRRQ-BVt23uOL.js +43 -0
- package/dist-web/assets/diagram-5GNKFQAL-BF-OZRmP.js +10 -0
- package/dist-web/assets/diagram-KO2AKTUF-BvW-uYc2.js +3 -0
- package/dist-web/assets/diagram-LMA3HP47-CG2JR86G.js +24 -0
- package/dist-web/assets/diagram-OG6HWLK6-PZ5nR1AF.js +24 -0
- package/dist-web/assets/erDiagram-TEJ5UH35-D2GJWnIo.js +85 -0
- package/dist-web/assets/flowDiagram-I6XJVG4X-DGboZXQm.js +162 -0
- package/dist-web/assets/ganttDiagram-6RSMTGT7-IPOlSI7E.js +292 -0
- package/dist-web/assets/gitGraphDiagram-PVQCEYII-DO9E2tXK.js +106 -0
- package/dist-web/assets/graph-Dqkl27Ch.js +1 -0
- package/dist-web/assets/index-B8AJFM1Y.js +125 -0
- package/dist-web/assets/index-Bm5I46eC.css +1 -0
- package/dist-web/assets/infoDiagram-5YYISTIA-Clg2ubQz.js +2 -0
- package/dist-web/assets/init-Gi6I4Gst.js +1 -0
- package/dist-web/assets/ishikawaDiagram-YF4QCWOH-CDyYc7AV.js +70 -0
- package/dist-web/assets/journeyDiagram-JHISSGLW-CIz55Ff7.js +139 -0
- package/dist-web/assets/kanban-definition-UN3LZRKU-OzC_r8lI.js +89 -0
- package/dist-web/assets/katex-C5jXJg4s.js +257 -0
- package/dist-web/assets/layout-DO9UvE1P.js +1 -0
- package/dist-web/assets/linear-rdoP0iOK.js +1 -0
- package/dist-web/assets/mermaid.core-DOgS-uvF.js +307 -0
- package/dist-web/assets/mindmap-definition-RKZ34NQL-52nfuxxC.js +96 -0
- package/dist-web/assets/ordinal-Cboi1Yqb.js +1 -0
- package/dist-web/assets/pieDiagram-4H26LBE5-Drwd0WV7.js +30 -0
- package/dist-web/assets/quadrantDiagram-W4KKPZXB-DYJRwtFj.js +7 -0
- package/dist-web/assets/requirementDiagram-4Y6WPE33-HOL8fCwg.js +84 -0
- package/dist-web/assets/sankeyDiagram-5OEKKPKP-CyA-ExUk.js +40 -0
- package/dist-web/assets/sequenceDiagram-3UESZ5HK-C6Zr5XVd.js +162 -0
- package/dist-web/assets/stateDiagram-AJRCARHV-DSAZMis2.js +1 -0
- package/dist-web/assets/stateDiagram-v2-BHNVJYJU-nDV4UH9R.js +1 -0
- package/dist-web/assets/timeline-definition-PNZ67QCA-CUPjxRlk.js +120 -0
- package/dist-web/assets/vennDiagram-CIIHVFJN-CtjMS4vh.js +34 -0
- package/dist-web/assets/wardley-L42UT6IY-Bk6PjBWD.js +173 -0
- package/dist-web/assets/wardleyDiagram-YWT4CUSO-Bjb8yHyW.js +78 -0
- package/dist-web/assets/xychartDiagram-2RQKCTM6-C3ukcEfW.js +7 -0
- package/dist-web/favicon.svg +13 -0
- package/dist-web/index.html +30 -0
- package/package.json +28 -8
- package/templates/harness/skills/st-full-workflow/SKILL.md +2 -2
- package/templates/harness/skills/st-generate-tasks/SKILL.md +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/serve/watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,2EAA2E;AAC3E,MAAM,WAAW,gBAAgB;IAC/B,KAAK,IAAI,IAAI,CAAC;CACf;AAED,sDAAsD;AACtD,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,GACjC,cAAc,MAAM,EACpB,UAAU,MAAM,IAAI,EACpB,aAAY,MAA4B,KACvC,gBAkCF,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Workspace file watcher for `npx strikethroo serve`.
|
|
4
|
+
*
|
|
5
|
+
* Centralizes change detection behind one small interface so the underlying
|
|
6
|
+
* mechanism can be swapped later without touching call sites. Today it uses a
|
|
7
|
+
* single recursive `fs.watch` over the workspace, feeding a debounce so a burst
|
|
8
|
+
* of rapid writes (editor saves, assistant edits) collapses into one `onChange`
|
|
9
|
+
* call after a short quiet window.
|
|
10
|
+
*
|
|
11
|
+
* Per the plan's portability risk, recursive `fs.watch` may be unreliable on
|
|
12
|
+
* some Linux configurations. If that proves true on a target platform, a tiny
|
|
13
|
+
* watcher dependency can be substituted here as a documented last resort without
|
|
14
|
+
* changing how the server consumes this module. No such dependency is added now.
|
|
15
|
+
*
|
|
16
|
+
* Node built-ins only.
|
|
17
|
+
*/
|
|
18
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
21
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
22
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
23
|
+
}
|
|
24
|
+
Object.defineProperty(o, k2, desc);
|
|
25
|
+
}) : (function(o, m, k, k2) {
|
|
26
|
+
if (k2 === undefined) k2 = k;
|
|
27
|
+
o[k2] = m[k];
|
|
28
|
+
}));
|
|
29
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
30
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
31
|
+
}) : function(o, v) {
|
|
32
|
+
o["default"] = v;
|
|
33
|
+
});
|
|
34
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
35
|
+
var ownKeys = function(o) {
|
|
36
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
37
|
+
var ar = [];
|
|
38
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
39
|
+
return ar;
|
|
40
|
+
};
|
|
41
|
+
return ownKeys(o);
|
|
42
|
+
};
|
|
43
|
+
return function (mod) {
|
|
44
|
+
if (mod && mod.__esModule) return mod;
|
|
45
|
+
var result = {};
|
|
46
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
47
|
+
__setModuleDefault(result, mod);
|
|
48
|
+
return result;
|
|
49
|
+
};
|
|
50
|
+
})();
|
|
51
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52
|
+
exports.createWorkspaceWatcher = exports.DEFAULT_DEBOUNCE_MS = void 0;
|
|
53
|
+
const fs = __importStar(require("fs"));
|
|
54
|
+
/** Default debounce quiet window, in milliseconds. */
|
|
55
|
+
exports.DEFAULT_DEBOUNCE_MS = 300;
|
|
56
|
+
/**
|
|
57
|
+
* Starts watching `workspaceDir` recursively. `onChange` is invoked once per
|
|
58
|
+
* burst, after `debounceMs` of quiet. Returns a handle whose `close()` stops the
|
|
59
|
+
* watch and clears any pending debounce timer.
|
|
60
|
+
*
|
|
61
|
+
* Watch errors are swallowed (the stream stays usable); they must not crash the
|
|
62
|
+
* server. If `fs.watch` cannot start at all, a no-op watcher is returned.
|
|
63
|
+
*/
|
|
64
|
+
const createWorkspaceWatcher = (workspaceDir, onChange, debounceMs = exports.DEFAULT_DEBOUNCE_MS) => {
|
|
65
|
+
let timer = null;
|
|
66
|
+
const schedule = () => {
|
|
67
|
+
if (timer)
|
|
68
|
+
clearTimeout(timer);
|
|
69
|
+
timer = setTimeout(() => {
|
|
70
|
+
timer = null;
|
|
71
|
+
onChange();
|
|
72
|
+
}, debounceMs);
|
|
73
|
+
};
|
|
74
|
+
let fsWatcher = null;
|
|
75
|
+
try {
|
|
76
|
+
fsWatcher = fs.watch(workspaceDir, { recursive: true }, () => schedule());
|
|
77
|
+
// A watcher error must not crash the process; keep the server alive.
|
|
78
|
+
fsWatcher.on('error', () => {
|
|
79
|
+
/* swallow: watching degrades gracefully */
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
fsWatcher = null;
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
close() {
|
|
87
|
+
if (timer) {
|
|
88
|
+
clearTimeout(timer);
|
|
89
|
+
timer = null;
|
|
90
|
+
}
|
|
91
|
+
if (fsWatcher) {
|
|
92
|
+
fsWatcher.close();
|
|
93
|
+
fsWatcher = null;
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
exports.createWorkspaceWatcher = createWorkspaceWatcher;
|
|
99
|
+
//# sourceMappingURL=watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/serve/watcher.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AAOzB,sDAAsD;AACzC,QAAA,mBAAmB,GAAG,GAAG,CAAC;AAEvC;;;;;;;GAOG;AACI,MAAM,sBAAsB,GAAG,CACpC,YAAoB,EACpB,QAAoB,EACpB,aAAqB,2BAAmB,EACtB,EAAE;IACpB,IAAI,KAAK,GAAyC,IAAI,CAAC;IAEvD,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC1B,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAC/B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,KAAK,GAAG,IAAI,CAAC;YACb,QAAQ,EAAE,CAAC;QACb,CAAC,EAAE,UAAU,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,IAAI,SAAS,GAAwB,IAAI,CAAC;IAC1C,IAAI,CAAC;QACH,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1E,qEAAqE;QACrE,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACzB,2CAA2C;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,OAAO;QACL,KAAK;YACH,IAAI,KAAK,EAAE,CAAC;gBACV,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;YACD,IAAI,SAAS,EAAE,CAAC;gBACd,SAAS,CAAC,KAAK,EAAE,CAAC;gBAClB,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAtCW,QAAA,sBAAsB,0BAsCjC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace data layer for `npx strikethroo serve`.
|
|
3
|
+
*
|
|
4
|
+
* A pure, synchronous, side-effect-free module that scans a project's
|
|
5
|
+
* `.ai/strikethroo/` directory tree and returns a stable JSON model describing
|
|
6
|
+
* every plan, its derived lifecycle state, tasks, inferred execution phases,
|
|
7
|
+
* embedded mermaid diagrams, the archive, and the customizable hooks and
|
|
8
|
+
* templates under `config/`.
|
|
9
|
+
*
|
|
10
|
+
* This module performs reads only: no `fs.watch`, no `http`/`net`, no writes.
|
|
11
|
+
* HTTP, file-watching, and caching belong to the runtime server (a later plan),
|
|
12
|
+
* not here. Discovery and plan enumeration reuse the existing shared helpers
|
|
13
|
+
* rather than re-walking directories.
|
|
14
|
+
*/
|
|
15
|
+
import { MarkdownSection } from './markdown';
|
|
16
|
+
import { Task, Phase, PlanState } from './derivation';
|
|
17
|
+
export type { Task, Phase, PlanState } from './derivation';
|
|
18
|
+
export type { MarkdownSection, MermaidBlock, ParsedFrontmatter } from './markdown';
|
|
19
|
+
/** A mermaid diagram as exposed by the model. */
|
|
20
|
+
export interface ModelMermaidBlock {
|
|
21
|
+
source: string;
|
|
22
|
+
isArchitecturalApproach: boolean;
|
|
23
|
+
}
|
|
24
|
+
/** Compact, list/board-facing view of a plan. */
|
|
25
|
+
export interface PlanSummary {
|
|
26
|
+
id: number;
|
|
27
|
+
/** Directory slug, e.g. `83--workspace-data-layer`. */
|
|
28
|
+
name: string;
|
|
29
|
+
summary?: string;
|
|
30
|
+
created?: string;
|
|
31
|
+
state: PlanState;
|
|
32
|
+
done: number;
|
|
33
|
+
total: number;
|
|
34
|
+
phaseCount: number;
|
|
35
|
+
archived: boolean;
|
|
36
|
+
}
|
|
37
|
+
/** Full, detail-screen view of a plan. */
|
|
38
|
+
export interface PlanDetail extends PlanSummary {
|
|
39
|
+
/** Absolute path to the plan markdown file. */
|
|
40
|
+
file: string;
|
|
41
|
+
/** Absolute path to the plan directory. */
|
|
42
|
+
dir: string;
|
|
43
|
+
/** Verbatim markdown body after the frontmatter. */
|
|
44
|
+
rawBody: string;
|
|
45
|
+
/** Ordered named `##` sections. */
|
|
46
|
+
sections: MarkdownSection[];
|
|
47
|
+
/** Extracted mermaid blocks, with the Architectural Approach block flagged. */
|
|
48
|
+
mermaid: ModelMermaidBlock[];
|
|
49
|
+
tasks: Task[];
|
|
50
|
+
phases: Phase[];
|
|
51
|
+
}
|
|
52
|
+
/** A customizable config file (hook or template). */
|
|
53
|
+
export interface ConfigFile {
|
|
54
|
+
/** Basename without `.md`, e.g. `PRE_PHASE`. */
|
|
55
|
+
id: string;
|
|
56
|
+
/** Absolute path to the file. */
|
|
57
|
+
file: string;
|
|
58
|
+
/** File content. */
|
|
59
|
+
content: string;
|
|
60
|
+
}
|
|
61
|
+
/** The customizable config slice (hooks + templates). */
|
|
62
|
+
export interface WorkspaceConfig {
|
|
63
|
+
hooks: ConfigFile[];
|
|
64
|
+
templates: ConfigFile[];
|
|
65
|
+
}
|
|
66
|
+
/** The complete workspace model. */
|
|
67
|
+
export interface WorkspaceModel {
|
|
68
|
+
plans: PlanSummary[];
|
|
69
|
+
config: WorkspaceConfig;
|
|
70
|
+
}
|
|
71
|
+
/** Returns the config slice: hooks and templates under `config/`. */
|
|
72
|
+
export declare const getConfig: (root?: string) => WorkspaceConfig;
|
|
73
|
+
/** Returns the full detail for a single plan by numeric id, or undefined. */
|
|
74
|
+
export declare const getPlanDetail: (root: string | undefined, planId: number) => PlanDetail | undefined;
|
|
75
|
+
/**
|
|
76
|
+
* Returns the complete workspace model: plan summaries for active and archived
|
|
77
|
+
* plans, plus the config block.
|
|
78
|
+
*/
|
|
79
|
+
export declare const getWorkspaceModel: (root?: string) => WorkspaceModel;
|
|
80
|
+
//# sourceMappingURL=workspace-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-model.d.ts","sourceRoot":"","sources":["../../src/serve/workspace-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,EAKL,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAyC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE7F,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEnF,iDAAiD;AACjD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,uBAAuB,EAAE,OAAO,CAAC;CAClC;AAED,iDAAiD;AACjD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,0CAA0C;AAC1C,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,+EAA+E;IAC/E,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,qDAAqD;AACrD,MAAM,WAAW,UAAU;IACzB,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,yDAAyD;AACzD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,SAAS,EAAE,UAAU,EAAE,CAAC;CACzB;AAED,oCAAoC;AACpC,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,MAAM,EAAE,eAAe,CAAC;CACzB;AA+FD,qEAAqE;AACrE,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,KAAG,eAMzC,CAAC;AAEF,6EAA6E;AAC7E,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,GAAG,SAAS,EAAE,QAAQ,MAAM,KAAG,UAAU,GAAG,SAKrF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,KAAG,cAOjD,CAAC"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Workspace data layer for `npx strikethroo serve`.
|
|
4
|
+
*
|
|
5
|
+
* A pure, synchronous, side-effect-free module that scans a project's
|
|
6
|
+
* `.ai/strikethroo/` directory tree and returns a stable JSON model describing
|
|
7
|
+
* every plan, its derived lifecycle state, tasks, inferred execution phases,
|
|
8
|
+
* embedded mermaid diagrams, the archive, and the customizable hooks and
|
|
9
|
+
* templates under `config/`.
|
|
10
|
+
*
|
|
11
|
+
* This module performs reads only: no `fs.watch`, no `http`/`net`, no writes.
|
|
12
|
+
* HTTP, file-watching, and caching belong to the runtime server (a later plan),
|
|
13
|
+
* not here. Discovery and plan enumeration reuse the existing shared helpers
|
|
14
|
+
* rather than re-walking directories.
|
|
15
|
+
*/
|
|
16
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
19
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
20
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
21
|
+
}
|
|
22
|
+
Object.defineProperty(o, k2, desc);
|
|
23
|
+
}) : (function(o, m, k, k2) {
|
|
24
|
+
if (k2 === undefined) k2 = k;
|
|
25
|
+
o[k2] = m[k];
|
|
26
|
+
}));
|
|
27
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
28
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
29
|
+
}) : function(o, v) {
|
|
30
|
+
o["default"] = v;
|
|
31
|
+
});
|
|
32
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
33
|
+
var ownKeys = function(o) {
|
|
34
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
35
|
+
var ar = [];
|
|
36
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
37
|
+
return ar;
|
|
38
|
+
};
|
|
39
|
+
return ownKeys(o);
|
|
40
|
+
};
|
|
41
|
+
return function (mod) {
|
|
42
|
+
if (mod && mod.__esModule) return mod;
|
|
43
|
+
var result = {};
|
|
44
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
45
|
+
__setModuleDefault(result, mod);
|
|
46
|
+
return result;
|
|
47
|
+
};
|
|
48
|
+
})();
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.getWorkspaceModel = exports.getPlanDetail = exports.getConfig = void 0;
|
|
51
|
+
const fs = __importStar(require("fs"));
|
|
52
|
+
const path = __importStar(require("path"));
|
|
53
|
+
const root_1 = require("../skill-scripts/shared/root");
|
|
54
|
+
const plan_scan_1 = require("../skill-scripts/shared/plan-scan");
|
|
55
|
+
const markdown_1 = require("./markdown");
|
|
56
|
+
const derivation_1 = require("./derivation");
|
|
57
|
+
/** Resolves the workspace root, falling back to discovery when none is given. */
|
|
58
|
+
const resolveRoot = (root) => {
|
|
59
|
+
if (root)
|
|
60
|
+
return root;
|
|
61
|
+
const discovered = (0, root_1.findStrikethrooRoot)();
|
|
62
|
+
if (!discovered) {
|
|
63
|
+
throw new Error('Could not locate a .ai/strikethroo/ workspace root. Pass an explicit root path.');
|
|
64
|
+
}
|
|
65
|
+
return discovered;
|
|
66
|
+
};
|
|
67
|
+
/** Builds the full detail for a single plan entry. */
|
|
68
|
+
const buildDetail = (entry) => {
|
|
69
|
+
let content = '';
|
|
70
|
+
try {
|
|
71
|
+
content = fs.readFileSync(entry.file, 'utf8');
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
content = '';
|
|
75
|
+
}
|
|
76
|
+
const fm = (0, markdown_1.parseFrontmatter)(content);
|
|
77
|
+
const body = (0, markdown_1.extractBody)(content);
|
|
78
|
+
const { rawBody, sections } = (0, markdown_1.sectionBody)(body);
|
|
79
|
+
const mermaid = (0, markdown_1.extractMermaidBlocks)(body).map(b => ({
|
|
80
|
+
source: b.source,
|
|
81
|
+
isArchitecturalApproach: b.isArchitecturalApproach,
|
|
82
|
+
}));
|
|
83
|
+
const tasks = (0, derivation_1.scanTasks)(entry.dir);
|
|
84
|
+
const { state, done, total } = (0, derivation_1.deriveState)(tasks);
|
|
85
|
+
const phases = (0, derivation_1.resolvePhases)(body, tasks);
|
|
86
|
+
return {
|
|
87
|
+
id: entry.id,
|
|
88
|
+
name: entry.name,
|
|
89
|
+
summary: fm.summary,
|
|
90
|
+
created: fm.created,
|
|
91
|
+
state,
|
|
92
|
+
done,
|
|
93
|
+
total,
|
|
94
|
+
phaseCount: phases.length,
|
|
95
|
+
archived: entry.isArchive,
|
|
96
|
+
file: entry.file,
|
|
97
|
+
dir: entry.dir,
|
|
98
|
+
rawBody,
|
|
99
|
+
sections,
|
|
100
|
+
mermaid,
|
|
101
|
+
tasks,
|
|
102
|
+
phases,
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
/** Projects a detail down to its summary fields. */
|
|
106
|
+
const toSummary = (detail) => ({
|
|
107
|
+
id: detail.id,
|
|
108
|
+
name: detail.name,
|
|
109
|
+
summary: detail.summary,
|
|
110
|
+
created: detail.created,
|
|
111
|
+
state: detail.state,
|
|
112
|
+
done: detail.done,
|
|
113
|
+
total: detail.total,
|
|
114
|
+
phaseCount: detail.phaseCount,
|
|
115
|
+
archived: detail.archived,
|
|
116
|
+
});
|
|
117
|
+
/** Enumerates `*.md` files in a config subdirectory. Missing dir -> []. */
|
|
118
|
+
const enumerateConfigDir = (dir) => {
|
|
119
|
+
let entries;
|
|
120
|
+
try {
|
|
121
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return [];
|
|
125
|
+
}
|
|
126
|
+
return entries
|
|
127
|
+
.filter(e => e.isFile() && e.name.endsWith('.md'))
|
|
128
|
+
.sort((a, b) => a.name.localeCompare(b.name))
|
|
129
|
+
.map(e => {
|
|
130
|
+
const file = path.join(dir, e.name);
|
|
131
|
+
let fileContent = '';
|
|
132
|
+
try {
|
|
133
|
+
fileContent = fs.readFileSync(file, 'utf8');
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
fileContent = '';
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
id: e.name.replace(/\.md$/, ''),
|
|
140
|
+
file,
|
|
141
|
+
content: fileContent,
|
|
142
|
+
};
|
|
143
|
+
});
|
|
144
|
+
};
|
|
145
|
+
/** Returns the config slice: hooks and templates under `config/`. */
|
|
146
|
+
const getConfig = (root) => {
|
|
147
|
+
const resolved = resolveRoot(root);
|
|
148
|
+
return {
|
|
149
|
+
hooks: enumerateConfigDir(path.join(resolved, 'config', 'hooks')),
|
|
150
|
+
templates: enumerateConfigDir(path.join(resolved, 'config', 'templates')),
|
|
151
|
+
};
|
|
152
|
+
};
|
|
153
|
+
exports.getConfig = getConfig;
|
|
154
|
+
/** Returns the full detail for a single plan by numeric id, or undefined. */
|
|
155
|
+
const getPlanDetail = (root, planId) => {
|
|
156
|
+
const resolved = resolveRoot(root);
|
|
157
|
+
const entry = (0, plan_scan_1.getAllPlans)(resolved).find(p => p.id === planId);
|
|
158
|
+
if (!entry)
|
|
159
|
+
return undefined;
|
|
160
|
+
return buildDetail(entry);
|
|
161
|
+
};
|
|
162
|
+
exports.getPlanDetail = getPlanDetail;
|
|
163
|
+
/**
|
|
164
|
+
* Returns the complete workspace model: plan summaries for active and archived
|
|
165
|
+
* plans, plus the config block.
|
|
166
|
+
*/
|
|
167
|
+
const getWorkspaceModel = (root) => {
|
|
168
|
+
const resolved = resolveRoot(root);
|
|
169
|
+
const plans = (0, plan_scan_1.getAllPlans)(resolved).map(entry => toSummary(buildDetail(entry)));
|
|
170
|
+
return {
|
|
171
|
+
plans,
|
|
172
|
+
config: (0, exports.getConfig)(resolved),
|
|
173
|
+
};
|
|
174
|
+
};
|
|
175
|
+
exports.getWorkspaceModel = getWorkspaceModel;
|
|
176
|
+
//# sourceMappingURL=workspace-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-model.js","sourceRoot":"","sources":["../../src/serve/workspace-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../../src/skill-scripts/shared/frontmatter.ts"],"names":[],"mappings":"AA6BA,eAAO,MAAM,aAAa,GAAI,SAAS,MAAM,EAAE,WAAW,MAAM,KAAG,MAAM,GAAG,IAE3E,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractPlanId = void 0;
|
|
4
|
+
const ID_PATTERNS = [
|
|
5
|
+
/^\s*["']?id["']?\s*:\s*["']?([+-]?\d+)["']?\s*(?:#.*)?$/im,
|
|
6
|
+
/^\s*id\s*:\s*([+-]?\d+)\s*(?:#.*)?$/im,
|
|
7
|
+
/^\s*["']?id["']?\s*:\s*"([+-]?\d+)"\s*(?:#.*)?$/im,
|
|
8
|
+
/^\s*["']?id["']?\s*:\s*'([+-]?\d+)'\s*(?:#.*)?$/im,
|
|
9
|
+
/^\s*["']id["']\s*:\s*([+-]?\d+)\s*(?:#.*)?$/im,
|
|
10
|
+
/^\s*id\s*:\s*[|>]\s*([+-]?\d+)\s*$/im,
|
|
11
|
+
];
|
|
12
|
+
const validateId = (rawId) => {
|
|
13
|
+
const id = parseInt(rawId, 10);
|
|
14
|
+
if (Number.isNaN(id) || id < 0 || id > Number.MAX_SAFE_INTEGER)
|
|
15
|
+
return null;
|
|
16
|
+
return id;
|
|
17
|
+
};
|
|
18
|
+
const extractIdFromMarkdown = (content) => {
|
|
19
|
+
const frontmatterMatch = content.match(/^---\s*\r?\n([\s\S]*?)\r?\n---/);
|
|
20
|
+
if (!frontmatterMatch || !frontmatterMatch[1])
|
|
21
|
+
return null;
|
|
22
|
+
const block = frontmatterMatch[1];
|
|
23
|
+
for (const pattern of ID_PATTERNS) {
|
|
24
|
+
const match = block.match(pattern);
|
|
25
|
+
if (match && match[1]) {
|
|
26
|
+
const id = validateId(match[1]);
|
|
27
|
+
if (id !== null)
|
|
28
|
+
return id;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
};
|
|
33
|
+
const extractPlanId = (content, _filePath) => {
|
|
34
|
+
return extractIdFromMarkdown(content);
|
|
35
|
+
};
|
|
36
|
+
exports.extractPlanId = extractPlanId;
|
|
37
|
+
//# sourceMappingURL=frontmatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../../src/skill-scripts/shared/frontmatter.ts"],"names":[],"mappings":";;;AAAA,MAAM,WAAW,GAAa;IAC5B,2DAA2D;IAC3D,uCAAuC;IACvC,mDAAmD;IACnD,mDAAmD;IACnD,+CAA+C;IAC/C,sCAAsC;CACvC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,KAAa,EAAiB,EAAE;IAClD,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IAC5E,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,OAAe,EAAiB,EAAE;IAC/D,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACzE,IAAI,CAAC,gBAAgB,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3D,MAAM,KAAK,GAAW,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC1C,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,EAAE,KAAK,IAAI;gBAAE,OAAO,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEK,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,SAAiB,EAAiB,EAAE;IACjF,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC,CAAC;AAFW,QAAA,aAAa,iBAExB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface PlanEntry {
|
|
2
|
+
id: number;
|
|
3
|
+
file: string;
|
|
4
|
+
dir: string;
|
|
5
|
+
isArchive: boolean;
|
|
6
|
+
name: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const getAllPlans: (taskManagerRoot: string) => PlanEntry[];
|
|
9
|
+
export declare const computeNextPlanId: (taskManagerRoot: string) => number;
|
|
10
|
+
//# sourceMappingURL=plan-scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-scan.d.ts","sourceRoot":"","sources":["../../../src/skill-scripts/shared/plan-scan.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AA2BD,eAAO,MAAM,WAAW,GAAI,iBAAiB,MAAM,KAAG,SAAS,EAkB9D,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,iBAAiB,MAAM,KAAG,MAG3D,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
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.computeNextPlanId = exports.getAllPlans = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const frontmatter_1 = require("./frontmatter");
|
|
40
|
+
const PLAN_EXTENSIONS = ['.md'];
|
|
41
|
+
const scanPlanDir = (planDirPath, dirName, isArchive) => {
|
|
42
|
+
let entries;
|
|
43
|
+
try {
|
|
44
|
+
entries = fs.readdirSync(planDirPath, { withFileTypes: true });
|
|
45
|
+
}
|
|
46
|
+
catch (_err) {
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
return entries
|
|
50
|
+
.filter(e => e.isFile() && PLAN_EXTENSIONS.some(ext => e.name.endsWith(ext)))
|
|
51
|
+
.flatMap(e => {
|
|
52
|
+
const filePath = path.join(planDirPath, e.name);
|
|
53
|
+
try {
|
|
54
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
55
|
+
const id = (0, frontmatter_1.extractPlanId)(content, filePath);
|
|
56
|
+
if (id === null)
|
|
57
|
+
return [];
|
|
58
|
+
return [{ id, file: filePath, dir: planDirPath, isArchive, name: dirName }];
|
|
59
|
+
}
|
|
60
|
+
catch (_err) {
|
|
61
|
+
return [];
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
const getAllPlans = (taskManagerRoot) => {
|
|
66
|
+
const sources = [
|
|
67
|
+
{ dir: path.join(taskManagerRoot, 'plans'), isArchive: false },
|
|
68
|
+
{ dir: path.join(taskManagerRoot, 'archive'), isArchive: true },
|
|
69
|
+
];
|
|
70
|
+
return sources.flatMap(({ dir, isArchive }) => {
|
|
71
|
+
if (!fs.existsSync(dir))
|
|
72
|
+
return [];
|
|
73
|
+
let entries;
|
|
74
|
+
try {
|
|
75
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
76
|
+
}
|
|
77
|
+
catch (_err) {
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
return entries
|
|
81
|
+
.filter(e => e.isDirectory())
|
|
82
|
+
.flatMap(e => scanPlanDir(path.join(dir, e.name), e.name, isArchive));
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
exports.getAllPlans = getAllPlans;
|
|
86
|
+
const computeNextPlanId = (taskManagerRoot) => {
|
|
87
|
+
const plans = (0, exports.getAllPlans)(taskManagerRoot);
|
|
88
|
+
return plans.reduce((max, p) => Math.max(max, p.id), 0) + 1;
|
|
89
|
+
};
|
|
90
|
+
exports.computeNextPlanId = computeNextPlanId;
|
|
91
|
+
//# sourceMappingURL=plan-scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-scan.js","sourceRoot":"","sources":["../../../src/skill-scripts/shared/plan-scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../../src/skill-scripts/shared/root.ts"],"names":[],"mappings":"AAgEA,eAAO,MAAM,mBAAmB,GAAI,YAAW,MAAsB,KAAG,MAAM,GAAG,IAOhF,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
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.findStrikethrooRoot = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
// In the bundled .cjs, esbuild's `define` substitutes the identifier with an
|
|
40
|
+
// integer literal. In direct TS execution (Vitest), the ambient declaration
|
|
41
|
+
// has no runtime value; the `typeof` guard avoids a ReferenceError and falls
|
|
42
|
+
// back to the initial schema version.
|
|
43
|
+
const EXPECTED_SCHEMA = typeof EXPECTED_WORKSPACE_SCHEMA_VERSION !== 'undefined' ? EXPECTED_WORKSPACE_SCHEMA_VERSION : 1;
|
|
44
|
+
const isValidStrikethrooRoot = (strikethrooPath) => {
|
|
45
|
+
try {
|
|
46
|
+
if (!fs.existsSync(strikethrooPath))
|
|
47
|
+
return false;
|
|
48
|
+
if (!fs.lstatSync(strikethrooPath).isDirectory())
|
|
49
|
+
return false;
|
|
50
|
+
const metadataPath = path.join(strikethrooPath, '.init-metadata.json');
|
|
51
|
+
if (!fs.existsSync(metadataPath))
|
|
52
|
+
return false;
|
|
53
|
+
const metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf8'));
|
|
54
|
+
return metadata && typeof metadata === 'object' && 'version' in metadata;
|
|
55
|
+
}
|
|
56
|
+
catch (_err) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const getStrikethrooAt = (directory) => {
|
|
61
|
+
const strikethrooPath = path.join(directory, '.ai', 'strikethroo');
|
|
62
|
+
return isValidStrikethrooRoot(strikethrooPath) ? strikethrooPath : null;
|
|
63
|
+
};
|
|
64
|
+
const getParentPaths = (currentPath, acc = []) => {
|
|
65
|
+
const absolutePath = path.resolve(currentPath);
|
|
66
|
+
const nextAcc = [...acc, absolutePath];
|
|
67
|
+
const parentPath = path.dirname(absolutePath);
|
|
68
|
+
if (parentPath === absolutePath)
|
|
69
|
+
return nextAcc;
|
|
70
|
+
return getParentPaths(parentPath, nextAcc);
|
|
71
|
+
};
|
|
72
|
+
const checkWorkspaceSchema = (metadataPath) => {
|
|
73
|
+
let metadata;
|
|
74
|
+
try {
|
|
75
|
+
metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf8'));
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const actual = typeof metadata.workspaceSchemaVersion === 'number' ? metadata.workspaceSchemaVersion : 1;
|
|
81
|
+
if (actual === EXPECTED_SCHEMA)
|
|
82
|
+
return;
|
|
83
|
+
if (actual < EXPECTED_SCHEMA) {
|
|
84
|
+
process.stderr.write(`Workspace schema v${actual} is older than this skill requires (v${EXPECTED_SCHEMA}). ` +
|
|
85
|
+
'Re-run `npx strikethroo init` with the latest CLI to update.\n');
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
process.stderr.write(`This skill (built for workspace schema v${EXPECTED_SCHEMA}) is older than the workspace (v${actual}). ` +
|
|
89
|
+
'Re-run `npx skills add e0ipso/strikethroo` to update skills.\n');
|
|
90
|
+
}
|
|
91
|
+
process.exit(1);
|
|
92
|
+
};
|
|
93
|
+
const findStrikethrooRoot = (startPath = process.cwd()) => {
|
|
94
|
+
const paths = getParentPaths(startPath);
|
|
95
|
+
const found = paths.find(p => getStrikethrooAt(p));
|
|
96
|
+
if (!found)
|
|
97
|
+
return null;
|
|
98
|
+
const root = getStrikethrooAt(found);
|
|
99
|
+
if (root)
|
|
100
|
+
checkWorkspaceSchema(path.join(root, '.init-metadata.json'));
|
|
101
|
+
return root;
|
|
102
|
+
};
|
|
103
|
+
exports.findStrikethrooRoot = findStrikethrooRoot;
|
|
104
|
+
//# sourceMappingURL=root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root.js","sourceRoot":"","sources":["../../../src/skill-scripts/shared/root.ts"],"names":[],"mappings":"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"}
|