react-agentic 0.0.1
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/LICENSE +21 -0
- package/README.md +402 -0
- package/dist/chunk-263OAOFB.js +7903 -0
- package/dist/chunk-263OAOFB.js.map +1 -0
- package/dist/chunk-OO3V32L6.js +34 -0
- package/dist/chunk-OO3V32L6.js.map +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +416 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +3320 -0
- package/dist/index.js +2800 -0
- package/dist/index.js.map +1 -0
- package/dist/sqlite-QIS455OH.js +278 -0
- package/dist/sqlite-QIS455OH.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import {
|
|
2
|
+
registerProvider
|
|
3
|
+
} from "./chunk-OO3V32L6.js";
|
|
4
|
+
|
|
5
|
+
// src/providers/sqlite.ts
|
|
6
|
+
function escapeSql(value) {
|
|
7
|
+
return value.replace(/'/g, "''");
|
|
8
|
+
}
|
|
9
|
+
function toCliFlag(arg) {
|
|
10
|
+
return "--" + arg.replace(/_/g, "-");
|
|
11
|
+
}
|
|
12
|
+
function toShellVar(arg) {
|
|
13
|
+
return arg.toUpperCase();
|
|
14
|
+
}
|
|
15
|
+
function frontmatter(name, description, tools) {
|
|
16
|
+
const toolsYaml = tools.map((t) => ` - ${t}`).join("\n");
|
|
17
|
+
return `---
|
|
18
|
+
name: ${name}
|
|
19
|
+
description: ${description}
|
|
20
|
+
allowed-tools:
|
|
21
|
+
${toolsYaml}
|
|
22
|
+
---`;
|
|
23
|
+
}
|
|
24
|
+
function argParser(args) {
|
|
25
|
+
if (args.length === 0) return "";
|
|
26
|
+
const varInits = args.map((arg) => `${toShellVar(arg)}=""`).join("\n");
|
|
27
|
+
const cases = args.map(
|
|
28
|
+
(arg) => ` ${toCliFlag(arg)}) ${toShellVar(arg)}="$2"; shift 2 ;;`
|
|
29
|
+
).join("\n");
|
|
30
|
+
return `# Parse arguments
|
|
31
|
+
${varInits}
|
|
32
|
+
while [[ $# -gt 0 ]]; do
|
|
33
|
+
case $1 in
|
|
34
|
+
${cases}
|
|
35
|
+
*) shift ;;
|
|
36
|
+
esac
|
|
37
|
+
done`;
|
|
38
|
+
}
|
|
39
|
+
function tableCheck(stateName) {
|
|
40
|
+
return `# Check table exists
|
|
41
|
+
if ! sqlite3 "$DB" "SELECT 1 FROM ${stateName} LIMIT 1" 2>/dev/null; then
|
|
42
|
+
echo '{"error": "State not initialized. Run /${stateName}:init first"}'
|
|
43
|
+
exit 1
|
|
44
|
+
fi`;
|
|
45
|
+
}
|
|
46
|
+
var SQLiteProvider = class {
|
|
47
|
+
name = "sqlite";
|
|
48
|
+
generateInit(ctx) {
|
|
49
|
+
const { stateName, database, schema } = ctx;
|
|
50
|
+
const columns = schema.fields.map((f) => {
|
|
51
|
+
let def = ` ${f.name} ${f.sqlType}`;
|
|
52
|
+
if (f.defaultValue) {
|
|
53
|
+
def += ` DEFAULT ${f.sqlType === "TEXT" ? `'${escapeSql(f.defaultValue)}'` : f.defaultValue}`;
|
|
54
|
+
}
|
|
55
|
+
if (f.enumValues && f.enumValues.length > 0) {
|
|
56
|
+
const checks = f.enumValues.map((v) => `'${escapeSql(v)}'`).join(", ");
|
|
57
|
+
def += ` CHECK(${f.name} IN (${checks}))`;
|
|
58
|
+
}
|
|
59
|
+
return def;
|
|
60
|
+
}).join(",\n");
|
|
61
|
+
const content = `${frontmatter(
|
|
62
|
+
`${stateName}.init`,
|
|
63
|
+
`Initialize ${stateName} state table. Run once before using ${stateName} state.`,
|
|
64
|
+
["Bash(sqlite3:*)", "Bash(mkdir:*)"]
|
|
65
|
+
)}
|
|
66
|
+
|
|
67
|
+
# Initialize ${stateName.charAt(0).toUpperCase() + stateName.slice(1)} State
|
|
68
|
+
|
|
69
|
+
Create the SQLite table for ${stateName} state.
|
|
70
|
+
|
|
71
|
+
## Process
|
|
72
|
+
|
|
73
|
+
\`\`\`bash
|
|
74
|
+
mkdir -p "$(dirname "${database}")"
|
|
75
|
+
sqlite3 "${database}" <<'SQL'
|
|
76
|
+
CREATE TABLE IF NOT EXISTS ${stateName} (
|
|
77
|
+
${columns}
|
|
78
|
+
);
|
|
79
|
+
-- Insert default row if not exists
|
|
80
|
+
INSERT OR IGNORE INTO ${stateName} (rowid) VALUES (1);
|
|
81
|
+
SQL
|
|
82
|
+
echo '{"status": "initialized", "table": "${stateName}"}'
|
|
83
|
+
\`\`\`
|
|
84
|
+
`;
|
|
85
|
+
return {
|
|
86
|
+
filename: `${stateName}.init.md`,
|
|
87
|
+
content
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
generateRead(ctx) {
|
|
91
|
+
const { stateName, database } = ctx;
|
|
92
|
+
const content = `${frontmatter(
|
|
93
|
+
`${stateName}.read`,
|
|
94
|
+
`Read ${stateName} state. Returns current state as JSON.`,
|
|
95
|
+
["Bash(sqlite3:*)"]
|
|
96
|
+
)}
|
|
97
|
+
|
|
98
|
+
# Read ${stateName.charAt(0).toUpperCase() + stateName.slice(1)} State
|
|
99
|
+
|
|
100
|
+
Read the current ${stateName} state from SQLite.
|
|
101
|
+
|
|
102
|
+
## Arguments
|
|
103
|
+
|
|
104
|
+
- \`--field {name}\`: Optional field to read (e.g., \`lastVersion\`)
|
|
105
|
+
|
|
106
|
+
## Process
|
|
107
|
+
|
|
108
|
+
\`\`\`bash
|
|
109
|
+
DB="${database}"
|
|
110
|
+
|
|
111
|
+
# Parse arguments
|
|
112
|
+
FIELD=""
|
|
113
|
+
while [[ $# -gt 0 ]]; do
|
|
114
|
+
case $1 in
|
|
115
|
+
--field) FIELD="$2"; shift 2 ;;
|
|
116
|
+
*) shift ;;
|
|
117
|
+
esac
|
|
118
|
+
done
|
|
119
|
+
|
|
120
|
+
${tableCheck(stateName)}
|
|
121
|
+
|
|
122
|
+
# Read state
|
|
123
|
+
if [ -z "$FIELD" ]; then
|
|
124
|
+
sqlite3 -json "$DB" "SELECT * FROM ${stateName} WHERE rowid = 1" | jq '.[0]'
|
|
125
|
+
else
|
|
126
|
+
sqlite3 -json "$DB" "SELECT $FIELD FROM ${stateName} WHERE rowid = 1" | jq ".[0].$FIELD"
|
|
127
|
+
fi
|
|
128
|
+
\`\`\`
|
|
129
|
+
`;
|
|
130
|
+
return {
|
|
131
|
+
filename: `${stateName}.read.md`,
|
|
132
|
+
content
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
generateWrite(ctx) {
|
|
136
|
+
const { stateName, database } = ctx;
|
|
137
|
+
const content = `${frontmatter(
|
|
138
|
+
`${stateName}.write`,
|
|
139
|
+
`Write to ${stateName} state. Updates fields in state.`,
|
|
140
|
+
["Bash(sqlite3:*)"]
|
|
141
|
+
)}
|
|
142
|
+
|
|
143
|
+
# Write ${stateName.charAt(0).toUpperCase() + stateName.slice(1)} State
|
|
144
|
+
|
|
145
|
+
Update ${stateName} state fields in SQLite.
|
|
146
|
+
|
|
147
|
+
## Arguments
|
|
148
|
+
|
|
149
|
+
- \`--field {name}\`: Field to update (e.g., \`lastVersion\`)
|
|
150
|
+
- \`--value {val}\`: Value to set
|
|
151
|
+
|
|
152
|
+
## Process
|
|
153
|
+
|
|
154
|
+
\`\`\`bash
|
|
155
|
+
DB="${database}"
|
|
156
|
+
|
|
157
|
+
# Parse arguments
|
|
158
|
+
FIELD=""
|
|
159
|
+
VALUE=""
|
|
160
|
+
while [[ $# -gt 0 ]]; do
|
|
161
|
+
case $1 in
|
|
162
|
+
--field) FIELD="$2"; shift 2 ;;
|
|
163
|
+
--value) VALUE="$2"; shift 2 ;;
|
|
164
|
+
*) shift ;;
|
|
165
|
+
esac
|
|
166
|
+
done
|
|
167
|
+
|
|
168
|
+
# Validate
|
|
169
|
+
if [ -z "$FIELD" ] || [ -z "$VALUE" ]; then
|
|
170
|
+
echo '{"error": "Both --field and --value required"}'
|
|
171
|
+
exit 1
|
|
172
|
+
fi
|
|
173
|
+
|
|
174
|
+
${tableCheck(stateName)}
|
|
175
|
+
|
|
176
|
+
# Escape value for SQL (double single quotes)
|
|
177
|
+
SAFE_VALUE=$(printf '%s' "$VALUE" | sed "s/'/''/g")
|
|
178
|
+
|
|
179
|
+
# Update and return new state
|
|
180
|
+
sqlite3 "$DB" "UPDATE ${stateName} SET $FIELD = '$SAFE_VALUE' WHERE rowid = 1"
|
|
181
|
+
sqlite3 -json "$DB" "SELECT * FROM ${stateName} WHERE rowid = 1" | jq '.[0]'
|
|
182
|
+
\`\`\`
|
|
183
|
+
`;
|
|
184
|
+
return {
|
|
185
|
+
filename: `${stateName}.write.md`,
|
|
186
|
+
content
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
generateDelete(ctx) {
|
|
190
|
+
const { stateName, database, schema } = ctx;
|
|
191
|
+
const resets = schema.fields.map((f) => {
|
|
192
|
+
const val = f.sqlType === "TEXT" ? `'${escapeSql(f.defaultValue || "")}'` : f.defaultValue || "0";
|
|
193
|
+
return `${f.name} = ${val}`;
|
|
194
|
+
}).join(", ");
|
|
195
|
+
const content = `${frontmatter(
|
|
196
|
+
`${stateName}.delete`,
|
|
197
|
+
`Reset ${stateName} state to defaults.`,
|
|
198
|
+
["Bash(sqlite3:*)"]
|
|
199
|
+
)}
|
|
200
|
+
|
|
201
|
+
# Reset ${stateName.charAt(0).toUpperCase() + stateName.slice(1)} State
|
|
202
|
+
|
|
203
|
+
Reset ${stateName} state to default values.
|
|
204
|
+
|
|
205
|
+
## Process
|
|
206
|
+
|
|
207
|
+
\`\`\`bash
|
|
208
|
+
DB="${database}"
|
|
209
|
+
|
|
210
|
+
${tableCheck(stateName)}
|
|
211
|
+
|
|
212
|
+
# Reset to defaults
|
|
213
|
+
sqlite3 "$DB" "UPDATE ${stateName} SET ${resets} WHERE rowid = 1"
|
|
214
|
+
sqlite3 -json "$DB" "SELECT * FROM ${stateName} WHERE rowid = 1" | jq '.[0]'
|
|
215
|
+
\`\`\`
|
|
216
|
+
`;
|
|
217
|
+
return {
|
|
218
|
+
filename: `${stateName}.delete.md`,
|
|
219
|
+
content
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
generateOperation(ctx, operation) {
|
|
223
|
+
const { stateName, database } = ctx;
|
|
224
|
+
const { name, sqlTemplate, args } = operation;
|
|
225
|
+
const argDocs = args.map(
|
|
226
|
+
(arg) => `- \`${toCliFlag(arg)} {value}\`: ${arg.replace(/_/g, " ")}`
|
|
227
|
+
).join("\n");
|
|
228
|
+
const parser = argParser(args);
|
|
229
|
+
let sqlWithVars = sqlTemplate;
|
|
230
|
+
for (const arg of args) {
|
|
231
|
+
const regex = new RegExp(`\\$${arg}`, "g");
|
|
232
|
+
sqlWithVars = sqlWithVars.replace(regex, `'$SAFE_${toShellVar(arg)}'`);
|
|
233
|
+
}
|
|
234
|
+
const escapes = args.map(
|
|
235
|
+
(arg) => `SAFE_${toShellVar(arg)}=$(printf '%s' "$${toShellVar(arg)}" | sed "s/'/''/g")`
|
|
236
|
+
).join("\n");
|
|
237
|
+
const content = `${frontmatter(
|
|
238
|
+
`${stateName}.${name}`,
|
|
239
|
+
`${name.charAt(0).toUpperCase() + name.slice(1)} operation on ${stateName} state.`,
|
|
240
|
+
["Bash(sqlite3:*)"]
|
|
241
|
+
)}
|
|
242
|
+
|
|
243
|
+
# ${name.charAt(0).toUpperCase() + name.slice(1)} ${stateName.charAt(0).toUpperCase() + stateName.slice(1)}
|
|
244
|
+
|
|
245
|
+
Custom operation on ${stateName} state.
|
|
246
|
+
|
|
247
|
+
## Arguments
|
|
248
|
+
|
|
249
|
+
${argDocs || "(no arguments)"}
|
|
250
|
+
|
|
251
|
+
## Process
|
|
252
|
+
|
|
253
|
+
\`\`\`bash
|
|
254
|
+
DB="${database}"
|
|
255
|
+
|
|
256
|
+
${parser}
|
|
257
|
+
|
|
258
|
+
${tableCheck(stateName)}
|
|
259
|
+
|
|
260
|
+
# Escape values for SQL
|
|
261
|
+
${escapes || "# (no escaping needed)"}
|
|
262
|
+
|
|
263
|
+
# Execute operation
|
|
264
|
+
sqlite3 "$DB" "${sqlWithVars.trim()}"
|
|
265
|
+
sqlite3 -json "$DB" "SELECT * FROM ${stateName} WHERE rowid = 1" | jq '.[0]'
|
|
266
|
+
\`\`\`
|
|
267
|
+
`;
|
|
268
|
+
return {
|
|
269
|
+
filename: `${stateName}.${name}.md`,
|
|
270
|
+
content
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
registerProvider(new SQLiteProvider());
|
|
275
|
+
export {
|
|
276
|
+
SQLiteProvider
|
|
277
|
+
};
|
|
278
|
+
//# sourceMappingURL=sqlite-QIS455OH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/sqlite.ts"],"sourcesContent":["/**\n * SQLite Provider\n *\n * Generates bash/sqlite3 CLI skills for state operations.\n * All skills output JSON and use proper SQL escaping.\n */\n\nimport type { OperationNode } from '../ir/nodes.js';\nimport { registerProvider, type ProviderTemplate, type ProviderContext, type GeneratedSkill } from './index.js';\n\n/**\n * Escape a value for SQL single-quoted string\n * Doubles single quotes: O'Brien -> O''Brien\n */\nfunction escapeSql(value: string): string {\n return value.replace(/'/g, \"''\");\n}\n\n/**\n * Convert arg name to CLI flag format\n * bump_type -> --bump-type\n */\nfunction toCliFlag(arg: string): string {\n return '--' + arg.replace(/_/g, '-');\n}\n\n/**\n * Convert CLI flag back to shell variable\n * --bump-type -> BUMP_TYPE\n */\nfunction toShellVar(arg: string): string {\n return arg.toUpperCase();\n}\n\n/**\n * Generate skill frontmatter\n */\nfunction frontmatter(name: string, description: string, tools: string[]): string {\n const toolsYaml = tools.map(t => ` - ${t}`).join('\\n');\n return `---\nname: ${name}\ndescription: ${description}\nallowed-tools:\n${toolsYaml}\n---`;\n}\n\n/**\n * Generate argument parsing bash code\n */\nfunction argParser(args: string[]): string {\n if (args.length === 0) return '';\n\n const varInits = args.map(arg => `${toShellVar(arg)}=\"\"`).join('\\n');\n const cases = args.map(arg =>\n ` ${toCliFlag(arg)}) ${toShellVar(arg)}=\"$2\"; shift 2 ;;`\n ).join('\\n');\n\n return `# Parse arguments\n${varInits}\nwhile [[ $# -gt 0 ]]; do\n case $1 in\n${cases}\n *) shift ;;\n esac\ndone`;\n}\n\n/**\n * Generate table existence check\n */\nfunction tableCheck(stateName: string): string {\n return `# Check table exists\nif ! sqlite3 \"$DB\" \"SELECT 1 FROM ${stateName} LIMIT 1\" 2>/dev/null; then\n echo '{\"error\": \"State not initialized. Run /${stateName}:init first\"}'\n exit 1\nfi`;\n}\n\n/**\n * SQLite provider implementation\n */\nexport class SQLiteProvider implements ProviderTemplate {\n readonly name = 'sqlite';\n\n generateInit(ctx: ProviderContext): GeneratedSkill {\n const { stateName, database, schema } = ctx;\n\n // Generate CREATE TABLE columns\n const columns = schema.fields.map(f => {\n let def = ` ${f.name} ${f.sqlType}`;\n if (f.defaultValue) {\n def += ` DEFAULT ${f.sqlType === 'TEXT' ? `'${escapeSql(f.defaultValue)}'` : f.defaultValue}`;\n }\n if (f.enumValues && f.enumValues.length > 0) {\n const checks = f.enumValues.map(v => `'${escapeSql(v)}'`).join(', ');\n def += ` CHECK(${f.name} IN (${checks}))`;\n }\n return def;\n }).join(',\\n');\n\n const content = `${frontmatter(\n `${stateName}.init`,\n `Initialize ${stateName} state table. Run once before using ${stateName} state.`,\n ['Bash(sqlite3:*)', 'Bash(mkdir:*)']\n )}\n\n# Initialize ${stateName.charAt(0).toUpperCase() + stateName.slice(1)} State\n\nCreate the SQLite table for ${stateName} state.\n\n## Process\n\n\\`\\`\\`bash\nmkdir -p \"$(dirname \"${database}\")\"\nsqlite3 \"${database}\" <<'SQL'\nCREATE TABLE IF NOT EXISTS ${stateName} (\n${columns}\n);\n-- Insert default row if not exists\nINSERT OR IGNORE INTO ${stateName} (rowid) VALUES (1);\nSQL\necho '{\"status\": \"initialized\", \"table\": \"${stateName}\"}'\n\\`\\`\\`\n`;\n\n return {\n filename: `${stateName}.init.md`,\n content\n };\n }\n\n generateRead(ctx: ProviderContext): GeneratedSkill {\n const { stateName, database } = ctx;\n\n const content = `${frontmatter(\n `${stateName}.read`,\n `Read ${stateName} state. Returns current state as JSON.`,\n ['Bash(sqlite3:*)']\n )}\n\n# Read ${stateName.charAt(0).toUpperCase() + stateName.slice(1)} State\n\nRead the current ${stateName} state from SQLite.\n\n## Arguments\n\n- \\`--field {name}\\`: Optional field to read (e.g., \\`lastVersion\\`)\n\n## Process\n\n\\`\\`\\`bash\nDB=\"${database}\"\n\n# Parse arguments\nFIELD=\"\"\nwhile [[ $# -gt 0 ]]; do\n case $1 in\n --field) FIELD=\"$2\"; shift 2 ;;\n *) shift ;;\n esac\ndone\n\n${tableCheck(stateName)}\n\n# Read state\nif [ -z \"$FIELD\" ]; then\n sqlite3 -json \"$DB\" \"SELECT * FROM ${stateName} WHERE rowid = 1\" | jq '.[0]'\nelse\n sqlite3 -json \"$DB\" \"SELECT $FIELD FROM ${stateName} WHERE rowid = 1\" | jq \".[0].$FIELD\"\nfi\n\\`\\`\\`\n`;\n\n return {\n filename: `${stateName}.read.md`,\n content\n };\n }\n\n generateWrite(ctx: ProviderContext): GeneratedSkill {\n const { stateName, database } = ctx;\n\n const content = `${frontmatter(\n `${stateName}.write`,\n `Write to ${stateName} state. Updates fields in state.`,\n ['Bash(sqlite3:*)']\n )}\n\n# Write ${stateName.charAt(0).toUpperCase() + stateName.slice(1)} State\n\nUpdate ${stateName} state fields in SQLite.\n\n## Arguments\n\n- \\`--field {name}\\`: Field to update (e.g., \\`lastVersion\\`)\n- \\`--value {val}\\`: Value to set\n\n## Process\n\n\\`\\`\\`bash\nDB=\"${database}\"\n\n# Parse arguments\nFIELD=\"\"\nVALUE=\"\"\nwhile [[ $# -gt 0 ]]; do\n case $1 in\n --field) FIELD=\"$2\"; shift 2 ;;\n --value) VALUE=\"$2\"; shift 2 ;;\n *) shift ;;\n esac\ndone\n\n# Validate\nif [ -z \"$FIELD\" ] || [ -z \"$VALUE\" ]; then\n echo '{\"error\": \"Both --field and --value required\"}'\n exit 1\nfi\n\n${tableCheck(stateName)}\n\n# Escape value for SQL (double single quotes)\nSAFE_VALUE=$(printf '%s' \"$VALUE\" | sed \"s/'/''/g\")\n\n# Update and return new state\nsqlite3 \"$DB\" \"UPDATE ${stateName} SET $FIELD = '$SAFE_VALUE' WHERE rowid = 1\"\nsqlite3 -json \"$DB\" \"SELECT * FROM ${stateName} WHERE rowid = 1\" | jq '.[0]'\n\\`\\`\\`\n`;\n\n return {\n filename: `${stateName}.write.md`,\n content\n };\n }\n\n generateDelete(ctx: ProviderContext): GeneratedSkill {\n const { stateName, database, schema } = ctx;\n\n // Generate default values for reset\n const resets = schema.fields.map(f => {\n const val = f.sqlType === 'TEXT' ? `'${escapeSql(f.defaultValue || '')}'` : (f.defaultValue || '0');\n return `${f.name} = ${val}`;\n }).join(', ');\n\n const content = `${frontmatter(\n `${stateName}.delete`,\n `Reset ${stateName} state to defaults.`,\n ['Bash(sqlite3:*)']\n )}\n\n# Reset ${stateName.charAt(0).toUpperCase() + stateName.slice(1)} State\n\nReset ${stateName} state to default values.\n\n## Process\n\n\\`\\`\\`bash\nDB=\"${database}\"\n\n${tableCheck(stateName)}\n\n# Reset to defaults\nsqlite3 \"$DB\" \"UPDATE ${stateName} SET ${resets} WHERE rowid = 1\"\nsqlite3 -json \"$DB\" \"SELECT * FROM ${stateName} WHERE rowid = 1\" | jq '.[0]'\n\\`\\`\\`\n`;\n\n return {\n filename: `${stateName}.delete.md`,\n content\n };\n }\n\n generateOperation(ctx: ProviderContext, operation: OperationNode): GeneratedSkill {\n const { stateName, database } = ctx;\n const { name, sqlTemplate, args } = operation;\n\n // Generate argument docs\n const argDocs = args.map(arg =>\n `- \\`${toCliFlag(arg)} {value}\\`: ${arg.replace(/_/g, ' ')}`\n ).join('\\n');\n\n // Generate argument parser\n const parser = argParser(args);\n\n // Generate SQL with shell variable substitution\n // Replace $arg with shell variable interpolation\n let sqlWithVars = sqlTemplate;\n for (const arg of args) {\n // Replace $arg with escaped shell variable\n const regex = new RegExp(`\\\\$${arg}`, 'g');\n sqlWithVars = sqlWithVars.replace(regex, `'$SAFE_${toShellVar(arg)}'`);\n }\n\n // Generate escaping for each arg\n const escapes = args.map(arg =>\n `SAFE_${toShellVar(arg)}=$(printf '%s' \"$${toShellVar(arg)}\" | sed \"s/'/''/g\")`\n ).join('\\n');\n\n const content = `${frontmatter(\n `${stateName}.${name}`,\n `${name.charAt(0).toUpperCase() + name.slice(1)} operation on ${stateName} state.`,\n ['Bash(sqlite3:*)']\n )}\n\n# ${name.charAt(0).toUpperCase() + name.slice(1)} ${stateName.charAt(0).toUpperCase() + stateName.slice(1)}\n\nCustom operation on ${stateName} state.\n\n## Arguments\n\n${argDocs || '(no arguments)'}\n\n## Process\n\n\\`\\`\\`bash\nDB=\"${database}\"\n\n${parser}\n\n${tableCheck(stateName)}\n\n# Escape values for SQL\n${escapes || '# (no escaping needed)'}\n\n# Execute operation\nsqlite3 \"$DB\" \"${sqlWithVars.trim()}\"\nsqlite3 -json \"$DB\" \"SELECT * FROM ${stateName} WHERE rowid = 1\" | jq '.[0]'\n\\`\\`\\`\n`;\n\n return {\n filename: `${stateName}.${name}.md`,\n content\n };\n }\n}\n\n// Register SQLite provider\nregisterProvider(new SQLiteProvider());\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "react-agentic",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Compile-time safety for Claude Code commands - malformed commands fail at build time, not runtime",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"react-agentic": "dist/cli/index.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md",
|
|
14
|
+
"LICENSE"
|
|
15
|
+
],
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"import": "./dist/index.js",
|
|
19
|
+
"types": "./dist/index.d.ts"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "git+https://github.com/Kaenn/react-agentic.git"
|
|
25
|
+
},
|
|
26
|
+
"homepage": "https://github.com/Kaenn/react-agentic#readme",
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "tsup",
|
|
29
|
+
"dev": "tsx watch src/index.ts",
|
|
30
|
+
"test": "vitest",
|
|
31
|
+
"test:run": "vitest run",
|
|
32
|
+
"typecheck": "tsc --noEmit",
|
|
33
|
+
"prewatch": "npm run build",
|
|
34
|
+
"watch": "node dist/cli/index.js build -w",
|
|
35
|
+
"build:agentic": "node dist/cli/index.js build 'src/app/**/*.tsx' --minify",
|
|
36
|
+
"prepublishOnly": "npm run build && npm run typecheck"
|
|
37
|
+
},
|
|
38
|
+
"keywords": [
|
|
39
|
+
"claude",
|
|
40
|
+
"claude-code",
|
|
41
|
+
"markdown",
|
|
42
|
+
"tsx",
|
|
43
|
+
"typescript",
|
|
44
|
+
"cli",
|
|
45
|
+
"agentic",
|
|
46
|
+
"ai"
|
|
47
|
+
],
|
|
48
|
+
"author": "Kaenn",
|
|
49
|
+
"license": "MIT",
|
|
50
|
+
"engines": {
|
|
51
|
+
"node": ">=18.0.0"
|
|
52
|
+
},
|
|
53
|
+
"peerDependencies": {
|
|
54
|
+
"@types/react": ">=18.0.0"
|
|
55
|
+
},
|
|
56
|
+
"peerDependenciesMeta": {
|
|
57
|
+
"@types/react": {
|
|
58
|
+
"optional": true
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"dependencies": {
|
|
62
|
+
"cat-names": "^4.0.0",
|
|
63
|
+
"chokidar": "^5.0.0",
|
|
64
|
+
"commander": "^14.0.2",
|
|
65
|
+
"globby": "^16.1.0",
|
|
66
|
+
"gray-matter": "^4.0.3",
|
|
67
|
+
"picocolors": "^1.1.1",
|
|
68
|
+
"ts-morph": "^27.0.2"
|
|
69
|
+
},
|
|
70
|
+
"devDependencies": {
|
|
71
|
+
"@types/js-yaml": "^4.0.9",
|
|
72
|
+
"@types/node": "^25.0.9",
|
|
73
|
+
"@types/react": "^19.1.6",
|
|
74
|
+
"esbuild": "^0.27.2",
|
|
75
|
+
"tsup": "^8.5.1",
|
|
76
|
+
"tsx": "^4.21.0",
|
|
77
|
+
"typescript": "^5.9.3",
|
|
78
|
+
"vitest": "^4.0.17"
|
|
79
|
+
}
|
|
80
|
+
}
|