shreni 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.
Files changed (269) hide show
  1. package/ARCHITECTURE.md +260 -0
  2. package/LICENSE +201 -0
  3. package/README.md +519 -0
  4. package/TRADEMARK.md +97 -0
  5. package/dist/agents/parikshaka.d.ts +11 -0
  6. package/dist/agents/parikshaka.d.ts.map +1 -0
  7. package/dist/agents/parikshaka.js +80 -0
  8. package/dist/agents/parikshaka.js.map +1 -0
  9. package/dist/agents/providers/claude.d.ts +3 -0
  10. package/dist/agents/providers/claude.d.ts.map +1 -0
  11. package/dist/agents/providers/claude.js +100 -0
  12. package/dist/agents/providers/claude.js.map +1 -0
  13. package/dist/agents/providers/codex.d.ts +3 -0
  14. package/dist/agents/providers/codex.d.ts.map +1 -0
  15. package/dist/agents/providers/codex.js +123 -0
  16. package/dist/agents/providers/codex.js.map +1 -0
  17. package/dist/agents/providers/gemini.d.ts +3 -0
  18. package/dist/agents/providers/gemini.d.ts.map +1 -0
  19. package/dist/agents/providers/gemini.js +77 -0
  20. package/dist/agents/providers/gemini.js.map +1 -0
  21. package/dist/agents/providers/index.d.ts +6 -0
  22. package/dist/agents/providers/index.d.ts.map +1 -0
  23. package/dist/agents/providers/index.js +35 -0
  24. package/dist/agents/providers/index.js.map +1 -0
  25. package/dist/agents/providers/registry.d.ts +20 -0
  26. package/dist/agents/providers/registry.d.ts.map +1 -0
  27. package/dist/agents/providers/registry.js +91 -0
  28. package/dist/agents/providers/registry.js.map +1 -0
  29. package/dist/agents/providers/types.d.ts +42 -0
  30. package/dist/agents/providers/types.d.ts.map +1 -0
  31. package/dist/agents/providers/types.js +61 -0
  32. package/dist/agents/providers/types.js.map +1 -0
  33. package/dist/agents/runner.d.ts +6 -0
  34. package/dist/agents/runner.d.ts.map +1 -0
  35. package/dist/agents/runner.js +159 -0
  36. package/dist/agents/runner.js.map +1 -0
  37. package/dist/agents/silpi.d.ts +3 -0
  38. package/dist/agents/silpi.d.ts.map +1 -0
  39. package/dist/agents/silpi.js +101 -0
  40. package/dist/agents/silpi.js.map +1 -0
  41. package/dist/agents/viharapala.d.ts +5 -0
  42. package/dist/agents/viharapala.d.ts.map +1 -0
  43. package/dist/agents/viharapala.js +128 -0
  44. package/dist/agents/viharapala.js.map +1 -0
  45. package/dist/cli/agents.d.ts +14 -0
  46. package/dist/cli/agents.d.ts.map +1 -0
  47. package/dist/cli/agents.js +47 -0
  48. package/dist/cli/agents.js.map +1 -0
  49. package/dist/cli/detect-toolchain.d.ts +10 -0
  50. package/dist/cli/detect-toolchain.d.ts.map +1 -0
  51. package/dist/cli/detect-toolchain.js +77 -0
  52. package/dist/cli/detect-toolchain.js.map +1 -0
  53. package/dist/cli/index.d.ts +3 -0
  54. package/dist/cli/index.d.ts.map +1 -0
  55. package/dist/cli/index.js +342 -0
  56. package/dist/cli/index.js.map +1 -0
  57. package/dist/cli/init-kshetra.d.ts +59 -0
  58. package/dist/cli/init-kshetra.d.ts.map +1 -0
  59. package/dist/cli/init-kshetra.js +531 -0
  60. package/dist/cli/init-kshetra.js.map +1 -0
  61. package/dist/cli/list.d.ts +11 -0
  62. package/dist/cli/list.d.ts.map +1 -0
  63. package/dist/cli/list.js +45 -0
  64. package/dist/cli/list.js.map +1 -0
  65. package/dist/cli/logs.d.ts +20 -0
  66. package/dist/cli/logs.d.ts.map +1 -0
  67. package/dist/cli/logs.js +144 -0
  68. package/dist/cli/logs.js.map +1 -0
  69. package/dist/cli/migrate.d.ts +8 -0
  70. package/dist/cli/migrate.d.ts.map +1 -0
  71. package/dist/cli/migrate.js +116 -0
  72. package/dist/cli/migrate.js.map +1 -0
  73. package/dist/cli/pause.d.ts +24 -0
  74. package/dist/cli/pause.d.ts.map +1 -0
  75. package/dist/cli/pause.js +41 -0
  76. package/dist/cli/pause.js.map +1 -0
  77. package/dist/cli/phalaka-autostart.d.ts +11 -0
  78. package/dist/cli/phalaka-autostart.d.ts.map +1 -0
  79. package/dist/cli/phalaka-autostart.js +28 -0
  80. package/dist/cli/phalaka-autostart.js.map +1 -0
  81. package/dist/cli/phalaka-server.d.ts +2 -0
  82. package/dist/cli/phalaka-server.d.ts.map +1 -0
  83. package/dist/cli/phalaka-server.js +20 -0
  84. package/dist/cli/phalaka-server.js.map +1 -0
  85. package/dist/cli/phalaka.d.ts +30 -0
  86. package/dist/cli/phalaka.d.ts.map +1 -0
  87. package/dist/cli/phalaka.js +60 -0
  88. package/dist/cli/phalaka.js.map +1 -0
  89. package/dist/cli/pid.d.ts +9 -0
  90. package/dist/cli/pid.d.ts.map +1 -0
  91. package/dist/cli/pid.js +66 -0
  92. package/dist/cli/pid.js.map +1 -0
  93. package/dist/cli/provider-preflight.d.ts +11 -0
  94. package/dist/cli/provider-preflight.d.ts.map +1 -0
  95. package/dist/cli/provider-preflight.js +70 -0
  96. package/dist/cli/provider-preflight.js.map +1 -0
  97. package/dist/cli/register.d.ts +8 -0
  98. package/dist/cli/register.d.ts.map +1 -0
  99. package/dist/cli/register.js +34 -0
  100. package/dist/cli/register.js.map +1 -0
  101. package/dist/cli/run.d.ts +3 -0
  102. package/dist/cli/run.d.ts.map +1 -0
  103. package/dist/cli/run.js +40 -0
  104. package/dist/cli/run.js.map +1 -0
  105. package/dist/cli/start.d.ts +11 -0
  106. package/dist/cli/start.d.ts.map +1 -0
  107. package/dist/cli/start.js +26 -0
  108. package/dist/cli/start.js.map +1 -0
  109. package/dist/cli/status.d.ts +39 -0
  110. package/dist/cli/status.d.ts.map +1 -0
  111. package/dist/cli/status.js +207 -0
  112. package/dist/cli/status.js.map +1 -0
  113. package/dist/cli/stop.d.ts +13 -0
  114. package/dist/cli/stop.d.ts.map +1 -0
  115. package/dist/cli/stop.js +18 -0
  116. package/dist/cli/stop.js.map +1 -0
  117. package/dist/cli/sync.d.ts +6 -0
  118. package/dist/cli/sync.d.ts.map +1 -0
  119. package/dist/cli/sync.js +31 -0
  120. package/dist/cli/sync.js.map +1 -0
  121. package/dist/cli/tail.d.ts +6 -0
  122. package/dist/cli/tail.d.ts.map +1 -0
  123. package/dist/cli/tail.js +170 -0
  124. package/dist/cli/tail.js.map +1 -0
  125. package/dist/cli/telemetry.d.ts +2 -0
  126. package/dist/cli/telemetry.d.ts.map +1 -0
  127. package/dist/cli/telemetry.js +42 -0
  128. package/dist/cli/telemetry.js.map +1 -0
  129. package/dist/cli/verify-hooks.d.ts +12 -0
  130. package/dist/cli/verify-hooks.d.ts.map +1 -0
  131. package/dist/cli/verify-hooks.js +38 -0
  132. package/dist/cli/verify-hooks.js.map +1 -0
  133. package/dist/cli/worker.d.ts +2 -0
  134. package/dist/cli/worker.d.ts.map +1 -0
  135. package/dist/cli/worker.js +211 -0
  136. package/dist/cli/worker.js.map +1 -0
  137. package/dist/kshetra/config.d.ts +64 -0
  138. package/dist/kshetra/config.d.ts.map +1 -0
  139. package/dist/kshetra/config.js +173 -0
  140. package/dist/kshetra/config.js.map +1 -0
  141. package/dist/kshetra/registry.d.ts +5 -0
  142. package/dist/kshetra/registry.d.ts.map +1 -0
  143. package/dist/kshetra/registry.js +69 -0
  144. package/dist/kshetra/registry.js.map +1 -0
  145. package/dist/kshetra/state.d.ts +57 -0
  146. package/dist/kshetra/state.d.ts.map +1 -0
  147. package/dist/kshetra/state.js +195 -0
  148. package/dist/kshetra/state.js.map +1 -0
  149. package/dist/kshetra/toolchain.d.ts +20 -0
  150. package/dist/kshetra/toolchain.d.ts.map +1 -0
  151. package/dist/kshetra/toolchain.js +146 -0
  152. package/dist/kshetra/toolchain.js.map +1 -0
  153. package/dist/phalaka/api.d.ts +123 -0
  154. package/dist/phalaka/api.d.ts.map +1 -0
  155. package/dist/phalaka/api.js +196 -0
  156. package/dist/phalaka/api.js.map +1 -0
  157. package/dist/phalaka/beads-read.d.ts +49 -0
  158. package/dist/phalaka/beads-read.d.ts.map +1 -0
  159. package/dist/phalaka/beads-read.js +174 -0
  160. package/dist/phalaka/beads-read.js.map +1 -0
  161. package/dist/phalaka/pid.d.ts +6 -0
  162. package/dist/phalaka/pid.d.ts.map +1 -0
  163. package/dist/phalaka/pid.js +48 -0
  164. package/dist/phalaka/pid.js.map +1 -0
  165. package/dist/phalaka/server.d.ts +10 -0
  166. package/dist/phalaka/server.d.ts.map +1 -0
  167. package/dist/phalaka/server.js +30 -0
  168. package/dist/phalaka/server.js.map +1 -0
  169. package/dist/phalaka/token.d.ts +5 -0
  170. package/dist/phalaka/token.d.ts.map +1 -0
  171. package/dist/phalaka/token.js +40 -0
  172. package/dist/phalaka/token.js.map +1 -0
  173. package/dist/phalaka/ui.d.ts +15 -0
  174. package/dist/phalaka/ui.d.ts.map +1 -0
  175. package/dist/phalaka/ui.js +233 -0
  176. package/dist/phalaka/ui.js.map +1 -0
  177. package/dist/sthapathi/activity-log.d.ts +68 -0
  178. package/dist/sthapathi/activity-log.d.ts.map +1 -0
  179. package/dist/sthapathi/activity-log.js +57 -0
  180. package/dist/sthapathi/activity-log.js.map +1 -0
  181. package/dist/sthapathi/beads.d.ts +27 -0
  182. package/dist/sthapathi/beads.d.ts.map +1 -0
  183. package/dist/sthapathi/beads.js +153 -0
  184. package/dist/sthapathi/beads.js.map +1 -0
  185. package/dist/sthapathi/branch.d.ts +5 -0
  186. package/dist/sthapathi/branch.d.ts.map +1 -0
  187. package/dist/sthapathi/branch.js +20 -0
  188. package/dist/sthapathi/branch.js.map +1 -0
  189. package/dist/sthapathi/dispatch.d.ts +14 -0
  190. package/dist/sthapathi/dispatch.d.ts.map +1 -0
  191. package/dist/sthapathi/dispatch.js +326 -0
  192. package/dist/sthapathi/dispatch.js.map +1 -0
  193. package/dist/sthapathi/errors.d.ts +27 -0
  194. package/dist/sthapathi/errors.d.ts.map +1 -0
  195. package/dist/sthapathi/errors.js +174 -0
  196. package/dist/sthapathi/errors.js.map +1 -0
  197. package/dist/sthapathi/gh.d.ts +19 -0
  198. package/dist/sthapathi/gh.d.ts.map +1 -0
  199. package/dist/sthapathi/gh.js +69 -0
  200. package/dist/sthapathi/gh.js.map +1 -0
  201. package/dist/sthapathi/git.d.ts +41 -0
  202. package/dist/sthapathi/git.d.ts.map +1 -0
  203. package/dist/sthapathi/git.js +199 -0
  204. package/dist/sthapathi/git.js.map +1 -0
  205. package/dist/sthapathi/guard.d.ts +24 -0
  206. package/dist/sthapathi/guard.d.ts.map +1 -0
  207. package/dist/sthapathi/guard.js +64 -0
  208. package/dist/sthapathi/guard.js.map +1 -0
  209. package/dist/sthapathi/health.d.ts +23 -0
  210. package/dist/sthapathi/health.d.ts.map +1 -0
  211. package/dist/sthapathi/health.js +142 -0
  212. package/dist/sthapathi/health.js.map +1 -0
  213. package/dist/sthapathi/index.d.ts +21 -0
  214. package/dist/sthapathi/index.d.ts.map +1 -0
  215. package/dist/sthapathi/index.js +88 -0
  216. package/dist/sthapathi/index.js.map +1 -0
  217. package/dist/sthapathi/lifecycle.d.ts +7 -0
  218. package/dist/sthapathi/lifecycle.d.ts.map +1 -0
  219. package/dist/sthapathi/lifecycle.js +43 -0
  220. package/dist/sthapathi/lifecycle.js.map +1 -0
  221. package/dist/sthapathi/lint.d.ts +8 -0
  222. package/dist/sthapathi/lint.d.ts.map +1 -0
  223. package/dist/sthapathi/lint.js +33 -0
  224. package/dist/sthapathi/lint.js.map +1 -0
  225. package/dist/sthapathi/merge.d.ts +18 -0
  226. package/dist/sthapathi/merge.d.ts.map +1 -0
  227. package/dist/sthapathi/merge.js +259 -0
  228. package/dist/sthapathi/merge.js.map +1 -0
  229. package/dist/sthapathi/notifications.d.ts +14 -0
  230. package/dist/sthapathi/notifications.d.ts.map +1 -0
  231. package/dist/sthapathi/notifications.js +57 -0
  232. package/dist/sthapathi/notifications.js.map +1 -0
  233. package/dist/sthapathi/parikshaka-dispatch.d.ts +12 -0
  234. package/dist/sthapathi/parikshaka-dispatch.d.ts.map +1 -0
  235. package/dist/sthapathi/parikshaka-dispatch.js +0 -0
  236. package/dist/sthapathi/parikshaka-dispatch.js.map +1 -0
  237. package/dist/sthapathi/pickup.d.ts +13 -0
  238. package/dist/sthapathi/pickup.d.ts.map +1 -0
  239. package/dist/sthapathi/pickup.js +144 -0
  240. package/dist/sthapathi/pickup.js.map +1 -0
  241. package/dist/sthapathi/recover.d.ts +16 -0
  242. package/dist/sthapathi/recover.d.ts.map +1 -0
  243. package/dist/sthapathi/recover.js +149 -0
  244. package/dist/sthapathi/recover.js.map +1 -0
  245. package/dist/sthapathi/retry.d.ts +11 -0
  246. package/dist/sthapathi/retry.d.ts.map +1 -0
  247. package/dist/sthapathi/retry.js +42 -0
  248. package/dist/sthapathi/retry.js.map +1 -0
  249. package/dist/sthapathi/self-heal.d.ts +19 -0
  250. package/dist/sthapathi/self-heal.d.ts.map +1 -0
  251. package/dist/sthapathi/self-heal.js +46 -0
  252. package/dist/sthapathi/self-heal.js.map +1 -0
  253. package/dist/sthapathi/types.d.ts +56 -0
  254. package/dist/sthapathi/types.d.ts.map +1 -0
  255. package/dist/sthapathi/types.js +4 -0
  256. package/dist/sthapathi/types.js.map +1 -0
  257. package/dist/sthapathi/watchdog.d.ts +27 -0
  258. package/dist/sthapathi/watchdog.d.ts.map +1 -0
  259. package/dist/sthapathi/watchdog.js +145 -0
  260. package/dist/sthapathi/watchdog.js.map +1 -0
  261. package/dist/telemetry/telemetry.d.ts +42 -0
  262. package/dist/telemetry/telemetry.d.ts.map +1 -0
  263. package/dist/telemetry/telemetry.js +189 -0
  264. package/dist/telemetry/telemetry.js.map +1 -0
  265. package/dist/test-setup.d.ts +2 -0
  266. package/dist/test-setup.d.ts.map +1 -0
  267. package/dist/test-setup.js +16 -0
  268. package/dist/test-setup.js.map +1 -0
  269. package/package.json +71 -0
@@ -0,0 +1,173 @@
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.KshetraConfigError = exports.KshetraConfigSchema = void 0;
37
+ exports.loadKshetraConfig = loadKshetraConfig;
38
+ const zod_1 = require("zod");
39
+ const fs_1 = require("fs");
40
+ const yaml = __importStar(require("js-yaml"));
41
+ const path_1 = require("path");
42
+ const registry_js_1 = require("../agents/providers/registry.js");
43
+ // Single source of truth for the default agent model. Codex/Gemini have no
44
+ // bakeable default (providerDefaultModel returns null, OQ1), so the schema
45
+ // default is the confirmed Claude model; a Codex/Gemini Kshetra sets agents.model
46
+ // explicitly at init.
47
+ const DEFAULT_AGENT_MODEL = (0, registry_js_1.providerDefaultModel)('anthropic');
48
+ const RepoConfigSchema = zod_1.z.object({
49
+ path: zod_1.z.string(),
50
+ remote: zod_1.z.string(),
51
+ mainBranch: zod_1.z.string().default('main'),
52
+ branchPattern: zod_1.z.string().default('bead-{id}/{slug}'),
53
+ // Where approved work lands (3r2). 'push' (default): squash-merge the bead
54
+ // branch straight to main on APPROVE — today's behaviour. 'pr': open a PR
55
+ // (bead branch → main) and DEFER — the bead is kept open (in_progress +
56
+ // `awaiting-merge` label) so bd dependents stay blocked until the code is on
57
+ // main, and is closed only when its PR actually merges (reconcilePullRequests).
58
+ // Optional for back-compat; resolveMergePolicy() treats an absent value as
59
+ // 'push' and lets SHRENI_MERGE_POLICY override at runtime.
60
+ mergePolicy: zod_1.z.enum(['push', 'pr']).optional(),
61
+ });
62
+ const BeadsConfigSchema = zod_1.z.object({
63
+ path: zod_1.z.string(),
64
+ remote: zod_1.z.string(),
65
+ mode: zod_1.z.literal('embedded').default('embedded'),
66
+ });
67
+ const StackConfigSchema = zod_1.z.object({
68
+ language: zod_1.z.string(),
69
+ framework: zod_1.z.string().optional(),
70
+ // Selects the default command family for node profiles (pnpm/npm/yarn).
71
+ packageManager: zod_1.z.string().optional(),
72
+ testRunner: zod_1.z.string().optional(),
73
+ linter: zod_1.z.string().optional(),
74
+ // Authoritative build/compile gate Viharapala must pass before approving a
75
+ // task branch. For TS/Next projects `next build` runs tsc, so `pnpm build`
76
+ // (the default) doubles as the type-check gate — there is no separate tsc
77
+ // script. A failing build means type errors reached the branch. Omit to use
78
+ // the language default; set to "" to explicitly skip the build gate.
79
+ buildCommand: zod_1.z.string().optional(),
80
+ // Enforced lint gate (the toolchain design §3.3). When set, the harness runs it as
81
+ // an independent gate; omit to skip lint (never synthesised for a repo that
82
+ // has none).
83
+ lintCommand: zod_1.z.string().optional(),
84
+ // Optional escape hatches (§3.4) — usually unnecessary; the runner's own
85
+ // config already declares these. Set testFileGlobs/vendorDirs only when the
86
+ // harness must discover tests WITHOUT invoking the runner (Parikshaka's
87
+ // static walk), and failCountPattern only for a non-standard test summary.
88
+ testFileGlobs: zod_1.z.array(zod_1.z.string()).optional(),
89
+ vendorDirs: zod_1.z.array(zod_1.z.string()).optional(),
90
+ failCountPattern: zod_1.z.string().optional(),
91
+ });
92
+ const ConventionsConfigSchema = zod_1.z.object({
93
+ styleGuide: zod_1.z.string().optional(),
94
+ architecture: zod_1.z.string().optional(),
95
+ // Reviewer-only custom instructions (the agent-execution design §3.3 channel B). A
96
+ // pointer to a file Shreni reads and injects into the Viharapala prompt ONLY —
97
+ // no provider has a reviewer-only native file, so this is the one role-scoped
98
+ // injection that survives the native flip. Adds review criteria/rubric but
99
+ // cannot disable a Shreni hard gate (precedence: gates > reviewGuide > shared
100
+ // native criteria). Shared criteria that should also shape Silpi belong in the
101
+ // native instruction file / @-imported .shreni/review-guide.md instead.
102
+ reviewGuide: zod_1.z.string().optional(),
103
+ });
104
+ const AgentsConfigSchema = zod_1.z.object({
105
+ provider: zod_1.z.enum(['anthropic', 'gemini', 'openai']).default('anthropic'),
106
+ model: zod_1.z.string().default(DEFAULT_AGENT_MODEL),
107
+ maxRoundsPerBead: zod_1.z.number().int().min(1).default(3),
108
+ });
109
+ // RESERVED — neither field is read at runtime yet. p0AutoAssign (auto-assign P0
110
+ // beads) and maxConcurrentBeads (per-Kshetra concurrency) are accepted and
111
+ // validated so existing configs keep working and the fields are stable, but they
112
+ // currently drive nothing. Concurrency is a Non-Goal in the design-Sthapathi; wire these
113
+ // up (or drop them) before relying on either. See the project-init design §3.7 / OQ2.
114
+ const PriorityConfigSchema = zod_1.z.object({
115
+ p0AutoAssign: zod_1.z.boolean().default(true),
116
+ maxConcurrentBeads: zod_1.z.number().int().min(1).default(1),
117
+ });
118
+ // Optional per-Kshetra overrides for the stuck-watchdog and recovery budget.
119
+ // Any omitted field falls back to the defaults in watchdog.ts / recover.ts.
120
+ const WatchdogConfigSchema = zod_1.z.object({
121
+ stuckThresholdMs: zod_1.z.number().int().positive().optional(),
122
+ maxOutcomeRepeat: zod_1.z.number().int().min(1).optional(),
123
+ maxRecoverAttempts: zod_1.z.number().int().min(1).optional(),
124
+ });
125
+ exports.KshetraConfigSchema = zod_1.z.object({
126
+ id: zod_1.z.string().regex(/^[a-z0-9-]+$/, 'id must be lowercase alphanumeric with hyphens'),
127
+ name: zod_1.z.string(),
128
+ description: zod_1.z.string().optional(),
129
+ repo: RepoConfigSchema,
130
+ beads: BeadsConfigSchema,
131
+ stack: StackConfigSchema,
132
+ conventions: ConventionsConfigSchema.default({ styleGuide: undefined, architecture: undefined }),
133
+ agents: AgentsConfigSchema.default({ provider: 'anthropic', model: DEFAULT_AGENT_MODEL, maxRoundsPerBead: 3 }),
134
+ priority: PriorityConfigSchema.default({ p0AutoAssign: true, maxConcurrentBeads: 1 }),
135
+ watchdog: WatchdogConfigSchema.optional(),
136
+ });
137
+ class KshetraConfigError extends Error {
138
+ configPath;
139
+ cause;
140
+ constructor(configPath, message, cause) {
141
+ super(`[${configPath}] ${message}`);
142
+ this.configPath = configPath;
143
+ this.cause = cause;
144
+ this.name = 'KshetraConfigError';
145
+ }
146
+ }
147
+ exports.KshetraConfigError = KshetraConfigError;
148
+ function loadKshetraConfig(configPath) {
149
+ const resolved = (0, path_1.resolve)(configPath);
150
+ let raw;
151
+ try {
152
+ raw = (0, fs_1.readFileSync)(resolved, 'utf8');
153
+ }
154
+ catch (err) {
155
+ throw new KshetraConfigError(resolved, `Cannot read file: ${err.message}`, err);
156
+ }
157
+ let parsed;
158
+ try {
159
+ parsed = yaml.load(raw);
160
+ }
161
+ catch (err) {
162
+ throw new KshetraConfigError(resolved, `Invalid YAML: ${err.message}`, err);
163
+ }
164
+ const result = exports.KshetraConfigSchema.safeParse(parsed);
165
+ if (!result.success) {
166
+ const issues = result.error.issues
167
+ .map(i => ` ${i.path.join('.')}: ${i.message}`)
168
+ .join('\n');
169
+ throw new KshetraConfigError(resolved, `Schema validation failed:\n${issues}`);
170
+ }
171
+ return result.data;
172
+ }
173
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/kshetra/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type KshetraConfig } from './config.js';
2
+ export declare function loadRegistry(): KshetraConfig[];
3
+ export declare function registerKshetra(id: string, configPath: string): void;
4
+ export declare function unregisterKshetra(id: string): void;
5
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/kshetra/registry.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyC,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AA8BxF,wBAAgB,YAAY,IAAI,aAAa,EAAE,CAyB9C;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAkBpE;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAIlD"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadRegistry = loadRegistry;
4
+ exports.registerKshetra = registerKshetra;
5
+ exports.unregisterKshetra = unregisterKshetra;
6
+ const fs_1 = require("fs");
7
+ const path_1 = require("path");
8
+ const os_1 = require("os");
9
+ const config_js_1 = require("./config.js");
10
+ const REGISTRY_PATH = (0, path_1.resolve)((0, os_1.homedir)(), '.shreni', 'registry.json');
11
+ function readRegistry() {
12
+ try {
13
+ const raw = (0, fs_1.readFileSync)(REGISTRY_PATH, 'utf8');
14
+ return JSON.parse(raw);
15
+ }
16
+ catch (err) {
17
+ const e = err;
18
+ if (e.code === 'ENOENT')
19
+ return { kshetras: [] };
20
+ throw new Error(`Cannot read registry at ${REGISTRY_PATH}: ${e.message}`);
21
+ }
22
+ }
23
+ function writeRegistry(registry) {
24
+ (0, fs_1.mkdirSync)((0, path_1.dirname)(REGISTRY_PATH), { recursive: true });
25
+ (0, fs_1.writeFileSync)(REGISTRY_PATH, JSON.stringify(registry, null, 2), 'utf8');
26
+ }
27
+ function loadRegistry() {
28
+ const registry = readRegistry();
29
+ const configs = [];
30
+ for (const entry of registry.kshetras) {
31
+ try {
32
+ const config = (0, config_js_1.loadKshetraConfig)(entry.configPath);
33
+ configs.push(config);
34
+ }
35
+ catch (err) {
36
+ if (err instanceof config_js_1.KshetraConfigError &&
37
+ err.cause?.code === 'ENOENT') {
38
+ console.warn(`[registry] Skipping kshetra "${entry.id}": config not found at ${entry.configPath}`);
39
+ }
40
+ else {
41
+ console.warn(`[registry] Skipping kshetra "${entry.id}": ${err.message}`);
42
+ }
43
+ }
44
+ }
45
+ return configs;
46
+ }
47
+ function registerKshetra(id, configPath) {
48
+ const registry = readRegistry();
49
+ const resolved = (0, path_1.resolve)(configPath);
50
+ const existing = registry.kshetras.findIndex(k => k.id === id);
51
+ const entry = {
52
+ id,
53
+ configPath: resolved,
54
+ registeredAt: new Date().toISOString(),
55
+ };
56
+ if (existing >= 0) {
57
+ registry.kshetras[existing] = entry;
58
+ }
59
+ else {
60
+ registry.kshetras.push(entry);
61
+ }
62
+ writeRegistry(registry);
63
+ }
64
+ function unregisterKshetra(id) {
65
+ const registry = readRegistry();
66
+ registry.kshetras = registry.kshetras.filter(k => k.id !== id);
67
+ writeRegistry(registry);
68
+ }
69
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/kshetra/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { KshetraConfig } from './config.js';
2
+ interface KshetraState {
3
+ paused: boolean;
4
+ reason?: string;
5
+ message?: string;
6
+ pausedAt?: string;
7
+ requiresManualResume?: boolean;
8
+ healthBaseline?: number;
9
+ beadAttempts?: Record<string, number>;
10
+ lastProgressAt?: string;
11
+ lastOutcome?: string;
12
+ outcomeRepeatCount?: number;
13
+ stuck?: {
14
+ since: string;
15
+ reason: string;
16
+ remediation: string;
17
+ phase?: string;
18
+ beadId?: string;
19
+ };
20
+ phase?: string;
21
+ }
22
+ interface State {
23
+ kshetras: Record<string, KshetraState>;
24
+ }
25
+ export declare function loadState(): State;
26
+ export declare function pauseKshetra(kshetra: KshetraConfig, opts: {
27
+ cooldownMs?: number;
28
+ manual?: boolean;
29
+ reason: string;
30
+ message: string;
31
+ }): void;
32
+ export declare function resumeKshetra(kshetra: KshetraConfig): void;
33
+ export declare function recordProgress(kshetra: KshetraConfig): void;
34
+ export declare function recordStall(kshetra: KshetraConfig, outcome: string): number;
35
+ export declare function setStuck(kshetra: KshetraConfig, info: {
36
+ reason: string;
37
+ remediation: string;
38
+ phase?: string;
39
+ beadId?: string;
40
+ }): void;
41
+ export declare function setPhase(kshetra: KshetraConfig, phase: string): void;
42
+ export declare function getProgressState(kshetra: KshetraConfig): {
43
+ lastProgressAt?: string;
44
+ lastOutcome?: string;
45
+ outcomeRepeatCount: number;
46
+ stuck?: KshetraState['stuck'];
47
+ };
48
+ export declare function getHealthBaseline(kshetra: KshetraConfig): number;
49
+ export declare function setHealthBaseline(kshetra: KshetraConfig, count: number): void;
50
+ export declare function recordBeadAttempt(kshetra: KshetraConfig, beadId: string): number;
51
+ export declare function getBeadAttempts(kshetra: KshetraConfig, beadId: string): number;
52
+ export declare function clearBeadAttempts(kshetra: KshetraConfig, beadId: string): void;
53
+ export declare function isKshetraManuallyPaused(kshetra: KshetraConfig): boolean;
54
+ export declare function clearStuckPauseOnRecover(kshetra: KshetraConfig): boolean;
55
+ export declare function clearCooldownPauses(): void;
56
+ export {};
57
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/kshetra/state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,UAAU,YAAY;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAI/B,cAAc,CAAC,EAAE,MAAM,CAAC;IAGxB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAItC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAGhG,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,KAAK;IACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACxC;AAED,wBAAgB,SAAS,IAAI,KAAK,CASjC;AAOD,wBAAgB,YAAY,CAC1B,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC/E,IAAI,CAWN;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAgB1D;AAGD,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAU3D;AAID,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAO3E;AAED,wBAAgB,QAAQ,CACtB,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7E,IAAI,CAQN;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAKpE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;CAC/B,CAQA;AAID,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAEhE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAO7E;AAGD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAQhF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE9E;AAID,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAQ9E;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAIvE;AAaD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAgBxE;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAQ1C"}
@@ -0,0 +1,195 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadState = loadState;
4
+ exports.pauseKshetra = pauseKshetra;
5
+ exports.resumeKshetra = resumeKshetra;
6
+ exports.recordProgress = recordProgress;
7
+ exports.recordStall = recordStall;
8
+ exports.setStuck = setStuck;
9
+ exports.setPhase = setPhase;
10
+ exports.getProgressState = getProgressState;
11
+ exports.getHealthBaseline = getHealthBaseline;
12
+ exports.setHealthBaseline = setHealthBaseline;
13
+ exports.recordBeadAttempt = recordBeadAttempt;
14
+ exports.getBeadAttempts = getBeadAttempts;
15
+ exports.clearBeadAttempts = clearBeadAttempts;
16
+ exports.isKshetraManuallyPaused = isKshetraManuallyPaused;
17
+ exports.clearStuckPauseOnRecover = clearStuckPauseOnRecover;
18
+ exports.clearCooldownPauses = clearCooldownPauses;
19
+ const fs_1 = require("fs");
20
+ const path_1 = require("path");
21
+ const os_1 = require("os");
22
+ const STATE_PATH = (0, path_1.resolve)((0, os_1.homedir)(), '.shreni', 'state.json');
23
+ function loadState() {
24
+ try {
25
+ const raw = (0, fs_1.readFileSync)(STATE_PATH, 'utf8');
26
+ return JSON.parse(raw);
27
+ }
28
+ catch (err) {
29
+ const e = err;
30
+ if (e.code === 'ENOENT')
31
+ return { kshetras: {} };
32
+ throw new Error(`Cannot read state at ${STATE_PATH}: ${e.message}`);
33
+ }
34
+ }
35
+ function saveState(state) {
36
+ (0, fs_1.mkdirSync)((0, path_1.dirname)(STATE_PATH), { recursive: true });
37
+ (0, fs_1.writeFileSync)(STATE_PATH, JSON.stringify(state, null, 2), 'utf8');
38
+ }
39
+ function pauseKshetra(kshetra, opts) {
40
+ const state = loadState();
41
+ state.kshetras[kshetra.id] = {
42
+ ...state.kshetras[kshetra.id],
43
+ paused: true,
44
+ reason: opts.reason,
45
+ message: opts.message,
46
+ pausedAt: new Date().toISOString(),
47
+ requiresManualResume: opts.manual ?? false,
48
+ };
49
+ saveState(state);
50
+ }
51
+ function resumeKshetra(kshetra) {
52
+ const state = loadState();
53
+ // Resume IS the circuit-breaker ACK (the watchdog design §3.3): the human has
54
+ // acted, so clear the stuck marker AND the manual-resume gate AND the stall counter,
55
+ // and start the worker fresh rather than re-tripping on a stale count or coming up
56
+ // still gated. Without clearing requiresManualResume the chip stays dimmed after an
57
+ // ACK even though the latch is gone (RC3 cosmetic leak).
58
+ const { stuck: _stuck, ...rest } = state.kshetras[kshetra.id] ?? { paused: false };
59
+ state.kshetras[kshetra.id] = {
60
+ ...rest,
61
+ paused: false,
62
+ requiresManualResume: false,
63
+ outcomeRepeatCount: 0,
64
+ lastOutcome: undefined,
65
+ };
66
+ saveState(state);
67
+ }
68
+ // Forward progress: stamp the time and clear the stall counter.
69
+ function recordProgress(kshetra) {
70
+ const state = loadState();
71
+ const current = state.kshetras[kshetra.id] ?? { paused: false };
72
+ state.kshetras[kshetra.id] = {
73
+ ...current,
74
+ lastProgressAt: new Date().toISOString(),
75
+ lastOutcome: undefined,
76
+ outcomeRepeatCount: 0,
77
+ };
78
+ saveState(state);
79
+ }
80
+ // A non-advancing outcome (preflight reject, off-branch abort, cycle error…).
81
+ // Increments the repeat counter when the same outcome recurs; returns the count.
82
+ function recordStall(kshetra, outcome) {
83
+ const state = loadState();
84
+ const current = state.kshetras[kshetra.id] ?? { paused: false };
85
+ const count = current.lastOutcome === outcome ? (current.outcomeRepeatCount ?? 0) + 1 : 1;
86
+ state.kshetras[kshetra.id] = { ...current, lastOutcome: outcome, outcomeRepeatCount: count };
87
+ saveState(state);
88
+ return count;
89
+ }
90
+ function setStuck(kshetra, info) {
91
+ const state = loadState();
92
+ const current = state.kshetras[kshetra.id] ?? { paused: false };
93
+ state.kshetras[kshetra.id] = {
94
+ ...current,
95
+ stuck: { since: new Date().toISOString(), ...info },
96
+ };
97
+ saveState(state);
98
+ }
99
+ function setPhase(kshetra, phase) {
100
+ const state = loadState();
101
+ const current = state.kshetras[kshetra.id] ?? { paused: false };
102
+ state.kshetras[kshetra.id] = { ...current, phase };
103
+ saveState(state);
104
+ }
105
+ function getProgressState(kshetra) {
106
+ const s = loadState().kshetras[kshetra.id];
107
+ return {
108
+ lastProgressAt: s?.lastProgressAt,
109
+ lastOutcome: s?.lastOutcome,
110
+ outcomeRepeatCount: s?.outcomeRepeatCount ?? 0,
111
+ stuck: s?.stuck,
112
+ };
113
+ }
114
+ // Accepted count of known-failing tests for the health gate. Defaults to 0
115
+ // (suite must be fully green) until quarantine bumps it.
116
+ function getHealthBaseline(kshetra) {
117
+ return loadState().kshetras[kshetra.id]?.healthBaseline ?? 0;
118
+ }
119
+ function setHealthBaseline(kshetra, count) {
120
+ const state = loadState();
121
+ state.kshetras[kshetra.id] = {
122
+ ...(state.kshetras[kshetra.id] ?? { paused: false }),
123
+ healthBaseline: count,
124
+ };
125
+ saveState(state);
126
+ }
127
+ // Record one more recovery attempt for a bead and return the new total.
128
+ function recordBeadAttempt(kshetra, beadId) {
129
+ const state = loadState();
130
+ const current = state.kshetras[kshetra.id] ?? { paused: false };
131
+ const attempts = { ...(current.beadAttempts ?? {}) };
132
+ attempts[beadId] = (attempts[beadId] ?? 0) + 1;
133
+ state.kshetras[kshetra.id] = { ...current, beadAttempts: attempts };
134
+ saveState(state);
135
+ return attempts[beadId];
136
+ }
137
+ function getBeadAttempts(kshetra, beadId) {
138
+ return loadState().kshetras[kshetra.id]?.beadAttempts?.[beadId] ?? 0;
139
+ }
140
+ // Clear a bead's attempt count — called when it finally succeeds, so a later
141
+ // unrelated reuse of the id (or a re-filed follow-up) starts fresh.
142
+ function clearBeadAttempts(kshetra, beadId) {
143
+ const state = loadState();
144
+ const current = state.kshetras[kshetra.id];
145
+ if (!current?.beadAttempts || !(beadId in current.beadAttempts))
146
+ return;
147
+ const attempts = { ...current.beadAttempts };
148
+ delete attempts[beadId];
149
+ state.kshetras[kshetra.id] = { ...current, beadAttempts: attempts };
150
+ saveState(state);
151
+ }
152
+ function isKshetraManuallyPaused(kshetra) {
153
+ const state = loadState();
154
+ const s = state.kshetras[kshetra.id];
155
+ return s?.paused === true && s.requiresManualResume === true;
156
+ }
157
+ // Clear a stale *stuck* pause on worker (re)start. The watchdog escalates a hung
158
+ // worker with paused+requiresManualResume and reason:'stuck'; its remediation
159
+ // tells the human to `shreni stop && shreni start` so RECOVER reconciles the
160
+ // drift. But RECOVER only reconciles git/beads/phase — without this, the fresh
161
+ // worker inherits the previous worker's pause and is dead-on-arrival (selectNext
162
+ // returns null, and the watchdog short-circuits on the leftover stuck marker),
163
+ // flying a stale banner forever. Once RECOVER has run the stuck condition is
164
+ // reconciled by definition, so clear it. A deliberate user pause (reason:
165
+ // 'manual', via `shreni pause`) is preserved — a restart must not silently
166
+ // un-pause work a human paused on purpose. Returns whether it cleared anything.
167
+ //
168
+ function clearStuckPauseOnRecover(kshetra) {
169
+ const state = loadState();
170
+ const s = state.kshetras[kshetra.id];
171
+ if (!s?.paused || s.reason !== 'stuck')
172
+ return false;
173
+ const { stuck: _stuck, ...rest } = s;
174
+ state.kshetras[kshetra.id] = {
175
+ ...rest,
176
+ paused: false,
177
+ requiresManualResume: false,
178
+ reason: undefined,
179
+ message: undefined,
180
+ outcomeRepeatCount: 0,
181
+ lastOutcome: undefined,
182
+ };
183
+ saveState(state);
184
+ return true;
185
+ }
186
+ function clearCooldownPauses() {
187
+ const state = loadState();
188
+ for (const [id, s] of Object.entries(state.kshetras)) {
189
+ if (s.paused && !s.requiresManualResume) {
190
+ state.kshetras[id] = { ...s, paused: false };
191
+ }
192
+ }
193
+ saveState(state);
194
+ }
195
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/kshetra/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { KshetraConfig } from './config.js';
2
+ export type ProfileKey = 'node' | 'python' | 'go' | 'rust' | 'java' | 'unknown';
3
+ interface Profile {
4
+ build: string;
5
+ test: string;
6
+ lint: string;
7
+ testFileGlobs: string[];
8
+ vendorDirs: string[];
9
+ }
10
+ export declare function normalizeLanguage(language: string): ProfileKey;
11
+ export declare function profileFor(kshetra: KshetraConfig): Profile;
12
+ export declare function resolveBuildCommand(kshetra: KshetraConfig): string;
13
+ export declare function resolveTestCommand(kshetra: KshetraConfig): string;
14
+ export declare function resolveLintCommand(kshetra: KshetraConfig): string;
15
+ export declare function resolveTestGlobs(kshetra: KshetraConfig): string[];
16
+ export declare function resolveVendorDirs(kshetra: KshetraConfig): string[];
17
+ export declare function splitCommand(command: string): string[];
18
+ export declare function matchesTestGlob(relPath: string, globs: string[]): boolean;
19
+ export {};
20
+ //# sourceMappingURL=toolchain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolchain.d.ts","sourceRoot":"","sources":["../../src/kshetra/toolchain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAUjD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAEhF,UAAU,OAAO;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAKD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAQ9D;AAwDD,wBAAgB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAI1D;AAUD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAElE;AAGD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAEjE;AAID,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAEjE;AAGD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,EAAE,CAEjE;AAGD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,EAAE,CAElE;AAID,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAGtD;AAqBD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAMzE"}