@holdpoint/yaml-core 0.1.0-alpha.5 → 0.1.0-alpha.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +98 -0
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -178,6 +178,49 @@ declare const HoldpointConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
|
|
|
178
178
|
}, unknown>, "many">>;
|
|
179
179
|
patterns: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
180
180
|
session_context_files: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
181
|
+
engines: z.ZodOptional<z.ZodObject<{
|
|
182
|
+
claude: z.ZodOptional<z.ZodObject<{
|
|
183
|
+
stop_command: z.ZodOptional<z.ZodString>;
|
|
184
|
+
}, "strip", z.ZodTypeAny, {
|
|
185
|
+
stop_command?: string | undefined;
|
|
186
|
+
}, {
|
|
187
|
+
stop_command?: string | undefined;
|
|
188
|
+
}>>;
|
|
189
|
+
codex: z.ZodOptional<z.ZodObject<{
|
|
190
|
+
stop_command: z.ZodOptional<z.ZodString>;
|
|
191
|
+
}, "strip", z.ZodTypeAny, {
|
|
192
|
+
stop_command?: string | undefined;
|
|
193
|
+
}, {
|
|
194
|
+
stop_command?: string | undefined;
|
|
195
|
+
}>>;
|
|
196
|
+
copilot: z.ZodOptional<z.ZodObject<{
|
|
197
|
+
check_command: z.ZodOptional<z.ZodString>;
|
|
198
|
+
}, "strip", z.ZodTypeAny, {
|
|
199
|
+
check_command?: string | undefined;
|
|
200
|
+
}, {
|
|
201
|
+
check_command?: string | undefined;
|
|
202
|
+
}>>;
|
|
203
|
+
}, "strip", z.ZodTypeAny, {
|
|
204
|
+
claude?: {
|
|
205
|
+
stop_command?: string | undefined;
|
|
206
|
+
} | undefined;
|
|
207
|
+
codex?: {
|
|
208
|
+
stop_command?: string | undefined;
|
|
209
|
+
} | undefined;
|
|
210
|
+
copilot?: {
|
|
211
|
+
check_command?: string | undefined;
|
|
212
|
+
} | undefined;
|
|
213
|
+
}, {
|
|
214
|
+
claude?: {
|
|
215
|
+
stop_command?: string | undefined;
|
|
216
|
+
} | undefined;
|
|
217
|
+
codex?: {
|
|
218
|
+
stop_command?: string | undefined;
|
|
219
|
+
} | undefined;
|
|
220
|
+
copilot?: {
|
|
221
|
+
check_command?: string | undefined;
|
|
222
|
+
} | undefined;
|
|
223
|
+
}>>;
|
|
181
224
|
}, "strip", z.ZodTypeAny, {
|
|
182
225
|
checks: {
|
|
183
226
|
id: string;
|
|
@@ -202,6 +245,17 @@ declare const HoldpointConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
|
|
|
202
245
|
}[];
|
|
203
246
|
patterns?: Record<string, string> | undefined;
|
|
204
247
|
session_context_files?: string[] | undefined;
|
|
248
|
+
engines?: {
|
|
249
|
+
claude?: {
|
|
250
|
+
stop_command?: string | undefined;
|
|
251
|
+
} | undefined;
|
|
252
|
+
codex?: {
|
|
253
|
+
stop_command?: string | undefined;
|
|
254
|
+
} | undefined;
|
|
255
|
+
copilot?: {
|
|
256
|
+
check_command?: string | undefined;
|
|
257
|
+
} | undefined;
|
|
258
|
+
} | undefined;
|
|
205
259
|
}, {
|
|
206
260
|
checks?: unknown[] | undefined;
|
|
207
261
|
version?: number | undefined;
|
|
@@ -218,6 +272,17 @@ declare const HoldpointConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
|
|
|
218
272
|
}[] | undefined;
|
|
219
273
|
patterns?: Record<string, string> | undefined;
|
|
220
274
|
session_context_files?: string[] | undefined;
|
|
275
|
+
engines?: {
|
|
276
|
+
claude?: {
|
|
277
|
+
stop_command?: string | undefined;
|
|
278
|
+
} | undefined;
|
|
279
|
+
codex?: {
|
|
280
|
+
stop_command?: string | undefined;
|
|
281
|
+
} | undefined;
|
|
282
|
+
copilot?: {
|
|
283
|
+
check_command?: string | undefined;
|
|
284
|
+
} | undefined;
|
|
285
|
+
} | undefined;
|
|
221
286
|
}>, {
|
|
222
287
|
checks: {
|
|
223
288
|
id: string;
|
|
@@ -242,6 +307,17 @@ declare const HoldpointConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
|
|
|
242
307
|
}[];
|
|
243
308
|
patterns?: Record<string, string> | undefined;
|
|
244
309
|
session_context_files?: string[] | undefined;
|
|
310
|
+
engines?: {
|
|
311
|
+
claude?: {
|
|
312
|
+
stop_command?: string | undefined;
|
|
313
|
+
} | undefined;
|
|
314
|
+
codex?: {
|
|
315
|
+
stop_command?: string | undefined;
|
|
316
|
+
} | undefined;
|
|
317
|
+
copilot?: {
|
|
318
|
+
check_command?: string | undefined;
|
|
319
|
+
} | undefined;
|
|
320
|
+
} | undefined;
|
|
245
321
|
}, {
|
|
246
322
|
checks?: unknown[] | undefined;
|
|
247
323
|
version?: number | undefined;
|
|
@@ -258,6 +334,17 @@ declare const HoldpointConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
|
|
|
258
334
|
}[] | undefined;
|
|
259
335
|
patterns?: Record<string, string> | undefined;
|
|
260
336
|
session_context_files?: string[] | undefined;
|
|
337
|
+
engines?: {
|
|
338
|
+
claude?: {
|
|
339
|
+
stop_command?: string | undefined;
|
|
340
|
+
} | undefined;
|
|
341
|
+
codex?: {
|
|
342
|
+
stop_command?: string | undefined;
|
|
343
|
+
} | undefined;
|
|
344
|
+
copilot?: {
|
|
345
|
+
check_command?: string | undefined;
|
|
346
|
+
} | undefined;
|
|
347
|
+
} | undefined;
|
|
261
348
|
}>, {
|
|
262
349
|
checks: {
|
|
263
350
|
id: string;
|
|
@@ -282,6 +369,17 @@ declare const HoldpointConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
|
|
|
282
369
|
}[];
|
|
283
370
|
patterns?: Record<string, string> | undefined;
|
|
284
371
|
session_context_files?: string[] | undefined;
|
|
372
|
+
engines?: {
|
|
373
|
+
claude?: {
|
|
374
|
+
stop_command?: string | undefined;
|
|
375
|
+
} | undefined;
|
|
376
|
+
codex?: {
|
|
377
|
+
stop_command?: string | undefined;
|
|
378
|
+
} | undefined;
|
|
379
|
+
copilot?: {
|
|
380
|
+
check_command?: string | undefined;
|
|
381
|
+
} | undefined;
|
|
382
|
+
} | undefined;
|
|
285
383
|
}, unknown>;
|
|
286
384
|
|
|
287
385
|
export { CheckDefSchema, ConditionDefSchema, HoldpointConfigSchema, HookEventSchema, generateYaml, matchesWhen, parseHoldpointYaml, validateConfig };
|
package/dist/index.js
CHANGED
|
@@ -96,6 +96,11 @@ var BUILTIN_SCOPES = /* @__PURE__ */ new Set([
|
|
|
96
96
|
"docs",
|
|
97
97
|
"structural"
|
|
98
98
|
]);
|
|
99
|
+
var EnginesConfigSchema = z.object({
|
|
100
|
+
claude: z.object({ stop_command: z.string().optional() }).optional(),
|
|
101
|
+
codex: z.object({ stop_command: z.string().optional() }).optional(),
|
|
102
|
+
copilot: z.object({ check_command: z.string().optional() }).optional()
|
|
103
|
+
}).optional();
|
|
99
104
|
var HoldpointConfigSchema = z.preprocess(
|
|
100
105
|
migrateLegacyConfig,
|
|
101
106
|
z.object({
|
|
@@ -104,7 +109,8 @@ var HoldpointConfigSchema = z.preprocess(
|
|
|
104
109
|
conditions: z.array(ConditionDefSchema).default([]),
|
|
105
110
|
checks: z.array(CheckDefSchema).default([]),
|
|
106
111
|
patterns: z.record(z.string()).optional(),
|
|
107
|
-
session_context_files: z.array(z.string()).optional()
|
|
112
|
+
session_context_files: z.array(z.string()).optional(),
|
|
113
|
+
engines: EnginesConfigSchema
|
|
108
114
|
}).superRefine((data, ctx) => {
|
|
109
115
|
if (!data.patterns) return;
|
|
110
116
|
for (const [key, value] of Object.entries(data.patterns)) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/parser.ts","../src/schema.ts"],"sourcesContent":["import * as yaml from \"js-yaml\";\nimport type { HoldpointConfig, ValidationResult } from \"@holdpoint/types\";\nimport { HoldpointConfigSchema } from \"./schema.js\";\n\n/**\n * Parse a checks.yaml text into a HoldpointConfig.\n * Throws on invalid YAML or schema violations.\n */\nexport function parseHoldpointYaml(text: string): HoldpointConfig {\n const raw = yaml.load(text);\n const result = HoldpointConfigSchema.safeParse(raw);\n if (!result.success) {\n const messages = result.error.errors.map((e) => `${e.path.join(\".\")}: ${e.message}`).join(\"\\n\");\n throw new Error(`Invalid checks.yaml:\\n${messages}`);\n }\n return result.data as HoldpointConfig;\n}\n\n/**\n * Validate a parsed HoldpointConfig, returning structured errors.\n */\nexport function validateConfig(config: HoldpointConfig): ValidationResult {\n const result = HoldpointConfigSchema.safeParse(config);\n if (result.success) {\n return { valid: true, errors: [] };\n }\n return {\n valid: false,\n errors: result.error.errors.map((e) => ({\n path: e.path.join(\".\"),\n message: e.message,\n })),\n };\n}\n\n/**\n * Serialize a HoldpointConfig back to YAML text.\n */\nexport function generateYaml(config: HoldpointConfig): string {\n return yaml.dump(config, {\n indent: 2,\n lineWidth: 120,\n quotingType: '\"',\n forceQuotes: false,\n noRefs: true,\n });\n}\n","import { z } from \"zod\";\n\n// ─── Zod schemas ─────────────────────────────────────────────────────────────\n\nexport const HookEventSchema = z.enum([\"before_done\"]);\n\nexport const ConditionOperatorSchema = z.enum([\n \"file_exists\",\n \"file_contains\",\n \"env_var_set\",\n \"shell_returns_0\",\n]);\n\nexport const ConditionDefSchema = z.object({\n id: z.string().min(1),\n operator: ConditionOperatorSchema,\n path: z.string().optional(),\n contains: z.string().optional(),\n envVar: z.string().optional(),\n cmd: z.string().optional(),\n});\n\n/**\n * Per-item migration: handles legacy `trigger: { type, pattern }` → on/when\n * and legacy `manual:` field → `prompt:`.\n */\nfunction migrateLegacyCheckDef(raw: unknown): unknown {\n if (raw == null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n const result: Record<string, unknown> = { ...obj };\n\n // migrate trigger: { type, pattern } → on/when\n if (\"trigger\" in result && !(\"on\" in result) && !(\"when\" in result)) {\n const { trigger } = result;\n delete result.trigger;\n const t = trigger as Record<string, unknown>;\n if (t.type !== \"always\") {\n result.when = t.type === \"custom\" ? t.pattern : t.type;\n }\n }\n\n // migrate manual: → prompt:\n if (\"manual\" in result && !(\"prompt\" in result)) {\n result.prompt = result.manual;\n delete result.manual;\n }\n\n return result;\n}\n\n/**\n * Top-level migration: collapses ALL legacy array names into `checks:`.\n * Handles: deterministic, manual, task, prompt (any combination).\n * Existing `checks:` entries are preserved and come first.\n */\nfunction migrateLegacyConfig(raw: unknown): unknown {\n if (raw == null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n const result: Record<string, unknown> = { ...obj };\n\n const toArray = (key: string) => (Array.isArray(result[key]) ? (result[key] as unknown[]) : []);\n\n const merged = [\n ...toArray(\"checks\"),\n ...toArray(\"task\"),\n ...toArray(\"prompt\"),\n ...toArray(\"deterministic\"),\n ...toArray(\"manual\"),\n ].map(migrateLegacyCheckDef);\n\n if (\n \"checks\" in result ||\n \"task\" in result ||\n \"prompt\" in result ||\n \"deterministic\" in result ||\n \"manual\" in result\n ) {\n result.checks = merged;\n delete result.task;\n delete result.prompt;\n delete result.deterministic;\n delete result.manual;\n }\n\n return result;\n}\n\nexport const CheckDefSchema = z.preprocess(\n migrateLegacyCheckDef,\n z\n .object({\n id: z.string().min(1),\n label: z.string().min(1),\n on: HookEventSchema.optional(),\n when: z.string().optional(),\n cmd: z.string().optional(),\n prompt: z.string().optional(),\n conditionId: z.string().optional(),\n })\n .refine((c) => c.cmd !== undefined || c.prompt !== undefined, {\n message: \"A check must have either cmd (task) or prompt (agent instruction)\",\n }),\n);\n\nexport const HoldpointContextSchema = z.object({\n guides: z.record(z.string()).default({}),\n});\n\n/** Built-in scope names that cannot be overridden by user-defined patterns. */\nconst BUILTIN_SCOPES = new Set([\n \"frontend\",\n \"backend\",\n \"socket\",\n \"visual\",\n \"python\",\n \"go\",\n \"rust\",\n \"java\",\n \"ruby\",\n \"database\",\n \"prisma\",\n \"testing\",\n \"infra\",\n \"ci\",\n \"docs\",\n \"structural\",\n]);\n\nexport const HoldpointConfigSchema = z.preprocess(\n migrateLegacyConfig,\n z\n .object({\n version: z.number().int().positive().default(1),\n context: HoldpointContextSchema.default({ guides: {} }),\n conditions: z.array(ConditionDefSchema).default([]),\n checks: z.array(CheckDefSchema).default([]),\n patterns: z.record(z.string()).optional(),\n session_context_files: z.array(z.string()).optional(),\n })\n .superRefine((data, ctx) => {\n if (!data.patterns) return;\n for (const [key, value] of Object.entries(data.patterns)) {\n if (BUILTIN_SCOPES.has(key)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `'${key}' is a built-in scope name and cannot be redefined in patterns`,\n path: [\"patterns\", key],\n });\n }\n try {\n new RegExp(value);\n } catch {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Invalid regex in patterns.${key}: '${value}'`,\n path: [\"patterns\", key],\n });\n }\n }\n }),\n);\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/parser.ts","../src/schema.ts"],"sourcesContent":["import * as yaml from \"js-yaml\";\nimport type { HoldpointConfig, ValidationResult } from \"@holdpoint/types\";\nimport { HoldpointConfigSchema } from \"./schema.js\";\n\n/**\n * Parse a checks.yaml text into a HoldpointConfig.\n * Throws on invalid YAML or schema violations.\n */\nexport function parseHoldpointYaml(text: string): HoldpointConfig {\n const raw = yaml.load(text);\n const result = HoldpointConfigSchema.safeParse(raw);\n if (!result.success) {\n const messages = result.error.errors.map((e) => `${e.path.join(\".\")}: ${e.message}`).join(\"\\n\");\n throw new Error(`Invalid checks.yaml:\\n${messages}`);\n }\n return result.data as HoldpointConfig;\n}\n\n/**\n * Validate a parsed HoldpointConfig, returning structured errors.\n */\nexport function validateConfig(config: HoldpointConfig): ValidationResult {\n const result = HoldpointConfigSchema.safeParse(config);\n if (result.success) {\n return { valid: true, errors: [] };\n }\n return {\n valid: false,\n errors: result.error.errors.map((e) => ({\n path: e.path.join(\".\"),\n message: e.message,\n })),\n };\n}\n\n/**\n * Serialize a HoldpointConfig back to YAML text.\n */\nexport function generateYaml(config: HoldpointConfig): string {\n return yaml.dump(config, {\n indent: 2,\n lineWidth: 120,\n quotingType: '\"',\n forceQuotes: false,\n noRefs: true,\n });\n}\n","import { z } from \"zod\";\n\n// ─── Zod schemas ─────────────────────────────────────────────────────────────\n\nexport const HookEventSchema = z.enum([\"before_done\"]);\n\nexport const ConditionOperatorSchema = z.enum([\n \"file_exists\",\n \"file_contains\",\n \"env_var_set\",\n \"shell_returns_0\",\n]);\n\nexport const ConditionDefSchema = z.object({\n id: z.string().min(1),\n operator: ConditionOperatorSchema,\n path: z.string().optional(),\n contains: z.string().optional(),\n envVar: z.string().optional(),\n cmd: z.string().optional(),\n});\n\n/**\n * Per-item migration: handles legacy `trigger: { type, pattern }` → on/when\n * and legacy `manual:` field → `prompt:`.\n */\nfunction migrateLegacyCheckDef(raw: unknown): unknown {\n if (raw == null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n const result: Record<string, unknown> = { ...obj };\n\n // migrate trigger: { type, pattern } → on/when\n if (\"trigger\" in result && !(\"on\" in result) && !(\"when\" in result)) {\n const { trigger } = result;\n delete result.trigger;\n const t = trigger as Record<string, unknown>;\n if (t.type !== \"always\") {\n result.when = t.type === \"custom\" ? t.pattern : t.type;\n }\n }\n\n // migrate manual: → prompt:\n if (\"manual\" in result && !(\"prompt\" in result)) {\n result.prompt = result.manual;\n delete result.manual;\n }\n\n return result;\n}\n\n/**\n * Top-level migration: collapses ALL legacy array names into `checks:`.\n * Handles: deterministic, manual, task, prompt (any combination).\n * Existing `checks:` entries are preserved and come first.\n */\nfunction migrateLegacyConfig(raw: unknown): unknown {\n if (raw == null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n const result: Record<string, unknown> = { ...obj };\n\n const toArray = (key: string) => (Array.isArray(result[key]) ? (result[key] as unknown[]) : []);\n\n const merged = [\n ...toArray(\"checks\"),\n ...toArray(\"task\"),\n ...toArray(\"prompt\"),\n ...toArray(\"deterministic\"),\n ...toArray(\"manual\"),\n ].map(migrateLegacyCheckDef);\n\n if (\n \"checks\" in result ||\n \"task\" in result ||\n \"prompt\" in result ||\n \"deterministic\" in result ||\n \"manual\" in result\n ) {\n result.checks = merged;\n delete result.task;\n delete result.prompt;\n delete result.deterministic;\n delete result.manual;\n }\n\n return result;\n}\n\nexport const CheckDefSchema = z.preprocess(\n migrateLegacyCheckDef,\n z\n .object({\n id: z.string().min(1),\n label: z.string().min(1),\n on: HookEventSchema.optional(),\n when: z.string().optional(),\n cmd: z.string().optional(),\n prompt: z.string().optional(),\n conditionId: z.string().optional(),\n })\n .refine((c) => c.cmd !== undefined || c.prompt !== undefined, {\n message: \"A check must have either cmd (task) or prompt (agent instruction)\",\n }),\n);\n\nexport const HoldpointContextSchema = z.object({\n guides: z.record(z.string()).default({}),\n});\n\n/** Built-in scope names that cannot be overridden by user-defined patterns. */\nconst BUILTIN_SCOPES = new Set([\n \"frontend\",\n \"backend\",\n \"socket\",\n \"visual\",\n \"python\",\n \"go\",\n \"rust\",\n \"java\",\n \"ruby\",\n \"database\",\n \"prisma\",\n \"testing\",\n \"infra\",\n \"ci\",\n \"docs\",\n \"structural\",\n]);\n\nconst EnginesConfigSchema = z\n .object({\n claude: z.object({ stop_command: z.string().optional() }).optional(),\n codex: z.object({ stop_command: z.string().optional() }).optional(),\n copilot: z.object({ check_command: z.string().optional() }).optional(),\n })\n .optional();\n\nexport const HoldpointConfigSchema = z.preprocess(\n migrateLegacyConfig,\n z\n .object({\n version: z.number().int().positive().default(1),\n context: HoldpointContextSchema.default({ guides: {} }),\n conditions: z.array(ConditionDefSchema).default([]),\n checks: z.array(CheckDefSchema).default([]),\n patterns: z.record(z.string()).optional(),\n session_context_files: z.array(z.string()).optional(),\n engines: EnginesConfigSchema,\n })\n .superRefine((data, ctx) => {\n if (!data.patterns) return;\n for (const [key, value] of Object.entries(data.patterns)) {\n if (BUILTIN_SCOPES.has(key)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `'${key}' is a built-in scope name and cannot be redefined in patterns`,\n path: [\"patterns\", key],\n });\n }\n try {\n new RegExp(value);\n } catch {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Invalid regex in patterns.${key}: '${value}'`,\n path: [\"patterns\", key],\n });\n }\n }\n }),\n);\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@holdpoint/yaml-core",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.7",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public",
|
|
6
6
|
"tag": "alpha"
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"js-yaml": "^4.1.0",
|
|
51
51
|
"minimatch": "^10.0.1",
|
|
52
52
|
"zod": "^3.24.1",
|
|
53
|
-
"@holdpoint/types": "0.1.0-alpha.
|
|
53
|
+
"@holdpoint/types": "0.1.0-alpha.6"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@types/js-yaml": "^4.0.9",
|