@haibun/core 3.6.0 → 3.8.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 (88) hide show
  1. package/build/currentVersion.d.ts +1 -1
  2. package/build/currentVersion.js +1 -1
  3. package/build/lib/EventLogger.d.ts +6 -7
  4. package/build/lib/EventLogger.d.ts.map +1 -1
  5. package/build/lib/EventLogger.js +12 -33
  6. package/build/lib/EventLogger.js.map +1 -1
  7. package/build/lib/PhaseRunner.d.ts +16 -0
  8. package/build/lib/PhaseRunner.d.ts.map +1 -0
  9. package/build/lib/PhaseRunner.js +39 -0
  10. package/build/lib/PhaseRunner.js.map +1 -0
  11. package/build/lib/defs.d.ts +9 -11
  12. package/build/lib/defs.d.ts.map +1 -1
  13. package/build/lib/defs.js +8 -0
  14. package/build/lib/defs.js.map +1 -1
  15. package/build/lib/feature-variables.d.ts +10 -22
  16. package/build/lib/feature-variables.d.ts.map +1 -1
  17. package/build/lib/feature-variables.js +42 -58
  18. package/build/lib/feature-variables.js.map +1 -1
  19. package/build/lib/filter-schema.d.ts +49 -0
  20. package/build/lib/filter-schema.d.ts.map +1 -0
  21. package/build/lib/filter-schema.js +104 -0
  22. package/build/lib/filter-schema.js.map +1 -0
  23. package/build/lib/filter-types.d.ts +71 -0
  24. package/build/lib/filter-types.d.ts.map +1 -0
  25. package/build/lib/filter-types.js +121 -0
  26. package/build/lib/filter-types.js.map +1 -0
  27. package/build/lib/monitor-event-collector.d.ts +16 -0
  28. package/build/lib/monitor-event-collector.d.ts.map +1 -0
  29. package/build/lib/monitor-event-collector.js +26 -0
  30. package/build/lib/monitor-event-collector.js.map +1 -0
  31. package/build/lib/populateActionArgs.js +1 -1
  32. package/build/lib/populateActionArgs.js.map +1 -1
  33. package/build/lib/secrets.d.ts +17 -0
  34. package/build/lib/secrets.d.ts.map +1 -0
  35. package/build/lib/secrets.js +46 -0
  36. package/build/lib/secrets.js.map +1 -0
  37. package/build/lib/test/lib.js +3 -3
  38. package/build/lib/test/lib.js.map +1 -1
  39. package/build/lib/util/actualURI.d.ts +1 -1
  40. package/build/lib/util/actualURI.d.ts.map +1 -1
  41. package/build/lib/util/index.d.ts +1 -0
  42. package/build/lib/util/index.d.ts.map +1 -1
  43. package/build/lib/util/index.js +1 -0
  44. package/build/lib/util/index.js.map +1 -1
  45. package/build/lib/util/secret-utils.d.ts +7 -0
  46. package/build/lib/util/secret-utils.d.ts.map +1 -0
  47. package/build/lib/util/secret-utils.js +36 -0
  48. package/build/lib/util/secret-utils.js.map +1 -0
  49. package/build/phases/Executor.d.ts.map +1 -1
  50. package/build/phases/Executor.js +4 -6
  51. package/build/phases/Executor.js.map +1 -1
  52. package/build/phases/collector.d.ts +3 -2
  53. package/build/phases/collector.d.ts.map +1 -1
  54. package/build/phases/collector.js +19 -7
  55. package/build/phases/collector.js.map +1 -1
  56. package/build/run-policy/run-policy-schema.d.ts +44 -0
  57. package/build/run-policy/run-policy-schema.d.ts.map +1 -0
  58. package/build/run-policy/run-policy-schema.js +263 -0
  59. package/build/run-policy/run-policy-schema.js.map +1 -0
  60. package/build/run-policy/run-policy-types.d.ts +60 -0
  61. package/build/run-policy/run-policy-types.d.ts.map +1 -0
  62. package/build/run-policy/run-policy-types.js +106 -0
  63. package/build/run-policy/run-policy-types.js.map +1 -0
  64. package/build/runfilter/filter-schema.d.ts +76 -0
  65. package/build/runfilter/filter-schema.d.ts.map +1 -0
  66. package/build/runfilter/filter-schema.js +129 -0
  67. package/build/runfilter/filter-schema.js.map +1 -0
  68. package/build/runfilter/filter-types.d.ts +58 -0
  69. package/build/runfilter/filter-types.d.ts.map +1 -0
  70. package/build/runfilter/filter-types.js +102 -0
  71. package/build/runfilter/filter-types.js.map +1 -0
  72. package/build/runner.d.ts +0 -3
  73. package/build/runner.d.ts.map +1 -1
  74. package/build/runner.js +19 -52
  75. package/build/runner.js.map +1 -1
  76. package/build/schema/protocol.d.ts +2 -2
  77. package/build/steps/activities-stepper.d.ts +4 -4
  78. package/build/steps/activities-stepper.d.ts.map +1 -1
  79. package/build/steps/activities-stepper.js +0 -2
  80. package/build/steps/activities-stepper.js.map +1 -1
  81. package/build/steps/haibun.d.ts +4 -4
  82. package/build/steps/narrator.d.ts +4 -4
  83. package/build/steps/variables-stepper.d.ts +25 -25
  84. package/build/steps/variables-stepper.d.ts.map +1 -1
  85. package/build/steps/variables-stepper.js +45 -41
  86. package/build/steps/variables-stepper.js.map +1 -1
  87. package/haibun-core-specl.schema.json +42 -0
  88. package/package.json +6 -4
@@ -0,0 +1,44 @@
1
+ import { z } from 'zod';
2
+ import { type TRunPolicyConfig } from './run-policy-types.js';
3
+ /**
4
+ * Validates the policy file structure itself.
5
+ * The structure mirrors TRunPolicyConfig (place + dirFilters array).
6
+ */
7
+ declare const PolicyFileSchema: z.ZodObject<{
8
+ $schema: z.ZodOptional<z.ZodString>;
9
+ type: z.ZodDefault<z.ZodLiteral<"object">>;
10
+ properties: z.ZodOptional<z.ZodObject<{}, z.core.$loose>>;
11
+ definitions: z.ZodOptional<z.ZodObject<{}, z.core.$loose>>;
12
+ $defs: z.ZodOptional<z.ZodObject<{}, z.core.$loose>>;
13
+ required: z.ZodOptional<z.ZodArray<z.ZodString>>;
14
+ allOf: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
15
+ anyOf: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
16
+ oneOf: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
17
+ deny: z.ZodDefault<z.ZodArray<z.ZodObject<{
18
+ place: z.ZodOptional<z.ZodString>;
19
+ dir: z.ZodOptional<z.ZodString>;
20
+ access: z.ZodOptional<z.ZodEnum<{
21
+ r: "r";
22
+ a: "a";
23
+ w: "w";
24
+ }>>;
25
+ }, z.core.$strip>>>;
26
+ }, z.core.$loose>;
27
+ export type TRunPolicy = z.infer<typeof PolicyFileSchema>;
28
+ /** Load and parse a policy file */
29
+ export declare function loadRunPolicy(schemaPath: string): TRunPolicy;
30
+ /**
31
+ * Validate a runtime config against a loaded policy.
32
+ * Builds a strict Zod schema dynamically from the policy definition.
33
+ */
34
+ export declare function buildConfigValidator(policy: TRunPolicy): z.ZodObject<{
35
+ [x: string]: z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
36
+ }, z.core.$loose>;
37
+ /**
38
+ * Validate a config against a loaded policy, returning array of error strings.
39
+ */
40
+ export declare function validateRunPolicyConfig(config: TRunPolicyConfig, policy: TRunPolicy, schemaPath: string): string[];
41
+ /** Load policy, validate config, throw on failure. */
42
+ export declare function loadAndValidateRunPolicy(config: TRunPolicyConfig, schemaPath: string): TRunPolicy;
43
+ export {};
44
+ //# sourceMappingURL=run-policy-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-policy-schema.d.ts","sourceRoot":"","sources":["../../src/run-policy/run-policy-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAY7E;;;GAGG;AACH,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;iBAWN,CAAC;AAEjB,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,mCAAmC;AACnC,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAQ5D;AAsID;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU;;kBA6EtD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAMlH;AAED,sDAAsD;AACtD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,CAQjG"}
@@ -0,0 +1,263 @@
1
+ import { z } from 'zod';
2
+ import { readFileSync } from 'fs';
3
+ import { ACCESS_LEVELS } from './run-policy-types.js';
4
+ // ============================================================================
5
+ // Policy File Schema — Hierarchical JSON Schema
6
+ // ============================================================================
7
+ const DenyRuleSchema = z.object({
8
+ place: z.string().optional(),
9
+ dir: z.string().optional(),
10
+ access: z.enum(ACCESS_LEVELS).optional(),
11
+ });
12
+ /**
13
+ * Validates the policy file structure itself.
14
+ * The structure mirrors TRunPolicyConfig (place + dirFilters array).
15
+ */
16
+ const PolicyFileSchema = z.object({
17
+ $schema: z.string().optional(),
18
+ type: z.literal('object').default('object'),
19
+ properties: z.object({}).passthrough().optional(),
20
+ definitions: z.object({}).passthrough().optional(),
21
+ $defs: z.object({}).passthrough().optional(),
22
+ required: z.array(z.string()).optional(),
23
+ allOf: z.array(z.unknown()).optional(),
24
+ anyOf: z.array(z.unknown()).optional(),
25
+ oneOf: z.array(z.unknown()).optional(),
26
+ deny: z.array(DenyRuleSchema).default([]),
27
+ }).passthrough();
28
+ /** Load and parse a policy file */
29
+ export function loadRunPolicy(schemaPath) {
30
+ let raw;
31
+ try {
32
+ raw = readFileSync(schemaPath, 'utf-8');
33
+ }
34
+ catch (err) {
35
+ throw new Error(`Cannot read run policy "${schemaPath}": ${err.message}`);
36
+ }
37
+ return PolicyFileSchema.parse(JSON.parse(raw));
38
+ }
39
+ function resolveRef(ref, rootDocs) {
40
+ if (!ref.startsWith('#/'))
41
+ return undefined;
42
+ const parts = ref.substring(2).split('/');
43
+ for (const doc of rootDocs) {
44
+ if (!doc)
45
+ continue;
46
+ let curr = doc;
47
+ for (const part of parts) {
48
+ if (typeof curr === 'object' && curr !== null && part in curr) {
49
+ curr = curr[part];
50
+ }
51
+ else {
52
+ curr = undefined;
53
+ break;
54
+ }
55
+ }
56
+ if (curr !== undefined)
57
+ return curr;
58
+ }
59
+ return undefined;
60
+ }
61
+ function evaluateCondition(conditionObj, config, ctx, rootDocs, allowedKeys) {
62
+ if (!conditionObj)
63
+ return true;
64
+ let ok = true;
65
+ // 1. resolve $ref
66
+ if (typeof conditionObj.$ref === 'string') {
67
+ const resolved = resolveRef(conditionObj.$ref, rootDocs);
68
+ if (resolved) {
69
+ ok = evaluateCondition(resolved, config, ctx, rootDocs, allowedKeys) && ok;
70
+ }
71
+ else {
72
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: `Unresolvable schema reference: ${conditionObj.$ref}`, path: [] });
73
+ ok = false;
74
+ }
75
+ return ok; // If it's a $ref, JSON schema typically ignores siblings, but we'll stop here.
76
+ }
77
+ // 2. process allOf
78
+ if (Array.isArray(conditionObj.allOf)) {
79
+ for (const rule of conditionObj.allOf) {
80
+ ok = evaluateCondition(rule, config, ctx, rootDocs, allowedKeys) && ok;
81
+ }
82
+ }
83
+ if (Array.isArray(conditionObj.anyOf)) {
84
+ const results = conditionObj.anyOf.map((rule) => evaluateBranch(rule, config, rootDocs));
85
+ const passing = results.filter((result) => result.ok);
86
+ if (passing.length === 0) {
87
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'must match at least one schema in anyOf', path: [] });
88
+ ok = false;
89
+ }
90
+ else {
91
+ for (const result of passing) {
92
+ for (const key of result.allowedKeys) {
93
+ allowedKeys.add(key);
94
+ }
95
+ }
96
+ }
97
+ }
98
+ if (Array.isArray(conditionObj.oneOf)) {
99
+ const results = conditionObj.oneOf.map((rule) => evaluateBranch(rule, config, rootDocs));
100
+ const passing = results.filter((result) => result.ok);
101
+ if (passing.length !== 1) {
102
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'must match exactly one schema in oneOf', path: [] });
103
+ ok = false;
104
+ }
105
+ else {
106
+ for (const key of passing[0].allowedKeys) {
107
+ allowedKeys.add(key);
108
+ }
109
+ }
110
+ }
111
+ // 3. process if/then
112
+ if (conditionObj.if && typeof conditionObj.if === 'object' && 'properties' in conditionObj.if) {
113
+ let matchesIf = true;
114
+ for (const [k, v] of Object.entries(conditionObj.if.properties)) {
115
+ const castV = v;
116
+ if (castV.const !== undefined && config[k] !== castV.const) {
117
+ matchesIf = false;
118
+ break;
119
+ }
120
+ }
121
+ if (matchesIf && conditionObj.then) {
122
+ ok = evaluateCondition(conditionObj.then, config, ctx, rootDocs, allowedKeys) && ok;
123
+ }
124
+ }
125
+ // 4. process required
126
+ if (Array.isArray(conditionObj.required)) {
127
+ for (const req of conditionObj.required) {
128
+ if (config[req] === undefined) {
129
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: `must have required property '${req}'`, path: [req] });
130
+ ok = false;
131
+ }
132
+ }
133
+ }
134
+ if (conditionObj.properties && typeof conditionObj.properties === 'object') {
135
+ for (const [k, v] of Object.entries(conditionObj.properties)) {
136
+ allowedKeys.add(k);
137
+ const castV = v;
138
+ if (config[k] !== undefined) {
139
+ if (castV.const !== undefined && config[k] !== castV.const) {
140
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: `must be equal to constant "${castV.const}"`, path: [k] });
141
+ ok = false;
142
+ }
143
+ if (castV.type === 'number' && typeof config[k] !== 'number') {
144
+ // if it's string from env, parse it dynamically
145
+ if (typeof config[k] === 'string' && !isNaN(Number(config[k]))) {
146
+ config[k] = Number(config[k]);
147
+ }
148
+ else {
149
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: `must be number`, path: [k] });
150
+ ok = false;
151
+ }
152
+ }
153
+ }
154
+ }
155
+ }
156
+ return ok;
157
+ }
158
+ function evaluateBranch(conditionObj, config, rootDocs) {
159
+ const issues = [];
160
+ const branchAllowed = new Set();
161
+ const ctx = {
162
+ addIssue: (issue) => {
163
+ issues.push(issue);
164
+ }
165
+ };
166
+ const ok = evaluateCondition(conditionObj, config, ctx, rootDocs, branchAllowed);
167
+ return { ok: ok && issues.length === 0, allowedKeys: branchAllowed, issues };
168
+ }
169
+ /**
170
+ * Validate a runtime config against a loaded policy.
171
+ * Builds a strict Zod schema dynamically from the policy definition.
172
+ */
173
+ export function buildConfigValidator(policy) {
174
+ const validPlaces = policy.properties?.place && policy.properties.place.enum;
175
+ const validDirs = policy.properties?.dirFilters &&
176
+ policy.properties.dirFilters.items &&
177
+ policy.properties.dirFilters.items.properties &&
178
+ policy.properties.dirFilters.items.properties.dir &&
179
+ policy.properties.dirFilters.items.properties.dir.enum;
180
+ const baseSchema = {};
181
+ if (validPlaces) {
182
+ baseSchema.place = z.enum(validPlaces);
183
+ }
184
+ else {
185
+ baseSchema.place = z.string();
186
+ }
187
+ if (validDirs) {
188
+ baseSchema.dirFilters = z.array(z.object({
189
+ dir: z.union([z.enum(validDirs), z.literal('*')]),
190
+ access: z.enum(ACCESS_LEVELS),
191
+ }));
192
+ }
193
+ else {
194
+ baseSchema.dirFilters = z.array(z.object({
195
+ dir: z.string(),
196
+ access: z.enum(ACCESS_LEVELS),
197
+ }));
198
+ }
199
+ const ConfigValidator = z.object(baseSchema).passthrough();
200
+ return ConfigValidator.superRefine((config, ctx) => {
201
+ // 1. Evaluate policy rules dynamically
202
+ const rootDocs = [policy];
203
+ // keys that are always allowed by the base schema
204
+ const allowedKeys = new Set();
205
+ // Pre-populate allowedKeys with root properties
206
+ allowedKeys.add('place');
207
+ allowedKeys.add('dirFilters');
208
+ if (policy.properties)
209
+ Object.keys(policy.properties).forEach(k => allowedKeys.add(k));
210
+ evaluateCondition(policy, config, ctx, rootDocs, allowedKeys);
211
+ // Validate strictness: block non-existent parameters
212
+ for (const key of Object.keys(config)) {
213
+ if (!allowedKeys.has(key)) {
214
+ ctx.addIssue({
215
+ code: z.ZodIssueCode.unrecognized_keys,
216
+ keys: [key],
217
+ message: `Unrecognized key(s) in object: '${key}'`,
218
+ path: []
219
+ });
220
+ }
221
+ }
222
+ // 2. Custom deny rule validation
223
+ const dirFilters = config.dirFilters;
224
+ if (dirFilters) {
225
+ dirFilters.forEach((filter, index) => {
226
+ const flat = { place: config.place, dir: filter.dir, access: filter.access };
227
+ for (const rule of policy.deny) {
228
+ const match = (!rule.place || rule.place === flat.place)
229
+ && (!rule.dir || rule.dir === flat.dir)
230
+ && (!rule.access || rule.access === flat.access);
231
+ if (match) {
232
+ ctx.addIssue({
233
+ code: z.ZodIssueCode.custom,
234
+ message: `Filter "${filter.dir}:${filter.access}" in "${config.place}": Denied by policy: ${JSON.stringify(rule)}`,
235
+ path: ['dirFilters', index]
236
+ });
237
+ }
238
+ }
239
+ });
240
+ }
241
+ });
242
+ }
243
+ /**
244
+ * Validate a config against a loaded policy, returning array of error strings.
245
+ */
246
+ export function validateRunPolicyConfig(config, policy, schemaPath) {
247
+ const validator = buildConfigValidator(policy);
248
+ const result = validator.safeParse(config);
249
+ if (result.success)
250
+ return [];
251
+ return result.error.issues.map((err) => `${err.path.length ? '/' + err.path.join('/') + ' ' : ''}${err.message}`);
252
+ }
253
+ /** Load policy, validate config, throw on failure. */
254
+ export function loadAndValidateRunPolicy(config, schemaPath) {
255
+ const policy = loadRunPolicy(schemaPath);
256
+ const errors = validateRunPolicyConfig(config, policy, schemaPath);
257
+ if (errors.length > 0) {
258
+ const jsonContext = JSON.stringify({ $schema: schemaPath, ...config }, null, 2);
259
+ throw new Error(`Run policy validation failed:\n${jsonContext}\n\nErrors:\n${errors.map((e) => ` • ${e}`).join('\\n')}`);
260
+ }
261
+ return policy;
262
+ }
263
+ //# sourceMappingURL=run-policy-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-policy-schema.js","sourceRoot":"","sources":["../../src/run-policy/run-policy-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { z } from 'zod';
2
+ /** CLI option name for run-policy */
3
+ export declare const OPTION_RUN_POLICY = "--run-policy";
4
+ /** CLI option for dry-run mode (preview which features pass/fail the run policy) */
5
+ export declare const OPTION_DRY_RUN = "--dry-run";
6
+ /** Environment variable for run-policy (format: "place dir:access[,dir:access]") */
7
+ export declare const HAIBUN_RUN_POLICY = "HAIBUN_RUN_POLICY";
8
+ /** Valid access levels, forming a strict hierarchy: r ⊂ a ⊂ w */
9
+ export declare const ACCESS_LEVELS: readonly ["r", "a", "w"];
10
+ /** Feature filename prefixes corresponding to access levels */
11
+ export declare const ACCESS_PREFIXES: readonly ["r_", "a_", "w_"];
12
+ export declare const AccessLevelSchema: z.ZodEnum<{
13
+ r: "r";
14
+ a: "a";
15
+ w: "w";
16
+ }>;
17
+ export type AccessLevel = z.infer<typeof AccessLevelSchema>;
18
+ export type TDirFilter = {
19
+ dir: string;
20
+ access: string;
21
+ };
22
+ export type TRunPolicyConfig = {
23
+ place: string;
24
+ dirFilters: TDirFilter[];
25
+ [param: string]: unknown;
26
+ };
27
+ /** Parses "smoke:r" → { dir: "smoke", access: "r" } */
28
+ export declare const DirFilterSchema: z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<{
29
+ dir: string;
30
+ access: string;
31
+ }, string>>, z.ZodObject<{
32
+ dir: z.ZodString;
33
+ access: z.ZodString;
34
+ }, z.core.$strip>>;
35
+ /** Parse dir:access[,dir:access] string */
36
+ export declare function parseDirFilters(input: string): TDirFilter[];
37
+ export declare const RunPolicyConfigSchema: z.ZodPipe<z.ZodObject<{
38
+ place: z.ZodString;
39
+ dirAccessStr: z.ZodString;
40
+ }, z.core.$catchall<z.ZodUnknown>>, z.ZodTransform<TRunPolicyConfig, {
41
+ [x: string]: unknown;
42
+ place: string;
43
+ dirAccessStr: string;
44
+ }>>;
45
+ /** Parse --run-policy arguments: place dir:access[,dir:access] */
46
+ export declare function parseRunPolicyArgs(place: string, dirAccessStr: string): TRunPolicyConfig;
47
+ /** Parse HAIBUN_RUN_POLICY env var: "place dir:access[,dir:access]" */
48
+ export declare function parseRunPolicyEnv(envVar: string): TRunPolicyConfig;
49
+ /** Numeric rank for hierarchy comparison: r=0, a=1, w=2 */
50
+ export declare function accessRank(level: string): number;
51
+ /** Check if granted level includes required level (w ⊃ a ⊃ r) */
52
+ export declare function accessLevelIncludes(granted: string, required: string): boolean;
53
+ /** Extract access prefix from feature filename, or undefined if unrecognized */
54
+ export declare function getFeatureAccessPrefix(filename: string): AccessLevel | undefined;
55
+ /**
56
+ * Determine if a feature file should run given the active dir filters.
57
+ * Exclusive: only features with a recognized prefix in a listed directory pass.
58
+ */
59
+ export declare function featureMatchesFilter(featurePath: string, dirFilters: TDirFilter[]): boolean;
60
+ //# sourceMappingURL=run-policy-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-policy-types.d.ts","sourceRoot":"","sources":["../../src/run-policy/run-policy-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,qCAAqC;AACrC,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAEhD,oFAAoF;AACpF,eAAO,MAAM,cAAc,cAAc,CAAC;AAE1C,oFAAoF;AACpF,eAAO,MAAM,iBAAiB,sBAAsB,CAAC;AAErD,iEAAiE;AACjE,eAAO,MAAM,aAAa,0BAA2B,CAAC;AAEtD,+DAA+D;AAC/D,eAAO,MAAM,eAAe,6BAA8B,CAAC;AAQ3D,eAAO,MAAM,iBAAiB;;;;EAAwB,CAAC;AACvD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,eAAe;;;;;;kBASiD,CAAC;AAE9E,2CAA2C;AAC3C,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CAE3D;AAED,eAAO,MAAM,qBAAqB;;;;;;;GAShC,CAAC;AAMH,kEAAkE;AAClE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,gBAAgB,CAUxF;AAED,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAMlE;AAMD,2DAA2D;AAC3D,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,iEAAiE;AACjE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE9E;AAED,gFAAgF;AAChF,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAGhF;AAMD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,OAAO,CAa3F"}
@@ -0,0 +1,106 @@
1
+ import { z } from 'zod';
2
+ // ============================================================================
3
+ // Constants
4
+ // ============================================================================
5
+ /** CLI option name for run-policy */
6
+ export const OPTION_RUN_POLICY = '--run-policy';
7
+ /** CLI option for dry-run mode (preview which features pass/fail the run policy) */
8
+ export const OPTION_DRY_RUN = '--dry-run';
9
+ /** Environment variable for run-policy (format: "place dir:access[,dir:access]") */
10
+ export const HAIBUN_RUN_POLICY = 'HAIBUN_RUN_POLICY';
11
+ /** Valid access levels, forming a strict hierarchy: r ⊂ a ⊂ w */
12
+ export const ACCESS_LEVELS = ['r', 'a', 'w'];
13
+ /** Feature filename prefixes corresponding to access levels */
14
+ export const ACCESS_PREFIXES = ['r_', 'a_', 'w_'];
15
+ // ============================================================================
16
+ // Zod Schemas — types are inferred, parsing via transforms
17
+ // ============================================================================
18
+ // Basic types
19
+ const InputAccessLevelSchema = z.string();
20
+ export const AccessLevelSchema = z.enum(ACCESS_LEVELS);
21
+ /** Parses "smoke:r" → { dir: "smoke", access: "r" } */
22
+ export const DirFilterSchema = z.string()
23
+ .transform((val, ctx) => {
24
+ const parts = val.split(':');
25
+ if (parts.length !== 2) {
26
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: `Invalid filter format "${val}". Expected "dir:access"` });
27
+ return z.NEVER;
28
+ }
29
+ return { dir: parts[0], access: parts[1] };
30
+ })
31
+ .pipe(z.object({ dir: z.string().min(1), access: InputAccessLevelSchema }));
32
+ /** Parse dir:access[,dir:access] string */
33
+ export function parseDirFilters(input) {
34
+ return input.split(',').map(s => DirFilterSchema.parse(s));
35
+ }
36
+ export const RunPolicyConfigSchema = z.object({
37
+ place: z.string().min(1),
38
+ dirAccessStr: z.string(),
39
+ }).catchall(z.unknown()).transform((data) => {
40
+ const dirFilters = parseDirFilters(data.dirAccessStr);
41
+ const result = { ...data };
42
+ delete result.dirAccessStr;
43
+ result.dirFilters = dirFilters;
44
+ return result;
45
+ });
46
+ // ============================================================================
47
+ // Parsing — thin wrappers delegating to Zod
48
+ // ============================================================================
49
+ /** Parse --run-policy arguments: place dir:access[,dir:access] */
50
+ export function parseRunPolicyArgs(place, dirAccessStr) {
51
+ try {
52
+ return RunPolicyConfigSchema.parse({ place, dirAccessStr });
53
+ }
54
+ catch (e) {
55
+ if (e instanceof z.ZodError) {
56
+ const detail = e.issues.map((i) => ` • ${i.path.join('.')}: ${i.message}`).join('\n');
57
+ throw new Error(`Run policy configuration failed:\n${detail}`);
58
+ }
59
+ throw e;
60
+ }
61
+ }
62
+ /** Parse HAIBUN_RUN_POLICY env var: "place dir:access[,dir:access]" */
63
+ export function parseRunPolicyEnv(envVar) {
64
+ const parts = envVar.trim().split(/\s+/);
65
+ if (parts.length !== 2) {
66
+ throw new Error(`Invalid format. Expected "place dir:access"`);
67
+ }
68
+ return parseRunPolicyArgs(parts[0], parts[1]);
69
+ }
70
+ // ============================================================================
71
+ // Access Level Logic — minimal procedural (pure domain logic)
72
+ // ============================================================================
73
+ /** Numeric rank for hierarchy comparison: r=0, a=1, w=2 */
74
+ export function accessRank(level) {
75
+ return ACCESS_LEVELS.indexOf(level);
76
+ }
77
+ /** Check if granted level includes required level (w ⊃ a ⊃ r) */
78
+ export function accessLevelIncludes(granted, required) {
79
+ return accessRank(granted) >= accessRank(required);
80
+ }
81
+ /** Extract access prefix from feature filename, or undefined if unrecognized */
82
+ export function getFeatureAccessPrefix(filename) {
83
+ const result = AccessLevelSchema.safeParse(filename.charAt(0));
84
+ return result.success && filename.charAt(1) === '_' ? result.data : undefined;
85
+ }
86
+ // ============================================================================
87
+ // Feature Matching — runtime matching (must be procedural)
88
+ // ============================================================================
89
+ /**
90
+ * Determine if a feature file should run given the active dir filters.
91
+ * Exclusive: only features with a recognized prefix in a listed directory pass.
92
+ */
93
+ export function featureMatchesFilter(featurePath, dirFilters) {
94
+ const parts = featurePath.replace(/^\//, '').split('/');
95
+ const filename = parts[parts.length - 1];
96
+ const featureDir = parts.length > 1 ? parts[0] : undefined;
97
+ const requiredAccess = getFeatureAccessPrefix(filename);
98
+ if (!requiredAccess)
99
+ return false;
100
+ const matchingFilter = dirFilters.find((f) => f.dir === featureDir)
101
+ ?? dirFilters.find((f) => f.dir === '*');
102
+ if (!matchingFilter)
103
+ return false;
104
+ return accessLevelIncludes(matchingFilter.access, requiredAccess);
105
+ }
106
+ //# sourceMappingURL=run-policy-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-policy-types.js","sourceRoot":"","sources":["../../src/run-policy/run-policy-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,qCAAqC;AACrC,MAAM,CAAC,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAEhD,oFAAoF;AACpF,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAC;AAE1C,oFAAoF;AACpF,MAAM,CAAC,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAErD,iEAAiE;AACjE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAC;AAEtD,+DAA+D;AAC/D,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAE3D,+EAA+E;AAC/E,2DAA2D;AAC3D,+EAA+E;AAE/E,cAAc;AACd,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;AAC1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAcvD,uDAAuD;AACvD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,EAAE;KACtC,SAAS,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACtB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,0BAA0B,GAAG,0BAA0B,EAAE,CAAC,CAAC;QAChH,OAAO,CAAC,CAAC,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7C,CAAC,CAAC;KACD,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC;AAE9E,2CAA2C;AAC3C,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;CACzB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,EAAoB,EAAE;IAC5D,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACtD,MAAM,MAAM,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAC;IACpD,OAAO,MAAM,CAAC,YAAY,CAAC;IAC3B,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,OAAO,MAA0B,CAAC;AACpC,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAC/E,4CAA4C;AAC5C,+EAA+E;AAE/E,kEAAkE;AAClE,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,YAAoB;IACpE,IAAI,CAAC;QACH,OAAO,qBAAqB,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvF,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,+EAA+E;AAC/E,8DAA8D;AAC9D,+EAA+E;AAE/E,2DAA2D;AAC3D,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,aAAa,CAAC,OAAO,CAAC,KAAoB,CAAC,CAAC;AACrD,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,mBAAmB,CAAC,OAAe,EAAE,QAAgB;IACnE,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;AACrD,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAChF,CAAC;AAED,+EAA+E;AAC/E,2DAA2D;AAC3D,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAmB,EAAE,UAAwB;IAChF,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE3D,MAAM,cAAc,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IAElC,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,UAAU,CAAC;WAC9D,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IAC3C,IAAI,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IAElC,OAAO,mBAAmB,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,76 @@
1
+ import { z } from 'zod';
2
+ import { type TFilterConfig } from './filter-types.js';
3
+ /**
4
+ * Validates the policy file structure itself.
5
+ * The structure now mimics TFilterConfig (env + dirFilters array).
6
+ */
7
+ declare const PolicyFileSchema: z.ZodObject<{
8
+ type: z.ZodDefault<z.ZodLiteral<"object">>;
9
+ properties: z.ZodObject<{
10
+ env: z.ZodObject<{
11
+ type: z.ZodDefault<z.ZodLiteral<"string">>;
12
+ enum: z.ZodArray<z.ZodString>;
13
+ }, z.core.$loose>;
14
+ dirFilters: z.ZodObject<{
15
+ type: z.ZodDefault<z.ZodLiteral<"array">>;
16
+ items: z.ZodObject<{
17
+ type: z.ZodDefault<z.ZodLiteral<"object">>;
18
+ properties: z.ZodObject<{
19
+ dir: z.ZodObject<{
20
+ type: z.ZodDefault<z.ZodLiteral<"string">>;
21
+ enum: z.ZodArray<z.ZodString>;
22
+ }, z.core.$loose>;
23
+ access: z.ZodOptional<z.ZodObject<{
24
+ type: z.ZodDefault<z.ZodLiteral<"string">>;
25
+ enum: z.ZodOptional<z.ZodArray<z.ZodEnum<{
26
+ r: "r";
27
+ a: "a";
28
+ w: "w";
29
+ }>>>;
30
+ }, z.core.$loose>>;
31
+ }, z.core.$loose>;
32
+ required: z.ZodOptional<z.ZodArray<z.ZodString>>;
33
+ }, z.core.$loose>;
34
+ }, z.core.$loose>;
35
+ }, z.core.$loose>;
36
+ deny: z.ZodDefault<z.ZodArray<z.ZodObject<{
37
+ env: z.ZodOptional<z.ZodString>;
38
+ dir: z.ZodOptional<z.ZodString>;
39
+ access: z.ZodOptional<z.ZodEnum<{
40
+ r: "r";
41
+ a: "a";
42
+ w: "w";
43
+ }>>;
44
+ }, z.core.$strip>>>;
45
+ }, z.core.$loose>;
46
+ export type TFilterPolicy = z.infer<typeof PolicyFileSchema>;
47
+ /**
48
+ * Build a Zod validator for the entire TFilterConfig based on the policy.
49
+ * This validator checks the whole config object at once ("wholesale validation").
50
+ */
51
+ export declare function buildConfigValidator(policy: TFilterPolicy): z.ZodObject<{
52
+ env: z.ZodEnum<{
53
+ [x: string]: string;
54
+ }>;
55
+ dirFilters: z.ZodArray<z.ZodObject<{
56
+ dir: z.ZodEnum<{
57
+ [x: string]: string;
58
+ }>;
59
+ access: z.ZodEnum<{
60
+ r: "r";
61
+ a: "a";
62
+ w: "w";
63
+ }>;
64
+ }, z.core.$strip>>;
65
+ }, z.core.$loose>;
66
+ /** Load and parse a policy file */
67
+ export declare function loadFilterPolicy(schemaPath: string): TFilterPolicy;
68
+ /**
69
+ * Validate a runtime config against a loaded policy.
70
+ * Uses the generated Zod validator to check the config wholesale.
71
+ */
72
+ export declare function validateFilterConfig(config: TFilterConfig, policy: TFilterPolicy, schemaPath: string): string[];
73
+ /** Load schema, validate config, throw on failure. */
74
+ export declare function loadAndValidateFilters(config: TFilterConfig, schemaPath: string): TFilterPolicy;
75
+ export {};
76
+ //# sourceMappingURL=filter-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-schema.d.ts","sourceRoot":"","sources":["../../src/runfilter/filter-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAYtE;;;GAGG;AACH,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0BN,CAAC;AAEjB,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAM7D;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa;;;;;;;;;;;;;;kBAsCzD;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CAQlE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAmB/G;AAED,sDAAsD;AACtD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,CAQ/F"}