@scanton/phase2s 0.15.0 → 0.18.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 (66) hide show
  1. package/.phase2s/skills/audit/SKILL.md +1 -0
  2. package/.phase2s/skills/careful/SKILL.md +1 -0
  3. package/.phase2s/skills/checkpoint/SKILL.md +1 -0
  4. package/.phase2s/skills/debug/SKILL.md +1 -0
  5. package/.phase2s/skills/deep-specify/SKILL.md +1 -0
  6. package/.phase2s/skills/diff/SKILL.md +1 -0
  7. package/.phase2s/skills/docs/SKILL.md +1 -0
  8. package/.phase2s/skills/explain/SKILL.md +1 -0
  9. package/.phase2s/skills/freeze/SKILL.md +1 -0
  10. package/.phase2s/skills/guard/SKILL.md +1 -0
  11. package/.phase2s/skills/health/SKILL.md +1 -0
  12. package/.phase2s/skills/investigate/SKILL.md +1 -0
  13. package/.phase2s/skills/land-and-deploy/SKILL.md +1 -0
  14. package/.phase2s/skills/plan/SKILL.md +13 -2
  15. package/.phase2s/skills/plan-review/SKILL.md +1 -0
  16. package/.phase2s/skills/qa/SKILL.md +1 -0
  17. package/.phase2s/skills/remember/SKILL.md +1 -0
  18. package/.phase2s/skills/retro/SKILL.md +1 -0
  19. package/.phase2s/skills/review/SKILL.md +29 -0
  20. package/.phase2s/skills/scope-review/SKILL.md +1 -0
  21. package/.phase2s/skills/ship/SKILL.md +1 -0
  22. package/.phase2s/skills/skill/SKILL.md +1 -0
  23. package/.phase2s/skills/slop-clean/SKILL.md +1 -0
  24. package/.phase2s/skills/tdd/SKILL.md +1 -0
  25. package/.phase2s/skills/unfreeze/SKILL.md +1 -0
  26. package/README.md +28 -3
  27. package/dist/src/cli/index.d.ts +15 -0
  28. package/dist/src/cli/index.d.ts.map +1 -1
  29. package/dist/src/cli/index.js +70 -5
  30. package/dist/src/cli/index.js.map +1 -1
  31. package/dist/src/core/agent.d.ts.map +1 -1
  32. package/dist/src/core/agent.js +3 -1
  33. package/dist/src/core/agent.js.map +1 -1
  34. package/dist/src/core/config.d.ts +30 -3
  35. package/dist/src/core/config.d.ts.map +1 -1
  36. package/dist/src/core/config.js +25 -2
  37. package/dist/src/core/config.js.map +1 -1
  38. package/dist/src/mcp/server.d.ts +1 -1
  39. package/dist/src/mcp/server.d.ts.map +1 -1
  40. package/dist/src/mcp/server.js +43 -9
  41. package/dist/src/mcp/server.js.map +1 -1
  42. package/dist/src/providers/anthropic.d.ts +75 -0
  43. package/dist/src/providers/anthropic.d.ts.map +1 -0
  44. package/dist/src/providers/anthropic.js +195 -0
  45. package/dist/src/providers/anthropic.js.map +1 -0
  46. package/dist/src/providers/index.d.ts.map +1 -1
  47. package/dist/src/providers/index.js +6 -0
  48. package/dist/src/providers/index.js.map +1 -1
  49. package/dist/src/providers/ollama.d.ts +4 -0
  50. package/dist/src/providers/ollama.d.ts.map +1 -0
  51. package/dist/src/providers/ollama.js +42 -0
  52. package/dist/src/providers/ollama.js.map +1 -0
  53. package/dist/src/skills/loader.d.ts.map +1 -1
  54. package/dist/src/skills/loader.js +63 -1
  55. package/dist/src/skills/loader.js.map +1 -1
  56. package/dist/src/skills/template.d.ts +17 -0
  57. package/dist/src/skills/template.d.ts.map +1 -0
  58. package/dist/src/skills/template.js +30 -0
  59. package/dist/src/skills/template.js.map +1 -0
  60. package/dist/src/skills/types.d.ts +25 -0
  61. package/dist/src/skills/types.d.ts.map +1 -1
  62. package/dist/src/tools/registry.d.ts +12 -0
  63. package/dist/src/tools/registry.d.ts.map +1 -1
  64. package/dist/src/tools/registry.js +36 -0
  65. package/dist/src/tools/registry.js.map +1 -1
  66. package/package.json +3 -2
@@ -1,11 +1,17 @@
1
1
  import { CodexProvider } from "./codex.js";
2
2
  import { OpenAIProvider } from "./openai.js";
3
+ import { AnthropicProvider } from "./anthropic.js";
4
+ import { createOllamaProvider } from "./ollama.js";
3
5
  export function createProvider(config) {
4
6
  switch (config.provider) {
5
7
  case "codex-cli":
6
8
  return new CodexProvider(config);
7
9
  case "openai-api":
8
10
  return new OpenAIProvider(config);
11
+ case "anthropic":
12
+ return new AnthropicProvider(config);
13
+ case "ollama":
14
+ return createOllamaProvider(config);
9
15
  default:
10
16
  throw new Error(`Unknown provider: ${config.provider}`);
11
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,WAAW;YACd,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;QACnC,KAAK,YAAY;YACf,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QACpC;YACE,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,WAAW;YACd,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;QACnC,KAAK,YAAY;YACf,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QACpC,KAAK,WAAW;YACd,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACvC,KAAK,QAAQ;YACX,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACtC;YACE,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Config } from "../core/config.js";
2
+ import type { Provider } from "./types.js";
3
+ export declare function createOllamaProvider(config: Config): Provider;
4
+ //# sourceMappingURL=ollama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../src/providers/ollama.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA4B3C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAc7D"}
@@ -0,0 +1,42 @@
1
+ import OpenAI from "openai";
2
+ import { OpenAIProvider } from "./openai.js";
3
+ import { log } from "../utils/logger.js";
4
+ /**
5
+ * Ollama provider — wraps OpenAIProvider with Ollama's OpenAI-compatible base URL.
6
+ *
7
+ * Ollama exposes an OpenAI-compatible API at http://localhost:11434/v1 (default).
8
+ * No new class needed — inject a pre-configured OpenAI client into OpenAIProvider.
9
+ * The `name` field is overridden so logs and tests see "ollama" not "openai-api".
10
+ *
11
+ * Prerequisites:
12
+ * - `ollama serve` must be running
13
+ * - The target model must be pulled: `ollama pull <model>`
14
+ *
15
+ * Recommended models for tool-calling skills (/satori, /consensus-plan):
16
+ * qwen2.5-coder:7b or llama3.1:8b — both support function calling via Ollama.
17
+ * llama3.2 (3B) may drop tool calls on complex prompts.
18
+ */
19
+ function isLocalUrl(url) {
20
+ try {
21
+ const { hostname } = new URL(url);
22
+ return hostname === "localhost" || hostname === "127.0.0.1" || hostname === "::1";
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ export function createOllamaProvider(config) {
29
+ const baseURL = config.ollamaBaseUrl ?? "http://localhost:11434/v1";
30
+ if (!isLocalUrl(baseURL)) {
31
+ log.warn(`Ollama: remote server configured (${baseURL}) — prompts and tool results will be sent to that host. Ensure this is intentional.`);
32
+ }
33
+ // Ollama accepts any non-empty string as API key — required by the OpenAI SDK
34
+ const client = new OpenAI({ baseURL, apiKey: "ollama" });
35
+ // Pass apiKey: "ollama" so OpenAIProvider skips the "no API key" guard.
36
+ const provider = new OpenAIProvider({ ...config, apiKey: "ollama" }, client);
37
+ // Override the inherited name so logs and tests see "ollama" not "openai-api".
38
+ // OpenAIProvider.name is a public mutable string field, so this cast is safe.
39
+ provider.name = "ollama";
40
+ return provider;
41
+ }
42
+ //# sourceMappingURL=ollama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../src/providers/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,OAAO,EAAE,cAAc,EAAyB,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAEzC;;;;;;;;;;;;;;GAcG;AACH,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,OAAO,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,KAAK,CAAC;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,IAAI,2BAA2B,CAAC;IACpE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,IAAI,CAAC,qCAAqC,OAAO,qFAAqF,CAAC,CAAC;IAC9I,CAAC;IACD,8EAA8E;IAC9E,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAgC,CAAC;IAExF,wEAAwE;IACxE,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;IAC7E,+EAA+E;IAC/E,8EAA8E;IAC7E,QAAwC,CAAC,IAAI,GAAG,QAAQ,CAAC;IAC1D,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/skills/loader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAmBxC;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAkCrE;AA4DD;;;;;;;;;GASG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAyBtD"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/skills/loader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAmBxC;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAkCrE;AAkID;;;;;;;;;GASG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAyBtD"}
@@ -78,6 +78,7 @@ async function parseSkillFile(path) {
78
78
  let promptTemplate;
79
79
  let skill_model;
80
80
  let skill_retries;
81
+ let skill_inputs;
81
82
  if (frontmatterMatch) {
82
83
  const rawMeta = frontmatterMatch[1];
83
84
  promptTemplate = frontmatterMatch[2].trim();
@@ -100,10 +101,69 @@ async function parseSkillFile(path) {
100
101
  else if (typeof meta.triggers === "string") {
101
102
  triggerPhrases = meta.triggers.split(",").map((s) => s.trim()).filter(Boolean);
102
103
  }
103
- if (typeof meta.model === "string" && meta.model.length > 0)
104
+ if (typeof meta.model === "string" && meta.model.length > 0) {
105
+ const VALID_MODEL_TIERS = ["fast", "smart"];
106
+ // Allow "fast", "smart", and any literal model string (non-empty).
107
+ // Warn if it looks like a misspelled tier (short word, not a known model ID).
108
+ const isLiteralModel = meta.model.includes("-") || meta.model.includes("/") || meta.model.includes(".");
109
+ const isKnownTier = VALID_MODEL_TIERS.includes(meta.model);
110
+ if (!isKnownTier && !isLiteralModel && meta.model.length < 20) {
111
+ console.warn(`[phase2s] Warning: skill at ${path}: model: '${meta.model}' looks like a misspelled tier. Valid tiers: fast, smart. Treating as literal model name.`);
112
+ }
104
113
  skill_model = meta.model;
114
+ }
105
115
  if (typeof meta.retries === "number" && meta.retries > 0)
106
116
  skill_retries = meta.retries;
117
+ // Parse inputs: key — must be an object mapping name → { prompt: string, type?, enum? }
118
+ if (meta.inputs !== null &&
119
+ meta.inputs !== undefined &&
120
+ typeof meta.inputs === "object" &&
121
+ !Array.isArray(meta.inputs)) {
122
+ const rawInputs = meta.inputs;
123
+ const parsed = {};
124
+ const VALID_INPUT_TYPES = ["string", "boolean", "enum", "number"];
125
+ for (const [key, val] of Object.entries(rawInputs)) {
126
+ if (val !== null &&
127
+ typeof val === "object" &&
128
+ !Array.isArray(val) &&
129
+ typeof val.prompt === "string") {
130
+ const rawVal = val;
131
+ const input = {
132
+ prompt: rawVal.prompt,
133
+ };
134
+ // Parse type field
135
+ if (rawVal.type !== undefined) {
136
+ if (VALID_INPUT_TYPES.includes(rawVal.type)) {
137
+ input.type = rawVal.type;
138
+ }
139
+ else {
140
+ console.warn(`[phase2s] Warning: skill at ${path}: input '${key}' has unrecognized type: '${rawVal.type}'. Valid types: string, boolean, enum, number. Falling back to 'string'.`);
141
+ input.type = "string";
142
+ }
143
+ }
144
+ // Parse enum field (only meaningful when type === "enum")
145
+ if (rawVal.enum !== undefined) {
146
+ if (Array.isArray(rawVal.enum)) {
147
+ input.enum = rawVal.enum.filter((e) => typeof e === "string");
148
+ }
149
+ else if (typeof rawVal.enum === "string") {
150
+ // YAML parsers coerce single-item arrays to strings — normalize gracefully
151
+ console.warn(`[phase2s] Warning: skill at ${path}: input '${key}' enum: is a string, not an array. Coercing to single-element array ['${rawVal.enum}'].`);
152
+ input.enum = [rawVal.enum];
153
+ }
154
+ }
155
+ // Validate enum completeness: type=enum with empty/absent enum array falls back to string
156
+ if (input.type === "enum" && (!input.enum || input.enum.length === 0)) {
157
+ console.warn(`[phase2s] Warning: skill at ${path}: input '${key}' has type: 'enum' but no valid enum values. Falling back to type: 'string'.`);
158
+ input.type = "string";
159
+ delete input.enum;
160
+ }
161
+ parsed[key] = input;
162
+ }
163
+ }
164
+ if (Object.keys(parsed).length > 0)
165
+ skill_inputs = parsed;
166
+ }
107
167
  }
108
168
  else {
109
169
  promptTemplate = content.trim();
@@ -119,6 +179,8 @@ async function parseSkillFile(path) {
119
179
  skill.model = skill_model;
120
180
  if (skill_retries !== undefined)
121
181
  skill.retries = skill_retries;
182
+ if (skill_inputs !== undefined)
183
+ skill.inputs = skill_inputs;
122
184
  return skill;
123
185
  }
124
186
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/skills/loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/skills/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Skill } from "./types.js";
2
+ /**
3
+ * Substitute declared skill inputs into a prompt template.
4
+ *
5
+ * Only replaces {{name}} tokens that are declared in skill.inputs.
6
+ * Unknown {{tokens}} pass through unchanged — this means existing templates
7
+ * like /explain's {{target}} are safe even when no inputs: frontmatter exists.
8
+ *
9
+ * Precedence: deny overrides allow (consistent with ToolRegistry.allowed()).
10
+ */
11
+ export declare function substituteInputs(template: string, values: Record<string, string>, inputs: Skill["inputs"]): string;
12
+ /**
13
+ * Return the list of input keys that have unfilled {{placeholder}} tokens
14
+ * in the given template. Only checks keys declared in skill.inputs.
15
+ */
16
+ export declare function getUnfilledInputKeys(template: string, inputs: Skill["inputs"]): string[];
17
+ //# sourceMappingURL=template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../../src/skills/template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,GACtB,MAAM,CAUR;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,GACtB,MAAM,EAAE,CAGV"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Substitute declared skill inputs into a prompt template.
3
+ *
4
+ * Only replaces {{name}} tokens that are declared in skill.inputs.
5
+ * Unknown {{tokens}} pass through unchanged — this means existing templates
6
+ * like /explain's {{target}} are safe even when no inputs: frontmatter exists.
7
+ *
8
+ * Precedence: deny overrides allow (consistent with ToolRegistry.allowed()).
9
+ */
10
+ export function substituteInputs(template, values, inputs) {
11
+ if (!inputs)
12
+ return template;
13
+ let result = template;
14
+ for (const key of Object.keys(inputs)) {
15
+ const value = values[key] ?? "";
16
+ // Only replace tokens explicitly declared in inputs
17
+ result = result.replaceAll(`{{${key}}}`, value);
18
+ }
19
+ return result;
20
+ }
21
+ /**
22
+ * Return the list of input keys that have unfilled {{placeholder}} tokens
23
+ * in the given template. Only checks keys declared in skill.inputs.
24
+ */
25
+ export function getUnfilledInputKeys(template, inputs) {
26
+ if (!inputs)
27
+ return [];
28
+ return Object.keys(inputs).filter((key) => template.includes(`{{${key}}}`));
29
+ }
30
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/skills/template.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,MAA8B,EAC9B,MAAuB;IAEvB,IAAI,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC;IAE7B,IAAI,MAAM,GAAG,QAAQ,CAAC;IACtB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,oDAAoD;QACpD,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,MAAuB;IAEvB,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;AAC9E,CAAC"}
@@ -1,3 +1,19 @@
1
+ export interface SkillInput {
2
+ /** Human-readable prompt shown to the user in REPL mode, and used as the
3
+ * MCP tool parameter description in MCP mode. */
4
+ prompt: string;
5
+ /**
6
+ * Optional type for the input. Controls the JSON Schema type emitted for MCP
7
+ * tool parameters. All values are stringified before template substitution.
8
+ * Defaults to "string" when absent or unrecognized.
9
+ */
10
+ type?: "string" | "boolean" | "enum" | "number";
11
+ /**
12
+ * Valid enum values. Only used when type === "enum". If absent or empty when
13
+ * type is "enum", the field falls back to type "string".
14
+ */
15
+ enum?: string[];
16
+ }
1
17
  export interface Skill {
2
18
  name: string;
3
19
  description: string;
@@ -10,5 +26,14 @@ export interface Skill {
10
26
  model?: string;
11
27
  /** Number of satori retries (enables satori mode when > 0) */
12
28
  retries?: number;
29
+ /**
30
+ * Named inputs the skill needs before running. Each key corresponds to a
31
+ * {{key}} placeholder in promptTemplate. In REPL mode Phase2S prompts the
32
+ * user for each. In MCP mode each becomes a typed tool parameter.
33
+ *
34
+ * Only {{key}} tokens declared here are substituted — unknown {{tokens}}
35
+ * pass through unchanged.
36
+ */
37
+ inputs?: Record<string, SkillInput>;
13
38
  }
14
39
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/skills/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,uEAAuE;IACvE,cAAc,EAAE,MAAM,CAAC;IACvB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/skills/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB;sDACkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IAChD;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,uEAAuE;IACvE,cAAc,EAAE,MAAM,CAAC;IACvB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACrC"}
@@ -7,6 +7,18 @@ export declare class ToolRegistry {
7
7
  names(): string[];
8
8
  /** Get all tools as OpenAI function definitions */
9
9
  toOpenAI(): OpenAIFunctionDef[];
10
+ /**
11
+ * Return a new ToolRegistry containing only the tools permitted by the
12
+ * allow/deny configuration.
13
+ *
14
+ * Rules (applied in order):
15
+ * 1. If `allow` is provided, only tools whose names appear in `allow` are kept.
16
+ * 2. If `deny` is provided, any tool whose name appears in `deny` is removed.
17
+ * 3. `deny` always overrides `allow` — it is a security control.
18
+ *
19
+ * Unknown names in either list produce a console warning so typos are visible.
20
+ */
21
+ allowed(allow?: string[], deny?: string[]): ToolRegistry;
10
22
  /** Execute a tool by name with parsed arguments */
11
23
  execute(name: string, args: unknown): Promise<ToolResult>;
12
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAgB,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE9F,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAqC;IAElD,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAIpC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI7C,IAAI,IAAI,cAAc,EAAE;IAIxB,KAAK,IAAI,MAAM,EAAE;IAIjB,mDAAmD;IACnD,QAAQ,IAAI,iBAAiB,EAAE;IAI/B,mDAAmD;IAC7C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;CA6BhE"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAgB,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE9F,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAqC;IAElD,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAIpC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI7C,IAAI,IAAI,cAAc,EAAE;IAIxB,KAAK,IAAI,MAAM,EAAE;IAIjB,mDAAmD;IACnD,QAAQ,IAAI,iBAAiB,EAAE;IAI/B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,YAAY;IA0BxD,mDAAmD;IAC7C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;CA6BhE"}
@@ -17,6 +17,42 @@ export class ToolRegistry {
17
17
  toOpenAI() {
18
18
  return this.list().map(toolToOpenAI);
19
19
  }
20
+ /**
21
+ * Return a new ToolRegistry containing only the tools permitted by the
22
+ * allow/deny configuration.
23
+ *
24
+ * Rules (applied in order):
25
+ * 1. If `allow` is provided, only tools whose names appear in `allow` are kept.
26
+ * 2. If `deny` is provided, any tool whose name appears in `deny` is removed.
27
+ * 3. `deny` always overrides `allow` — it is a security control.
28
+ *
29
+ * Unknown names in either list produce a console warning so typos are visible.
30
+ */
31
+ allowed(allow, deny) {
32
+ const allNames = this.names();
33
+ // Warn on unrecognized names — silent misconfiguration is a security risk
34
+ for (const name of allow ?? []) {
35
+ if (!allNames.includes(name)) {
36
+ console.warn(`Warning: unknown tool '${name}' in tools (allow) list`);
37
+ }
38
+ }
39
+ for (const name of deny ?? []) {
40
+ if (!allNames.includes(name)) {
41
+ console.warn(`Warning: unknown tool '${name}' in deny list`);
42
+ }
43
+ }
44
+ const filtered = new ToolRegistry();
45
+ for (const tool of this.list()) {
46
+ // Step 1: apply allow-list (if provided)
47
+ if (allow && allow.length > 0 && !allow.includes(tool.name))
48
+ continue;
49
+ // Step 2: apply deny-list (deny overrides allow)
50
+ if (deny && deny.includes(tool.name))
51
+ continue;
52
+ filtered.register(tool);
53
+ }
54
+ return filtered;
55
+ }
20
56
  /** Execute a tool by name with parsed arguments */
21
57
  async execute(name, args) {
22
58
  const tool = this.tools.get(name);
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,YAAY,EAA0B,MAAM,YAAY,CAAC;AAE9F,MAAM,OAAO,YAAY;IACf,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;IAElD,QAAQ,CAAC,IAAoB;QAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,KAAK;QACH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,mDAAmD;IACnD,QAAQ;QACN,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC;IAED,mDAAmD;IACnD,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,IAAa;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,iBAAiB,IAAI,EAAE;aAC/B,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,yBAAyB,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;aAChE,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,QAAQ,IAAI,YAAY,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;aAClF,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/tools/registry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scanton/phase2s",
3
- "version": "0.15.0",
3
+ "version": "0.18.0",
4
4
  "description": "AI programming harness with multi-model support",
5
5
  "type": "module",
6
6
  "files": [
@@ -39,11 +39,12 @@
39
39
  ],
40
40
  "license": "MIT",
41
41
  "dependencies": {
42
+ "@anthropic-ai/sdk": "^0.82.0",
42
43
  "@iarna/toml": "^2.2.5",
43
44
  "@types/iarna__toml": "^2.0.5",
44
45
  "chalk": "^5.3.0",
45
46
  "commander": "^12.1.0",
46
- "glob": "^11.0.0",
47
+ "glob": "^13.0.0",
47
48
  "openai": "^4.73.0",
48
49
  "yaml": "^2.6.0",
49
50
  "zod": "^3.23.0"