@helmiq/crew 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 (209) hide show
  1. package/defaults/personas/architect.persona.yaml +72 -0
  2. package/defaults/personas/engineer.persona.yaml +137 -0
  3. package/defaults/personas/persona-spec.schema.yaml +149 -0
  4. package/defaults/personas/reviewer.persona.yaml +47 -0
  5. package/defaults/rubrics/adr.rubric.yaml +48 -0
  6. package/defaults/rubrics/code-review.rubric.yaml +39 -0
  7. package/defaults/rubrics/pull-request.rubric.yaml +40 -0
  8. package/dist/actions/actions.test.d.ts +2 -0
  9. package/dist/actions/actions.test.d.ts.map +1 -0
  10. package/dist/actions/actions.test.js +158 -0
  11. package/dist/actions/direct-dispatcher.d.ts +10 -0
  12. package/dist/actions/direct-dispatcher.d.ts.map +1 -0
  13. package/dist/actions/direct-dispatcher.js +27 -0
  14. package/dist/actions/dispatcher.d.ts +11 -0
  15. package/dist/actions/dispatcher.d.ts.map +1 -0
  16. package/dist/actions/dispatcher.js +1 -0
  17. package/dist/actions/index.d.ts +7 -0
  18. package/dist/actions/index.d.ts.map +1 -0
  19. package/dist/actions/index.js +3 -0
  20. package/dist/actions/registry.d.ts +13 -0
  21. package/dist/actions/registry.d.ts.map +1 -0
  22. package/dist/actions/registry.js +40 -0
  23. package/dist/actions/resolver.d.ts +47 -0
  24. package/dist/actions/resolver.d.ts.map +1 -0
  25. package/dist/actions/resolver.js +43 -0
  26. package/dist/cli/cli.test.d.ts +2 -0
  27. package/dist/cli/cli.test.d.ts.map +1 -0
  28. package/dist/cli/cli.test.js +392 -0
  29. package/dist/cli/run.d.ts +45 -0
  30. package/dist/cli/run.d.ts.map +1 -0
  31. package/dist/cli/run.js +236 -0
  32. package/dist/common/errors.d.ts +76 -0
  33. package/dist/common/errors.d.ts.map +1 -0
  34. package/dist/common/errors.js +74 -0
  35. package/dist/config/config.test.d.ts +2 -0
  36. package/dist/config/config.test.d.ts.map +1 -0
  37. package/dist/config/config.test.js +691 -0
  38. package/dist/config/index.d.ts +7 -0
  39. package/dist/config/index.d.ts.map +1 -0
  40. package/dist/config/index.js +4 -0
  41. package/dist/config/loader.d.ts +16 -0
  42. package/dist/config/loader.d.ts.map +1 -0
  43. package/dist/config/loader.js +56 -0
  44. package/dist/config/model-resolver.d.ts +24 -0
  45. package/dist/config/model-resolver.d.ts.map +1 -0
  46. package/dist/config/model-resolver.js +39 -0
  47. package/dist/config/resolver.d.ts +22 -0
  48. package/dist/config/resolver.d.ts.map +1 -0
  49. package/dist/config/resolver.js +115 -0
  50. package/dist/config/schemas.d.ts +266 -0
  51. package/dist/config/schemas.d.ts.map +1 -0
  52. package/dist/config/schemas.js +115 -0
  53. package/dist/context/artifact-reader.d.ts +12 -0
  54. package/dist/context/artifact-reader.d.ts.map +1 -0
  55. package/dist/context/artifact-reader.js +92 -0
  56. package/dist/context/assembler.d.ts +22 -0
  57. package/dist/context/assembler.d.ts.map +1 -0
  58. package/dist/context/assembler.js +126 -0
  59. package/dist/context/code-reader.d.ts +14 -0
  60. package/dist/context/code-reader.d.ts.map +1 -0
  61. package/dist/context/code-reader.js +56 -0
  62. package/dist/context/context.test.d.ts +2 -0
  63. package/dist/context/context.test.d.ts.map +1 -0
  64. package/dist/context/context.test.js +260 -0
  65. package/dist/context/index.d.ts +9 -0
  66. package/dist/context/index.d.ts.map +1 -0
  67. package/dist/context/index.js +5 -0
  68. package/dist/context/section-extractor.d.ts +9 -0
  69. package/dist/context/section-extractor.d.ts.map +1 -0
  70. package/dist/context/section-extractor.js +32 -0
  71. package/dist/context/token-budget.d.ts +11 -0
  72. package/dist/context/token-budget.d.ts.map +1 -0
  73. package/dist/context/token-budget.js +22 -0
  74. package/dist/control/control.test.d.ts +2 -0
  75. package/dist/control/control.test.d.ts.map +1 -0
  76. package/dist/control/control.test.js +137 -0
  77. package/dist/control/id-generator.d.ts +12 -0
  78. package/dist/control/id-generator.d.ts.map +1 -0
  79. package/dist/control/id-generator.js +20 -0
  80. package/dist/control/index.d.ts +5 -0
  81. package/dist/control/index.d.ts.map +1 -0
  82. package/dist/control/index.js +3 -0
  83. package/dist/control/lock-manager.d.ts +13 -0
  84. package/dist/control/lock-manager.d.ts.map +1 -0
  85. package/dist/control/lock-manager.js +72 -0
  86. package/dist/control/run-state.d.ts +16 -0
  87. package/dist/control/run-state.d.ts.map +1 -0
  88. package/dist/control/run-state.js +55 -0
  89. package/dist/engine/composite.d.ts +34 -0
  90. package/dist/engine/composite.d.ts.map +1 -0
  91. package/dist/engine/composite.js +192 -0
  92. package/dist/engine/composite.test.d.ts +2 -0
  93. package/dist/engine/composite.test.d.ts.map +1 -0
  94. package/dist/engine/composite.test.js +1947 -0
  95. package/dist/engine/engine.test.d.ts +2 -0
  96. package/dist/engine/engine.test.d.ts.map +1 -0
  97. package/dist/engine/engine.test.js +334 -0
  98. package/dist/engine/index.d.ts +10 -0
  99. package/dist/engine/index.d.ts.map +1 -0
  100. package/dist/engine/index.js +5 -0
  101. package/dist/engine/llm-client.d.ts +27 -0
  102. package/dist/engine/llm-client.d.ts.map +1 -0
  103. package/dist/engine/llm-client.js +46 -0
  104. package/dist/engine/simple.d.ts +21 -0
  105. package/dist/engine/simple.d.ts.map +1 -0
  106. package/dist/engine/simple.js +59 -0
  107. package/dist/engine/tool-dispatch.d.ts +37 -0
  108. package/dist/engine/tool-dispatch.d.ts.map +1 -0
  109. package/dist/engine/tool-dispatch.js +146 -0
  110. package/dist/engine/tool-dispatch.test.d.ts +2 -0
  111. package/dist/engine/tool-dispatch.test.d.ts.map +1 -0
  112. package/dist/engine/tool-dispatch.test.js +348 -0
  113. package/dist/engine/tool-filter.d.ts +13 -0
  114. package/dist/engine/tool-filter.d.ts.map +1 -0
  115. package/dist/engine/tool-filter.js +25 -0
  116. package/dist/evaluation/evaluation.test.d.ts +2 -0
  117. package/dist/evaluation/evaluation.test.d.ts.map +1 -0
  118. package/dist/evaluation/evaluation.test.js +490 -0
  119. package/dist/evaluation/evaluator.d.ts +19 -0
  120. package/dist/evaluation/evaluator.d.ts.map +1 -0
  121. package/dist/evaluation/evaluator.js +78 -0
  122. package/dist/evaluation/index.d.ts +4 -0
  123. package/dist/evaluation/index.d.ts.map +1 -0
  124. package/dist/evaluation/index.js +2 -0
  125. package/dist/evaluation/scorer.d.ts +38 -0
  126. package/dist/evaluation/scorer.d.ts.map +1 -0
  127. package/dist/evaluation/scorer.js +94 -0
  128. package/dist/index.d.ts +47 -0
  129. package/dist/index.d.ts.map +1 -0
  130. package/dist/index.js +28 -0
  131. package/dist/providers/index.d.ts +2 -0
  132. package/dist/providers/index.d.ts.map +1 -0
  133. package/dist/providers/index.js +1 -0
  134. package/dist/providers/provider-factory.d.ts +11 -0
  135. package/dist/providers/provider-factory.d.ts.map +1 -0
  136. package/dist/providers/provider-factory.js +30 -0
  137. package/dist/publication/frontmatter.d.ts +21 -0
  138. package/dist/publication/frontmatter.d.ts.map +1 -0
  139. package/dist/publication/frontmatter.js +15 -0
  140. package/dist/publication/git-ops.d.ts +18 -0
  141. package/dist/publication/git-ops.d.ts.map +1 -0
  142. package/dist/publication/git-ops.js +74 -0
  143. package/dist/publication/index.d.ts +9 -0
  144. package/dist/publication/index.d.ts.map +1 -0
  145. package/dist/publication/index.js +5 -0
  146. package/dist/publication/provenance-writer.d.ts +27 -0
  147. package/dist/publication/provenance-writer.d.ts.map +1 -0
  148. package/dist/publication/provenance-writer.js +21 -0
  149. package/dist/publication/publication.test.d.ts +2 -0
  150. package/dist/publication/publication.test.d.ts.map +1 -0
  151. package/dist/publication/publication.test.js +235 -0
  152. package/dist/publication/publisher.d.ts +32 -0
  153. package/dist/publication/publisher.d.ts.map +1 -0
  154. package/dist/publication/publisher.js +113 -0
  155. package/dist/publication/secret-scanner.d.ts +6 -0
  156. package/dist/publication/secret-scanner.d.ts.map +1 -0
  157. package/dist/publication/secret-scanner.js +19 -0
  158. package/dist/tools/index.d.ts +4 -0
  159. package/dist/tools/index.d.ts.map +1 -0
  160. package/dist/tools/index.js +2 -0
  161. package/dist/tools/registry.d.ts +15 -0
  162. package/dist/tools/registry.d.ts.map +1 -0
  163. package/dist/tools/registry.js +288 -0
  164. package/dist/tools/registry.test.d.ts +2 -0
  165. package/dist/tools/registry.test.d.ts.map +1 -0
  166. package/dist/tools/registry.test.js +131 -0
  167. package/dist/tools/tool-groups.d.ts +20 -0
  168. package/dist/tools/tool-groups.d.ts.map +1 -0
  169. package/dist/tools/tool-groups.js +48 -0
  170. package/dist/tools/tool-groups.test.d.ts +2 -0
  171. package/dist/tools/tool-groups.test.d.ts.map +1 -0
  172. package/dist/tools/tool-groups.test.js +127 -0
  173. package/dist/types/artifact-store.d.ts +33 -0
  174. package/dist/types/artifact-store.d.ts.map +1 -0
  175. package/dist/types/artifact-store.js +9 -0
  176. package/dist/types/evaluation-rubric.d.ts +18 -0
  177. package/dist/types/evaluation-rubric.d.ts.map +1 -0
  178. package/dist/types/evaluation-rubric.js +1 -0
  179. package/dist/types/index.d.ts +10 -0
  180. package/dist/types/index.d.ts.map +1 -0
  181. package/dist/types/index.js +1 -0
  182. package/dist/types/llm-provider.d.ts +47 -0
  183. package/dist/types/llm-provider.d.ts.map +1 -0
  184. package/dist/types/llm-provider.js +8 -0
  185. package/dist/types/persona-spec.d.ts +79 -0
  186. package/dist/types/persona-spec.d.ts.map +1 -0
  187. package/dist/types/persona-spec.js +1 -0
  188. package/dist/types/project-config.d.ts +28 -0
  189. package/dist/types/project-config.d.ts.map +1 -0
  190. package/dist/types/project-config.js +1 -0
  191. package/dist/types/provenance.d.ts +67 -0
  192. package/dist/types/provenance.d.ts.map +1 -0
  193. package/dist/types/provenance.js +1 -0
  194. package/dist/types/run-state.d.ts +11 -0
  195. package/dist/types/run-state.d.ts.map +1 -0
  196. package/dist/types/run-state.js +1 -0
  197. package/dist/types/tool-runtime.d.ts +43 -0
  198. package/dist/types/tool-runtime.d.ts.map +1 -0
  199. package/dist/types/tool-runtime.js +30 -0
  200. package/dist/workspace/detect.d.ts +11 -0
  201. package/dist/workspace/detect.d.ts.map +1 -0
  202. package/dist/workspace/detect.js +28 -0
  203. package/dist/workspace/detect.test.d.ts +2 -0
  204. package/dist/workspace/detect.test.d.ts.map +1 -0
  205. package/dist/workspace/detect.test.js +53 -0
  206. package/dist/workspace/index.d.ts +2 -0
  207. package/dist/workspace/index.d.ts.map +1 -0
  208. package/dist/workspace/index.js +1 -0
  209. package/package.json +51 -0
@@ -0,0 +1,7 @@
1
+ export { loadYaml, projectConfigPath, loadProjectConfig } from './loader.js';
2
+ export { loadConfig } from './resolver.js';
3
+ export type { LoadedConfig, ResolverOptions, ResolvedSkills } from './resolver.js';
4
+ export { resolveModel, resolveExecutionModel, resolveEvalModel } from './model-resolver.js';
5
+ export type { ResolvedModel } from './model-resolver.js';
6
+ export { ProjectConfigSchema, PersonaSpecSchema, EvaluationRubricSchema, LlmConfigSchema, ProviderSchema, SourceConfigSchema, WorkspaceConfigSchema, ContextRefSchema, SubAgentSchema, SimpleTaskSchema, CompositeTaskSchema, TaskSchema, CriterionSchema, CriterionWeightSchema, } from './schemas.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5F,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,EACV,eAAe,EACf,qBAAqB,GACtB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { loadYaml, projectConfigPath, loadProjectConfig } from './loader.js';
2
+ export { loadConfig } from './resolver.js';
3
+ export { resolveModel, resolveExecutionModel, resolveEvalModel } from './model-resolver.js';
4
+ export { ProjectConfigSchema, PersonaSpecSchema, EvaluationRubricSchema, LlmConfigSchema, ProviderSchema, SourceConfigSchema, WorkspaceConfigSchema, ContextRefSchema, SubAgentSchema, SimpleTaskSchema, CompositeTaskSchema, TaskSchema, CriterionSchema, CriterionWeightSchema, } from './schemas.js';
@@ -0,0 +1,16 @@
1
+ import type { ZodSchema } from 'zod';
2
+ import type { ProjectConfig } from '../types/index.js';
3
+ /**
4
+ * Read a YAML file from disk and validate it against a Zod schema.
5
+ * Returns the parsed, validated object typed by the schema.
6
+ */
7
+ export declare function loadYaml<T>(filePath: string, schema: ZodSchema<T>, label: string): Promise<T>;
8
+ /**
9
+ * Resolve the path to the project config file within a workspace.
10
+ */
11
+ export declare function projectConfigPath(workspacePath: string): string;
12
+ /**
13
+ * Load and validate the project config from a workspace path.
14
+ */
15
+ export declare function loadProjectConfig(workspacePath: string): Promise<ProjectConfig>;
16
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAGrC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EACpB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,CAAC,CAAC,CAoCZ;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAGrF"}
@@ -0,0 +1,56 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { parse as parseYaml } from 'yaml';
4
+ import { ZodError } from 'zod';
5
+ import { ConfigNotFoundError, SchemaValidationError } from '../common/errors.js';
6
+ /**
7
+ * Read a YAML file from disk and validate it against a Zod schema.
8
+ * Returns the parsed, validated object typed by the schema.
9
+ */
10
+ export async function loadYaml(filePath, schema, label) {
11
+ let raw;
12
+ try {
13
+ raw = await readFile(filePath, 'utf-8');
14
+ }
15
+ catch (err) {
16
+ const code = err.code;
17
+ if (code === 'ENOENT') {
18
+ throw new ConfigNotFoundError(`${label} not found at ${filePath}`, { cause: err });
19
+ }
20
+ throw new ConfigNotFoundError(`Failed to read ${label} at ${filePath}: ${String(err)}`, {
21
+ cause: err,
22
+ });
23
+ }
24
+ let parsed;
25
+ try {
26
+ parsed = parseYaml(raw);
27
+ }
28
+ catch (err) {
29
+ throw new SchemaValidationError(`${label} at ${filePath} contains invalid YAML`, err, {
30
+ cause: err,
31
+ });
32
+ }
33
+ try {
34
+ return schema.parse(parsed);
35
+ }
36
+ catch (err) {
37
+ if (err instanceof ZodError) {
38
+ const issues = err.issues.map((i) => ` - ${i.path.join('.')}: ${i.message}`);
39
+ throw new SchemaValidationError(`${label} at ${filePath} failed schema validation:\n${issues.join('\n')}`, err.issues, { cause: err });
40
+ }
41
+ throw err;
42
+ }
43
+ }
44
+ /**
45
+ * Resolve the path to the project config file within a workspace.
46
+ */
47
+ export function projectConfigPath(workspacePath) {
48
+ return join(workspacePath, '.crew', 'config');
49
+ }
50
+ /**
51
+ * Load and validate the project config from a workspace path.
52
+ */
53
+ export async function loadProjectConfig(workspacePath) {
54
+ const { ProjectConfigSchema } = await import('./schemas.js');
55
+ return loadYaml(projectConfigPath(workspacePath), ProjectConfigSchema, 'Project config');
56
+ }
@@ -0,0 +1,24 @@
1
+ import type { LlmConfig } from '../types/index.js';
2
+ export interface ResolvedModel {
3
+ alias: string;
4
+ provider: string;
5
+ concreteModel: string;
6
+ apiKeyEnv: string;
7
+ }
8
+ /**
9
+ * Resolve a model alias to its concrete provider details using the project's LLM config.
10
+ *
11
+ * Walks the provider registry to find which provider owns the alias,
12
+ * then validates the alias against allowed_models if configured.
13
+ */
14
+ export declare function resolveModel(llmConfig: LlmConfig, alias: string): ResolvedModel;
15
+ /**
16
+ * Resolve the execution model for a run, using the project default.
17
+ */
18
+ export declare function resolveExecutionModel(llmConfig: LlmConfig): ResolvedModel;
19
+ /**
20
+ * Resolve the self-evaluation model, falling back to the project default
21
+ * if the persona does not specify one.
22
+ */
23
+ export declare function resolveEvalModel(llmConfig: LlmConfig, selfEvalModel?: string): ResolvedModel;
24
+ //# sourceMappingURL=model-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-resolver.d.ts","sourceRoot":"","sources":["../../src/config/model-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGnD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAuB/E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,SAAS,GAAG,aAAa,CAEzE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,aAAa,CAG5F"}
@@ -0,0 +1,39 @@
1
+ import { ModelNotFoundError, ModelNotAllowedError } from '../common/errors.js';
2
+ /**
3
+ * Resolve a model alias to its concrete provider details using the project's LLM config.
4
+ *
5
+ * Walks the provider registry to find which provider owns the alias,
6
+ * then validates the alias against allowed_models if configured.
7
+ */
8
+ export function resolveModel(llmConfig, alias) {
9
+ for (const [providerName, provider] of Object.entries(llmConfig.providers)) {
10
+ const concreteModel = provider.models[alias];
11
+ if (concreteModel !== undefined) {
12
+ if (llmConfig.allowed_models && !llmConfig.allowed_models.includes(alias)) {
13
+ throw new ModelNotAllowedError(`Model '${alias}' exists in provider '${providerName}' but is not in the allowed_models list: [${llmConfig.allowed_models.join(', ')}]`);
14
+ }
15
+ return {
16
+ alias,
17
+ provider: providerName,
18
+ concreteModel,
19
+ apiKeyEnv: provider.api_key_env,
20
+ };
21
+ }
22
+ }
23
+ const allAliases = Object.values(llmConfig.providers).flatMap((p) => Object.keys(p.models));
24
+ throw new ModelNotFoundError(`Model alias '${alias}' not found in any provider. Available aliases: [${allAliases.join(', ')}]`);
25
+ }
26
+ /**
27
+ * Resolve the execution model for a run, using the project default.
28
+ */
29
+ export function resolveExecutionModel(llmConfig) {
30
+ return resolveModel(llmConfig, llmConfig.default_model);
31
+ }
32
+ /**
33
+ * Resolve the self-evaluation model, falling back to the project default
34
+ * if the persona does not specify one.
35
+ */
36
+ export function resolveEvalModel(llmConfig, selfEvalModel) {
37
+ const alias = selfEvalModel ?? llmConfig.default_model;
38
+ return resolveModel(llmConfig, alias);
39
+ }
@@ -0,0 +1,22 @@
1
+ import type { ProjectConfig, PersonaSpec, EvaluationRubric } from '../types/index.js';
2
+ export type ResolvedSkills = Record<string, string>;
3
+ export interface LoadedConfig {
4
+ project: ProjectConfig;
5
+ persona: PersonaSpec;
6
+ rubric: EvaluationRubric;
7
+ skills: ResolvedSkills;
8
+ }
9
+ export interface ResolverOptions {
10
+ workspacePath: string;
11
+ personaName: string;
12
+ /** Absolute path to the crew monorepo root (for skills). Defaults to 4 levels above this package. */
13
+ crewRepoPath?: string;
14
+ /** Absolute path to the @helmiq/crew package root (for defaults/rubrics). Defaults to 2 levels above dist/config. */
15
+ crewPackagePath?: string;
16
+ }
17
+ /**
18
+ * Load all configuration needed for a persona run:
19
+ * project config, persona spec, evaluation rubric, and resolved skill prompts.
20
+ */
21
+ export declare function loadConfig(options: ResolverOptions): Promise<LoadedConfig>;
22
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/config/resolver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAKtF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,qGAAqG;IACrG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qHAAqH;IACrH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAkID;;;GAGG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAehF"}
@@ -0,0 +1,115 @@
1
+ import { access, readFile } from 'node:fs/promises';
2
+ import { join, resolve } from 'node:path';
3
+ import { PersonaNotFoundError, RubricNotFoundError, SkillNotFoundError } from '../common/errors.js';
4
+ import { loadYaml } from './loader.js';
5
+ import { ProjectConfigSchema, PersonaSpecSchema, EvaluationRubricSchema } from './schemas.js';
6
+ async function fileExists(filePath) {
7
+ try {
8
+ await access(filePath);
9
+ return true;
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
15
+ /**
16
+ * Resolve a persona spec using the override chain:
17
+ * 1. {workspace}/.crew/agents/{name}/persona.yaml (project override)
18
+ * 2. {crewRepo}/defaults/personas/{name}.persona.yaml (default)
19
+ */
20
+ async function resolvePersonaSpec(workspacePath, personaName, crewRepoPath) {
21
+ const projectPath = join(workspacePath, '.crew', 'agents', personaName, 'persona.yaml');
22
+ if (await fileExists(projectPath)) {
23
+ return loadYaml(projectPath, PersonaSpecSchema, `Persona spec '${personaName}'`);
24
+ }
25
+ const defaultPath = join(crewRepoPath, 'defaults', 'personas', `${personaName}.persona.yaml`);
26
+ if (await fileExists(defaultPath)) {
27
+ return loadYaml(defaultPath, PersonaSpecSchema, `Persona spec '${personaName}'`);
28
+ }
29
+ throw new PersonaNotFoundError(`Persona '${personaName}' not found. Searched:\n - ${projectPath}\n - ${defaultPath}`);
30
+ }
31
+ /**
32
+ * Resolve a rubric using the override chain:
33
+ * 1. {workspace}/.crew/rubrics/{rubricPath} (project override)
34
+ * 2. {crewRepo}/defaults/{rubricPath} (default)
35
+ *
36
+ * The rubricPath comes from the persona spec's evaluation.rubric field.
37
+ */
38
+ async function resolveRubric(workspacePath, rubricPath, crewRepoPath) {
39
+ const projectRubricPath = join(workspacePath, '.crew', 'rubrics', rubricPath);
40
+ if (await fileExists(projectRubricPath)) {
41
+ return loadYaml(projectRubricPath, EvaluationRubricSchema, `Rubric '${rubricPath}'`);
42
+ }
43
+ const defaultRubricPath = join(crewRepoPath, 'defaults', rubricPath);
44
+ if (await fileExists(defaultRubricPath)) {
45
+ return loadYaml(defaultRubricPath, EvaluationRubricSchema, `Rubric '${rubricPath}'`);
46
+ }
47
+ throw new RubricNotFoundError(`Rubric '${rubricPath}' not found. Searched:\n - ${projectRubricPath}\n - ${defaultRubricPath}`);
48
+ }
49
+ /**
50
+ * Resolve a single skill name to its prompt content using the override chain:
51
+ * 1. {workspace}/.crew/skills/{name}/{name}.prompt.md (project override)
52
+ * 2. {crewRepo}/packages/crew-skills/{name}/{name}.prompt.md (default from skills package)
53
+ */
54
+ async function resolveSkillPrompt(skillName, workspacePath, crewRepoPath) {
55
+ const fileName = `${skillName}.prompt.md`;
56
+ const wsPath = join(workspacePath, '.crew', 'skills', skillName, fileName);
57
+ if (await fileExists(wsPath))
58
+ return readFile(wsPath, 'utf-8');
59
+ const defaultPath = join(crewRepoPath, 'packages', 'crew-skills', skillName, fileName);
60
+ if (await fileExists(defaultPath))
61
+ return readFile(defaultPath, 'utf-8');
62
+ throw new SkillNotFoundError(`Skill '${skillName}' not found. Searched:\n - ${wsPath}\n - ${defaultPath}`);
63
+ }
64
+ /**
65
+ * Collect all unique skill names from the persona spec (persona-level skills,
66
+ * task-level skills, and sub-agent skills) and resolve each to prompt content.
67
+ */
68
+ async function resolveSkills(spec, workspacePath, crewRepoPath) {
69
+ const skillNames = new Set(spec.persona.skills);
70
+ for (const task of Object.values(spec.persona.tasks)) {
71
+ if (task.mode === 'composite') {
72
+ for (const sub of task.sub_agents) {
73
+ skillNames.add(sub.skill);
74
+ }
75
+ }
76
+ else {
77
+ skillNames.add(task.skill);
78
+ }
79
+ }
80
+ const resolved = {};
81
+ for (const name of skillNames) {
82
+ resolved[name] = await resolveSkillPrompt(name, workspacePath, crewRepoPath);
83
+ }
84
+ return resolved;
85
+ }
86
+ /**
87
+ * Resolve to the crew monorepo root (4 levels up from dist/config/).
88
+ * Used for skills resolution -- skills live at {repoRoot}/packages/crew-skills/.
89
+ */
90
+ function defaultCrewRepoPath() {
91
+ return resolve(import.meta.dirname, '..', '..', '..', '..');
92
+ }
93
+ /**
94
+ * Resolve to the @helmiq/crew package root (2 levels up from dist/config/).
95
+ * Used for defaults resolution -- defaults/ and rubrics live at {packageRoot}/defaults/.
96
+ */
97
+ function defaultPackagePath() {
98
+ return resolve(import.meta.dirname, '..', '..');
99
+ }
100
+ /**
101
+ * Load all configuration needed for a persona run:
102
+ * project config, persona spec, evaluation rubric, and resolved skill prompts.
103
+ */
104
+ export async function loadConfig(options) {
105
+ const { workspacePath, personaName } = options;
106
+ const crewRepoPath = options.crewRepoPath ?? defaultCrewRepoPath();
107
+ const packagePath = options.crewPackagePath ?? defaultPackagePath();
108
+ const configPath = join(workspacePath, '.crew', 'config');
109
+ const project = await loadYaml(configPath, ProjectConfigSchema, 'Project config');
110
+ const persona = await resolvePersonaSpec(workspacePath, personaName, packagePath);
111
+ const skills = await resolveSkills(persona, workspacePath, crewRepoPath);
112
+ const rubricPath = persona.persona.evaluation.rubric;
113
+ const rubric = await resolveRubric(workspacePath, rubricPath, packagePath);
114
+ return { project, persona, rubric, skills };
115
+ }
@@ -0,0 +1,266 @@
1
+ import { z } from 'zod';
2
+ export declare const ProviderSchema: z.ZodObject<{
3
+ api_key_env: z.ZodString;
4
+ models: z.ZodRecord<z.ZodString, z.ZodString>;
5
+ }, z.core.$strip>;
6
+ export declare const LlmConfigSchema: z.ZodObject<{
7
+ default_model: z.ZodString;
8
+ allowed_models: z.ZodOptional<z.ZodArray<z.ZodString>>;
9
+ providers: z.ZodRecord<z.ZodString, z.ZodObject<{
10
+ api_key_env: z.ZodString;
11
+ models: z.ZodRecord<z.ZodString, z.ZodString>;
12
+ }, z.core.$strip>>;
13
+ }, z.core.$strip>;
14
+ export declare const SourceConfigSchema: z.ZodObject<{
15
+ repo: z.ZodString;
16
+ path: z.ZodString;
17
+ }, z.core.$strip>;
18
+ export declare const WorkspaceConfigSchema: z.ZodObject<{
19
+ path: z.ZodString;
20
+ work: z.ZodString;
21
+ runs: z.ZodString;
22
+ }, z.core.$strip>;
23
+ export declare const ProjectConfigSchema: z.ZodObject<{
24
+ project: z.ZodObject<{
25
+ name: z.ZodString;
26
+ key: z.ZodString;
27
+ }, z.core.$strip>;
28
+ workspace: z.ZodObject<{
29
+ path: z.ZodString;
30
+ work: z.ZodString;
31
+ runs: z.ZodString;
32
+ }, z.core.$strip>;
33
+ source: z.ZodObject<{
34
+ repo: z.ZodString;
35
+ path: z.ZodString;
36
+ }, z.core.$strip>;
37
+ llm: z.ZodObject<{
38
+ default_model: z.ZodString;
39
+ allowed_models: z.ZodOptional<z.ZodArray<z.ZodString>>;
40
+ providers: z.ZodRecord<z.ZodString, z.ZodObject<{
41
+ api_key_env: z.ZodString;
42
+ models: z.ZodRecord<z.ZodString, z.ZodString>;
43
+ }, z.core.$strip>>;
44
+ }, z.core.$strip>;
45
+ }, z.core.$strip>;
46
+ export declare const ContextRefSchema: z.ZodObject<{
47
+ artifact: z.ZodString;
48
+ scope: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
49
+ sections: z.ZodOptional<z.ZodArray<z.ZodString>>;
50
+ when: z.ZodOptional<z.ZodString>;
51
+ }, z.core.$strip>;
52
+ export declare const SubAgentSchema: z.ZodObject<{
53
+ name: z.ZodString;
54
+ skill: z.ZodString;
55
+ reads: z.ZodArray<z.ZodString>;
56
+ produces: z.ZodString;
57
+ tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
58
+ max_iterations: z.ZodOptional<z.ZodNumber>;
59
+ gate: z.ZodOptional<z.ZodString>;
60
+ on_fail: z.ZodOptional<z.ZodString>;
61
+ max_loops: z.ZodOptional<z.ZodNumber>;
62
+ }, z.core.$strip>;
63
+ export declare const SimpleTaskSchema: z.ZodObject<{
64
+ mode: z.ZodLiteral<"simple">;
65
+ trigger: z.ZodArray<z.ZodEnum<{
66
+ manual: "manual";
67
+ scheduled: "scheduled";
68
+ event: "event";
69
+ }>>;
70
+ skill: z.ZodString;
71
+ reads: z.ZodOptional<z.ZodArray<z.ZodString>>;
72
+ produces: z.ZodString;
73
+ tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
74
+ published_artifact: z.ZodOptional<z.ZodString>;
75
+ quality_gate: z.ZodOptional<z.ZodEnum<{
76
+ "self-eval": "self-eval";
77
+ "human-review": "human-review";
78
+ "multi-model": "multi-model";
79
+ }>>;
80
+ }, z.core.$strip>;
81
+ export declare const CompositeTaskSchema: z.ZodObject<{
82
+ mode: z.ZodLiteral<"composite">;
83
+ trigger: z.ZodArray<z.ZodEnum<{
84
+ manual: "manual";
85
+ scheduled: "scheduled";
86
+ event: "event";
87
+ }>>;
88
+ sub_agents: z.ZodArray<z.ZodObject<{
89
+ name: z.ZodString;
90
+ skill: z.ZodString;
91
+ reads: z.ZodArray<z.ZodString>;
92
+ produces: z.ZodString;
93
+ tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
94
+ max_iterations: z.ZodOptional<z.ZodNumber>;
95
+ gate: z.ZodOptional<z.ZodString>;
96
+ on_fail: z.ZodOptional<z.ZodString>;
97
+ max_loops: z.ZodOptional<z.ZodNumber>;
98
+ }, z.core.$strip>>;
99
+ published_artifact: z.ZodString;
100
+ quality_gate: z.ZodOptional<z.ZodEnum<{
101
+ "self-eval": "self-eval";
102
+ "human-review": "human-review";
103
+ "multi-model": "multi-model";
104
+ }>>;
105
+ }, z.core.$strip>;
106
+ export declare const TaskSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
107
+ mode: z.ZodLiteral<"simple">;
108
+ trigger: z.ZodArray<z.ZodEnum<{
109
+ manual: "manual";
110
+ scheduled: "scheduled";
111
+ event: "event";
112
+ }>>;
113
+ skill: z.ZodString;
114
+ reads: z.ZodOptional<z.ZodArray<z.ZodString>>;
115
+ produces: z.ZodString;
116
+ tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
117
+ published_artifact: z.ZodOptional<z.ZodString>;
118
+ quality_gate: z.ZodOptional<z.ZodEnum<{
119
+ "self-eval": "self-eval";
120
+ "human-review": "human-review";
121
+ "multi-model": "multi-model";
122
+ }>>;
123
+ }, z.core.$strip>, z.ZodObject<{
124
+ mode: z.ZodLiteral<"composite">;
125
+ trigger: z.ZodArray<z.ZodEnum<{
126
+ manual: "manual";
127
+ scheduled: "scheduled";
128
+ event: "event";
129
+ }>>;
130
+ sub_agents: z.ZodArray<z.ZodObject<{
131
+ name: z.ZodString;
132
+ skill: z.ZodString;
133
+ reads: z.ZodArray<z.ZodString>;
134
+ produces: z.ZodString;
135
+ tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
136
+ max_iterations: z.ZodOptional<z.ZodNumber>;
137
+ gate: z.ZodOptional<z.ZodString>;
138
+ on_fail: z.ZodOptional<z.ZodString>;
139
+ max_loops: z.ZodOptional<z.ZodNumber>;
140
+ }, z.core.$strip>>;
141
+ published_artifact: z.ZodString;
142
+ quality_gate: z.ZodOptional<z.ZodEnum<{
143
+ "self-eval": "self-eval";
144
+ "human-review": "human-review";
145
+ "multi-model": "multi-model";
146
+ }>>;
147
+ }, z.core.$strip>], "mode">;
148
+ export declare const PersonaSpecSchema: z.ZodObject<{
149
+ persona: z.ZodObject<{
150
+ name: z.ZodString;
151
+ identity: z.ZodObject<{
152
+ role: z.ZodString;
153
+ }, z.core.$strip>;
154
+ skills: z.ZodArray<z.ZodString>;
155
+ perception: z.ZodObject<{
156
+ always_read: z.ZodOptional<z.ZodArray<z.ZodObject<{
157
+ artifact: z.ZodString;
158
+ scope: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
159
+ sections: z.ZodOptional<z.ZodArray<z.ZodString>>;
160
+ when: z.ZodOptional<z.ZodString>;
161
+ }, z.core.$strip>>>;
162
+ per_task: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodObject<{
163
+ artifact: z.ZodString;
164
+ scope: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
165
+ sections: z.ZodOptional<z.ZodArray<z.ZodString>>;
166
+ when: z.ZodOptional<z.ZodString>;
167
+ }, z.core.$strip>>>;
168
+ }, z.core.$strip>;
169
+ tasks: z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
170
+ mode: z.ZodLiteral<"simple">;
171
+ trigger: z.ZodArray<z.ZodEnum<{
172
+ manual: "manual";
173
+ scheduled: "scheduled";
174
+ event: "event";
175
+ }>>;
176
+ skill: z.ZodString;
177
+ reads: z.ZodOptional<z.ZodArray<z.ZodString>>;
178
+ produces: z.ZodString;
179
+ tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
180
+ published_artifact: z.ZodOptional<z.ZodString>;
181
+ quality_gate: z.ZodOptional<z.ZodEnum<{
182
+ "self-eval": "self-eval";
183
+ "human-review": "human-review";
184
+ "multi-model": "multi-model";
185
+ }>>;
186
+ }, z.core.$strip>, z.ZodObject<{
187
+ mode: z.ZodLiteral<"composite">;
188
+ trigger: z.ZodArray<z.ZodEnum<{
189
+ manual: "manual";
190
+ scheduled: "scheduled";
191
+ event: "event";
192
+ }>>;
193
+ sub_agents: z.ZodArray<z.ZodObject<{
194
+ name: z.ZodString;
195
+ skill: z.ZodString;
196
+ reads: z.ZodArray<z.ZodString>;
197
+ produces: z.ZodString;
198
+ tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
199
+ max_iterations: z.ZodOptional<z.ZodNumber>;
200
+ gate: z.ZodOptional<z.ZodString>;
201
+ on_fail: z.ZodOptional<z.ZodString>;
202
+ max_loops: z.ZodOptional<z.ZodNumber>;
203
+ }, z.core.$strip>>;
204
+ published_artifact: z.ZodString;
205
+ quality_gate: z.ZodOptional<z.ZodEnum<{
206
+ "self-eval": "self-eval";
207
+ "human-review": "human-review";
208
+ "multi-model": "multi-model";
209
+ }>>;
210
+ }, z.core.$strip>], "mode">>;
211
+ tools: z.ZodObject<{
212
+ permitted: z.ZodArray<z.ZodString>;
213
+ denied: z.ZodArray<z.ZodString>;
214
+ writable_paths: z.ZodOptional<z.ZodArray<z.ZodString>>;
215
+ }, z.core.$strip>;
216
+ cadence: z.ZodObject<{
217
+ scheduled: z.ZodOptional<z.ZodArray<z.ZodObject<{
218
+ cron: z.ZodString;
219
+ task: z.ZodString;
220
+ }, z.core.$strip>>>;
221
+ event: z.ZodOptional<z.ZodArray<z.ZodObject<{
222
+ on: z.ZodString;
223
+ task: z.ZodString;
224
+ }, z.core.$strip>>>;
225
+ }, z.core.$strip>;
226
+ evaluation: z.ZodObject<{
227
+ self_eval_model: z.ZodOptional<z.ZodString>;
228
+ rubric: z.ZodString;
229
+ multi_model: z.ZodOptional<z.ZodBoolean>;
230
+ }, z.core.$strip>;
231
+ }, z.core.$strip>;
232
+ }, z.core.$strip>;
233
+ export declare const CriterionWeightSchema: z.ZodEnum<{
234
+ blocking: "blocking";
235
+ important: "important";
236
+ advisory: "advisory";
237
+ }>;
238
+ export declare const CriterionSchema: z.ZodObject<{
239
+ name: z.ZodString;
240
+ weight: z.ZodEnum<{
241
+ blocking: "blocking";
242
+ important: "important";
243
+ advisory: "advisory";
244
+ }>;
245
+ description: z.ZodOptional<z.ZodString>;
246
+ }, z.core.$strip>;
247
+ export declare const EvaluationRubricSchema: z.ZodObject<{
248
+ rubric: z.ZodObject<{
249
+ artifact_type: z.ZodString;
250
+ scoring_scale: z.ZodOptional<z.ZodNumber>;
251
+ pass_threshold: z.ZodNumber;
252
+ aggregate_threshold: z.ZodOptional<z.ZodNumber>;
253
+ divergence_threshold: z.ZodOptional<z.ZodNumber>;
254
+ models: z.ZodOptional<z.ZodArray<z.ZodString>>;
255
+ criteria: z.ZodArray<z.ZodObject<{
256
+ name: z.ZodString;
257
+ weight: z.ZodEnum<{
258
+ blocking: "blocking";
259
+ important: "important";
260
+ advisory: "advisory";
261
+ }>;
262
+ description: z.ZodOptional<z.ZodString>;
263
+ }, z.core.$strip>>;
264
+ }, z.core.$strip>;
265
+ }, z.core.$strip>;
266
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/config/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,cAAc;;;iBAGzB,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;iBAYzB,CAAC;AAEJ,eAAO,MAAM,kBAAkB;;;iBAG7B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;iBAIhC,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;iBAQ9B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;iBAK3B,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;iBAUzB,CAAC;AAKH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;iBAS3B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;iBAM9B,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAAwE,CAAC;AAEhG,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2B5B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;EAAgD,CAAC;AAEnF,eAAO,MAAM,eAAe;;;;;;;;iBAI1B,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;iBAUjC,CAAC"}