wtf-p 0.7.4 → 0.8.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/README.md +10 -10
- package/bin/commands/install-logic.js +1 -1
- package/bin/lib/adapter-compiler.js +163 -55
- package/bin/lib/clio-registration.js +127 -36
- package/bin/lib/manifest.js +11 -3
- package/bin/uninstall.js +3 -2
- package/package.json +1 -1
- package/vendors/antigravity/.wtfp-generated.json +2 -2
- package/vendors/antigravity/plugin.json +1 -1
- package/vendors/claude/.claude-plugin/marketplace.json +2 -2
- package/vendors/claude/.claude-plugin/plugin.json +1 -1
- package/vendors/claude/.wtfp-generated.json +5 -5
- package/vendors/claude/ai.iowarp.clio/prompts/wtfp/help.md +1 -1
- package/vendors/claude/plugin.json +1 -1
- package/vendors/clio-extension/.wtfp-generated.json +228 -0
- package/vendors/clio-extension/actions/add-todo.json +52 -0
- package/vendors/clio-extension/actions/analyze-bib.json +97 -0
- package/vendors/clio-extension/actions/audit-milestone.json +63 -0
- package/vendors/clio-extension/actions/check-refs.json +80 -0
- package/vendors/clio-extension/actions/check-todos.json +52 -0
- package/vendors/clio-extension/actions/checkpoint.json +76 -0
- package/vendors/clio-extension/actions/contribute.json +57 -0
- package/vendors/clio-extension/actions/create-outline.json +84 -0
- package/vendors/clio-extension/actions/create-poster.json +54 -0
- package/vendors/clio-extension/actions/create-slides.json +54 -0
- package/vendors/clio-extension/actions/discuss-section.json +76 -0
- package/vendors/clio-extension/actions/execute-outline.json +116 -0
- package/vendors/clio-extension/actions/export-latex.json +65 -0
- package/vendors/clio-extension/actions/help.json +30 -0
- package/vendors/clio-extension/actions/insert-section.json +61 -0
- package/vendors/clio-extension/actions/list-assumptions.json +35 -0
- package/vendors/clio-extension/actions/map-project.json +71 -0
- package/vendors/clio-extension/actions/new-paper.json +70 -0
- package/vendors/clio-extension/actions/pause-writing.json +71 -0
- package/vendors/clio-extension/actions/plan-milestone-gaps.json +57 -0
- package/vendors/clio-extension/actions/plan-revision.json +58 -0
- package/vendors/clio-extension/actions/plan-section.json +100 -0
- package/vendors/clio-extension/actions/polish-prose.json +69 -0
- package/vendors/clio-extension/actions/progress.json +51 -0
- package/vendors/clio-extension/actions/quick.json +70 -0
- package/vendors/clio-extension/actions/remove-section.json +63 -0
- package/vendors/clio-extension/actions/report-bug.json +47 -0
- package/vendors/clio-extension/actions/request-feature.json +47 -0
- package/vendors/clio-extension/actions/research-gap.json +102 -0
- package/vendors/clio-extension/actions/resume-writing.json +65 -0
- package/vendors/clio-extension/actions/review-section.json +83 -0
- package/vendors/clio-extension/actions/settings.json +47 -0
- package/vendors/clio-extension/actions/submit-milestone.json +77 -0
- package/vendors/clio-extension/actions/update.json +42 -0
- package/vendors/clio-extension/actions/verify-work.json +63 -0
- package/vendors/clio-extension/actions/write-section.json +115 -0
- package/vendors/clio-extension/clio-coder-extension.yaml +53 -0
- package/vendors/clio-extension/compatibility/action-availability.json +295 -0
- package/vendors/clio-extension/project/schemas/checkpoint.schema.json +102 -0
- package/vendors/clio-extension/project/schemas/common.schema.json +33 -0
- package/vendors/clio-extension/project/schemas/config.schema.json +69 -0
- package/vendors/clio-extension/project/schemas/decisions.schema.json +31 -0
- package/vendors/clio-extension/project/schemas/evidence.schema.json +48 -0
- package/vendors/clio-extension/project/schemas/manifest.schema.json +102 -0
- package/vendors/clio-extension/project/schemas/outline.schema.json +67 -0
- package/vendors/clio-extension/project/schemas/section.schema.json +95 -0
- package/vendors/clio-extension/project/schemas/source.schema.json +73 -0
- package/vendors/clio-extension/project/schemas/state.schema.json +58 -0
- package/vendors/clio-extension/project/schemas/validation.schema.json +74 -0
- package/vendors/clio-extension/runtime/extension.test.ts +248 -0
- package/vendors/clio-extension/runtime/extension.ts +1321 -0
- package/vendors/clio-extension/runtime/json-schema.cjs +304 -0
- package/vendors/clio-extension/runtime/package.json +3 -0
- package/vendors/clio-extension/runtime/write-guard.json +21 -0
- package/vendors/clio-extension/skins/wtfp.json +20 -0
- package/vendors/codex/plugins/wtfp/.codex-plugin/plugin.json +1 -1
- package/vendors/codex/plugins/wtfp/.wtfp-generated.json +3 -3
- package/vendors/codex/plugins/wtfp/plugin.json +1 -1
- package/vendors/copilot/.wtfp-generated.json +2 -2
- package/vendors/copilot/marketplace.json +2 -2
- package/vendors/copilot/plugins/wtfp/.claude-plugin/plugin.json +1 -1
- package/vendors/copilot/plugins/wtfp/.wtfp-generated.json +2 -2
- package/vendors/gemini/.wtfp-generated.json +2 -2
- package/vendors/gemini/gemini-extension.json +1 -1
- package/vendors/plugin/.wtfp-generated.json +30 -30
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/add-todo.md +6 -12
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/analyze-bib.md +7 -19
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/audit-milestone.md +7 -25
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/check-refs.md +7 -15
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/check-todos.md +9 -13
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/checkpoint.md +7 -27
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/create-outline.md +7 -25
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/discuss-section.md +7 -17
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/execute-outline.md +8 -27
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/help.md +2 -2
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/insert-section.md +7 -13
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/map-project.md +6 -14
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/new-paper.md +7 -17
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/pause-writing.md +6 -18
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/plan-milestone-gaps.md +7 -15
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/plan-section.md +7 -27
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/polish-prose.md +8 -15
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/quick.md +8 -15
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/research-gap.md +7 -21
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/resume-writing.md +7 -23
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/review-section.md +7 -19
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/settings.md +7 -9
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/submit-milestone.md +7 -25
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/verify-work.md +7 -15
- package/vendors/plugin/ai.iowarp.clio/prompts/wtfp/write-section.md +8 -28
- package/vendors/plugin/compatibility/action-availability.json +16 -1
- package/vendors/plugin/plugin.json +7 -7
- /package/vendors/plugin/ai.iowarp.clio/{fleets → playbooks}/wtfp-draft-review.md +0 -0
- /package/vendors/plugin/ai.iowarp.clio/{fleets → playbooks}/wtfp-plan-section.md +0 -0
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
// Generated by WTF-P adapter compiler v5 from evaluation/lib/json-schema.js; do not edit.
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
|
|
7
|
+
function readJson(file) {
|
|
8
|
+
return JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function deepEqual(left, right) {
|
|
12
|
+
return JSON.stringify(left) === JSON.stringify(right);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function valueType(value) {
|
|
16
|
+
if (value === null) return 'null';
|
|
17
|
+
if (Array.isArray(value)) return 'array';
|
|
18
|
+
if (Number.isInteger(value)) return 'integer';
|
|
19
|
+
return typeof value;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function escapeLocationSegment(segment) {
|
|
23
|
+
return /^[A-Za-z_$][A-Za-z0-9_$-]*$/.test(segment)
|
|
24
|
+
? `.${segment}`
|
|
25
|
+
: `[${JSON.stringify(segment)}]`;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function calendarDateValid(year, month, day) {
|
|
29
|
+
if (month < 1 || month > 12 || day < 1) return false;
|
|
30
|
+
const leap = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
|
|
31
|
+
const days = [31, leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
|
32
|
+
return day <= days[month - 1];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function rfc3339DateValid(value) {
|
|
36
|
+
const match = value.match(/^(\d{4})-(\d{2})-(\d{2})$/u);
|
|
37
|
+
return Boolean(match && calendarDateValid(Number(match[1]), Number(match[2]), Number(match[3])));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function rfc3339DateTimeValid(value) {
|
|
41
|
+
const match = value.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d+)?(Z|([+-])(\d{2}):(\d{2}))$/u);
|
|
42
|
+
if (!match || !calendarDateValid(Number(match[1]), Number(match[2]), Number(match[3]))) return false;
|
|
43
|
+
const hour = Number(match[4]);
|
|
44
|
+
const minute = Number(match[5]);
|
|
45
|
+
const second = Number(match[6]);
|
|
46
|
+
// Leap seconds are intentionally rejected: the evaluator needs deterministic
|
|
47
|
+
// ordering through JavaScript Date parsing, which does not represent :60.
|
|
48
|
+
if (hour > 23 || minute > 59 || second > 59) return false;
|
|
49
|
+
if (match[7] !== 'Z' && (Number(match[9]) > 23 || Number(match[10]) > 59)) return false;
|
|
50
|
+
return Number.isFinite(Date.parse(value));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function resolvePointer(document, fragment, source) {
|
|
54
|
+
if (!fragment || fragment === '#') return document;
|
|
55
|
+
if (!fragment.startsWith('#/')) {
|
|
56
|
+
throw new Error(`${source}: unsupported JSON Schema fragment ${fragment}`);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return decodeURIComponent(fragment.slice(2)).split('/').reduce((value, segment) => {
|
|
60
|
+
const key = segment.replace(/~1/g, '/').replace(/~0/g, '~');
|
|
61
|
+
if (!value || !Object.prototype.hasOwnProperty.call(value, key)) {
|
|
62
|
+
throw new Error(`${source}: unresolved JSON pointer ${fragment}`);
|
|
63
|
+
}
|
|
64
|
+
return value[key];
|
|
65
|
+
}, document);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
class SchemaRegistry {
|
|
69
|
+
constructor(schemaFiles = []) {
|
|
70
|
+
this.documents = new Map();
|
|
71
|
+
this.identifiers = new Map();
|
|
72
|
+
for (const file of schemaFiles) this.add(file);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
add(file) {
|
|
76
|
+
const resolved = path.resolve(file);
|
|
77
|
+
if (this.documents.has(resolved)) return this.documents.get(resolved);
|
|
78
|
+
const document = readJson(resolved);
|
|
79
|
+
this.documents.set(resolved, document);
|
|
80
|
+
if (document.$id) {
|
|
81
|
+
if (this.identifiers.has(document.$id) && this.identifiers.get(document.$id) !== resolved) {
|
|
82
|
+
throw new Error(`duplicate JSON Schema identifier ${document.$id}`);
|
|
83
|
+
}
|
|
84
|
+
this.identifiers.set(document.$id, resolved);
|
|
85
|
+
}
|
|
86
|
+
return document;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
get(file) {
|
|
90
|
+
return this.add(file);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
resolve(reference, currentFile) {
|
|
94
|
+
const separator = reference.indexOf('#');
|
|
95
|
+
const resource = separator === -1 ? reference : reference.slice(0, separator);
|
|
96
|
+
const fragment = separator === -1 ? '' : reference.slice(separator);
|
|
97
|
+
let targetFile = path.resolve(currentFile);
|
|
98
|
+
|
|
99
|
+
if (resource) {
|
|
100
|
+
if (this.identifiers.has(resource)) {
|
|
101
|
+
targetFile = this.identifiers.get(resource);
|
|
102
|
+
} else if (/^[A-Za-z][A-Za-z0-9+.-]*:/.test(resource)) {
|
|
103
|
+
throw new Error(`${currentFile}: unregistered JSON Schema identifier ${resource}`);
|
|
104
|
+
} else {
|
|
105
|
+
targetFile = path.resolve(path.dirname(currentFile), resource);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const document = this.get(targetFile);
|
|
110
|
+
return {
|
|
111
|
+
file: targetFile,
|
|
112
|
+
schema: resolvePointer(document, fragment, targetFile)
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function validateInstance(instance, schema, schemaFile, registry, location = '$') {
|
|
118
|
+
if (schema === true) return [];
|
|
119
|
+
if (schema === false) return [`${location}: is rejected by the false schema`];
|
|
120
|
+
if (!schema || typeof schema !== 'object' || Array.isArray(schema)) {
|
|
121
|
+
throw new Error(`${schemaFile}: JSON Schema node at ${location} must be an object or boolean`);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const errors = [];
|
|
125
|
+
|
|
126
|
+
if (schema.$ref) {
|
|
127
|
+
const target = registry.resolve(schema.$ref, schemaFile);
|
|
128
|
+
errors.push(...validateInstance(instance, target.schema, target.file, registry, location));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
for (const child of schema.allOf || []) {
|
|
132
|
+
errors.push(...validateInstance(instance, child, schemaFile, registry, location));
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (schema.anyOf) {
|
|
136
|
+
const matches = schema.anyOf.filter(child =>
|
|
137
|
+
validateInstance(instance, child, schemaFile, registry, location).length === 0
|
|
138
|
+
).length;
|
|
139
|
+
if (matches === 0) errors.push(`${location}: must match at least one anyOf branch`);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (schema.oneOf) {
|
|
143
|
+
const matches = schema.oneOf.filter(child =>
|
|
144
|
+
validateInstance(instance, child, schemaFile, registry, location).length === 0
|
|
145
|
+
).length;
|
|
146
|
+
if (matches !== 1) errors.push(`${location}: must match exactly one oneOf branch (matched ${matches})`);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (schema.if) {
|
|
150
|
+
const conditionMatches = validateInstance(instance, schema.if, schemaFile, registry, location).length === 0;
|
|
151
|
+
if (conditionMatches && schema.then) {
|
|
152
|
+
errors.push(...validateInstance(instance, schema.then, schemaFile, registry, location));
|
|
153
|
+
}
|
|
154
|
+
if (!conditionMatches && schema.else) {
|
|
155
|
+
errors.push(...validateInstance(instance, schema.else, schemaFile, registry, location));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (schema.not && validateInstance(instance, schema.not, schemaFile, registry, location).length === 0) {
|
|
160
|
+
errors.push(`${location}: must not match the forbidden schema`);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (Object.prototype.hasOwnProperty.call(schema, 'const') && !deepEqual(instance, schema.const)) {
|
|
164
|
+
errors.push(`${location}: must equal ${JSON.stringify(schema.const)}`);
|
|
165
|
+
}
|
|
166
|
+
if (schema.enum && !schema.enum.some(item => deepEqual(instance, item))) {
|
|
167
|
+
errors.push(`${location}: must be one of ${schema.enum.map(JSON.stringify).join(', ')}`);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (schema.type) {
|
|
171
|
+
const allowed = Array.isArray(schema.type) ? schema.type : [schema.type];
|
|
172
|
+
const actual = valueType(instance);
|
|
173
|
+
const matches = allowed.some(type => type === actual || (type === 'number' && actual === 'integer'));
|
|
174
|
+
if (!matches) {
|
|
175
|
+
errors.push(`${location}: expected ${allowed.join('|')}, got ${actual}`);
|
|
176
|
+
return errors;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
if (typeof instance === 'string') {
|
|
181
|
+
if (schema.minLength !== undefined && instance.length < schema.minLength) {
|
|
182
|
+
errors.push(`${location}: string is shorter than ${schema.minLength}`);
|
|
183
|
+
}
|
|
184
|
+
if (schema.maxLength !== undefined && instance.length > schema.maxLength) {
|
|
185
|
+
errors.push(`${location}: string is longer than ${schema.maxLength}`);
|
|
186
|
+
}
|
|
187
|
+
if (schema.pattern && !new RegExp(schema.pattern, 'u').test(instance)) {
|
|
188
|
+
errors.push(`${location}: does not match ${schema.pattern}`);
|
|
189
|
+
}
|
|
190
|
+
if (schema.format === 'date-time' && !rfc3339DateTimeValid(instance)) {
|
|
191
|
+
errors.push(`${location}: is not an RFC 3339 date-time`);
|
|
192
|
+
}
|
|
193
|
+
if (schema.format === 'date' && !rfc3339DateValid(instance)) {
|
|
194
|
+
errors.push(`${location}: is not an ISO 8601 date`);
|
|
195
|
+
}
|
|
196
|
+
if (schema.format === 'uri') {
|
|
197
|
+
try {
|
|
198
|
+
new URL(instance);
|
|
199
|
+
} catch {
|
|
200
|
+
errors.push(`${location}: is not an absolute URI`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if (typeof instance === 'number') {
|
|
206
|
+
if (schema.minimum !== undefined && instance < schema.minimum) {
|
|
207
|
+
errors.push(`${location}: is below ${schema.minimum}`);
|
|
208
|
+
}
|
|
209
|
+
if (schema.maximum !== undefined && instance > schema.maximum) {
|
|
210
|
+
errors.push(`${location}: is above ${schema.maximum}`);
|
|
211
|
+
}
|
|
212
|
+
if (schema.exclusiveMinimum !== undefined && instance <= schema.exclusiveMinimum) {
|
|
213
|
+
errors.push(`${location}: is not greater than ${schema.exclusiveMinimum}`);
|
|
214
|
+
}
|
|
215
|
+
if (schema.exclusiveMaximum !== undefined && instance >= schema.exclusiveMaximum) {
|
|
216
|
+
errors.push(`${location}: is not less than ${schema.exclusiveMaximum}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
if (Array.isArray(instance)) {
|
|
221
|
+
if (schema.minItems !== undefined && instance.length < schema.minItems) {
|
|
222
|
+
errors.push(`${location}: has fewer than ${schema.minItems} items`);
|
|
223
|
+
}
|
|
224
|
+
if (schema.maxItems !== undefined && instance.length > schema.maxItems) {
|
|
225
|
+
errors.push(`${location}: has more than ${schema.maxItems} items`);
|
|
226
|
+
}
|
|
227
|
+
if (schema.uniqueItems) {
|
|
228
|
+
const serialized = instance.map(item => JSON.stringify(item));
|
|
229
|
+
if (new Set(serialized).size !== serialized.length) {
|
|
230
|
+
errors.push(`${location}: items are not unique`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (schema.items) {
|
|
234
|
+
instance.forEach((item, index) => {
|
|
235
|
+
errors.push(...validateInstance(item, schema.items, schemaFile, registry, `${location}[${index}]`));
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
if (instance && typeof instance === 'object' && !Array.isArray(instance)) {
|
|
241
|
+
const properties = schema.properties || {};
|
|
242
|
+
const patternProperties = schema.patternProperties || {};
|
|
243
|
+
const keys = Object.keys(instance);
|
|
244
|
+
if (schema.minProperties !== undefined && keys.length < schema.minProperties) {
|
|
245
|
+
errors.push(`${location}: has fewer than ${schema.minProperties} properties`);
|
|
246
|
+
}
|
|
247
|
+
if (schema.maxProperties !== undefined && keys.length > schema.maxProperties) {
|
|
248
|
+
errors.push(`${location}: has more than ${schema.maxProperties} properties`);
|
|
249
|
+
}
|
|
250
|
+
for (const required of schema.required || []) {
|
|
251
|
+
if (!Object.prototype.hasOwnProperty.call(instance, required)) {
|
|
252
|
+
errors.push(`${location}: missing required property ${required}`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
for (const key of keys) {
|
|
257
|
+
const matchingPatterns = Object.entries(patternProperties)
|
|
258
|
+
.filter(([pattern]) => new RegExp(pattern, 'u').test(key));
|
|
259
|
+
const declared = Object.prototype.hasOwnProperty.call(properties, key);
|
|
260
|
+
if (!declared && matchingPatterns.length === 0) {
|
|
261
|
+
if (schema.additionalProperties === false) {
|
|
262
|
+
errors.push(`${location}: unknown property ${key}`);
|
|
263
|
+
} else if (schema.additionalProperties && typeof schema.additionalProperties === 'object') {
|
|
264
|
+
errors.push(...validateInstance(
|
|
265
|
+
instance[key],
|
|
266
|
+
schema.additionalProperties,
|
|
267
|
+
schemaFile,
|
|
268
|
+
registry,
|
|
269
|
+
`${location}${escapeLocationSegment(key)}`
|
|
270
|
+
));
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
for (const [, childSchema] of matchingPatterns) {
|
|
274
|
+
errors.push(...validateInstance(
|
|
275
|
+
instance[key],
|
|
276
|
+
childSchema,
|
|
277
|
+
schemaFile,
|
|
278
|
+
registry,
|
|
279
|
+
`${location}${escapeLocationSegment(key)}`
|
|
280
|
+
));
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
for (const [key, childSchema] of Object.entries(properties)) {
|
|
285
|
+
if (Object.prototype.hasOwnProperty.call(instance, key)) {
|
|
286
|
+
errors.push(...validateInstance(
|
|
287
|
+
instance[key],
|
|
288
|
+
childSchema,
|
|
289
|
+
schemaFile,
|
|
290
|
+
registry,
|
|
291
|
+
`${location}${escapeLocationSegment(key)}`
|
|
292
|
+
));
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
return errors;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
module.exports = {
|
|
301
|
+
SchemaRegistry,
|
|
302
|
+
readJson,
|
|
303
|
+
validateInstance
|
|
304
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "wtfp.clio-write-guard/v1",
|
|
3
|
+
"actions": {
|
|
4
|
+
"execute-outline": [
|
|
5
|
+
".planning",
|
|
6
|
+
"paper"
|
|
7
|
+
],
|
|
8
|
+
"polish-prose": [
|
|
9
|
+
".planning",
|
|
10
|
+
"paper"
|
|
11
|
+
],
|
|
12
|
+
"quick": [
|
|
13
|
+
".planning",
|
|
14
|
+
"paper"
|
|
15
|
+
],
|
|
16
|
+
"write-section": [
|
|
17
|
+
".planning",
|
|
18
|
+
"paper"
|
|
19
|
+
]
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"palette": {
|
|
3
|
+
"cyanStrong": { "dark": "#f07ce4", "light": "#8c1d82" },
|
|
4
|
+
"cyanFocal": { "dark": "#ec8a74", "light": "#a63c25" }
|
|
5
|
+
},
|
|
6
|
+
"glyphs": { "brand": "✎" },
|
|
7
|
+
"agents": {
|
|
8
|
+
"wtfp-outliner": { "label": "Outliner", "glyph": "☰" },
|
|
9
|
+
"wtfp-section-planner": { "label": "Section planner", "glyph": "◇" },
|
|
10
|
+
"wtfp-plan-checker": { "label": "Plan checker", "glyph": "◈" },
|
|
11
|
+
"wtfp-research-synthesizer": { "label": "Research synthesizer", "glyph": "≋" },
|
|
12
|
+
"wtfp-section-writer": { "label": "Section writer", "glyph": "✎" },
|
|
13
|
+
"wtfp-section-reviewer": { "label": "Section reviewer", "glyph": "◎" },
|
|
14
|
+
"wtfp-argument-verifier": { "label": "Argument verifier", "glyph": "∴" },
|
|
15
|
+
"wtfp-coherence-checker": { "label": "Coherence checker", "glyph": "⇄" },
|
|
16
|
+
"wtfp-prose-polisher": { "label": "Prose polisher", "glyph": "✦" },
|
|
17
|
+
"wtfp-citation-expert": { "label": "Citation expert", "glyph": "❝" },
|
|
18
|
+
"wtfp-citation-formatter": { "label": "Citation formatter", "glyph": "¶" }
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
"schema": "wtfp.generated-adapter/v1",
|
|
3
3
|
"generatorVersion": 5,
|
|
4
4
|
"target": "codex",
|
|
5
|
-
"sourceHash": "
|
|
5
|
+
"sourceHash": "d0ce91ae7440986c363ee10ffe7eb36561b8ca58cae2bd3a0f6ffd323b6759b7",
|
|
6
6
|
"files": [
|
|
7
7
|
{
|
|
8
8
|
"path": ".codex-plugin/plugin.json",
|
|
9
|
-
"sha256": "
|
|
9
|
+
"sha256": "3b27fd09165749cdb099bb0fd835db0e42938908ffda80e718b48a9a4e64f85d"
|
|
10
10
|
},
|
|
11
11
|
{
|
|
12
12
|
"path": "actions/add-todo.json",
|
|
@@ -222,7 +222,7 @@
|
|
|
222
222
|
},
|
|
223
223
|
{
|
|
224
224
|
"path": "plugin.json",
|
|
225
|
-
"sha256": "
|
|
225
|
+
"sha256": "c3717895f13793a547a61373c41095853d6589b61f98eeee46d77b277d020c4e"
|
|
226
226
|
},
|
|
227
227
|
{
|
|
228
228
|
"path": "project/README.md",
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
"schema": "wtfp.generated-adapter/v1",
|
|
3
3
|
"generatorVersion": 5,
|
|
4
4
|
"target": "copilot-marketplace",
|
|
5
|
-
"sourceHash": "
|
|
5
|
+
"sourceHash": "4ca961caeec3dca222a55ef4e91b298694563f8baea8d24fe4c0a4634c07f868",
|
|
6
6
|
"files": [
|
|
7
7
|
{
|
|
8
8
|
"path": "marketplace.json",
|
|
9
|
-
"sha256": "
|
|
9
|
+
"sha256": "dc1062489823e8ab8561221e13836878333cc7ad3082c08a04316048b7514813"
|
|
10
10
|
},
|
|
11
11
|
{
|
|
12
12
|
"path": "project/.github/agents/wtfp-argument-verifier.agent.md",
|
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
},
|
|
6
6
|
"metadata": {
|
|
7
7
|
"description": "WTF-P research workflow plugins",
|
|
8
|
-
"version": "0.
|
|
8
|
+
"version": "0.8.0"
|
|
9
9
|
},
|
|
10
10
|
"plugins": [
|
|
11
11
|
{
|
|
12
12
|
"name": "wtfp",
|
|
13
13
|
"source": "./plugins/wtfp",
|
|
14
14
|
"description": "Portable academic research and writing workflows.",
|
|
15
|
-
"version": "0.
|
|
15
|
+
"version": "0.8.0",
|
|
16
16
|
"author": {
|
|
17
17
|
"name": "akougkas"
|
|
18
18
|
},
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
"schema": "wtfp.generated-adapter/v1",
|
|
3
3
|
"generatorVersion": 5,
|
|
4
4
|
"target": "copilot",
|
|
5
|
-
"sourceHash": "
|
|
5
|
+
"sourceHash": "cfd8e83bbbc037bf1f487a6c4534261bdcab7d2e32f030d232bf00e4a60f815a",
|
|
6
6
|
"files": [
|
|
7
7
|
{
|
|
8
8
|
"path": ".claude-plugin/plugin.json",
|
|
9
|
-
"sha256": "
|
|
9
|
+
"sha256": "9b8391fc30f1b454b4795cb94c5de6b0ef6fb7accc1546221c3239f2b7ffeaae"
|
|
10
10
|
},
|
|
11
11
|
{
|
|
12
12
|
"path": "actions/add-todo.json",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"schema": "wtfp.generated-adapter/v1",
|
|
3
3
|
"generatorVersion": 5,
|
|
4
4
|
"target": "gemini",
|
|
5
|
-
"sourceHash": "
|
|
5
|
+
"sourceHash": "853978c226536b563e078e632ecec210b0246fd33746d3236463e926da147295",
|
|
6
6
|
"files": [
|
|
7
7
|
{
|
|
8
8
|
"path": "actions/add-todo.json",
|
|
@@ -362,7 +362,7 @@
|
|
|
362
362
|
},
|
|
363
363
|
{
|
|
364
364
|
"path": "gemini-extension.json",
|
|
365
|
-
"sha256": "
|
|
365
|
+
"sha256": "90394dff1a58c75ddede1f979458d5ede617bf1ac4b9e4da0cc5fdf0ea780543"
|
|
366
366
|
},
|
|
367
367
|
{
|
|
368
368
|
"path": "GEMINI.md",
|