strikethroo 3.0.1 → 3.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.
Files changed (137) hide show
  1. package/README.md +20 -5
  2. package/dist/cli.js +19 -128
  3. package/dist/cli.js.map +1 -1
  4. package/dist/serve/archive.d.ts +43 -0
  5. package/dist/serve/archive.d.ts.map +1 -0
  6. package/dist/serve/archive.js +124 -0
  7. package/dist/serve/archive.js.map +1 -0
  8. package/dist/serve/derivation.d.ts +78 -0
  9. package/dist/serve/derivation.d.ts.map +1 -0
  10. package/dist/serve/derivation.js +237 -0
  11. package/dist/serve/derivation.js.map +1 -0
  12. package/dist/serve/events.d.ts +41 -0
  13. package/dist/serve/events.d.ts.map +1 -0
  14. package/dist/serve/events.js +91 -0
  15. package/dist/serve/events.js.map +1 -0
  16. package/dist/serve/markdown.d.ts +75 -0
  17. package/dist/serve/markdown.d.ts.map +1 -0
  18. package/dist/serve/markdown.js +221 -0
  19. package/dist/serve/markdown.js.map +1 -0
  20. package/dist/serve/root.d.ts +48 -0
  21. package/dist/serve/root.d.ts.map +1 -0
  22. package/dist/serve/root.js +110 -0
  23. package/dist/serve/root.js.map +1 -0
  24. package/dist/serve/self-review.d.ts +70 -0
  25. package/dist/serve/self-review.d.ts.map +1 -0
  26. package/dist/serve/self-review.js +164 -0
  27. package/dist/serve/self-review.js.map +1 -0
  28. package/dist/serve/server.d.ts +70 -0
  29. package/dist/serve/server.d.ts.map +1 -0
  30. package/dist/serve/server.js +368 -0
  31. package/dist/serve/server.js.map +1 -0
  32. package/dist/serve/watcher.d.ts +32 -0
  33. package/dist/serve/watcher.d.ts.map +1 -0
  34. package/dist/serve/watcher.js +99 -0
  35. package/dist/serve/watcher.js.map +1 -0
  36. package/dist/serve/workspace-model.d.ts +80 -0
  37. package/dist/serve/workspace-model.d.ts.map +1 -0
  38. package/dist/serve/workspace-model.js +176 -0
  39. package/dist/serve/workspace-model.js.map +1 -0
  40. package/dist/skill-scripts/shared/frontmatter.d.ts +2 -0
  41. package/dist/skill-scripts/shared/frontmatter.d.ts.map +1 -0
  42. package/dist/skill-scripts/shared/frontmatter.js +37 -0
  43. package/dist/skill-scripts/shared/frontmatter.js.map +1 -0
  44. package/dist/skill-scripts/shared/plan-scan.d.ts +10 -0
  45. package/dist/skill-scripts/shared/plan-scan.d.ts.map +1 -0
  46. package/dist/skill-scripts/shared/plan-scan.js +91 -0
  47. package/dist/skill-scripts/shared/plan-scan.js.map +1 -0
  48. package/dist/skill-scripts/shared/root.d.ts +2 -0
  49. package/dist/skill-scripts/shared/root.d.ts.map +1 -0
  50. package/dist/skill-scripts/shared/root.js +104 -0
  51. package/dist/skill-scripts/shared/root.js.map +1 -0
  52. package/dist-web/assets/Fraunces-Italic-VariableFont_SOFT_WONK_opsz_wght-CuXX_kIb.ttf +0 -0
  53. package/dist-web/assets/Fraunces-VariableFont_SOFT_WONK_opsz_wght-DLWfSgHL.ttf +0 -0
  54. package/dist-web/assets/Outfit-VariableFont_wght-B6lQlNBM.ttf +0 -0
  55. package/dist-web/assets/SFMonoBold-DXHgGUoo.otf +0 -0
  56. package/dist-web/assets/SFMonoBoldItalic-CdGEImHi.otf +0 -0
  57. package/dist-web/assets/SFMonoHeavy-DL92f7rT.otf +0 -0
  58. package/dist-web/assets/SFMonoHeavyItalic-DnE00LFH.otf +0 -0
  59. package/dist-web/assets/SFMonoLight-CaMC1gg-.otf +0 -0
  60. package/dist-web/assets/SFMonoLightItalic-DG3Owzn7.otf +0 -0
  61. package/dist-web/assets/SFMonoMedium-ypRDCKSo.otf +0 -0
  62. package/dist-web/assets/SFMonoMediumItalic-DkJk-c-x.otf +0 -0
  63. package/dist-web/assets/SFMonoRegular-77Uh1IPk.otf +0 -0
  64. package/dist-web/assets/SFMonoRegularItalic-Cn01bACm.otf +0 -0
  65. package/dist-web/assets/SFMonoSemibold-CvhtzcyM.otf +0 -0
  66. package/dist-web/assets/SFMonoSemiboldItalic-D75NMH13.otf +0 -0
  67. package/dist-web/assets/arc-BWWIDtzc.js +1 -0
  68. package/dist-web/assets/architectureDiagram-3BPJPVTR-DeYxmq4e.js +36 -0
  69. package/dist-web/assets/blockDiagram-GPEHLZMM-DR85OQGh.js +132 -0
  70. package/dist-web/assets/c4Diagram-AAUBKEIU-B5p4vlmU.js +10 -0
  71. package/dist-web/assets/channel-BaP08-ph.js +1 -0
  72. package/dist-web/assets/chunk-2J33WTMH-duXs_Bbu.js +1 -0
  73. package/dist-web/assets/chunk-4BX2VUAB-DR1619KE.js +1 -0
  74. package/dist-web/assets/chunk-55IACEB6-UacLKom4.js +1 -0
  75. package/dist-web/assets/chunk-727SXJPM-DW2a_NI7.js +206 -0
  76. package/dist-web/assets/chunk-AQP2D5EJ-Bu5jn-_L.js +231 -0
  77. package/dist-web/assets/chunk-FMBD7UC4-eJsExyuh.js +15 -0
  78. package/dist-web/assets/chunk-ND2GUHAM-BqKmGd94.js +1 -0
  79. package/dist-web/assets/chunk-QZHKN3VN--ynTiOCz.js +1 -0
  80. package/dist-web/assets/classDiagram-4FO5ZUOK-V5dHIfdR.js +1 -0
  81. package/dist-web/assets/classDiagram-v2-Q7XG4LA2-V5dHIfdR.js +1 -0
  82. package/dist-web/assets/cose-bilkent-S5V4N54A-Ccz3r4S1.js +1 -0
  83. package/dist-web/assets/cytoscape.esm-BHYC38rz.js +331 -0
  84. package/dist-web/assets/dagre-BM42HDAG-BESSLbjB.js +4 -0
  85. package/dist-web/assets/defaultLocale-CrowFXzY.js +1 -0
  86. package/dist-web/assets/diagram-2AECGRRQ-BB5cYRbY.js +43 -0
  87. package/dist-web/assets/diagram-5GNKFQAL-3lmcZFDS.js +10 -0
  88. package/dist-web/assets/diagram-KO2AKTUF-DUMp202y.js +3 -0
  89. package/dist-web/assets/diagram-LMA3HP47-DCGXhLm1.js +24 -0
  90. package/dist-web/assets/diagram-OG6HWLK6-D247gj5y.js +24 -0
  91. package/dist-web/assets/erDiagram-TEJ5UH35-GI1vhsr2.js +85 -0
  92. package/dist-web/assets/flowDiagram-I6XJVG4X-iqUPWZuf.js +162 -0
  93. package/dist-web/assets/ganttDiagram-6RSMTGT7-DfG1X-Pe.js +292 -0
  94. package/dist-web/assets/gitGraphDiagram-PVQCEYII-B2MrV3y6.js +106 -0
  95. package/dist-web/assets/graph-Dqkl27Ch.js +1 -0
  96. package/dist-web/assets/index-Bm5I46eC.css +1 -0
  97. package/dist-web/assets/index-CvfrFREc.js +125 -0
  98. package/dist-web/assets/infoDiagram-5YYISTIA-DGqU5K4a.js +2 -0
  99. package/dist-web/assets/init-Gi6I4Gst.js +1 -0
  100. package/dist-web/assets/ishikawaDiagram-YF4QCWOH-DrMH3jRf.js +70 -0
  101. package/dist-web/assets/journeyDiagram-JHISSGLW-BH4wiwsd.js +139 -0
  102. package/dist-web/assets/kanban-definition-UN3LZRKU-DEV_dEgE.js +89 -0
  103. package/dist-web/assets/katex-C5jXJg4s.js +257 -0
  104. package/dist-web/assets/layout-DO9UvE1P.js +1 -0
  105. package/dist-web/assets/linear-D81nAxzR.js +1 -0
  106. package/dist-web/assets/mermaid.core-BaP7clO2.js +307 -0
  107. package/dist-web/assets/mindmap-definition-RKZ34NQL-DM4iAZ4M.js +96 -0
  108. package/dist-web/assets/ordinal-Cboi1Yqb.js +1 -0
  109. package/dist-web/assets/pieDiagram-4H26LBE5-DinO6q5i.js +30 -0
  110. package/dist-web/assets/quadrantDiagram-W4KKPZXB-CYvCm7U6.js +7 -0
  111. package/dist-web/assets/requirementDiagram-4Y6WPE33-DXfPIJ5m.js +84 -0
  112. package/dist-web/assets/sankeyDiagram-5OEKKPKP-CfovFay4.js +40 -0
  113. package/dist-web/assets/sequenceDiagram-3UESZ5HK-BboUGmEB.js +162 -0
  114. package/dist-web/assets/stateDiagram-AJRCARHV-CsB2FtnQ.js +1 -0
  115. package/dist-web/assets/stateDiagram-v2-BHNVJYJU-D0D_KesS.js +1 -0
  116. package/dist-web/assets/timeline-definition-PNZ67QCA-Cma1yLcq.js +120 -0
  117. package/dist-web/assets/vennDiagram-CIIHVFJN-DhFGEgCQ.js +34 -0
  118. package/dist-web/assets/wardley-L42UT6IY-DYkCeynG.js +173 -0
  119. package/dist-web/assets/wardleyDiagram-YWT4CUSO-jogT61m_.js +78 -0
  120. package/dist-web/assets/xychartDiagram-2RQKCTM6-Cn3W0E3s.js +7 -0
  121. package/dist-web/favicon.svg +13 -0
  122. package/dist-web/index.html +30 -0
  123. package/package.json +28 -8
  124. package/templates/harness/skills/st-full-workflow/SKILL.md +2 -2
  125. package/templates/harness/skills/st-generate-tasks/SKILL.md +2 -2
  126. package/dist/plan-utils.d.ts +0 -35
  127. package/dist/plan-utils.d.ts.map +0 -1
  128. package/dist/plan-utils.js +0 -123
  129. package/dist/plan-utils.js.map +0 -1
  130. package/dist/plan.d.ts +0 -27
  131. package/dist/plan.d.ts.map +0 -1
  132. package/dist/plan.js +0 -279
  133. package/dist/plan.js.map +0 -1
  134. package/dist/status.d.ts +0 -73
  135. package/dist/status.d.ts.map +0 -1
  136. package/dist/status.js +0 -375
  137. package/dist/status.js.map +0 -1
@@ -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,2 @@
1
+ export declare const extractPlanId: (content: string, _filePath: string) => number | null;
2
+ //# sourceMappingURL=frontmatter.d.ts.map
@@ -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,2 @@
1
+ export declare const findStrikethrooRoot: (startPath?: string) => string | null;
2
+ //# sourceMappingURL=root.d.ts.map
@@ -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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"}
@@ -0,0 +1 @@
1
+ import{bk as ln,aN as an,H as k,b7 as w,F as N,ag as un,V as g,bc as tn,b8 as C,aH as _,c as rn,m as o,aF as on,j as sn,d as fn}from"./mermaid.core-BaP7clO2.js";function cn(l){return l.innerRadius}function gn(l){return l.outerRadius}function yn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,j,F,v,A,O,a){var q=j-l,i=F-h,n=O-v,d=a-A,u=d*q-n*i;if(!(u*u<g))return u=(n*(h-A)-d*(l-v))/u,[l+u*q,h+u*i]}function Q(l,h,j,F,v,A,O){var a=l-j,q=h-F,i=(O?A:-A)/C(a*a+q*q),n=i*q,d=-i*a,u=l+n,s=h+d,f=j+n,c=F+d,S=(u+f)/2,t=(s+c)/2,m=f-u,y=c-s,R=m*m+y*y,T=v-A,P=u*c-f*s,D=(y<0?-1:1)*C(on(0,T*T*R-P*P)),E=(P*y-m*D)/R,I=(-P*m-y*D)/R,b=(P*y+m*D)/R,p=(-P*m+y*D)/R,x=E-S,e=I-t,r=b-S,V=p-t;return x*x+e*e>r*r+V*V&&(E=b,I=p),{cx:E,cy:I,x01:-n,y01:-d,x11:E*(v/T-1),y11:I*(v/T-1)}}function hn(){var l=cn,h=gn,j=N(0),F=null,v=yn,A=dn,O=mn,a=null,q=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=A.apply(this,arguments)-un,S=rn(c-f),t=c>f;if(a||(a=n=q()),s<u&&(d=s,s=u,u=d),!(s>g))a.moveTo(0,0);else if(S>tn-g)a.moveTo(s*k(f),s*w(f)),a.arc(0,0,s,f,c,!t),u>g&&(a.moveTo(u*k(c),u*w(c)),a.arc(0,0,u,c,f,t));else{var m=f,y=c,R=f,T=c,P=S,D=S,E=O.apply(this,arguments)/2,I=E>g&&(F?+F.apply(this,arguments):C(u*u+s*s)),b=_(rn(s-u)/2,+j.apply(this,arguments)),p=b,x=b,e,r;if(I>g){var V=sn(I/u*w(E)),G=sn(I/s*w(E));(P-=V*2)>g?(V*=t?1:-1,R+=V,T-=V):(P=0,R=T=(f+c)/2),(D-=G*2)>g?(G*=t?1:-1,m+=G,y-=G):(D=0,m=y=(f+c)/2)}var z=s*k(m),B=s*w(m),J=u*k(T),K=u*w(T);if(b>g){var L=s*k(y),M=s*w(y),U=u*k(R),W=u*w(R),H;if(S<an)if(H=pn(z,B,U,W,L,M,J,K)){var X=z-H[0],Y=B-H[1],Z=L-H[0],$=M-H[1],nn=1/w(fn((X*Z+Y*$)/(C(X*X+Y*Y)*C(Z*Z+$*$)))/2),en=C(H[0]*H[0]+H[1]*H[1]);p=_(b,(u-en)/(nn-1)),x=_(b,(s-en)/(nn+1))}else p=x=0}D>g?x>g?(e=Q(U,W,z,B,s,x,t),r=Q(L,M,J,K,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<b?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(z,B),a.arc(0,0,s,m,y,!t)):a.moveTo(z,B),!(u>g)||!(P>g)?a.lineTo(J,K):p>g?(e=Q(J,K,L,M,u,-p,t),r=Q(z,B,U,W,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<b?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-an/2;return[k(d)*n,w(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:N(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:N(+n),i):h},i.cornerRadius=function(n){return arguments.length?(j=typeof n=="function"?n:N(+n),i):j},i.padRadius=function(n){return arguments.length?(F=n==null?null:typeof n=="function"?n:N(+n),i):F},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:N(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:N(+n),i):A},i.padAngle=function(n){return arguments.length?(O=typeof n=="function"?n:N(+n),i):O},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};