@fro.bot/systematic 2.33.2 → 3.0.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 (112) hide show
  1. package/ATTRIBUTIONS.md +1 -1
  2. package/agents/design/design-iterator.md +1 -0
  3. package/agents/research/best-practices-researcher.md +6 -8
  4. package/agents/review/pattern-recognition-specialist.md +1 -1
  5. package/agents/workflow/systematic-implementer.md +1 -0
  6. package/dist/cli.js +348 -53
  7. package/dist/{index-vyzhzvap.js → index-yskzf7vh.js} +587 -386
  8. package/dist/index.js +100 -155
  9. package/dist/lib/agent-overlays.d.ts +0 -1
  10. package/dist/lib/agent-resolver.d.ts +28 -0
  11. package/dist/lib/bootstrap.d.ts +8 -1
  12. package/dist/lib/bundled-names.d.ts +3 -3
  13. package/dist/lib/pi-delegate-session.d.ts +31 -0
  14. package/dist/lib/pi-delegate-tool.d.ts +42 -0
  15. package/dist/lib/removed-names.d.ts +3 -3
  16. package/dist/lib/setup.d.ts +36 -0
  17. package/dist/lib/skill-loader.d.ts +1 -2
  18. package/dist/lib/skill-resolver.d.ts +39 -0
  19. package/dist/lib/skill-tool.d.ts +2 -11
  20. package/dist/lib/skills.d.ts +1 -9
  21. package/dist/lib/source-model-defaults.d.ts +1 -1
  22. package/dist/pi.d.ts +7 -0
  23. package/dist/pi.js +3641 -0
  24. package/dist/schemas/systematic-config.schema.json +47 -242
  25. package/package.json +31 -8
  26. package/skills/ce-brainstorm/references/handoff.md +5 -26
  27. package/skills/ce-brainstorm/references/universal-brainstorming.md +0 -1
  28. package/skills/ce-compound/SKILL.md +8 -12
  29. package/skills/ce-ideate/references/post-ideation-workflow.md +21 -85
  30. package/skills/ce-plan/SKILL.md +6 -6
  31. package/skills/ce-plan/references/deepening-workflow.md +6 -7
  32. package/skills/ce-plan/references/plan-handoff.md +1 -17
  33. package/skills/ce-plan/references/universal-planning.md +0 -4
  34. package/skills/ce-review/SKILL.md +10 -19
  35. package/skills/ce-review/references/persona-catalog.md +2 -7
  36. package/skills/ce-review/references/review-output-template.md +0 -1
  37. package/skills/ce-work/SKILL.md +1 -1
  38. package/skills/deepen-plan/SKILL.md +6 -7
  39. package/skills/document-review/SKILL.md +2 -2
  40. package/skills/git-commit-push-pr/SKILL.md +1 -2
  41. package/skills/lfg/SKILL.md +1 -1
  42. package/skills/onboarding/SKILL.md +1 -12
  43. package/skills/orchestrating-subagents/SKILL.md +2 -2
  44. package/skills/slfg/SKILL.md +2 -3
  45. package/skills/test-browser/SKILL.md +2 -2
  46. package/skills/todos/SKILL.md +239 -0
  47. package/skills/writing-skills/SKILL.md +102 -1
  48. package/skills/{writing-systematic-skills → writing-skills}/references/foundation-conventions.md +5 -5
  49. package/agents/design/design-implementation-reviewer.md +0 -95
  50. package/agents/design/figma-design-sync.md +0 -173
  51. package/agents/docs/ankane-readme-writer.md +0 -51
  52. package/agents/review/cli-agent-readiness-reviewer.md +0 -418
  53. package/agents/review/data-integrity-guardian.md +0 -72
  54. package/agents/review/data-migration-expert.md +0 -99
  55. package/agents/review/dhh-rails-reviewer.md +0 -46
  56. package/agents/review/julik-frontend-races-reviewer.md +0 -49
  57. package/agents/review/kieran-python-reviewer.md +0 -47
  58. package/agents/review/kieran-rails-reviewer.md +0 -47
  59. package/agents/review/performance-oracle.md +0 -112
  60. package/agents/review/schema-drift-detector.md +0 -143
  61. package/agents/review/security-sentinel.md +0 -95
  62. package/agents/workflow/lint.md +0 -17
  63. package/dist/lib/converter.d.ts +0 -14
  64. package/skills/andrew-kane-gem-writer/SKILL.md +0 -184
  65. package/skills/andrew-kane-gem-writer/references/database-adapters.md +0 -231
  66. package/skills/andrew-kane-gem-writer/references/module-organization.md +0 -121
  67. package/skills/andrew-kane-gem-writer/references/rails-integration.md +0 -183
  68. package/skills/andrew-kane-gem-writer/references/resources.md +0 -119
  69. package/skills/andrew-kane-gem-writer/references/testing-patterns.md +0 -261
  70. package/skills/changelog/SKILL.md +0 -139
  71. package/skills/claude-permissions-optimizer/SKILL.md +0 -166
  72. package/skills/claude-permissions-optimizer/scripts/extract-commands.mjs +0 -655
  73. package/skills/claude-permissions-optimizer/scripts/normalize.mjs +0 -151
  74. package/skills/dhh-rails-style/SKILL.md +0 -186
  75. package/skills/dhh-rails-style/references/architecture.md +0 -653
  76. package/skills/dhh-rails-style/references/controllers.md +0 -303
  77. package/skills/dhh-rails-style/references/frontend.md +0 -510
  78. package/skills/dhh-rails-style/references/gems.md +0 -266
  79. package/skills/dhh-rails-style/references/models.md +0 -359
  80. package/skills/dhh-rails-style/references/testing.md +0 -338
  81. package/skills/dspy-ruby/SKILL.md +0 -737
  82. package/skills/dspy-ruby/assets/config-template.rb +0 -187
  83. package/skills/dspy-ruby/assets/module-template.rb +0 -300
  84. package/skills/dspy-ruby/assets/signature-template.rb +0 -221
  85. package/skills/dspy-ruby/references/core-concepts.md +0 -674
  86. package/skills/dspy-ruby/references/observability.md +0 -366
  87. package/skills/dspy-ruby/references/optimization.md +0 -603
  88. package/skills/dspy-ruby/references/providers.md +0 -418
  89. package/skills/dspy-ruby/references/toolsets.md +0 -502
  90. package/skills/every-style-editor/SKILL.md +0 -135
  91. package/skills/every-style-editor/references/EVERY_WRITE_STYLE.md +0 -529
  92. package/skills/feature-video/SKILL.md +0 -383
  93. package/skills/gemini-imagegen/SKILL.md +0 -237
  94. package/skills/gemini-imagegen/requirements.txt +0 -2
  95. package/skills/gemini-imagegen/scripts/compose_images.py +0 -157
  96. package/skills/gemini-imagegen/scripts/edit_image.py +0 -144
  97. package/skills/gemini-imagegen/scripts/gemini_images.py +0 -263
  98. package/skills/gemini-imagegen/scripts/generate_image.py +0 -133
  99. package/skills/gemini-imagegen/scripts/multi_turn_chat.py +0 -216
  100. package/skills/generate_command/SKILL.md +0 -164
  101. package/skills/orchestrating-swarms/SKILL.md +0 -1723
  102. package/skills/proof/SKILL.md +0 -291
  103. package/skills/proof/references/hitl-review.md +0 -368
  104. package/skills/rclone/SKILL.md +0 -150
  105. package/skills/rclone/scripts/check_setup.sh +0 -60
  106. package/skills/setup/SKILL.md +0 -22
  107. package/skills/test-xcode/SKILL.md +0 -214
  108. package/skills/todo-create/SKILL.md +0 -109
  109. package/skills/todo-resolve/SKILL.md +0 -68
  110. package/skills/todo-triage/SKILL.md +0 -70
  111. package/skills/writing-systematic-skills/SKILL.md +0 -119
  112. /package/skills/{todo-create → todos}/assets/todo-template.md +0 -0
@@ -0,0 +1,36 @@
1
+ import fs from 'node:fs';
2
+ /** The one package identity this module knows how to configure (literal check, not a resolver). */
3
+ export declare const SYSTEMATIC_PACKAGE_NAME = "@fro.bot/systematic";
4
+ /** The exact string written into a fresh Pi `packages` array entry. */
5
+ export declare const PI_PACKAGE_IDENTIFIER = "npm:@fro.bot/systematic";
6
+ export type Harness = 'opencode' | 'pi';
7
+ /** Discriminated result: exactly one of these two states, never a boolean pair. */
8
+ export type SetupResult = {
9
+ status: 'configured';
10
+ targetPath: string;
11
+ } | {
12
+ status: 'already-configured';
13
+ targetPath: string;
14
+ };
15
+ /** Type guard for errors raised by `createSetupError`. */
16
+ export declare function isSetupError(error: unknown): error is Error;
17
+ /**
18
+ * Narrow filesystem seam for injecting failures (e.g. a broken `renameSync`)
19
+ * in tests. Default implementation is real `node:fs`.
20
+ */
21
+ export interface SetupFsOps {
22
+ writeFileSync: typeof fs.writeFileSync;
23
+ renameSync: typeof fs.renameSync;
24
+ unlinkSync: typeof fs.unlinkSync;
25
+ chmodSync: typeof fs.chmodSync;
26
+ }
27
+ /**
28
+ * Configures the given harness's project-local config to load
29
+ * `@fro.bot/systematic`. Project-local only -- no `--global` mode. Writes
30
+ * are atomic, backed-up on real mutation, idempotent, and isolated per
31
+ * harness (setting up one never touches the other's config file).
32
+ *
33
+ * `opsOverride` is an injectable filesystem seam for tests exercising
34
+ * failure/cleanup paths; production callers should omit it.
35
+ */
36
+ export declare function setupHarness(harness: Harness, cwd: string, opsOverride?: Partial<SetupFsOps>): SetupResult;
@@ -1,4 +1,4 @@
1
- import type { SkillDeprecated, SkillInfo } from './skills.js';
1
+ import type { SkillInfo } from './skills.js';
2
2
  export interface LoadedSkill {
3
3
  name: string;
4
4
  prefixedName: string;
@@ -12,7 +12,6 @@ export interface LoadedSkill {
12
12
  agent?: string;
13
13
  model?: string;
14
14
  argumentHint?: string;
15
- deprecated?: SkillDeprecated;
16
15
  }
17
16
  export declare function formatSkillCommandName(name: string): string;
18
17
  export declare function formatSkillDescription(description: string, fallbackName: string): string;
@@ -0,0 +1,39 @@
1
+ import { type LoadedSkill } from './skill-loader.js';
2
+ /**
3
+ * Harness-neutral options shared by every adapter (OpenCode, Pi, ...).
4
+ */
5
+ export interface SkillResolverOptions {
6
+ bundledSkillsDir: string;
7
+ disabledSkills: string[];
8
+ }
9
+ /**
10
+ * Resolves a requested skill name (with or without the `systematic:` prefix)
11
+ * against the bundled skill catalog. Throws the same not-found error text
12
+ * regardless of the calling harness.
13
+ */
14
+ export declare function resolveSkill(options: SkillResolverOptions, requestedName: string): LoadedSkill;
15
+ /**
16
+ * Deterministic, catalog-derived tool description shared by every harness.
17
+ */
18
+ export declare function buildSkillToolDescription(options: SkillResolverOptions): string;
19
+ /**
20
+ * Deterministic, catalog-derived parameter hint shared by every harness.
21
+ */
22
+ export declare function buildSkillToolParameterHint(options: SkillResolverOptions): string;
23
+ /**
24
+ * Builds the exact `<skill_content>`-wrapped output shared by every harness.
25
+ */
26
+ export declare function buildSkillContentOutput(matchedSkill: LoadedSkill): {
27
+ output: string;
28
+ dir: string;
29
+ };
30
+ /**
31
+ * Discovers skill files in a directory and formats them as XML tags.
32
+ * Recursively searches subdirectories, includes hidden files, excludes .git and SKILL.md.
33
+ * Matches OpenCode v1.1.50 behavior exactly.
34
+ *
35
+ * @param dir - Directory path to search for skill files
36
+ * @param limit - Maximum number of files to return (default: 10)
37
+ * @returns String with absolute file paths formatted as XML tags, one per line
38
+ */
39
+ export declare function discoverSkillFiles(dir: string, limit?: number): string;
@@ -1,5 +1,6 @@
1
1
  import type { ToolDefinition } from '@opencode-ai/plugin';
2
- import { type SkillInfo } from './skills.js';
2
+ import type { SkillInfo } from './skills.js';
3
+ export { discoverSkillFiles } from './skill-resolver.js';
3
4
  export interface SkillToolOptions {
4
5
  bundledSkillsDir: string;
5
6
  disabledSkills: string[];
@@ -9,14 +10,4 @@ export interface SkillToolOptions {
9
10
  * Uses indented format matching OpenCode's native skill tool.
10
11
  */
11
12
  export declare function formatSkillsXml(skills: SkillInfo[]): string;
12
- /**
13
- * Discovers skill files in a directory and formats them as XML tags.
14
- * Recursively searches subdirectories, includes hidden files, excludes .git and SKILL.md.
15
- * Matches OpenCode v1.1.50 behavior exactly.
16
- *
17
- * @param dir - Directory path to search for skill files
18
- * @param limit - Maximum number of files to return (default: 10)
19
- * @returns String with absolute file paths formatted as XML tags, one per line
20
- */
21
- export declare function discoverSkillFiles(dir: string, limit?: number): string;
22
13
  export declare function createSkillTool(options: SkillToolOptions): ToolDefinition;
@@ -1,16 +1,9 @@
1
- export interface SkillDeprecated {
2
- since: string;
3
- removal: string;
4
- replacement?: string;
5
- reason?: string;
6
- }
7
1
  export interface SkillFrontmatter {
8
2
  name: string;
9
3
  description: string;
10
4
  license?: string;
11
5
  compatibility?: string;
12
6
  metadata?: Record<string, string>;
13
- deprecated?: SkillDeprecated;
14
7
  disableModelInvocation?: boolean;
15
8
  userInvocable?: boolean;
16
9
  subtask?: boolean;
@@ -27,7 +20,6 @@ export interface SkillInfo {
27
20
  license?: string;
28
21
  compatibility?: string;
29
22
  metadata?: Record<string, string>;
30
- deprecated?: SkillDeprecated;
31
23
  disableModelInvocation?: boolean;
32
24
  userInvocable?: boolean;
33
25
  subtask?: boolean;
@@ -36,7 +28,7 @@ export interface SkillInfo {
36
28
  argumentHint?: string;
37
29
  allowedTools?: string;
38
30
  }
39
- export declare const SKILL_FRONTMATTER_FIELDS: readonly ["name", "description", "argument-hint", "disable-model-invocation", "allowed-tools", "license", "compatibility", "metadata", "deprecated", "user-invocable", "agent", "model", "context", "subtask"];
31
+ export declare const SKILL_FRONTMATTER_FIELDS: readonly ["name", "description", "argument-hint", "disable-model-invocation", "allowed-tools", "license", "compatibility", "metadata", "user-invocable", "agent", "model", "context", "subtask"];
40
32
  /**
41
33
  * Parse skill frontmatter from already-read file content. Split out from
42
34
  * `extractFrontmatter` so callers that also need the body (e.g. discovered-skill
@@ -74,7 +74,7 @@ export interface CategoryDefault {
74
74
  }
75
75
  export type SourceCategoryDefaults = Record<string, CategoryDefault>;
76
76
  /**
77
- * Provider-grouped source model defaults for the 6 Systematic agent categories.
77
+ * Provider-grouped source model defaults for the 5 Systematic agent categories.
78
78
  *
79
79
  * Provider chains are ordered by OMO category-fit reasoning. The resolver
80
80
  * walks providers in order and picks the first available provider/model pair.
package/dist/pi.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';
2
+ import { buildAgentCatalog } from './lib/agent-resolver.js';
3
+ type PiExtensionDependencies = {
4
+ buildAgentCatalog?: typeof buildAgentCatalog;
5
+ };
6
+ export default function systematicPiExtension(pi: ExtensionAPI, deps?: PiExtensionDependencies): Promise<void>;
7
+ export {};