va-claw 0.1.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/CONTRIBUTING.md +36 -0
- package/LICENSE +21 -0
- package/README.md +337 -0
- package/bin/va-claw +3 -0
- package/bin/va-claw.mjs +3 -0
- package/docs/README.md +6 -0
- package/index.html +728 -0
- package/package.json +43 -0
- package/packages/channels/discord/dist/.tsbuildinfo +1 -0
- package/packages/channels/discord/dist/cli-runner.d.ts +18 -0
- package/packages/channels/discord/dist/cli-runner.d.ts.map +1 -0
- package/packages/channels/discord/dist/cli-runner.js +58 -0
- package/packages/channels/discord/dist/cli-runner.js.map +1 -0
- package/packages/channels/discord/dist/cli-runner.test.d.ts +2 -0
- package/packages/channels/discord/dist/cli-runner.test.d.ts.map +1 -0
- package/packages/channels/discord/dist/cli-runner.test.js +173 -0
- package/packages/channels/discord/dist/cli-runner.test.js.map +1 -0
- package/packages/channels/discord/dist/discord-client.d.ts +3 -0
- package/packages/channels/discord/dist/discord-client.d.ts.map +1 -0
- package/packages/channels/discord/dist/discord-client.js +49 -0
- package/packages/channels/discord/dist/discord-client.js.map +1 -0
- package/packages/channels/discord/dist/format.d.ts +6 -0
- package/packages/channels/discord/dist/format.d.ts.map +1 -0
- package/packages/channels/discord/dist/format.js +19 -0
- package/packages/channels/discord/dist/format.js.map +1 -0
- package/packages/channels/discord/dist/format.test.d.ts +2 -0
- package/packages/channels/discord/dist/format.test.d.ts.map +1 -0
- package/packages/channels/discord/dist/format.test.js +63 -0
- package/packages/channels/discord/dist/format.test.js.map +1 -0
- package/packages/channels/discord/dist/index.d.ts +3 -0
- package/packages/channels/discord/dist/index.d.ts.map +1 -0
- package/packages/channels/discord/dist/index.js +2 -0
- package/packages/channels/discord/dist/index.js.map +1 -0
- package/packages/channels/discord/dist/prompt.d.ts +4 -0
- package/packages/channels/discord/dist/prompt.d.ts.map +1 -0
- package/packages/channels/discord/dist/prompt.js +28 -0
- package/packages/channels/discord/dist/prompt.js.map +1 -0
- package/packages/channels/discord/dist/prompt.test.d.ts +2 -0
- package/packages/channels/discord/dist/prompt.test.d.ts.map +1 -0
- package/packages/channels/discord/dist/prompt.test.js +130 -0
- package/packages/channels/discord/dist/prompt.test.js.map +1 -0
- package/packages/channels/discord/dist/runtime.d.ts +11 -0
- package/packages/channels/discord/dist/runtime.d.ts.map +1 -0
- package/packages/channels/discord/dist/runtime.js +66 -0
- package/packages/channels/discord/dist/runtime.js.map +1 -0
- package/packages/channels/discord/dist/runtime.test.d.ts +2 -0
- package/packages/channels/discord/dist/runtime.test.d.ts.map +1 -0
- package/packages/channels/discord/dist/runtime.test.js +107 -0
- package/packages/channels/discord/dist/runtime.test.js.map +1 -0
- package/packages/channels/discord/dist/types.d.ts +30 -0
- package/packages/channels/discord/dist/types.d.ts.map +1 -0
- package/packages/channels/discord/dist/types.js +2 -0
- package/packages/channels/discord/dist/types.js.map +1 -0
- package/packages/channels/discord/package.json +21 -0
- package/packages/channels/dist/.tsbuildinfo +1 -0
- package/packages/channels/dist/index.d.ts +14 -0
- package/packages/channels/dist/index.d.ts.map +1 -0
- package/packages/channels/dist/index.js +25 -0
- package/packages/channels/dist/index.js.map +1 -0
- package/packages/channels/package.json +23 -0
- package/packages/channels/slack/dist/.tsbuildinfo +1 -0
- package/packages/channels/slack/dist/cli.d.ts +7 -0
- package/packages/channels/slack/dist/cli.d.ts.map +1 -0
- package/packages/channels/slack/dist/cli.js +53 -0
- package/packages/channels/slack/dist/cli.js.map +1 -0
- package/packages/channels/slack/dist/cli.test.d.ts +2 -0
- package/packages/channels/slack/dist/cli.test.d.ts.map +1 -0
- package/packages/channels/slack/dist/cli.test.js +43 -0
- package/packages/channels/slack/dist/cli.test.js.map +1 -0
- package/packages/channels/slack/dist/index.d.ts +7 -0
- package/packages/channels/slack/dist/index.d.ts.map +1 -0
- package/packages/channels/slack/dist/index.js +28 -0
- package/packages/channels/slack/dist/index.js.map +1 -0
- package/packages/channels/slack/dist/message.d.ts +15 -0
- package/packages/channels/slack/dist/message.d.ts.map +1 -0
- package/packages/channels/slack/dist/message.js +38 -0
- package/packages/channels/slack/dist/message.js.map +1 -0
- package/packages/channels/slack/dist/slack.test.d.ts +2 -0
- package/packages/channels/slack/dist/slack.test.d.ts.map +1 -0
- package/packages/channels/slack/dist/slack.test.js +23 -0
- package/packages/channels/slack/dist/slack.test.js.map +1 -0
- package/packages/channels/slack/dist/types.d.ts +22 -0
- package/packages/channels/slack/dist/types.d.ts.map +1 -0
- package/packages/channels/slack/dist/types.js +2 -0
- package/packages/channels/slack/dist/types.js.map +1 -0
- package/packages/channels/slack/package.json +21 -0
- package/packages/channels/telegram/dist/.tsbuildinfo +1 -0
- package/packages/channels/telegram/dist/cli.d.ts +13 -0
- package/packages/channels/telegram/dist/cli.d.ts.map +1 -0
- package/packages/channels/telegram/dist/cli.js +53 -0
- package/packages/channels/telegram/dist/cli.js.map +1 -0
- package/packages/channels/telegram/dist/cli.test.d.ts +2 -0
- package/packages/channels/telegram/dist/cli.test.d.ts.map +1 -0
- package/packages/channels/telegram/dist/cli.test.js +167 -0
- package/packages/channels/telegram/dist/cli.test.js.map +1 -0
- package/packages/channels/telegram/dist/index.d.ts +7 -0
- package/packages/channels/telegram/dist/index.d.ts.map +1 -0
- package/packages/channels/telegram/dist/index.js +21 -0
- package/packages/channels/telegram/dist/index.js.map +1 -0
- package/packages/channels/telegram/dist/message.d.ts +6 -0
- package/packages/channels/telegram/dist/message.d.ts.map +1 -0
- package/packages/channels/telegram/dist/message.js +33 -0
- package/packages/channels/telegram/dist/message.js.map +1 -0
- package/packages/channels/telegram/dist/telegram.test.d.ts +2 -0
- package/packages/channels/telegram/dist/telegram.test.d.ts.map +1 -0
- package/packages/channels/telegram/dist/telegram.test.js +25 -0
- package/packages/channels/telegram/dist/telegram.test.js.map +1 -0
- package/packages/channels/telegram/dist/types.d.ts +20 -0
- package/packages/channels/telegram/dist/types.d.ts.map +1 -0
- package/packages/channels/telegram/dist/types.js +2 -0
- package/packages/channels/telegram/dist/types.js.map +1 -0
- package/packages/channels/telegram/package.json +21 -0
- package/packages/cli/dist/.tsbuildinfo +1 -0
- package/packages/cli/dist/bin/va-claw.d.mts +3 -0
- package/packages/cli/dist/bin/va-claw.d.mts.map +1 -0
- package/packages/cli/dist/bin/va-claw.mjs +4 -0
- package/packages/cli/dist/bin/va-claw.mjs.map +1 -0
- package/packages/cli/dist/channel-handlers.d.ts +8 -0
- package/packages/cli/dist/channel-handlers.d.ts.map +1 -0
- package/packages/cli/dist/channel-handlers.js +80 -0
- package/packages/cli/dist/channel-handlers.js.map +1 -0
- package/packages/cli/dist/deps-exports.d.ts +3 -0
- package/packages/cli/dist/deps-exports.d.ts.map +1 -0
- package/packages/cli/dist/deps-exports.js +3 -0
- package/packages/cli/dist/deps-exports.js.map +1 -0
- package/packages/cli/dist/deps.d.ts +3 -0
- package/packages/cli/dist/deps.d.ts.map +1 -0
- package/packages/cli/dist/deps.js +81 -0
- package/packages/cli/dist/deps.js.map +1 -0
- package/packages/cli/dist/handlers.d.ts +33 -0
- package/packages/cli/dist/handlers.d.ts.map +1 -0
- package/packages/cli/dist/handlers.js +207 -0
- package/packages/cli/dist/handlers.js.map +1 -0
- package/packages/cli/dist/index.d.ts +10 -0
- package/packages/cli/dist/index.d.ts.map +1 -0
- package/packages/cli/dist/index.js +9 -0
- package/packages/cli/dist/index.js.map +1 -0
- package/packages/cli/dist/install-files.d.ts +11 -0
- package/packages/cli/dist/install-files.d.ts.map +1 -0
- package/packages/cli/dist/install-files.js +72 -0
- package/packages/cli/dist/install-files.js.map +1 -0
- package/packages/cli/dist/memory-status.d.ts +3 -0
- package/packages/cli/dist/memory-status.d.ts.map +1 -0
- package/packages/cli/dist/memory-status.js +45 -0
- package/packages/cli/dist/memory-status.js.map +1 -0
- package/packages/cli/dist/output.d.ts +8 -0
- package/packages/cli/dist/output.d.ts.map +1 -0
- package/packages/cli/dist/output.js +45 -0
- package/packages/cli/dist/output.js.map +1 -0
- package/packages/cli/dist/platform.d.ts +6 -0
- package/packages/cli/dist/platform.d.ts.map +1 -0
- package/packages/cli/dist/platform.js +31 -0
- package/packages/cli/dist/platform.js.map +1 -0
- package/packages/cli/dist/program.d.ts +5 -0
- package/packages/cli/dist/program.d.ts.map +1 -0
- package/packages/cli/dist/program.js +116 -0
- package/packages/cli/dist/program.js.map +1 -0
- package/packages/cli/dist/test-helpers.d.ts +7 -0
- package/packages/cli/dist/test-helpers.d.ts.map +1 -0
- package/packages/cli/dist/test-helpers.js +91 -0
- package/packages/cli/dist/test-helpers.js.map +1 -0
- package/packages/cli/dist/types.d.ts +82 -0
- package/packages/cli/dist/types.d.ts.map +1 -0
- package/packages/cli/dist/types.js +2 -0
- package/packages/cli/dist/types.js.map +1 -0
- package/packages/cli/dist/wait.d.ts +2 -0
- package/packages/cli/dist/wait.d.ts.map +1 -0
- package/packages/cli/dist/wait.js +25 -0
- package/packages/cli/dist/wait.js.map +1 -0
- package/packages/cli/package.json +29 -0
- package/packages/daemon/dist/.tsbuildinfo +1 -0
- package/packages/daemon/dist/cli-adapter.d.ts +14 -0
- package/packages/daemon/dist/cli-adapter.d.ts.map +1 -0
- package/packages/daemon/dist/cli-adapter.js +30 -0
- package/packages/daemon/dist/cli-adapter.js.map +1 -0
- package/packages/daemon/dist/index.d.ts +5 -0
- package/packages/daemon/dist/index.d.ts.map +1 -0
- package/packages/daemon/dist/index.js +4 -0
- package/packages/daemon/dist/index.js.map +1 -0
- package/packages/daemon/dist/runner.d.ts +2 -0
- package/packages/daemon/dist/runner.d.ts.map +1 -0
- package/packages/daemon/dist/runner.js +18 -0
- package/packages/daemon/dist/runner.js.map +1 -0
- package/packages/daemon/dist/runtime.d.ts +24 -0
- package/packages/daemon/dist/runtime.d.ts.map +1 -0
- package/packages/daemon/dist/runtime.js +83 -0
- package/packages/daemon/dist/runtime.js.map +1 -0
- package/packages/daemon/dist/service-files.d.ts +13 -0
- package/packages/daemon/dist/service-files.d.ts.map +1 -0
- package/packages/daemon/dist/service-files.js +84 -0
- package/packages/daemon/dist/service-files.js.map +1 -0
- package/packages/daemon/dist/service.d.ts +4 -0
- package/packages/daemon/dist/service.d.ts.map +1 -0
- package/packages/daemon/dist/service.js +31 -0
- package/packages/daemon/dist/service.js.map +1 -0
- package/packages/daemon/dist/types.d.ts +11 -0
- package/packages/daemon/dist/types.d.ts.map +1 -0
- package/packages/daemon/dist/types.js +2 -0
- package/packages/daemon/dist/types.js.map +1 -0
- package/packages/daemon/dist/wake-cycle.d.ts +17 -0
- package/packages/daemon/dist/wake-cycle.d.ts.map +1 -0
- package/packages/daemon/dist/wake-cycle.js +58 -0
- package/packages/daemon/dist/wake-cycle.js.map +1 -0
- package/packages/daemon/package.json +22 -0
- package/packages/identity/dist/.tsbuildinfo +1 -0
- package/packages/identity/dist/defaults.d.ts +5 -0
- package/packages/identity/dist/defaults.d.ts.map +1 -0
- package/packages/identity/dist/defaults.js +70 -0
- package/packages/identity/dist/defaults.js.map +1 -0
- package/packages/identity/dist/index.d.ts +6 -0
- package/packages/identity/dist/index.d.ts.map +1 -0
- package/packages/identity/dist/index.js +5 -0
- package/packages/identity/dist/index.js.map +1 -0
- package/packages/identity/dist/path.d.ts +3 -0
- package/packages/identity/dist/path.d.ts.map +1 -0
- package/packages/identity/dist/path.js +16 -0
- package/packages/identity/dist/path.js.map +1 -0
- package/packages/identity/dist/render.d.ts +4 -0
- package/packages/identity/dist/render.d.ts.map +1 -0
- package/packages/identity/dist/render.js +34 -0
- package/packages/identity/dist/render.js.map +1 -0
- package/packages/identity/dist/storage.d.ts +4 -0
- package/packages/identity/dist/storage.d.ts.map +1 -0
- package/packages/identity/dist/storage.js +27 -0
- package/packages/identity/dist/storage.js.map +1 -0
- package/packages/identity/dist/types.d.ts +29 -0
- package/packages/identity/dist/types.d.ts.map +1 -0
- package/packages/identity/dist/types.js +2 -0
- package/packages/identity/dist/types.js.map +1 -0
- package/packages/identity/dist/wizard.d.ts +3 -0
- package/packages/identity/dist/wizard.d.ts.map +1 -0
- package/packages/identity/dist/wizard.js +37 -0
- package/packages/identity/dist/wizard.js.map +1 -0
- package/packages/identity/package.json +21 -0
- package/packages/identity/test/identity.test.mjs +71 -0
- package/packages/identity/test/storage.test.mjs +91 -0
- package/packages/identity/vendor/clack-prompts/index.d.ts +10 -0
- package/packages/identity/vendor/clack-prompts/index.js +55 -0
- package/packages/identity/vendor/clack-prompts/package.json +11 -0
- package/packages/memory/dist/.tsbuildinfo +1 -0
- package/packages/memory/dist/default-store.d.ts +21 -0
- package/packages/memory/dist/default-store.d.ts.map +1 -0
- package/packages/memory/dist/default-store.js +52 -0
- package/packages/memory/dist/default-store.js.map +1 -0
- package/packages/memory/dist/embedding.d.ts +6 -0
- package/packages/memory/dist/embedding.d.ts.map +1 -0
- package/packages/memory/dist/embedding.js +56 -0
- package/packages/memory/dist/embedding.js.map +1 -0
- package/packages/memory/dist/forgetting-curve.d.ts +3 -0
- package/packages/memory/dist/forgetting-curve.d.ts.map +1 -0
- package/packages/memory/dist/forgetting-curve.js +21 -0
- package/packages/memory/dist/forgetting-curve.js.map +1 -0
- package/packages/memory/dist/index.d.ts +5 -0
- package/packages/memory/dist/index.d.ts.map +1 -0
- package/packages/memory/dist/index.js +4 -0
- package/packages/memory/dist/index.js.map +1 -0
- package/packages/memory/dist/memory-store.d.ts +39 -0
- package/packages/memory/dist/memory-store.d.ts.map +1 -0
- package/packages/memory/dist/memory-store.js +417 -0
- package/packages/memory/dist/memory-store.js.map +1 -0
- package/packages/memory/dist/sqlite.d.ts +19 -0
- package/packages/memory/dist/sqlite.d.ts.map +1 -0
- package/packages/memory/dist/sqlite.js +195 -0
- package/packages/memory/dist/sqlite.js.map +1 -0
- package/packages/memory/dist/types.d.ts +43 -0
- package/packages/memory/dist/types.d.ts.map +1 -0
- package/packages/memory/dist/types.js +2 -0
- package/packages/memory/dist/types.js.map +1 -0
- package/packages/memory/package.json +18 -0
- package/packages/skills/dist/.tsbuildinfo +1 -0
- package/packages/skills/dist/frontmatter.d.ts +3 -0
- package/packages/skills/dist/frontmatter.d.ts.map +1 -0
- package/packages/skills/dist/frontmatter.js +85 -0
- package/packages/skills/dist/frontmatter.js.map +1 -0
- package/packages/skills/dist/index.d.ts +6 -0
- package/packages/skills/dist/index.d.ts.map +1 -0
- package/packages/skills/dist/index.js +5 -0
- package/packages/skills/dist/index.js.map +1 -0
- package/packages/skills/dist/paths.d.ts +13 -0
- package/packages/skills/dist/paths.d.ts.map +1 -0
- package/packages/skills/dist/paths.js +43 -0
- package/packages/skills/dist/paths.js.map +1 -0
- package/packages/skills/dist/search.d.ts +3 -0
- package/packages/skills/dist/search.d.ts.map +1 -0
- package/packages/skills/dist/search.js +20 -0
- package/packages/skills/dist/search.js.map +1 -0
- package/packages/skills/dist/store.d.ts +8 -0
- package/packages/skills/dist/store.d.ts.map +1 -0
- package/packages/skills/dist/store.js +75 -0
- package/packages/skills/dist/store.js.map +1 -0
- package/packages/skills/dist/types.d.ts +9 -0
- package/packages/skills/dist/types.d.ts.map +1 -0
- package/packages/skills/dist/types.js +2 -0
- package/packages/skills/dist/types.js.map +1 -0
- package/packages/skills/package.json +18 -0
- package/skills/install-va-claw.md +180 -0
- package/vendor/commander/index.d.ts +16 -0
- package/vendor/commander/index.js +110 -0
- package/vendor/commander/package.json +11 -0
- package/vendor/croner/LICENSE +22 -0
- package/vendor/croner/README.md +339 -0
- package/vendor/croner/dist/croner.cjs +1 -0
- package/vendor/croner/dist/croner.d.cts +693 -0
- package/vendor/croner/dist/croner.d.ts +693 -0
- package/vendor/croner/dist/croner.js +1 -0
- package/vendor/croner/dist/croner.umd.js +1 -0
- package/vendor/croner/package.json +73 -0
- package/vendor/discord.js/index.d.ts +22 -0
- package/vendor/discord.js/index.js +37 -0
- package/vendor/discord.js/package.json +7 -0
- package/vendor/grammy/index.d.ts +43 -0
- package/vendor/grammy/index.js +89 -0
- package/vendor/grammy/package.json +7 -0
- package/vendor/slack-bolt/index.d.ts +29 -0
- package/vendor/slack-bolt/index.js +72 -0
- package/vendor/slack-bolt/package.json +7 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { access, mkdir, readFile, readdir, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { parseSkillMarkdown } from "./frontmatter.js";
|
|
4
|
+
import { resolveInstalledSkillsDir, resolvePathInput, resolveSkillLookupDirs, toSkillFileName, } from "./paths.js";
|
|
5
|
+
import { matchesSkillQuery } from "./search.js";
|
|
6
|
+
export async function loadSkill(nameOrPath) {
|
|
7
|
+
const path = await resolveSkillPath(nameOrPath);
|
|
8
|
+
return readSkillFile(path);
|
|
9
|
+
}
|
|
10
|
+
export async function listSkills(dir) {
|
|
11
|
+
const skills = [];
|
|
12
|
+
const seen = new Set();
|
|
13
|
+
for (const lookupDir of resolveSkillLookupDirs(dir)) {
|
|
14
|
+
for (const skill of await readSkillsFromDir(lookupDir)) {
|
|
15
|
+
if (seen.has(skill.name)) {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
seen.add(skill.name);
|
|
19
|
+
skills.push(skill);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return skills;
|
|
23
|
+
}
|
|
24
|
+
export async function installSkill(content, name) {
|
|
25
|
+
const skillPath = join(resolveInstalledSkillsDir(), toSkillFileName(name));
|
|
26
|
+
parseSkillMarkdown(content, skillPath);
|
|
27
|
+
await mkdir(resolveInstalledSkillsDir(), { recursive: true });
|
|
28
|
+
await writeFile(skillPath, content, "utf8");
|
|
29
|
+
return skillPath;
|
|
30
|
+
}
|
|
31
|
+
export async function removeSkill(name) {
|
|
32
|
+
await rm(join(resolveInstalledSkillsDir(), toSkillFileName(name)), { force: true });
|
|
33
|
+
}
|
|
34
|
+
export async function searchSkills(query) {
|
|
35
|
+
return (await listSkills()).filter((skill) => matchesSkillQuery(skill, query));
|
|
36
|
+
}
|
|
37
|
+
export function injectSkillIntoPrompt(skill, basePrompt) {
|
|
38
|
+
const prompt = basePrompt.trimEnd();
|
|
39
|
+
const skillBlock = [`[Skill: ${skill.name}@${skill.version}]`, skill.content.trim()].join("\n");
|
|
40
|
+
return prompt === "" ? skillBlock : `${prompt}\n\n${skillBlock}`;
|
|
41
|
+
}
|
|
42
|
+
async function resolveSkillPath(nameOrPath) {
|
|
43
|
+
const candidates = looksLikePath(nameOrPath)
|
|
44
|
+
? [resolvePathInput(nameOrPath)]
|
|
45
|
+
: resolveSkillLookupDirs().map((dir) => join(dir, toSkillFileName(nameOrPath)));
|
|
46
|
+
for (const candidate of candidates) {
|
|
47
|
+
if (await exists(candidate)) {
|
|
48
|
+
return candidate;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
throw new Error(`Skill not found: ${nameOrPath}`);
|
|
52
|
+
}
|
|
53
|
+
async function readSkillsFromDir(dir) {
|
|
54
|
+
if (!(await exists(dir))) {
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
const names = (await readdir(dir)).filter((entry) => entry.toLowerCase().endsWith(".md")).sort();
|
|
58
|
+
return Promise.all(names.map((name) => readSkillFile(join(dir, name))));
|
|
59
|
+
}
|
|
60
|
+
async function readSkillFile(path) {
|
|
61
|
+
return parseSkillMarkdown(await readFile(path, "utf8"), path);
|
|
62
|
+
}
|
|
63
|
+
async function exists(path) {
|
|
64
|
+
try {
|
|
65
|
+
await access(path);
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function looksLikePath(value) {
|
|
73
|
+
return /[\\/]/.test(value) || value.startsWith(".") || value.startsWith("~") || value.endsWith(".md");
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EACL,yBAAyB,EACzB,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAAkB;IAChD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAChD,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAY;IAC3C,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,SAAS,IAAI,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC;QACpD,KAAK,MAAM,KAAK,IAAI,MAAM,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC;YACvD,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,SAAS;YACX,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,IAAY;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,yBAAyB,EAAE,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3E,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACvC,MAAM,KAAK,CAAC,yBAAyB,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,MAAM,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY;IAC5C,MAAM,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa;IAC9C,OAAO,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAsB,EAAE,UAAkB;IAC9E,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,CAAC,WAAW,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChG,OAAO,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,OAAO,UAAU,EAAE,CAAC;AACnE,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,UAAkB;IAChD,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC;QAC1C,CAAC,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAChC,CAAC,CAAC,sBAAsB,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAElF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,MAAM,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5B,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,oBAAoB,UAAU,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,GAAW;IAC1C,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjG,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAY;IACvC,OAAO,kBAAkB,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;AAChE,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACxG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@va-claw/skills",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "tsc -b",
|
|
10
|
+
"test": "pnpm run build && node --test dist/*.test.js"
|
|
11
|
+
},
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"default": "./dist/index.js"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: install-va-claw
|
|
3
|
+
description: Install and configure va-claw — persistent memory, identity, and wake-loop for Claude Code, OpenCode, or Codex
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
triggers:
|
|
6
|
+
- install va-claw
|
|
7
|
+
- setup va-claw
|
|
8
|
+
- va-claw
|
|
9
|
+
- persistent memory
|
|
10
|
+
- wake loop
|
|
11
|
+
- agent memory
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Install va-claw
|
|
15
|
+
|
|
16
|
+
va-claw gives your CLI agent (Claude Code / OpenCode / Codex) persistent memory, a custom identity, and a scheduled wake-loop — turning it into a continuously running autonomous agent.
|
|
17
|
+
|
|
18
|
+
## Prerequisites check
|
|
19
|
+
|
|
20
|
+
First verify Node.js version (must be ≥22):
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
node --version
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Also verify you have at least one supported CLI agent installed:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# Check Claude Code
|
|
30
|
+
claude --version 2>/dev/null && echo "✓ Claude Code found" || echo "✗ Claude Code not found"
|
|
31
|
+
|
|
32
|
+
# Check OpenCode
|
|
33
|
+
opencode --version 2>/dev/null && echo "✓ OpenCode found" || echo "✗ OpenCode not found"
|
|
34
|
+
|
|
35
|
+
# Check Codex
|
|
36
|
+
codex --version 2>/dev/null && echo "✓ Codex found" || echo "✗ Codex not found"
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Step 1 — Install va-claw globally
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
npm install -g va-claw
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Verify the installation:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
va-claw --version
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Step 2 — Set up your identity
|
|
52
|
+
|
|
53
|
+
Run the interactive identity wizard. This defines your agent's name, persona, system prompt, wake prompt, and loop schedule:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
va-claw identity setup
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
You'll be asked to provide:
|
|
60
|
+
- **Name**: Your agent's identity (e.g. "Nova")
|
|
61
|
+
- **Persona**: Tone and style (e.g. "Precise, calm, senior engineer mindset")
|
|
62
|
+
- **System prompt**: Base behavior (e.g. "Check memory before starting any task")
|
|
63
|
+
- **Wake prompt**: What to do on each scheduled wake (e.g. "Review repo health and summarize what needs attention")
|
|
64
|
+
- **Loop interval**: Cron expression (e.g. `0 * * * *` for hourly, `*/30 * * * *` for every 30 min)
|
|
65
|
+
|
|
66
|
+
## Step 3 — Install identity into your CLI agents
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# Install for all detected agents
|
|
70
|
+
va-claw install
|
|
71
|
+
|
|
72
|
+
# Or target a specific agent
|
|
73
|
+
va-claw install --for claude-code
|
|
74
|
+
va-claw install --for opencode
|
|
75
|
+
va-claw install --for codex
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
This injects your identity into:
|
|
79
|
+
- `~/.claude/CLAUDE.md` (Claude Code)
|
|
80
|
+
- `~/.codex/instructions.md` (Codex)
|
|
81
|
+
- OpenCode config (auto-detected)
|
|
82
|
+
|
|
83
|
+
## Step 4 — Start the wake-loop daemon
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
va-claw start
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Check it's running:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
va-claw status
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Optional: Connect to Discord
|
|
96
|
+
|
|
97
|
+
To receive wake outputs and send commands via Discord:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
va-claw channel discord setup
|
|
101
|
+
# Follow the prompts to enter your bot token and channel ID
|
|
102
|
+
va-claw channel discord start
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Get a Discord bot token at: https://discord.com/developers/applications
|
|
106
|
+
|
|
107
|
+
## Optional: Connect to Telegram
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
va-claw channel telegram setup --token <your-bot-token>
|
|
111
|
+
va-claw channel telegram start
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Get a Telegram bot token from @BotFather: https://t.me/BotFather
|
|
115
|
+
|
|
116
|
+
## Optional: Connect to Slack
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
va-claw channel slack setup \
|
|
120
|
+
--bot-token xoxb-your-bot-token \
|
|
121
|
+
--app-token xapp-your-app-token
|
|
122
|
+
va-claw channel slack start
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Create a Slack app at: https://api.slack.com/apps
|
|
126
|
+
|
|
127
|
+
## Verify everything is working
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
# Check daemon status
|
|
131
|
+
va-claw status
|
|
132
|
+
|
|
133
|
+
# Check memory (should be empty initially)
|
|
134
|
+
va-claw memory list
|
|
135
|
+
|
|
136
|
+
# Manually trigger a wake cycle to test
|
|
137
|
+
va-claw memory memorize "setup-complete" "va-claw installed and configured" --tags setup,milestone
|
|
138
|
+
|
|
139
|
+
# Search memory
|
|
140
|
+
va-claw memory recall "setup"
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Managing your agent
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
# Stop the daemon
|
|
147
|
+
va-claw stop
|
|
148
|
+
|
|
149
|
+
# Update your identity config
|
|
150
|
+
va-claw identity edit
|
|
151
|
+
|
|
152
|
+
# View what's in memory
|
|
153
|
+
va-claw memory list
|
|
154
|
+
va-claw memory recall "<query>"
|
|
155
|
+
|
|
156
|
+
# Consolidate memory (prune forgotten, reinforce recent)
|
|
157
|
+
va-claw memory consolidate
|
|
158
|
+
|
|
159
|
+
# Get a memory reflection summary
|
|
160
|
+
va-claw memory reflect
|
|
161
|
+
|
|
162
|
+
# Uninstall (removes from CLI config files, stops daemon)
|
|
163
|
+
va-claw uninstall
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Troubleshooting
|
|
167
|
+
|
|
168
|
+
**"No CLI agent detected"**
|
|
169
|
+
Make sure `claude`, `opencode`, or `codex` is in your PATH. You can also force a specific command:
|
|
170
|
+
```bash
|
|
171
|
+
VA_CLAW_CLI=claude-copilot va-claw start
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
**Wake loop not triggering**
|
|
175
|
+
Check that your cron expression is valid. Use `va-claw status` to see last wake time.
|
|
176
|
+
|
|
177
|
+
**Memory not persisting**
|
|
178
|
+
Memory is stored at `~/.va-claw/memory.db`. Ensure the directory is writable.
|
|
179
|
+
|
|
180
|
+
For more help: https://github.com/Vadaski/va-claw/issues
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type ActionHandler = (...args: any[]) => void | Promise<void>;
|
|
2
|
+
|
|
3
|
+
export class Command {
|
|
4
|
+
readonly commands: Command[];
|
|
5
|
+
constructor(name?: string);
|
|
6
|
+
name(value: string): this;
|
|
7
|
+
description(value: string): this;
|
|
8
|
+
showHelpAfterError(): this;
|
|
9
|
+
command(spec: string): Command;
|
|
10
|
+
argument(spec: string, description?: string): this;
|
|
11
|
+
option(flags: string, description?: string, defaultValue?: string): this;
|
|
12
|
+
action(handler: ActionHandler): this;
|
|
13
|
+
parseAsync(argv: string[]): Promise<void>;
|
|
14
|
+
helpInformation(): string;
|
|
15
|
+
opts(): Record<string, unknown>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
class Command {
|
|
2
|
+
constructor(name = "") {
|
|
3
|
+
this._name = name;
|
|
4
|
+
this._description = "";
|
|
5
|
+
this._action = null;
|
|
6
|
+
this._arguments = [];
|
|
7
|
+
this._options = [];
|
|
8
|
+
this._parsedOptions = {};
|
|
9
|
+
this.commands = [];
|
|
10
|
+
this.parent = null;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
name(value) { this._name = value; return this; }
|
|
14
|
+
description(value) { this._description = value; return this; }
|
|
15
|
+
showHelpAfterError() { return this; }
|
|
16
|
+
|
|
17
|
+
command(spec) {
|
|
18
|
+
const child = new Command(spec.trim().split(/\s+/)[0]);
|
|
19
|
+
child.parent = this;
|
|
20
|
+
this.commands.push(child);
|
|
21
|
+
return child;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
argument(spec) {
|
|
25
|
+
this._arguments.push({ required: spec.startsWith("<"), name: spec.slice(1, -1) });
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
option(flags, _description, defaultValue) {
|
|
30
|
+
const long = flags.match(/--([a-z0-9-]+)/i)?.[1];
|
|
31
|
+
if (!long) throw new Error(`Unsupported option flags: ${flags}`);
|
|
32
|
+
const key = long.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
|
|
33
|
+
this._options.push({ key, flag: `--${long}`, requiresValue: /<.+>/.test(flags), defaultValue });
|
|
34
|
+
return this;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
action(handler) { this._action = handler; return this; }
|
|
38
|
+
opts() { return { ...this._parsedOptions }; }
|
|
39
|
+
|
|
40
|
+
async parseAsync(argv) {
|
|
41
|
+
await this._dispatch(argv.slice(2));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async _dispatch(tokens) {
|
|
45
|
+
if (tokens.includes("--help") || tokens.includes("-h")) {
|
|
46
|
+
process.stdout.write(`${this.helpInformation()}\n`);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const child = tokens[0] ? this.commands.find((command) => command._name === tokens[0]) : null;
|
|
50
|
+
if (child) {
|
|
51
|
+
await child._dispatch(tokens.slice(1));
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const { options, positionals } = this._parseTokens(tokens);
|
|
55
|
+
this._parsedOptions = options;
|
|
56
|
+
const required = this._arguments.filter((argument) => argument.required).length;
|
|
57
|
+
if (positionals.length < required) {
|
|
58
|
+
throw new Error(`Missing required argument for ${this._commandPath()}.`);
|
|
59
|
+
}
|
|
60
|
+
if (!this._action) {
|
|
61
|
+
process.stdout.write(`${this.helpInformation()}\n`);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
await this._action(...positionals, options, this);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
_parseTokens(tokens) {
|
|
68
|
+
const options = Object.fromEntries(this._options.map((option) => [option.key, option.defaultValue]));
|
|
69
|
+
const positionals = [];
|
|
70
|
+
for (let index = 0; index < tokens.length; index += 1) {
|
|
71
|
+
const token = tokens[index];
|
|
72
|
+
const option = this._options.find((entry) => entry.flag === token);
|
|
73
|
+
if (!option) {
|
|
74
|
+
positionals.push(token);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
options[option.key] = option.requiresValue ? tokens[++index] : true;
|
|
78
|
+
}
|
|
79
|
+
return { options, positionals };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
helpInformation() {
|
|
83
|
+
const lines = [`Usage: ${this._commandPath()}${this.commands.length ? " [command]" : ""}`];
|
|
84
|
+
if (this._description) lines.push("", this._description);
|
|
85
|
+
const commands = this._flattenCommands();
|
|
86
|
+
if (commands.length) {
|
|
87
|
+
lines.push("", "Commands:");
|
|
88
|
+
for (const entry of commands) lines.push(` ${entry}`);
|
|
89
|
+
}
|
|
90
|
+
return lines.join("\n");
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
_flattenCommands(prefix = "") {
|
|
94
|
+
const nextPrefix = prefix ? `${prefix} ${this._name}`.trim() : this._name;
|
|
95
|
+
return this.commands.flatMap((command) => {
|
|
96
|
+
const label = `${nextPrefix} ${command._name}`.trim();
|
|
97
|
+
return [label, ...command._flattenCommands(nextPrefix)];
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
_commandPath() {
|
|
102
|
+
const names = [];
|
|
103
|
+
for (let current = this; current; current = current.parent) {
|
|
104
|
+
if (current._name) names.push(current._name);
|
|
105
|
+
}
|
|
106
|
+
return names.reverse().join(" ");
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export { Command };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2015-2021 Hexagon <github.com/Hexagon>
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|