@fro.bot/systematic 2.14.5 → 2.16.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 +1 -1
- package/dist/{index-7100fhg3.js → index-s0d2z9ph.js} +230 -11
- package/dist/index.js +1 -1
- package/dist/lib/bundled-names.d.ts +5 -0
- package/dist/lib/config-schema.d.ts +3519 -35
- package/dist/schemas/systematic-config.schema.json +16460 -141
- package/package.json +3 -3
package/dist/cli.js
CHANGED
|
@@ -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.
|
|
15817
|
-
description: "Per-agent configuration overlays keyed by agent name",
|
|
15818
|
-
examples: [
|
|
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.
|
|
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.
|
|
15829
|
-
|
|
15830
|
-
|
|
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,66 @@ function loadJsoncFile(filePath) {
|
|
|
15893
16058
|
}
|
|
15894
16059
|
return parsed;
|
|
15895
16060
|
}
|
|
15896
|
-
|
|
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 formatUnrecognizedKeysHint(badKeys, topField) {
|
|
16068
|
+
if (badKeys.length === 0) {
|
|
16069
|
+
throw new Error("formatUnrecognizedKeysHint requires non-empty keys");
|
|
16070
|
+
}
|
|
16071
|
+
if (badKeys.length === 1) {
|
|
16072
|
+
return `Unrecognized key '${badKeys[0]}' in \`${topField}\`. This must be a bundled name. See ${TYPED_VALIDATION_DOCS_URL} for the full list of valid names.`;
|
|
16073
|
+
}
|
|
16074
|
+
const joined = badKeys.map((k) => `'${k}'`).join(", ");
|
|
16075
|
+
return `Unrecognized keys ${joined} in \`${topField}\`. These must be bundled names. See ${TYPED_VALIDATION_DOCS_URL} for the full list of valid names.`;
|
|
16076
|
+
}
|
|
16077
|
+
function enrichUnrecognizedKeyIssues(issues, rawInput) {
|
|
16078
|
+
return issues.map((issue2) => {
|
|
16079
|
+
const topField = issue2.path[0];
|
|
16080
|
+
if (typeof topField !== "string" || !TYPED_KEY_FIELDS.has(topField)) {
|
|
16081
|
+
return issue2;
|
|
16082
|
+
}
|
|
16083
|
+
if (issue2.code === "unrecognized_keys") {
|
|
16084
|
+
const hint = formatUnrecognizedKeysHint(issue2.keys, topField);
|
|
16085
|
+
return { ...issue2, message: hint };
|
|
16086
|
+
}
|
|
16087
|
+
if (issue2.code === "invalid_value" && (topField === "disabled_agents" || topField === "disabled_skills")) {
|
|
16088
|
+
const badValue = resolveValueAtPath(rawInput, issue2.path);
|
|
16089
|
+
const kind = topField === "disabled_agents" ? "agent" : "skill";
|
|
16090
|
+
const hint = typeof badValue === "string" ? `Unrecognized ${kind} name '${badValue}' in \`${topField}\`. This must be a bundled name. See ${TYPED_VALIDATION_DOCS_URL} for the full list of valid names.` : `Invalid value in \`${topField}\`. See ${TYPED_VALIDATION_DOCS_URL} for the full list of valid names.`;
|
|
16091
|
+
return { ...issue2, message: hint };
|
|
16092
|
+
}
|
|
16093
|
+
return issue2;
|
|
16094
|
+
});
|
|
16095
|
+
}
|
|
16096
|
+
function resolveValueAtPath(root, path4) {
|
|
16097
|
+
let current = root;
|
|
16098
|
+
for (const segment of path4) {
|
|
16099
|
+
if (typeof segment === "symbol") {
|
|
16100
|
+
return;
|
|
16101
|
+
}
|
|
16102
|
+
if (typeof segment === "number") {
|
|
16103
|
+
if (!Array.isArray(current))
|
|
16104
|
+
return;
|
|
16105
|
+
current = current[segment];
|
|
16106
|
+
} else {
|
|
16107
|
+
if (!isRecord2(current))
|
|
16108
|
+
return;
|
|
16109
|
+
current = current[segment];
|
|
16110
|
+
}
|
|
16111
|
+
}
|
|
16112
|
+
return current;
|
|
16113
|
+
}
|
|
16114
|
+
function throwTopLevelConfigSchemaError(filePath, trust, rawIssues, rawInput) {
|
|
16115
|
+
const issues = enrichUnrecognizedKeyIssues(rawIssues, rawInput);
|
|
15897
16116
|
const issue2 = issues[0];
|
|
15898
16117
|
if (!issue2) {
|
|
15899
16118
|
throw Object.assign(new Error(`Invalid Systematic config in ${filePath}: schema validation failed`), { _tag: "ConfigSchemaError", filePath, trust, issues });
|
|
15900
16119
|
}
|
|
15901
|
-
const fieldPath = issue2.code === "unrecognized_keys" ?
|
|
16120
|
+
const fieldPath = issue2.code === "unrecognized_keys" ? null : issue2.path.join(".");
|
|
15902
16121
|
const message = fieldPath ? `Invalid Systematic config in ${filePath}: ${fieldPath} ${issue2.message}` : `Invalid Systematic config in ${filePath}: ${issue2.message}`;
|
|
15903
16122
|
throw Object.assign(new Error(message), {
|
|
15904
16123
|
_tag: "ConfigSchemaError",
|
|
@@ -15913,7 +16132,7 @@ function loadConfigSource(filePath, trust) {
|
|
|
15913
16132
|
return null;
|
|
15914
16133
|
const result = SystematicConfigSchema.safeParse(rawConfig);
|
|
15915
16134
|
if (!result.success) {
|
|
15916
|
-
throwTopLevelConfigSchemaError(filePath, trust, result.error.issues);
|
|
16135
|
+
throwTopLevelConfigSchemaError(filePath, trust, result.error.issues, rawConfig);
|
|
15917
16136
|
}
|
|
15918
16137
|
return { path: filePath, config: rawConfig, trust };
|
|
15919
16138
|
}
|
package/dist/index.js
CHANGED
|
@@ -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];
|