@mrciphersmith/keryx 0.3.2 → 0.3.3

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 (100) hide show
  1. package/dist/cli.js +4634 -2445
  2. package/dist/core.js +66 -10
  3. package/package.json +1 -1
  4. package/src/gdskills/bundled/install-manifest.json +349 -2
  5. package/src/gdskills/bundled/rules/core/model-selection.mdc +18 -0
  6. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.md +1 -1
  7. package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.md +1 -1
  8. package/src/gdskills/bundled/skills/planning/interviewer/SKILL.md +1 -1
  9. package/src/gdskills/bundled/skills/quality/deploy/SKILL.md +1 -1
  10. package/src/gdskills/bundled/skills/review/review-jev-contract/SKILL.md +193 -0
  11. package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.detail.md +81 -21
  12. package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.md +4 -4
  13. package/src/gdskills/bundled/stacks/c-cpp/agent-refs.json +4 -0
  14. package/src/gdskills/bundled/stacks/c-cpp/governance/eval.json +1777 -0
  15. package/src/gdskills/bundled/stacks/c-cpp/governance/scout.json +31 -0
  16. package/src/gdskills/bundled/stacks/c-cpp/pack.json +42 -0
  17. package/src/gdskills/bundled/stacks/c-cpp/rules/coding-style.mdc +80 -0
  18. package/src/gdskills/bundled/stacks/c-cpp/rules/patterns.mdc +87 -0
  19. package/src/gdskills/bundled/stacks/c-cpp/rules/security.mdc +90 -0
  20. package/src/gdskills/bundled/stacks/c-cpp/rules/testing.mdc +83 -0
  21. package/src/gdskills/bundled/stacks/c-cpp/skills/c-cpp-build-fix/SKILL.md +153 -0
  22. package/src/gdskills/bundled/stacks/c-cpp/skills/c-cpp-build-fix/evals.json +74 -0
  23. package/src/gdskills/bundled/stacks/c-cpp/skills/c-cpp-code-review/SKILL.md +132 -0
  24. package/src/gdskills/bundled/stacks/c-cpp/skills/c-cpp-code-review/evals.json +73 -0
  25. package/src/gdskills/bundled/stacks/c-cpp/skills/c-cpp-implementation/SKILL.md +151 -0
  26. package/src/gdskills/bundled/stacks/c-cpp/skills/c-cpp-implementation/evals.json +74 -0
  27. package/src/gdskills/bundled/stacks/c-cpp/skills/c-cpp-testing/SKILL.md +152 -0
  28. package/src/gdskills/bundled/stacks/c-cpp/skills/c-cpp-testing/evals.json +74 -0
  29. package/src/gdskills/bundled/stacks/ci-github-gitlab/agent-refs.json +4 -0
  30. package/src/gdskills/bundled/stacks/ci-github-gitlab/governance/eval.json +1295 -0
  31. package/src/gdskills/bundled/stacks/ci-github-gitlab/governance/scout.json +26 -0
  32. package/src/gdskills/bundled/stacks/ci-github-gitlab/pack.json +41 -0
  33. package/src/gdskills/bundled/stacks/ci-github-gitlab/rules/patterns.mdc +77 -0
  34. package/src/gdskills/bundled/stacks/ci-github-gitlab/rules/security.mdc +144 -0
  35. package/src/gdskills/bundled/stacks/ci-github-gitlab/skills/ci-pipeline-build-fix/SKILL.md +121 -0
  36. package/src/gdskills/bundled/stacks/ci-github-gitlab/skills/ci-pipeline-build-fix/evals.json +73 -0
  37. package/src/gdskills/bundled/stacks/ci-github-gitlab/skills/ci-pipeline-code-review/SKILL.md +139 -0
  38. package/src/gdskills/bundled/stacks/ci-github-gitlab/skills/ci-pipeline-code-review/evals.json +73 -0
  39. package/src/gdskills/bundled/stacks/ci-github-gitlab/skills/ci-pipeline-implementation/SKILL.md +147 -0
  40. package/src/gdskills/bundled/stacks/ci-github-gitlab/skills/ci-pipeline-implementation/evals.json +74 -0
  41. package/src/gdskills/bundled/stacks/docker-k8s-terraform/agent-refs.json +4 -0
  42. package/src/gdskills/bundled/stacks/docker-k8s-terraform/governance/eval.json +865 -0
  43. package/src/gdskills/bundled/stacks/docker-k8s-terraform/governance/scout.json +16 -0
  44. package/src/gdskills/bundled/stacks/docker-k8s-terraform/pack.json +46 -0
  45. package/src/gdskills/bundled/stacks/docker-k8s-terraform/rules/coding-style.mdc +74 -0
  46. package/src/gdskills/bundled/stacks/docker-k8s-terraform/rules/patterns.mdc +81 -0
  47. package/src/gdskills/bundled/stacks/docker-k8s-terraform/rules/security.mdc +146 -0
  48. package/src/gdskills/bundled/stacks/docker-k8s-terraform/rules/testing.mdc +61 -0
  49. package/src/gdskills/bundled/stacks/docker-k8s-terraform/skills/docker-k8s-terraform-build-fix/SKILL.md +151 -0
  50. package/src/gdskills/bundled/stacks/docker-k8s-terraform/skills/docker-k8s-terraform-build-fix/evals.json +74 -0
  51. package/src/gdskills/bundled/stacks/docker-k8s-terraform/skills/docker-k8s-terraform-review/SKILL.md +135 -0
  52. package/src/gdskills/bundled/stacks/docker-k8s-terraform/skills/docker-k8s-terraform-review/evals.json +76 -0
  53. package/src/gdskills/bundled/stacks/php-laravel/agent-refs.json +4 -0
  54. package/src/gdskills/bundled/stacks/php-laravel/governance/eval.json +1829 -0
  55. package/src/gdskills/bundled/stacks/php-laravel/governance/scout.json +33 -0
  56. package/src/gdskills/bundled/stacks/php-laravel/pack.json +41 -0
  57. package/src/gdskills/bundled/stacks/php-laravel/rules/coding-style.mdc +82 -0
  58. package/src/gdskills/bundled/stacks/php-laravel/rules/patterns.mdc +80 -0
  59. package/src/gdskills/bundled/stacks/php-laravel/rules/security.mdc +80 -0
  60. package/src/gdskills/bundled/stacks/php-laravel/rules/testing.mdc +82 -0
  61. package/src/gdskills/bundled/stacks/php-laravel/skills/php-laravel-build-fix/SKILL.md +143 -0
  62. package/src/gdskills/bundled/stacks/php-laravel/skills/php-laravel-build-fix/evals.json +74 -0
  63. package/src/gdskills/bundled/stacks/php-laravel/skills/php-laravel-code-review/SKILL.md +126 -0
  64. package/src/gdskills/bundled/stacks/php-laravel/skills/php-laravel-code-review/evals.json +76 -0
  65. package/src/gdskills/bundled/stacks/php-laravel/skills/php-laravel-implementation/SKILL.md +140 -0
  66. package/src/gdskills/bundled/stacks/php-laravel/skills/php-laravel-implementation/evals.json +75 -0
  67. package/src/gdskills/bundled/stacks/php-laravel/skills/php-laravel-testing/SKILL.md +124 -0
  68. package/src/gdskills/bundled/stacks/php-laravel/skills/php-laravel-testing/evals.json +74 -0
  69. package/src/gdskills/bundled/stacks/ruby-rails/agent-refs.json +4 -0
  70. package/src/gdskills/bundled/stacks/ruby-rails/governance/eval.json +1673 -0
  71. package/src/gdskills/bundled/stacks/ruby-rails/governance/scout.json +33 -0
  72. package/src/gdskills/bundled/stacks/ruby-rails/pack.json +42 -0
  73. package/src/gdskills/bundled/stacks/ruby-rails/rules/coding-style.mdc +69 -0
  74. package/src/gdskills/bundled/stacks/ruby-rails/rules/patterns.mdc +93 -0
  75. package/src/gdskills/bundled/stacks/ruby-rails/rules/security.mdc +90 -0
  76. package/src/gdskills/bundled/stacks/ruby-rails/rules/testing.mdc +89 -0
  77. package/src/gdskills/bundled/stacks/ruby-rails/skills/ruby-rails-build-fix/SKILL.md +143 -0
  78. package/src/gdskills/bundled/stacks/ruby-rails/skills/ruby-rails-build-fix/evals.json +73 -0
  79. package/src/gdskills/bundled/stacks/ruby-rails/skills/ruby-rails-code-review/SKILL.md +134 -0
  80. package/src/gdskills/bundled/stacks/ruby-rails/skills/ruby-rails-code-review/evals.json +71 -0
  81. package/src/gdskills/bundled/stacks/ruby-rails/skills/ruby-rails-implementation/SKILL.md +141 -0
  82. package/src/gdskills/bundled/stacks/ruby-rails/skills/ruby-rails-implementation/evals.json +72 -0
  83. package/src/gdskills/bundled/stacks/ruby-rails/skills/ruby-rails-testing/SKILL.md +125 -0
  84. package/src/gdskills/bundled/stacks/ruby-rails/skills/ruby-rails-testing/evals.json +72 -0
  85. package/src/gdskills/bundled/stacks/sql-db/agent-refs.json +4 -0
  86. package/src/gdskills/bundled/stacks/sql-db/governance/eval.json +1829 -0
  87. package/src/gdskills/bundled/stacks/sql-db/governance/scout.json +30 -0
  88. package/src/gdskills/bundled/stacks/sql-db/pack.json +40 -0
  89. package/src/gdskills/bundled/stacks/sql-db/rules/coding-style.mdc +69 -0
  90. package/src/gdskills/bundled/stacks/sql-db/rules/patterns.mdc +134 -0
  91. package/src/gdskills/bundled/stacks/sql-db/rules/security.mdc +74 -0
  92. package/src/gdskills/bundled/stacks/sql-db/rules/testing.mdc +83 -0
  93. package/src/gdskills/bundled/stacks/sql-db/skills/sql-db-build-fix/SKILL.md +147 -0
  94. package/src/gdskills/bundled/stacks/sql-db/skills/sql-db-build-fix/evals.json +72 -0
  95. package/src/gdskills/bundled/stacks/sql-db/skills/sql-db-code-review/SKILL.md +132 -0
  96. package/src/gdskills/bundled/stacks/sql-db/skills/sql-db-code-review/evals.json +73 -0
  97. package/src/gdskills/bundled/stacks/sql-db/skills/sql-db-implementation/SKILL.md +153 -0
  98. package/src/gdskills/bundled/stacks/sql-db/skills/sql-db-implementation/evals.json +77 -0
  99. package/src/gdskills/bundled/stacks/sql-db/skills/sql-db-testing/SKILL.md +129 -0
  100. package/src/gdskills/bundled/stacks/sql-db/skills/sql-db-testing/evals.json +73 -0
package/dist/core.js CHANGED
@@ -8191,6 +8191,12 @@ var init_catalog = __esm(() => {
8191
8191
  "Ask Jev one choice question per open comment; keryx writes every word of the finding.",
8192
8192
  "Never post a reply or resolve a thread \u2014 the label is advisory only."
8193
8193
  ]),
8194
+ skill("review-jev-contract", "review", ["recommended", "full"], "Check a PR description's own claims, and a linked flow's frozen acceptance criteria, against the diff, scored by Jev.", [
8195
+ "Split the PR description into claims deterministically \u2014 bullets, and sentences carrying a verb cue.",
8196
+ "Compute deterministic facts per claim first: named files/symbols/flags in the diff, tests touched, exported-symbol changes.",
8197
+ 'Ask Jev one noul per claim; a claim the facts CONTRADICT (e.g. "no API change" with an exported symbol touched) is major regardless of the answer.',
8198
+ "Reuse flow 328's check-ac.ts (via runCheckAc) for the linked flow's frozen acceptance criteria \u2014 never reimplemented here."
8199
+ ]),
8194
8200
  skill("review-logic", "review", ["recommended", "full"], "Review logic correctness, contracts, edge cases, nullability, and async behavior.", [
8195
8201
  "Trace behavior through call sites and affected context.",
8196
8202
  "Look for incorrect assumptions, missing branches, race conditions, and error paths.",
@@ -8655,6 +8661,7 @@ var init_skill_length_ceilings = __esm(() => {
8655
8661
  "review/review-frontend-conventions": 213,
8656
8662
  "review/review-highload": 550,
8657
8663
  "review/review-jev-comments": 184,
8664
+ "review/review-jev-contract": 193,
8658
8665
  "review/review-jev-docs": 189,
8659
8666
  "review/review-jev-risk": 190,
8660
8667
  "review/review-jev-rules": 267,
@@ -9849,16 +9856,17 @@ function stripMutationToolsForPolicy(tools, policyProfile) {
9849
9856
  function mdSentinelLine(definition) {
9850
9857
  return `<!-- ${agentManagedSentinelText(definition)} -->`;
9851
9858
  }
9852
- function renderClaudeExport(definition, header) {
9859
+ function renderClaudeExport(definition, header, options = {}) {
9853
9860
  const { allowed, strippedForPolicy } = stripMutationToolsForPolicy(definition.tools, definition.policy_profile);
9854
9861
  const { mappedTools, droppedTools } = mapToolsForTarget(allowed, "claude");
9855
9862
  const claudeTools = mappedTools.length > 0 ? mappedTools : CLAUDE_READ_BASELINE;
9863
+ const modelLine = options.claudeSubagentAliases === false ? "model: inherit" : `model: ${CLAUDE_MODEL_ALIAS[definition.model_tier]}`;
9856
9864
  const frontmatter = [
9857
9865
  "---",
9858
9866
  `name: ${yamlDoubleQuoted(definition.name)}`,
9859
9867
  `description: ${yamlDoubleQuoted(definition.description)}`,
9860
9868
  `tools: ${yamlDoubleQuoted(claudeTools.join(", "))}`,
9861
- "model: inherit",
9869
+ modelLine,
9862
9870
  "---"
9863
9871
  ].join(`
9864
9872
  `);
@@ -9979,9 +9987,9 @@ ${header}
9979
9987
  }
9980
9988
  };
9981
9989
  }
9982
- function renderHostExport(definition, target, header) {
9990
+ function renderHostExport(definition, target, header, options = {}) {
9983
9991
  if (target === "claude") {
9984
- return { ok: true, result: renderClaudeExport(definition, header) };
9992
+ return { ok: true, result: renderClaudeExport(definition, header, options) };
9985
9993
  }
9986
9994
  if (target === "codex") {
9987
9995
  return renderCodexExport(definition, header);
@@ -10023,7 +10031,7 @@ function compileAgentHeader(definition) {
10023
10031
  }
10024
10032
  return { ok: true, header: renderHeader(definition) };
10025
10033
  }
10026
- function compileAgentDefinition(definition, target) {
10034
+ function compileAgentDefinition(definition, target, options = {}) {
10027
10035
  const headerResult = compileAgentHeader(definition);
10028
10036
  if (!headerResult.ok) {
10029
10037
  return { ok: false, error: headerResult.error };
@@ -10032,9 +10040,9 @@ function compileAgentDefinition(definition, target) {
10032
10040
  if (target === "keryx-shell") {
10033
10041
  return compileKeryxShell(definition, header);
10034
10042
  }
10035
- return renderHostExport(definition, target, header);
10043
+ return renderHostExport(definition, target, header, options);
10036
10044
  }
10037
- var KERYX_SHELL_ENFORCEMENT, BASELINE_NGRAM_WORDS = 10, BASELINE_WORDS, BASELINE_NGRAMS, AGENT_CONTENT_HASH_PLACEHOLDER, CONTENT_HASH_MARKER = "content-sha256:", MUTATION_TOOL_NAMES, CLAUDE_READ_BASELINE, KIRO_READ_BASELINE;
10045
+ var KERYX_SHELL_ENFORCEMENT, BASELINE_NGRAM_WORDS = 10, BASELINE_WORDS, BASELINE_NGRAMS, AGENT_CONTENT_HASH_PLACEHOLDER, CONTENT_HASH_MARKER = "content-sha256:", MUTATION_TOOL_NAMES, CLAUDE_READ_BASELINE, KIRO_READ_BASELINE, CLAUDE_MODEL_ALIAS;
10038
10046
  var init_compile = __esm(() => {
10039
10047
  init_baseline();
10040
10048
  init_schema();
@@ -10052,6 +10060,11 @@ var init_compile = __esm(() => {
10052
10060
  MUTATION_TOOL_NAMES = new Set(["apply_patch", "shell_exec"]);
10053
10061
  CLAUDE_READ_BASELINE = ["Read", "Grep", "Glob"];
10054
10062
  KIRO_READ_BASELINE = ["read"];
10063
+ CLAUDE_MODEL_ALIAS = {
10064
+ deep: "opus",
10065
+ standard: "sonnet",
10066
+ light: "haiku"
10067
+ };
10055
10068
  });
10056
10069
 
10057
10070
  // src/agents/export.ts
@@ -10128,6 +10141,28 @@ function decideAction(existing, generated, format, expectedName) {
10128
10141
  }
10129
10142
  return { action: "update" };
10130
10143
  }
10144
+ async function readClaudeSubagentAliasesConfig(projectRoot) {
10145
+ const file = path36.join(projectRoot, CLAUDE_SUBAGENT_ALIASES_CONFIG_PATH);
10146
+ if (!await pathExists(file)) {
10147
+ return { enabled: true };
10148
+ }
10149
+ const read = await readJsonObjectFile(file);
10150
+ if (read.state !== "object") {
10151
+ return { enabled: true, note: `${CLAUDE_SUBAGENT_ALIASES_CONFIG_PATH} could not be read as a JSON object; claude subagent aliases stayed enabled` };
10152
+ }
10153
+ const modelGuidance = read.value["modelGuidance"];
10154
+ if (typeof modelGuidance !== "object" || modelGuidance === null || Array.isArray(modelGuidance)) {
10155
+ return { enabled: true };
10156
+ }
10157
+ const value = modelGuidance["claudeSubagentAliases"];
10158
+ if (value === false) {
10159
+ return { enabled: false };
10160
+ }
10161
+ if (value !== undefined && value !== true) {
10162
+ return { enabled: true, note: `${CLAUDE_SUBAGENT_ALIASES_CONFIG_PATH}: modelGuidance.claudeSubagentAliases is not a boolean; aliases stayed enabled` };
10163
+ }
10164
+ return { enabled: true };
10165
+ }
10131
10166
  async function planAgentExport(projectRoot, definition, runtime, opts = {}) {
10132
10167
  const supportLevel = agentExportSupport(runtime, opts.lookup);
10133
10168
  if (runtime === "keryx-shell") {
@@ -10194,7 +10229,8 @@ ${headerResult.header}
10194
10229
  ...decided.reason !== undefined ? { reason: decided.reason } : {}
10195
10230
  };
10196
10231
  }
10197
- const compiled = compileAgentDefinition(definition, runtime);
10232
+ const compileOptions = runtime === "claude" ? { claudeSubagentAliases: (await readClaudeSubagentAliasesConfig(projectRoot)).enabled } : {};
10233
+ const compiled = compileAgentDefinition(definition, runtime, compileOptions);
10198
10234
  if (!compiled.ok) {
10199
10235
  return {
10200
10236
  runtime,
@@ -10323,9 +10359,10 @@ var defaultAgentSupportLookup = (runtime) => {
10323
10359
  if (!surface)
10324
10360
  return;
10325
10361
  return matrixStateToExportLevel(classifySurfaceState(adapter, surface));
10326
- }, PROSE_EXPORT_ROOT = ".metaproject/agents-export", HOST_AGENTS_DIR;
10362
+ }, PROSE_EXPORT_ROOT = ".metaproject/agents-export", CLAUDE_SUBAGENT_ALIASES_CONFIG_PATH = ".metaproject/tasks.config.json", HOST_AGENTS_DIR;
10327
10363
  var init_export2 = __esm(() => {
10328
10364
  init_fs();
10365
+ init_json();
10329
10366
  init_contained_write();
10330
10367
  init_registry();
10331
10368
  init_matrix();
@@ -23346,6 +23383,7 @@ __export(exports_service3, {
23346
23383
  confirmPreconditionError: () => confirmPreconditionError,
23347
23384
  createFlowService: () => createFlowService,
23348
23385
  evaluatedVerdict: () => evaluatedVerdict,
23386
+ extractCriterionTokens: () => extractCriterionTokens,
23349
23387
  factsOnlyVerdict: () => factsOnlyVerdict,
23350
23388
  hashDiff: () => hashDiff,
23351
23389
  isFrozen: () => isFrozen,
@@ -36986,7 +37024,7 @@ var HELP_GROUPS = [
36986
37024
  kind: "cli",
36987
37025
  name: "routing",
36988
37026
  group: "Connect a model provider",
36989
- summary: "Category -> model routing table (list, set, unset, trust) and the model-profile catalogue (profile list, profile set)."
37027
+ summary: "Category -> model routing table (list, set, unset, trust), the model-profile catalogue (profile list, profile set), and real measured task cost (stats)."
36990
37028
  },
36991
37029
  { kind: "slash", name: "/connect", group: "Connect a model provider", summary: "Switch provider; row buttons test/disconnect it." },
36992
37030
  {
@@ -37183,12 +37221,30 @@ var HELP_GROUPS = [
37183
37221
  group: "Managed work",
37184
37222
  summary: "List open PR review comments with a Jev resolved/still-open/escalation label \u2014 /opencomments <owner/repo> <pr>."
37185
37223
  },
37224
+ {
37225
+ kind: "slash",
37226
+ name: "/contract",
37227
+ group: "Managed work",
37228
+ summary: "Check PR-description claims and a linked flow's frozen acceptance criteria against the working diff, with Jev."
37229
+ },
37230
+ {
37231
+ kind: "slash",
37232
+ name: "/triage",
37233
+ group: "Managed work",
37234
+ summary: "Advisory annotations \u2014 severity calibration, duplicate-merge candidates, verifier queue order \u2014 over the latest review package, with Jev."
37235
+ },
37186
37236
  {
37187
37237
  kind: "slash",
37188
37238
  name: "/guard",
37189
37239
  group: "Managed work",
37190
37240
  summary: "Opt-in turn guard: after a turn, checks whether the request was done and catches a reply that contradicts the tools \u2014 /guard [on|off]."
37191
37241
  },
37242
+ {
37243
+ kind: "slash",
37244
+ name: "/route",
37245
+ group: "Managed work",
37246
+ summary: "Opt-in routing classifier: each request runs on its routing category's model \u2014 /route [on|off]."
37247
+ },
37192
37248
  { kind: "slash", name: "/plan", group: "Managed work", summary: "Toggle read-only mode \u2014 /plan [on|off]." },
37193
37249
  {
37194
37250
  kind: "slash",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrciphersmith/keryx",
3
- "version": "0.3.2",
3
+ "version": "0.3.3",
4
4
  "description": "Version-controlled project context for AI coding agents: code graph, architecture wiki, project memory, relevant tests, quality signals, and task flows.",
5
5
  "private": false,
6
6
  "publishConfig": {
@@ -116,6 +116,28 @@
116
116
  ],
117
117
  "stackDetectionAware": true
118
118
  },
119
+ "docker-k8s-terraform": {
120
+ "description": "Common rules plus the Docker/Kubernetes/Terraform tool pack component, installed when `keryx stack detect` finds a matching tag (docker, docker-compose, or terraform). Experimental: has not cleared the honest behavioral eval gate yet.",
121
+ "modules": [
122
+ "core-common-rules",
123
+ "skill-lifecycle"
124
+ ],
125
+ "components": [
126
+ "tool:docker-k8s-terraform"
127
+ ],
128
+ "stackDetectionAware": true
129
+ },
130
+ "ci-github-gitlab": {
131
+ "description": "Common rules plus the CI (GitHub Actions & GitLab CI) tool pack component, installed when `keryx stack detect` finds a matching tag (github-actions or gitlab-ci). Experimental: has not cleared the honest behavioral eval gate yet.",
132
+ "modules": [
133
+ "core-common-rules",
134
+ "skill-lifecycle"
135
+ ],
136
+ "components": [
137
+ "tool:ci-github-gitlab"
138
+ ],
139
+ "stackDetectionAware": true
140
+ },
119
141
  "full": {
120
142
  "description": "Every registered module and component, unconditionally.",
121
143
  "modules": [
@@ -146,7 +168,19 @@
146
168
  "angular-rules",
147
169
  "angular-skills",
148
170
  "nextjs-nuxt-rules",
149
- "nextjs-nuxt-skills"
171
+ "nextjs-nuxt-skills",
172
+ "docker-k8s-terraform-rules",
173
+ "docker-k8s-terraform-skills",
174
+ "ci-github-gitlab-rules",
175
+ "ci-github-gitlab-skills",
176
+ "php-laravel-rules",
177
+ "php-laravel-skills",
178
+ "ruby-rails-rules",
179
+ "ruby-rails-skills",
180
+ "c-cpp-rules",
181
+ "c-cpp-skills",
182
+ "sql-db-rules",
183
+ "sql-db-skills"
150
184
  ],
151
185
  "components": [
152
186
  "lang:ts-js-node",
@@ -157,8 +191,58 @@
157
191
  "lang:go",
158
192
  "framework:vue",
159
193
  "framework:angular",
160
- "framework:nextjs-nuxt"
194
+ "framework:nextjs-nuxt",
195
+ "tool:docker-k8s-terraform",
196
+ "tool:ci-github-gitlab",
197
+ "framework:php-laravel",
198
+ "framework:ruby-rails",
199
+ "lang:c-cpp",
200
+ "capability:sql-db"
161
201
  ]
202
+ },
203
+ "php-laravel": {
204
+ "description": "Common rules plus the PHP/Laravel stack pack component (`php-laravel-rules` + `php-laravel-skills`, from src/gdskills/bundled/stacks/php-laravel/), installed when `keryx stack detect` finds a matching tag.",
205
+ "modules": [
206
+ "core-common-rules",
207
+ "skill-lifecycle"
208
+ ],
209
+ "components": [
210
+ "framework:php-laravel"
211
+ ],
212
+ "stackDetectionAware": true
213
+ },
214
+ "ruby-rails": {
215
+ "description": "Common rules plus the Ruby on Rails stack pack component (`ruby-rails-rules` + `ruby-rails-skills`, from src/gdskills/bundled/stacks/ruby-rails/), installed when `keryx stack detect` finds a matching tag.",
216
+ "modules": [
217
+ "core-common-rules",
218
+ "skill-lifecycle"
219
+ ],
220
+ "components": [
221
+ "framework:ruby-rails"
222
+ ],
223
+ "stackDetectionAware": true
224
+ },
225
+ "c-cpp": {
226
+ "description": "Common rules plus the C/C++ stack pack component (`c-cpp-rules` + `c-cpp-skills`, from src/gdskills/bundled/stacks/c-cpp/), installed when `keryx stack detect` finds a matching tag.",
227
+ "modules": [
228
+ "core-common-rules",
229
+ "skill-lifecycle"
230
+ ],
231
+ "components": [
232
+ "lang:c-cpp"
233
+ ],
234
+ "stackDetectionAware": true
235
+ },
236
+ "sql-db": {
237
+ "description": "Common rules plus the SQL/database stack pack component (`sql-db-rules` + `sql-db-skills`, from src/gdskills/bundled/stacks/sql-db/), installed when `keryx stack detect` finds a matching tag.",
238
+ "modules": [
239
+ "core-common-rules",
240
+ "skill-lifecycle"
241
+ ],
242
+ "components": [
243
+ "capability:sql-db"
244
+ ],
245
+ "stackDetectionAware": true
162
246
  }
163
247
  },
164
248
  "modules": {
@@ -664,6 +748,186 @@
664
748
  "defaultInstall": true,
665
749
  "cost": "medium",
666
750
  "stability": "experimental"
751
+ },
752
+ "docker-k8s-terraform-rules": {
753
+ "kind": "rule",
754
+ "description": "Docker/Kubernetes/Terraform stack pack rules (coding-style, patterns, security, testing; scoped to Dockerfiles, compose YAML, k8s/Helm YAML, *.tf/*.tfvars) from src/gdskills/bundled/stacks/docker-k8s-terraform/rules/.",
755
+ "paths": [
756
+ "src/gdskills/bundled/stacks/docker-k8s-terraform/rules/*.mdc"
757
+ ],
758
+ "targets": [
759
+ "claude",
760
+ "keryx-shell"
761
+ ],
762
+ "dependencies": [],
763
+ "defaultInstall": true,
764
+ "cost": "light",
765
+ "stability": "experimental"
766
+ },
767
+ "docker-k8s-terraform-skills": {
768
+ "kind": "skill",
769
+ "description": "Docker/Kubernetes/Terraform stack pack skills (no implement skill per W1-stack-catalog.md -- config authoring lives in the deploy quality skill; review, build-fix) from src/gdskills/bundled/stacks/docker-k8s-terraform/skills/.",
770
+ "paths": [
771
+ "src/gdskills/bundled/stacks/docker-k8s-terraform/skills/**"
772
+ ],
773
+ "targets": [
774
+ "claude",
775
+ "keryx-shell"
776
+ ],
777
+ "dependencies": [],
778
+ "defaultInstall": true,
779
+ "cost": "medium",
780
+ "stability": "experimental"
781
+ },
782
+ "ci-github-gitlab-rules": {
783
+ "kind": "rule",
784
+ "description": "CI (GitHub Actions & GitLab CI) stack pack rules (patterns, security; scoped to .github/workflows/*.yml and .gitlab-ci.yml only) from src/gdskills/bundled/stacks/ci-github-gitlab/rules/.",
785
+ "paths": [
786
+ "src/gdskills/bundled/stacks/ci-github-gitlab/rules/*.mdc"
787
+ ],
788
+ "targets": [
789
+ "claude",
790
+ "keryx-shell"
791
+ ],
792
+ "dependencies": [],
793
+ "defaultInstall": true,
794
+ "cost": "light",
795
+ "stability": "experimental"
796
+ },
797
+ "ci-github-gitlab-skills": {
798
+ "kind": "skill",
799
+ "description": "CI (GitHub Actions & GitLab CI) stack pack skills (implementation, code review, build-fix) from src/gdskills/bundled/stacks/ci-github-gitlab/skills/.",
800
+ "paths": [
801
+ "src/gdskills/bundled/stacks/ci-github-gitlab/skills/**"
802
+ ],
803
+ "targets": [
804
+ "claude",
805
+ "keryx-shell"
806
+ ],
807
+ "dependencies": [],
808
+ "defaultInstall": true,
809
+ "cost": "medium",
810
+ "stability": "experimental"
811
+ },
812
+ "php-laravel-rules": {
813
+ "kind": "rule",
814
+ "description": "PHP/Laravel stack pack rules (coding-style, patterns, security, testing) from src/gdskills/bundled/stacks/php-laravel/rules/.",
815
+ "paths": [
816
+ "src/gdskills/bundled/stacks/php-laravel/rules/*.mdc"
817
+ ],
818
+ "targets": [
819
+ "claude",
820
+ "keryx-shell"
821
+ ],
822
+ "dependencies": [],
823
+ "defaultInstall": true,
824
+ "cost": "light",
825
+ "stability": "experimental"
826
+ },
827
+ "php-laravel-skills": {
828
+ "kind": "skill",
829
+ "description": "PHP/Laravel stack pack skills (implementation, testing, code review, build-fix) from src/gdskills/bundled/stacks/php-laravel/skills/.",
830
+ "paths": [
831
+ "src/gdskills/bundled/stacks/php-laravel/skills/**"
832
+ ],
833
+ "targets": [
834
+ "claude",
835
+ "keryx-shell"
836
+ ],
837
+ "dependencies": [],
838
+ "defaultInstall": true,
839
+ "cost": "medium",
840
+ "stability": "experimental"
841
+ },
842
+ "ruby-rails-rules": {
843
+ "kind": "rule",
844
+ "description": "Ruby on Rails stack pack rules (coding-style, patterns, security, testing) from src/gdskills/bundled/stacks/ruby-rails/rules/.",
845
+ "paths": [
846
+ "src/gdskills/bundled/stacks/ruby-rails/rules/*.mdc"
847
+ ],
848
+ "targets": [
849
+ "claude",
850
+ "keryx-shell"
851
+ ],
852
+ "dependencies": [],
853
+ "defaultInstall": true,
854
+ "cost": "light",
855
+ "stability": "experimental"
856
+ },
857
+ "ruby-rails-skills": {
858
+ "kind": "skill",
859
+ "description": "Ruby on Rails stack pack skills (implementation, testing, code review, build-fix) from src/gdskills/bundled/stacks/ruby-rails/skills/.",
860
+ "paths": [
861
+ "src/gdskills/bundled/stacks/ruby-rails/skills/**"
862
+ ],
863
+ "targets": [
864
+ "claude",
865
+ "keryx-shell"
866
+ ],
867
+ "dependencies": [],
868
+ "defaultInstall": true,
869
+ "cost": "medium",
870
+ "stability": "experimental"
871
+ },
872
+ "c-cpp-rules": {
873
+ "kind": "rule",
874
+ "description": "C/C++ stack pack rules (coding-style, patterns, security, testing) from src/gdskills/bundled/stacks/c-cpp/rules/.",
875
+ "paths": [
876
+ "src/gdskills/bundled/stacks/c-cpp/rules/*.mdc"
877
+ ],
878
+ "targets": [
879
+ "claude",
880
+ "keryx-shell"
881
+ ],
882
+ "dependencies": [],
883
+ "defaultInstall": true,
884
+ "cost": "light",
885
+ "stability": "experimental"
886
+ },
887
+ "c-cpp-skills": {
888
+ "kind": "skill",
889
+ "description": "C/C++ stack pack skills (implementation, testing, code review, build-fix) from src/gdskills/bundled/stacks/c-cpp/skills/.",
890
+ "paths": [
891
+ "src/gdskills/bundled/stacks/c-cpp/skills/**"
892
+ ],
893
+ "targets": [
894
+ "claude",
895
+ "keryx-shell"
896
+ ],
897
+ "dependencies": [],
898
+ "defaultInstall": true,
899
+ "cost": "medium",
900
+ "stability": "experimental"
901
+ },
902
+ "sql-db-rules": {
903
+ "kind": "rule",
904
+ "description": "SQL/database stack pack rules (coding-style, patterns, security, testing) from src/gdskills/bundled/stacks/sql-db/rules/.",
905
+ "paths": [
906
+ "src/gdskills/bundled/stacks/sql-db/rules/*.mdc"
907
+ ],
908
+ "targets": [
909
+ "claude",
910
+ "keryx-shell"
911
+ ],
912
+ "dependencies": [],
913
+ "defaultInstall": true,
914
+ "cost": "light",
915
+ "stability": "experimental"
916
+ },
917
+ "sql-db-skills": {
918
+ "kind": "skill",
919
+ "description": "SQL/database stack pack skills (implementation, testing, code review, build-fix) from src/gdskills/bundled/stacks/sql-db/skills/.",
920
+ "paths": [
921
+ "src/gdskills/bundled/stacks/sql-db/skills/**"
922
+ ],
923
+ "targets": [
924
+ "claude",
925
+ "keryx-shell"
926
+ ],
927
+ "dependencies": [],
928
+ "defaultInstall": true,
929
+ "cost": "medium",
930
+ "stability": "experimental"
667
931
  }
668
932
  },
669
933
  "components": {
@@ -792,6 +1056,89 @@
792
1056
  "provenance": {
793
1057
  "origin": "authored"
794
1058
  }
1059
+ },
1060
+ "tool:docker-k8s-terraform": {
1061
+ "family": "tool",
1062
+ "modules": [
1063
+ "docker-k8s-terraform-rules",
1064
+ "docker-k8s-terraform-skills"
1065
+ ],
1066
+ "detectionMarkers": [
1067
+ "docker",
1068
+ "docker-compose",
1069
+ "terraform"
1070
+ ],
1071
+ "provenance": {
1072
+ "origin": "authored"
1073
+ }
1074
+ },
1075
+ "tool:ci-github-gitlab": {
1076
+ "family": "tool",
1077
+ "modules": [
1078
+ "ci-github-gitlab-rules",
1079
+ "ci-github-gitlab-skills"
1080
+ ],
1081
+ "detectionMarkers": [
1082
+ "github-actions",
1083
+ "gitlab-ci"
1084
+ ],
1085
+ "provenance": {
1086
+ "origin": "authored"
1087
+ }
1088
+ },
1089
+ "framework:php-laravel": {
1090
+ "family": "framework",
1091
+ "modules": [
1092
+ "php-laravel-rules",
1093
+ "php-laravel-skills"
1094
+ ],
1095
+ "detectionMarkers": [
1096
+ "php",
1097
+ "laravel"
1098
+ ],
1099
+ "provenance": {
1100
+ "origin": "authored"
1101
+ }
1102
+ },
1103
+ "framework:ruby-rails": {
1104
+ "family": "framework",
1105
+ "modules": [
1106
+ "ruby-rails-rules",
1107
+ "ruby-rails-skills"
1108
+ ],
1109
+ "detectionMarkers": [
1110
+ "ruby",
1111
+ "rails"
1112
+ ],
1113
+ "provenance": {
1114
+ "origin": "authored"
1115
+ }
1116
+ },
1117
+ "lang:c-cpp": {
1118
+ "family": "language",
1119
+ "modules": [
1120
+ "c-cpp-rules",
1121
+ "c-cpp-skills"
1122
+ ],
1123
+ "detectionMarkers": [
1124
+ "c-cpp"
1125
+ ],
1126
+ "provenance": {
1127
+ "origin": "authored"
1128
+ }
1129
+ },
1130
+ "capability:sql-db": {
1131
+ "family": "capability",
1132
+ "modules": [
1133
+ "sql-db-rules",
1134
+ "sql-db-skills"
1135
+ ],
1136
+ "detectionMarkers": [
1137
+ "sql"
1138
+ ],
1139
+ "provenance": {
1140
+ "origin": "authored"
1141
+ }
795
1142
  }
796
1143
  }
797
1144
  }
@@ -177,6 +177,24 @@ entry point; `decideDispatchModel` is what it calls.
177
177
  Nothing reads a recorded resolution back and checks it. These fields explain a
178
178
  finished run; they do not gate one.
179
179
 
180
+ ## A third place: compiling a Claude Code subagent file
181
+
182
+ `keryx agents export --runtime claude` (`src/agents/compile.ts`'s
183
+ `renderClaudeExport`) is neither of the two shapes above — it never asks
184
+ `spawn_subagent` or `keryx review tier` anything, and it runs at EXPORT time,
185
+ once, against a file written to disk, not at dispatch time. Claude Code's own
186
+ subagent frontmatter has no tier concept and no candidate discovery at all; it
187
+ accepts exactly four fixed, version-free words for `model` — `opus`, `sonnet`,
188
+ `haiku`, `inherit` — and nothing else. The compiler maps a definition's
189
+ declared `model_tier` onto that fixed vocabulary directly: `deep` to `opus`,
190
+ `standard` to `sonnet`, `light` to `haiku` (an undeclared tier defaults to
191
+ `standard`, so it lands on `sonnet`). This is not the discover/rank/fall-back
192
+ resolution described above, and it is not a model id — it is a static lookup
193
+ into the one enum a host's own docs define, so it can never go stale the way a
194
+ literal id would. A project that wants the pre-existing behavior sets
195
+ `.metaproject/tasks.config.json`'s `modelGuidance.claudeSubagentAliases:
196
+ false`, which restores `model: inherit` for every tier.
197
+
180
198
  ## Choosing the tier
181
199
 
182
200
  The tier is **computed, not judged**. Run:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: job-orchestrator
3
- description: "Use when a GitHub issue or complex intent needs to be analyzed, planned, and implemented end-to-end with sub-agents. NOT for: the same pipeline under Task Manager flow state (use flow-orchestrator)."
3
+ description: "Use when a GitHub issue or complex intent needs to be analyzed, planned, and implemented end-to-end with sub-agents — this skill orchestrates the whole task from issue to PR. NOT for: the same pipeline under Task Manager flow state (use flow-orchestrator)."
4
4
  triggers:
5
5
  - "implement issue"
6
6
  - "full workflow"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: brainstorm
3
- description: "Use when exploring architecture decisions, tech choices, feature ideas, or any open-ended problem that benefits from multiple perspectives. NOT for: writing the chosen option up as a formal requirements document (use prd-creator)."
3
+ description: "Use when exploring architecture decisions, tech choices, feature ideas, or any open-ended problem with several options that benefits from multiple perspectives. NOT for: writing the chosen option up as a formal requirements document (use prd-creator)."
4
4
  triggers:
5
5
  - "brainstorm"
6
6
  - "explore options"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: interviewer
3
- description: "Use when a request is ambiguous and must be pinned down BEFORE any context is collected — the entry-point interview that turns a vague or expensive ask into a scoped brief. This is the `custom`-intent gate job-orchestrator runs at 0.1.5. NOT for: clarifying implementation specifics AFTER context is already collected — use `interview` instead."
3
+ description: "Use when a request is ambiguous and must be pinned down BEFORE any context is collected — the entry-point interview that clarifies the real requirements and turns a vague or expensive ask into a scoped brief. This is the `custom`-intent gate job-orchestrator runs at 0.1.5. NOT for: clarifying implementation specifics AFTER context is already collected — use `interview` instead."
4
4
  triggers:
5
5
  - "ask questions"
6
6
  - "clarify requirements"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: deploy
3
- description: "Use when deploying to any environment (staging, production) or when a deployment pipeline needs to run. NOT for the database schema changes a release depends on (use `db-migrate`)."
3
+ description: "Use when deploying a release to any environment (staging, production) or when a deployment pipeline needs to run. NOT for the database schema changes a release depends on (use `db-migrate`)."
4
4
  triggers:
5
5
  - "deploy"
6
6
  - "deployment"