@fro.bot/systematic 2.14.4 → 2.15.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.
package/dist/cli.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  findCommandsInDir,
7
7
  findSkillsInDir,
8
8
  getConfigPaths
9
- } from "./index-7100fhg3.js";
9
+ } from "./index-6xnehr4s.js";
10
10
 
11
11
  // src/cli.ts
12
12
  import fs from "fs";
@@ -15684,6 +15684,161 @@ var OPENCODE_AGENT_COLOR_TOKENS = [
15684
15684
  "info"
15685
15685
  ];
15686
15686
 
15687
+ // src/lib/bundled-names.ts
15688
+ var BUNDLED_AGENT_NAMES = [
15689
+ "adversarial-document-reviewer",
15690
+ "adversarial-reviewer",
15691
+ "agent-native-reviewer",
15692
+ "ankane-readme-writer",
15693
+ "api-contract-reviewer",
15694
+ "architecture-strategist",
15695
+ "best-practices-researcher",
15696
+ "bug-reproduction-validator",
15697
+ "cli-agent-readiness-reviewer",
15698
+ "cli-readiness-reviewer",
15699
+ "code-simplicity-reviewer",
15700
+ "coherence-reviewer",
15701
+ "correctness-reviewer",
15702
+ "data-integrity-guardian",
15703
+ "data-migration-expert",
15704
+ "data-migrations-reviewer",
15705
+ "deployment-verification-agent",
15706
+ "design-implementation-reviewer",
15707
+ "design-iterator",
15708
+ "design-lens-reviewer",
15709
+ "dhh-rails-reviewer",
15710
+ "feasibility-reviewer",
15711
+ "figma-design-sync",
15712
+ "framework-docs-researcher",
15713
+ "git-history-analyzer",
15714
+ "issue-intelligence-analyst",
15715
+ "julik-frontend-races-reviewer",
15716
+ "kieran-python-reviewer",
15717
+ "kieran-rails-reviewer",
15718
+ "kieran-typescript-reviewer",
15719
+ "learnings-researcher",
15720
+ "lint",
15721
+ "maintainability-reviewer",
15722
+ "pattern-recognition-specialist",
15723
+ "performance-oracle",
15724
+ "performance-reviewer",
15725
+ "pr-comment-resolver",
15726
+ "previous-comments-reviewer",
15727
+ "product-lens-reviewer",
15728
+ "project-standards-reviewer",
15729
+ "reliability-reviewer",
15730
+ "repo-research-analyst",
15731
+ "schema-drift-detector",
15732
+ "scope-guardian-reviewer",
15733
+ "security-lens-reviewer",
15734
+ "security-reviewer",
15735
+ "security-sentinel",
15736
+ "slack-researcher",
15737
+ "spec-flow-analyzer",
15738
+ "systematic-implementer",
15739
+ "testing-reviewer"
15740
+ ];
15741
+ var BUNDLED_AGENT_QUALIFIED_IDS = [
15742
+ "design/design-implementation-reviewer",
15743
+ "design/design-iterator",
15744
+ "design/figma-design-sync",
15745
+ "docs/ankane-readme-writer",
15746
+ "document-review/adversarial-document-reviewer",
15747
+ "document-review/coherence-reviewer",
15748
+ "document-review/design-lens-reviewer",
15749
+ "document-review/feasibility-reviewer",
15750
+ "document-review/product-lens-reviewer",
15751
+ "document-review/scope-guardian-reviewer",
15752
+ "document-review/security-lens-reviewer",
15753
+ "research/best-practices-researcher",
15754
+ "research/framework-docs-researcher",
15755
+ "research/git-history-analyzer",
15756
+ "research/issue-intelligence-analyst",
15757
+ "research/learnings-researcher",
15758
+ "research/repo-research-analyst",
15759
+ "research/slack-researcher",
15760
+ "review/adversarial-reviewer",
15761
+ "review/agent-native-reviewer",
15762
+ "review/api-contract-reviewer",
15763
+ "review/architecture-strategist",
15764
+ "review/cli-agent-readiness-reviewer",
15765
+ "review/cli-readiness-reviewer",
15766
+ "review/code-simplicity-reviewer",
15767
+ "review/correctness-reviewer",
15768
+ "review/data-integrity-guardian",
15769
+ "review/data-migration-expert",
15770
+ "review/data-migrations-reviewer",
15771
+ "review/deployment-verification-agent",
15772
+ "review/dhh-rails-reviewer",
15773
+ "review/julik-frontend-races-reviewer",
15774
+ "review/kieran-python-reviewer",
15775
+ "review/kieran-rails-reviewer",
15776
+ "review/kieran-typescript-reviewer",
15777
+ "review/maintainability-reviewer",
15778
+ "review/pattern-recognition-specialist",
15779
+ "review/performance-oracle",
15780
+ "review/performance-reviewer",
15781
+ "review/previous-comments-reviewer",
15782
+ "review/project-standards-reviewer",
15783
+ "review/reliability-reviewer",
15784
+ "review/schema-drift-detector",
15785
+ "review/security-reviewer",
15786
+ "review/security-sentinel",
15787
+ "review/testing-reviewer",
15788
+ "workflow/bug-reproduction-validator",
15789
+ "workflow/lint",
15790
+ "workflow/pr-comment-resolver",
15791
+ "workflow/spec-flow-analyzer",
15792
+ "workflow/systematic-implementer"
15793
+ ];
15794
+ var BUNDLED_SKILL_NAMES = [
15795
+ "agent-browser",
15796
+ "agent-native-architecture",
15797
+ "agent-native-audit",
15798
+ "andrew-kane-gem-writer",
15799
+ "ce:brainstorm",
15800
+ "ce:compound",
15801
+ "ce:compound-refresh",
15802
+ "ce:ideate",
15803
+ "ce:plan",
15804
+ "ce:review",
15805
+ "ce:work",
15806
+ "changelog",
15807
+ "claude-permissions-optimizer",
15808
+ "compound-docs",
15809
+ "deepen-plan",
15810
+ "deploy-docs",
15811
+ "dhh-rails-style",
15812
+ "document-review",
15813
+ "dspy-ruby",
15814
+ "every-style-editor",
15815
+ "feature-video",
15816
+ "frontend-design",
15817
+ "gemini-imagegen",
15818
+ "generate_command",
15819
+ "git-clean-gone-branches",
15820
+ "git-commit",
15821
+ "git-commit-push-pr",
15822
+ "git-worktree",
15823
+ "lfg",
15824
+ "onboarding",
15825
+ "orchestrating-swarms",
15826
+ "proof",
15827
+ "rclone",
15828
+ "report-bug-ce",
15829
+ "reproduce-bug",
15830
+ "resolve-pr-feedback",
15831
+ "setup",
15832
+ "slfg",
15833
+ "test-browser",
15834
+ "test-xcode",
15835
+ "todo-create",
15836
+ "todo-resolve",
15837
+ "todo-triage",
15838
+ "using-systematic",
15839
+ "writing-systematic-skills"
15840
+ ];
15841
+
15687
15842
  // src/lib/config-schema.ts
15688
15843
  var permissionSettingSchema = exports_external.enum(["ask", "allow", "deny"]);
15689
15844
  var permissionRuleSchema = exports_external.union([
@@ -15813,21 +15968,31 @@ var SystematicConfigSchema = exports_external.object({
15813
15968
  "https://fro.bot/systematic/schemas/v2/systematic-config.schema.json"
15814
15969
  ]
15815
15970
  }),
15816
- agents: exports_external.record(exports_external.string(), AgentOverlaySchema).default({}).meta({
15817
- description: "Per-agent configuration overlays keyed by agent name",
15818
- examples: [{ "correctness-reviewer": { temperature: 0.1 } }, {}]
15971
+ agents: exports_external.object(Object.fromEntries([...BUNDLED_AGENT_NAMES, ...BUNDLED_AGENT_QUALIFIED_IDS].map((name) => [name, AgentOverlaySchema.optional()]))).strict().default({}).meta({
15972
+ description: "Per-agent configuration overlays keyed by bundled agent name (bare or qualified category/name). Unknown keys are rejected with a Zod parse error. To overlay a user-defined agent, configure it through OpenCode-native config (.opencode/opencode.json) instead.",
15973
+ examples: [
15974
+ { "correctness-reviewer": { temperature: 0.1 } },
15975
+ { "review/correctness-reviewer": { temperature: 0.1 } },
15976
+ {}
15977
+ ]
15819
15978
  }),
15820
15979
  categories: exports_external.record(exports_external.string(), CategoryOverlaySchema).default({}).meta({
15821
15980
  description: "Per-category configuration overlays keyed by category name",
15822
15981
  examples: [{ review: { model: "anthropic/claude-opus-4-7" } }, {}]
15823
15982
  }),
15824
- disabled_skills: exports_external.array(exports_external.string()).default([]).meta({
15825
- description: "Array of skill names to disable globally",
15983
+ disabled_skills: exports_external.array(exports_external.enum(BUNDLED_SKILL_NAMES)).default([]).meta({
15984
+ description: "Array of bundled skill names to disable globally. Unknown skill names are rejected at parse time.",
15826
15985
  examples: [["ce:plan", "ce:review"]]
15827
15986
  }),
15828
- disabled_agents: exports_external.array(exports_external.string()).default([]).meta({
15829
- description: "Array of agent names to disable globally",
15830
- examples: [["previous-comments-reviewer", "cli-readiness-reviewer"]]
15987
+ disabled_agents: exports_external.array(exports_external.enum([
15988
+ ...BUNDLED_AGENT_NAMES,
15989
+ ...BUNDLED_AGENT_QUALIFIED_IDS
15990
+ ])).default([]).meta({
15991
+ description: "Array of bundled agent names (bare or qualified category/name) to disable globally. Unknown agent names are rejected at parse time.",
15992
+ examples: [
15993
+ ["previous-comments-reviewer", "cli-readiness-reviewer"],
15994
+ ["review/security-reviewer"]
15995
+ ]
15831
15996
  }),
15832
15997
  disabled_commands: exports_external.array(exports_external.string()).default([]).meta({
15833
15998
  description: "Array of command names to disable globally",
@@ -15893,12 +16058,32 @@ function loadJsoncFile(filePath) {
15893
16058
  }
15894
16059
  return parsed;
15895
16060
  }
15896
- function throwTopLevelConfigSchemaError(filePath, trust, issues) {
16061
+ var TYPED_VALIDATION_DOCS_URL = "https://systematic.fro.bot/getting-started/configuration#typed-validation";
16062
+ var TYPED_KEY_FIELDS = new Set([
16063
+ "agents",
16064
+ "disabled_agents",
16065
+ "disabled_skills"
16066
+ ]);
16067
+ function enrichUnrecognizedKeyIssues(issues) {
16068
+ return issues.map((issue2) => {
16069
+ if (issue2.code !== "unrecognized_keys")
16070
+ return issue2;
16071
+ const topField = issue2.path[0];
16072
+ if (typeof topField !== "string" || !TYPED_KEY_FIELDS.has(topField)) {
16073
+ return issue2;
16074
+ }
16075
+ const badKey = issue2.message.match(/"([^"]+)"/)?.[1] ?? "";
16076
+ const hint = badKey ? `Unrecognized key '${badKey}' in \`${topField}\`. This must be a bundled name. See ${TYPED_VALIDATION_DOCS_URL} for the full list of valid names.` : `${issue2.message} See ${TYPED_VALIDATION_DOCS_URL} for the full list of valid names.`;
16077
+ return { ...issue2, message: hint };
16078
+ });
16079
+ }
16080
+ function throwTopLevelConfigSchemaError(filePath, trust, rawIssues) {
16081
+ const issues = enrichUnrecognizedKeyIssues(rawIssues);
15897
16082
  const issue2 = issues[0];
15898
16083
  if (!issue2) {
15899
16084
  throw Object.assign(new Error(`Invalid Systematic config in ${filePath}: schema validation failed`), { _tag: "ConfigSchemaError", filePath, trust, issues });
15900
16085
  }
15901
- const fieldPath = issue2.code === "unrecognized_keys" ? issue2.message.match(/"([^"]+)"/)?.[1] ?? issue2.path.join(".") : issue2.path.join(".");
16086
+ const fieldPath = issue2.code === "unrecognized_keys" ? null : issue2.path.join(".");
15902
16087
  const message = fieldPath ? `Invalid Systematic config in ${filePath}: ${fieldPath} ${issue2.message}` : `Invalid Systematic config in ${filePath}: ${issue2.message}`;
15903
16088
  throw Object.assign(new Error(message), {
15904
16089
  _tag: "ConfigSchemaError",
package/dist/index.js CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  loadConfig,
14
14
  loadConfigWithSources,
15
15
  parseFrontmatter
16
- } from "./index-7100fhg3.js";
16
+ } from "./index-6xnehr4s.js";
17
17
 
18
18
  // src/index.ts
19
19
  import fs5 from "fs";
@@ -634,6 +634,7 @@ function emptyAvailability() {
634
634
  var MAX_CACHE_FILE_BYTES = 16 * 1024 * 1024;
635
635
  var DEFAULT_API_TIMEOUT_MS = 1500;
636
636
  var MODELS_JSON_FILENAME = "models.json";
637
+ var availabilityCache = new WeakMap;
637
638
  function resolveCacheDir() {
638
639
  const xdgCacheHome = process.env.XDG_CACHE_HOME?.trim();
639
640
  const cacheBase = xdgCacheHome && path5.isAbsolute(xdgCacheHome) ? xdgCacheHome : path5.join(os2.homedir(), ".cache");
@@ -739,9 +740,19 @@ function buildSetFromProviders(providers) {
739
740
  return result;
740
741
  }
741
742
  async function getAvailableModels(client, options = {}) {
743
+ const cached = availabilityCache.get(client);
744
+ if (cached !== undefined) {
745
+ return cached;
746
+ }
747
+ const cacheAndReturn = (envelope) => {
748
+ if (envelope.status !== "unknown") {
749
+ availabilityCache.set(client, envelope);
750
+ }
751
+ return envelope;
752
+ };
742
753
  const timeoutMs = options.apiTimeoutMs === undefined ? DEFAULT_API_TIMEOUT_MS : options.apiTimeoutMs;
743
754
  if (typeof client.config?.providers !== "function") {
744
- return readFallbackCache();
755
+ return cacheAndReturn(readFallbackCache());
745
756
  }
746
757
  const apiCall = client.config.providers();
747
758
  let response;
@@ -757,24 +768,24 @@ async function getAvailableModels(client, options = {}) {
757
768
  const raced = await Promise.race([apiCall, timeoutPromise]);
758
769
  if (raced === TIMEOUT_SENTINEL) {
759
770
  console.warn(`[systematic] client.config.providers() exceeded ${timeoutMs}ms; falling back to models.json cache.`);
760
- return readFallbackCache();
771
+ return cacheAndReturn(readFallbackCache());
761
772
  }
762
773
  response = raced;
763
774
  }
764
775
  } catch {
765
- return readFallbackCache();
776
+ return cacheAndReturn(readFallbackCache());
766
777
  }
767
778
  if (response.error !== undefined || response.data === undefined) {
768
- return readFallbackCache();
779
+ return cacheAndReturn(readFallbackCache());
769
780
  }
770
781
  const models = buildSetFromProviders(response.data.providers);
771
782
  if (models.size === 0) {
772
- return emptyAvailability();
783
+ return cacheAndReturn(emptyAvailability());
773
784
  }
774
- return {
785
+ return cacheAndReturn({
775
786
  status: "api",
776
787
  models
777
- };
788
+ });
778
789
  }
779
790
 
780
791
  // src/lib/config-handler.ts
@@ -0,0 +1,5 @@
1
+ export declare const BUNDLED_AGENT_NAMES: readonly ["adversarial-document-reviewer", "adversarial-reviewer", "agent-native-reviewer", "ankane-readme-writer", "api-contract-reviewer", "architecture-strategist", "best-practices-researcher", "bug-reproduction-validator", "cli-agent-readiness-reviewer", "cli-readiness-reviewer", "code-simplicity-reviewer", "coherence-reviewer", "correctness-reviewer", "data-integrity-guardian", "data-migration-expert", "data-migrations-reviewer", "deployment-verification-agent", "design-implementation-reviewer", "design-iterator", "design-lens-reviewer", "dhh-rails-reviewer", "feasibility-reviewer", "figma-design-sync", "framework-docs-researcher", "git-history-analyzer", "issue-intelligence-analyst", "julik-frontend-races-reviewer", "kieran-python-reviewer", "kieran-rails-reviewer", "kieran-typescript-reviewer", "learnings-researcher", "lint", "maintainability-reviewer", "pattern-recognition-specialist", "performance-oracle", "performance-reviewer", "pr-comment-resolver", "previous-comments-reviewer", "product-lens-reviewer", "project-standards-reviewer", "reliability-reviewer", "repo-research-analyst", "schema-drift-detector", "scope-guardian-reviewer", "security-lens-reviewer", "security-reviewer", "security-sentinel", "slack-researcher", "spec-flow-analyzer", "systematic-implementer", "testing-reviewer"];
2
+ export declare const BUNDLED_AGENT_QUALIFIED_IDS: readonly ["design/design-implementation-reviewer", "design/design-iterator", "design/figma-design-sync", "docs/ankane-readme-writer", "document-review/adversarial-document-reviewer", "document-review/coherence-reviewer", "document-review/design-lens-reviewer", "document-review/feasibility-reviewer", "document-review/product-lens-reviewer", "document-review/scope-guardian-reviewer", "document-review/security-lens-reviewer", "research/best-practices-researcher", "research/framework-docs-researcher", "research/git-history-analyzer", "research/issue-intelligence-analyst", "research/learnings-researcher", "research/repo-research-analyst", "research/slack-researcher", "review/adversarial-reviewer", "review/agent-native-reviewer", "review/api-contract-reviewer", "review/architecture-strategist", "review/cli-agent-readiness-reviewer", "review/cli-readiness-reviewer", "review/code-simplicity-reviewer", "review/correctness-reviewer", "review/data-integrity-guardian", "review/data-migration-expert", "review/data-migrations-reviewer", "review/deployment-verification-agent", "review/dhh-rails-reviewer", "review/julik-frontend-races-reviewer", "review/kieran-python-reviewer", "review/kieran-rails-reviewer", "review/kieran-typescript-reviewer", "review/maintainability-reviewer", "review/pattern-recognition-specialist", "review/performance-oracle", "review/performance-reviewer", "review/previous-comments-reviewer", "review/project-standards-reviewer", "review/reliability-reviewer", "review/schema-drift-detector", "review/security-reviewer", "review/security-sentinel", "review/testing-reviewer", "workflow/bug-reproduction-validator", "workflow/lint", "workflow/pr-comment-resolver", "workflow/spec-flow-analyzer", "workflow/systematic-implementer"];
3
+ export declare const BUNDLED_SKILL_NAMES: readonly ["agent-browser", "agent-native-architecture", "agent-native-audit", "andrew-kane-gem-writer", "ce:brainstorm", "ce:compound", "ce:compound-refresh", "ce:ideate", "ce:plan", "ce:review", "ce:work", "changelog", "claude-permissions-optimizer", "compound-docs", "deepen-plan", "deploy-docs", "dhh-rails-style", "document-review", "dspy-ruby", "every-style-editor", "feature-video", "frontend-design", "gemini-imagegen", "generate_command", "git-clean-gone-branches", "git-commit", "git-commit-push-pr", "git-worktree", "lfg", "onboarding", "orchestrating-swarms", "proof", "rclone", "report-bug-ce", "reproduce-bug", "resolve-pr-feedback", "setup", "slfg", "test-browser", "test-xcode", "todo-create", "todo-resolve", "todo-triage", "using-systematic", "writing-systematic-skills"];
4
+ export type BundledAgentName = (typeof BUNDLED_AGENT_NAMES)[number];
5
+ export type BundledSkillName = (typeof BUNDLED_SKILL_NAMES)[number];