@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.
- package/.phase2s/skills/audit/SKILL.md +1 -0
- package/.phase2s/skills/careful/SKILL.md +1 -0
- package/.phase2s/skills/checkpoint/SKILL.md +1 -0
- package/.phase2s/skills/debug/SKILL.md +1 -0
- package/.phase2s/skills/deep-specify/SKILL.md +1 -0
- package/.phase2s/skills/diff/SKILL.md +1 -0
- package/.phase2s/skills/docs/SKILL.md +1 -0
- package/.phase2s/skills/explain/SKILL.md +1 -0
- package/.phase2s/skills/freeze/SKILL.md +1 -0
- package/.phase2s/skills/guard/SKILL.md +1 -0
- package/.phase2s/skills/health/SKILL.md +1 -0
- package/.phase2s/skills/investigate/SKILL.md +1 -0
- package/.phase2s/skills/land-and-deploy/SKILL.md +1 -0
- package/.phase2s/skills/plan/SKILL.md +13 -2
- package/.phase2s/skills/plan-review/SKILL.md +1 -0
- package/.phase2s/skills/qa/SKILL.md +1 -0
- package/.phase2s/skills/remember/SKILL.md +1 -0
- package/.phase2s/skills/retro/SKILL.md +1 -0
- package/.phase2s/skills/review/SKILL.md +29 -0
- package/.phase2s/skills/scope-review/SKILL.md +1 -0
- package/.phase2s/skills/ship/SKILL.md +1 -0
- package/.phase2s/skills/skill/SKILL.md +1 -0
- package/.phase2s/skills/slop-clean/SKILL.md +1 -0
- package/.phase2s/skills/tdd/SKILL.md +1 -0
- package/.phase2s/skills/unfreeze/SKILL.md +1 -0
- package/README.md +28 -3
- package/dist/src/cli/index.d.ts +15 -0
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +70 -5
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/core/agent.d.ts.map +1 -1
- package/dist/src/core/agent.js +3 -1
- package/dist/src/core/agent.js.map +1 -1
- package/dist/src/core/config.d.ts +30 -3
- package/dist/src/core/config.d.ts.map +1 -1
- package/dist/src/core/config.js +25 -2
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/mcp/server.d.ts +1 -1
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +43 -9
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/providers/anthropic.d.ts +75 -0
- package/dist/src/providers/anthropic.d.ts.map +1 -0
- package/dist/src/providers/anthropic.js +195 -0
- package/dist/src/providers/anthropic.js.map +1 -0
- package/dist/src/providers/index.d.ts.map +1 -1
- package/dist/src/providers/index.js +6 -0
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/providers/ollama.d.ts +4 -0
- package/dist/src/providers/ollama.d.ts.map +1 -0
- package/dist/src/providers/ollama.js +42 -0
- package/dist/src/providers/ollama.js.map +1 -0
- package/dist/src/skills/loader.d.ts.map +1 -1
- package/dist/src/skills/loader.js +63 -1
- package/dist/src/skills/loader.js.map +1 -1
- package/dist/src/skills/template.d.ts +17 -0
- package/dist/src/skills/template.d.ts.map +1 -0
- package/dist/src/skills/template.js +30 -0
- package/dist/src/skills/template.js.map +1 -0
- package/dist/src/skills/types.d.ts +25 -0
- package/dist/src/skills/types.d.ts.map +1 -1
- package/dist/src/tools/registry.d.ts +12 -0
- package/dist/src/tools/registry.d.ts.map +1 -1
- package/dist/src/tools/registry.js +36 -0
- package/dist/src/tools/registry.js.map +1 -1
- 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;
|
|
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 @@
|
|
|
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;
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAG1C;;;;;;;;;;GAUG;AACH,SAAS,gBAAgB;IACvB,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW;IACjD,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAE5B,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAE1D,IAAI,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC;YAC7B,yCAAyC;YACzC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;YAC9C,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YAC1D,wCAAwC;YACxC,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;YAC9C,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACpD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAY;IACxC,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oEAAoE;IACpE,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAErF,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,cAAc,GAAa,EAAE,CAAC;IAClC,IAAI,cAAsB,CAAC;IAC3B,IAAI,WAA+B,CAAC;IACpC,IAAI,aAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/skills/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAG1C;;;;;;;;;;GAUG;AACH,SAAS,gBAAgB;IACvB,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW;IACjD,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAE5B,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAE1D,IAAI,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC;YAC7B,yCAAyC;YACzC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;YAC9C,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YAC1D,wCAAwC;YACxC,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;YAC9C,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACpD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAY;IACxC,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oEAAoE;IACpE,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAErF,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,cAAc,GAAa,EAAE,CAAC;IAClC,IAAI,cAAsB,CAAC;IAC3B,IAAI,WAA+B,CAAC;IACpC,IAAI,aAAiC,CAAC;IACtC,IAAI,YAA8D,CAAC;IAEnE,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACpC,cAAc,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE5C,uFAAuF;QACvF,IAAI,IAAI,GAA4B,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,IAAI,GAAI,SAAS,CAAC,OAAO,CAA6B,IAAI,EAAE,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;QAED,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACpD,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;YAAE,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAEzE,2DAA2D;QAC3D,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;QACnF,CAAC;aAAM,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC7C,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjF,CAAC;QAED,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5D,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC5C,mEAAmE;YACnE,8EAA8E;YAC9E,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACxG,MAAM,WAAW,GAAG,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3D,IAAI,CAAC,WAAW,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBAC9D,OAAO,CAAC,IAAI,CAAC,+BAA+B,IAAI,aAAa,IAAI,CAAC,KAAK,2FAA2F,CAAC,CAAC;YACtK,CAAC;YACD,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC;QAC3B,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC;YAAE,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC;QAEvF,wFAAwF;QACxF,IACE,IAAI,CAAC,MAAM,KAAK,IAAI;YACpB,IAAI,CAAC,MAAM,KAAK,SAAS;YACzB,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;YAC/B,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAC3B,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAiC,CAAC;YACzD,MAAM,MAAM,GAAyC,EAAE,CAAC;YACxD,MAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAU,CAAC;YAG3E,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnD,IACE,GAAG,KAAK,IAAI;oBACZ,OAAO,GAAG,KAAK,QAAQ;oBACvB,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;oBACnB,OAAQ,GAA+B,CAAC,MAAM,KAAK,QAAQ,EAC3D,CAAC;oBACD,MAAM,MAAM,GAAG,GAA8B,CAAC;oBAC9C,MAAM,KAAK,GAAoC;wBAC7C,MAAM,EAAE,MAAM,CAAC,MAAgB;qBAChC,CAAC;oBAEF,mBAAmB;oBACnB,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;wBAC9B,IAAI,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAsB,CAAC,EAAE,CAAC;4BAC9D,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,IAAsB,CAAC;wBAC7C,CAAC;6BAAM,CAAC;4BACN,OAAO,CAAC,IAAI,CAAC,+BAA+B,IAAI,YAAY,GAAG,6BAA6B,MAAM,CAAC,IAAI,0EAA0E,CAAC,CAAC;4BACnL,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC;wBACxB,CAAC;oBACH,CAAC;oBAED,0DAA0D;oBAC1D,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;wBAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;4BAC/B,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;wBAC7E,CAAC;6BAAM,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;4BAC3C,2EAA2E;4BAC3E,OAAO,CAAC,IAAI,CAAC,+BAA+B,IAAI,YAAY,GAAG,yEAAyE,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC;4BAC1J,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;wBAC7B,CAAC;oBACH,CAAC;oBAED,0FAA0F;oBAC1F,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;wBACtE,OAAO,CAAC,IAAI,CAAC,+BAA+B,IAAI,YAAY,GAAG,8EAA8E,CAAC,CAAC;wBAC/I,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC;wBACtB,OAAO,KAAK,CAAC,IAAI,CAAC;oBACpB,CAAC;oBAED,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBACtB,CAAC;YACH,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,YAAY,GAAG,MAAM,CAAC;QAC5D,CAAC;IACH,CAAC;SAAM,CAAC;QACN,cAAc,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,MAAM,KAAK,GAA+B;QACxC,IAAI;QACJ,WAAW;QACX,cAAc;QACd,cAAc;QACd,UAAU,EAAE,IAAI;KACjB,CAAC;IACF,IAAI,WAAW,KAAK,SAAS;QAAE,KAAK,CAAC,KAAK,GAAG,WAAW,CAAC;IACzD,IAAI,aAAa,KAAK,SAAS;QAAE,KAAK,CAAC,OAAO,GAAG,aAAa,CAAC;IAC/D,IAAI,YAAY,KAAK,SAAS;QAAE,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC;IAC5D,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IAE/D,MAAM,IAAI,GAAG;QACX,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC;QACzC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAG,iDAAiD;QAClF,gBAAgB,EAAE,EAAgB,wCAAwC;KAC3E,CAAC;IAEF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAC5C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,sFAAsF;YACtF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -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;
|
|
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.
|
|
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": "^
|
|
47
|
+
"glob": "^13.0.0",
|
|
47
48
|
"openai": "^4.73.0",
|
|
48
49
|
"yaml": "^2.6.0",
|
|
49
50
|
"zod": "^3.23.0"
|