oris-skills 2.0.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/.cursor-plugin/plugin.json +31 -0
- package/LICENSE +21 -0
- package/README.md +67 -0
- package/agents/oris-loop-debriefer.md +29 -0
- package/agents/oris-loop-doctor.md +32 -0
- package/agents/oris-loop-executor.md +32 -0
- package/agents/oris-loop-verifier.md +31 -0
- package/docs/architecture.md +26 -0
- package/docs/distribution.md +38 -0
- package/docs/maintainer-guide.md +32 -0
- package/docs/user-guide.md +42 -0
- package/package.json +49 -0
- package/references/clean-code-checklist.md +107 -0
- package/references/conventions.md +39 -0
- package/references/doc-policy.md +24 -0
- package/references/loop-adapter.schema.json +126 -0
- package/references/loop-contract.md +119 -0
- package/references/loop.schema.json +143 -0
- package/references/questions.md +38 -0
- package/references/repo-map.md +53 -0
- package/references/repo-map.schema.json +198 -0
- package/references/settings.md +35 -0
- package/references/settings.schema.json +75 -0
- package/scripts/flow/oris-flow-clean-runtime.mjs +182 -0
- package/scripts/flow/oris-flow-layout.mjs +53 -0
- package/scripts/flow/oris-flow-scan.mjs +350 -0
- package/scripts/flow/oris-flow-version-control.mjs +42 -0
- package/scripts/flow/oris-gitignore.mjs +79 -0
- package/scripts/install/generate-agent-adapters.mjs +74 -0
- package/scripts/install/install-user-skills.mjs +271 -0
- package/scripts/install/uninstall-user-skills.mjs +163 -0
- package/scripts/loop/oris-loop-bootstrap.mjs +383 -0
- package/scripts/loop/oris-loop-bundle.mjs +22 -0
- package/scripts/loop/oris-loop-chat.mjs +408 -0
- package/scripts/loop/oris-loop-demo.mjs +180 -0
- package/scripts/loop/oris-loop-document.mjs +179 -0
- package/scripts/loop/oris-loop-dry-run.mjs +110 -0
- package/scripts/loop/oris-loop-fixtures.mjs +148 -0
- package/scripts/loop/oris-loop-list.mjs +81 -0
- package/scripts/loop/oris-loop-paths.mjs +232 -0
- package/scripts/loop/oris-loop-run.mjs +241 -0
- package/scripts/loop/oris-loop-stop.mjs +319 -0
- package/scripts/loop/oris-loop-templates.mjs +77 -0
- package/scripts/loop/oris-loop-verify.mjs +206 -0
- package/scripts/oris-skills.mjs +116 -0
- package/scripts/package-oris-skills.mjs +53 -0
- package/scripts/tests/run-all-tests.mjs +38 -0
- package/scripts/tests/test-agent-adapters.mjs +19 -0
- package/scripts/tests/test-oris-1-0-cleanliness.mjs +58 -0
- package/scripts/tests/test-oris-flow-clean-runtime.mjs +75 -0
- package/scripts/tests/test-oris-flow-scan.mjs +49 -0
- package/scripts/tests/test-oris-gitignore.mjs +35 -0
- package/scripts/tests/test-oris-loop-bootstrap.mjs +94 -0
- package/scripts/tests/test-oris-loop-document.mjs +112 -0
- package/scripts/tests/test-oris-loop-list.mjs +74 -0
- package/scripts/tests/test-oris-loop-run.mjs +45 -0
- package/scripts/tests/test-oris-loop-smoke.mjs +130 -0
- package/scripts/tests/test-oris-loop-stop.mjs +371 -0
- package/scripts/tests/test-routing-lifecycle.mjs +181 -0
- package/scripts/tests/test-schemas.mjs +55 -0
- package/skills/oris-flow/SKILL.md +55 -0
- package/skills/oris-flow/agents/openai.yaml +4 -0
- package/skills/oris-flow-criteria/SKILL.md +49 -0
- package/skills/oris-flow-discover/SKILL.md +58 -0
- package/skills/oris-flow-docs/SKILL.md +31 -0
- package/skills/oris-flow-fix/SKILL.md +42 -0
- package/skills/oris-flow-implement/SKILL.md +43 -0
- package/skills/oris-flow-plan/SKILL.md +51 -0
- package/skills/oris-flow-setup/SKILL.md +49 -0
- package/skills/oris-help/SKILL.md +30 -0
- package/skills/oris-help/agents/openai.yaml +4 -0
- package/skills/oris-loop/SKILL.md +66 -0
- package/skills/oris-loop/agents/openai.yaml +4 -0
- package/skills/oris-loop/references/craft.md +48 -0
- package/skills/oris-loop/references/improve.md +23 -0
- package/skills/oris-loop/references/run.md +30 -0
- package/skills/oris-loop/templates/debriefer.md +18 -0
- package/skills/oris-loop/templates/doctor.md +20 -0
- package/skills/oris-loop/templates/executor.md +19 -0
- package/skills/oris-loop/templates/orchestrator.md +33 -0
- package/skills/oris-loop/templates/verifier.md +21 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import childProcess from "node:child_process";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import process from "node:process";
|
|
7
|
+
import test from "node:test";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
|
|
10
|
+
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
|
|
11
|
+
|
|
12
|
+
function read(relativePath) {
|
|
13
|
+
return fs.readFileSync(path.join(root, relativePath), "utf8");
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function exists(relativePath) {
|
|
17
|
+
return fs.existsSync(path.join(root, relativePath));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function runCli(args, homeDir) {
|
|
21
|
+
return childProcess.spawnSync(process.execPath, ["scripts/oris-skills.mjs", ...args], {
|
|
22
|
+
cwd: root,
|
|
23
|
+
encoding: "utf8",
|
|
24
|
+
env: { ...process.env, HOME: homeDir, USERPROFILE: homeDir },
|
|
25
|
+
shell: false,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
test("plugin manifest skills all exist and match front-matter names", () => {
|
|
30
|
+
const manifest = JSON.parse(read(".cursor-plugin/plugin.json"));
|
|
31
|
+
assert.ok(manifest.skills.length >= 10);
|
|
32
|
+
for (const entry of manifest.skills) {
|
|
33
|
+
const relative = entry.replace(/^[.\\/]+/, "");
|
|
34
|
+
const skillFile = path.join(relative, "SKILL.md");
|
|
35
|
+
assert.equal(exists(skillFile), true, skillFile);
|
|
36
|
+
const name = read(skillFile).match(/^name:\s*(.+)$/m)?.[1].trim();
|
|
37
|
+
assert.equal(name, path.basename(relative), `front-matter name must match folder: ${relative}`);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test("oris-flow route table destinations exist and routing stays in-chat", () => {
|
|
42
|
+
const text = read("skills/oris-flow/SKILL.md");
|
|
43
|
+
const destinations = [...text.matchAll(/`(skills\/[a-z-]+\/SKILL\.md)`/g)].map((match) => match[1]);
|
|
44
|
+
assert.ok(destinations.length >= 9, "route table must list at least 9 destinations");
|
|
45
|
+
for (const destination of destinations) assert.equal(exists(destination), true, destination);
|
|
46
|
+
assert.deepEqual(destinations, [...new Set(destinations)], "route destinations must be unique");
|
|
47
|
+
assert.match(text, /NEVER tell the user to type another command/i);
|
|
48
|
+
assert.match(text, /route to the interview owner/i);
|
|
49
|
+
assert.match(text, /references\/conventions\.md/);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test("shared conventions centralize question, language, and gate rules", () => {
|
|
53
|
+
const conventions = read("references/conventions.md");
|
|
54
|
+
assert.match(conventions, /ONE question per turn/i);
|
|
55
|
+
assert.match(conventions, /Explain the options.*Spiega le opzioni/s);
|
|
56
|
+
assert.match(conventions, /NEVER write documents, code, settings, Git, or DevOps without explicit user confirmation/i);
|
|
57
|
+
const questions = read("references/questions.md");
|
|
58
|
+
assert.match(questions, /`Explain the options`/);
|
|
59
|
+
assert.match(questions, /`Spiega le opzioni`/);
|
|
60
|
+
assert.match(questions, /`Basta domande — procedi`/);
|
|
61
|
+
assert.match(questions, /`Genera il documento`/);
|
|
62
|
+
assert.match(questions, /`Continua l'intervista`/);
|
|
63
|
+
assert.match(questions, /`Approva documento`/);
|
|
64
|
+
assert.match(questions, /`Annulla`/);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test("every skill points at conventions instead of repeating shared rules", () => {
|
|
68
|
+
const manifest = JSON.parse(read(".cursor-plugin/plugin.json"));
|
|
69
|
+
for (const entry of manifest.skills) {
|
|
70
|
+
const relative = `${entry.replace(/^[.\\/]+/, "")}/SKILL.md`;
|
|
71
|
+
if (relative.includes("oris-help")) continue;
|
|
72
|
+
assert.match(read(relative), /conventions\.md/, relative);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test("loop skill covers craft, demo, run, audit, improve and editable prompt files", () => {
|
|
77
|
+
const skill = read("skills/oris-loop/SKILL.md");
|
|
78
|
+
assert.match(skill, /references\/craft\.md/);
|
|
79
|
+
assert.match(skill, /references\/run\.md/);
|
|
80
|
+
assert.match(skill, /references\/improve\.md/);
|
|
81
|
+
assert.match(skill, /oris-skills loop demo/);
|
|
82
|
+
assert.match(skill, /oris-skills loop dry-run/);
|
|
83
|
+
assert.match(skill, /oris-skills loop list --json/);
|
|
84
|
+
assert.match(skill, /prompts\//);
|
|
85
|
+
assert.match(skill, /improve\.mode: auto/);
|
|
86
|
+
assert.match(skill, /Cursor|Claude Code|Codex/);
|
|
87
|
+
for (const reference of ["craft", "run", "improve"]) {
|
|
88
|
+
assert.equal(exists(`skills/oris-loop/references/${reference}.md`), true, reference);
|
|
89
|
+
}
|
|
90
|
+
for (const template of ["orchestrator", "executor", "verifier", "doctor", "debriefer"]) {
|
|
91
|
+
assert.equal(exists(`skills/oris-loop/templates/${template}.md`), true, template);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test("loop contract stays subagent-first with per-role editable prompts", () => {
|
|
96
|
+
const contract = read("references/loop-contract.md");
|
|
97
|
+
assert.match(contract, /schemaVersion: 2/);
|
|
98
|
+
assert.match(contract, /approved: true/);
|
|
99
|
+
assert.match(contract, /prompts\/orchestrator\.md/);
|
|
100
|
+
assert.match(contract, /improve/);
|
|
101
|
+
assert.match(contract, /inherit/);
|
|
102
|
+
assert.match(contract, /NEVER success/i);
|
|
103
|
+
const run = read("skills/oris-loop/references/run.md");
|
|
104
|
+
assert.match(run, /oris-skills loop chat --action start --loop <slug>/);
|
|
105
|
+
assert.match(run, /NEVER do executor\/verifier\/doctor work in the main chat/i);
|
|
106
|
+
assert.match(run, /set-state blocked/);
|
|
107
|
+
assert.match(run, /oris-skills loop run --loop <slug> --agent codex\|claude/);
|
|
108
|
+
const craft = read("skills/oris-loop/references/craft.md");
|
|
109
|
+
assert.match(craft, /skills\/oris-loop\/templates\//);
|
|
110
|
+
assert.match(craft, /write the loop \| edit verifier \| edit executor \| edit doctor/);
|
|
111
|
+
for (const text of [contract, run, craft, read("skills/oris-loop/SKILL.md")]) {
|
|
112
|
+
assert.doesNotMatch(text, /node scripts\/(?:flow|loop)\//);
|
|
113
|
+
assert.doesNotMatch(text, /composer-2\.5/);
|
|
114
|
+
assert.doesNotMatch(text, /ORIS LOOP ACTIVE/);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test("setup and repo-map keep the installed CLI as the command surface", () => {
|
|
119
|
+
const setup = read("skills/oris-flow-setup/SKILL.md");
|
|
120
|
+
assert.match(setup, /oris-skills flow scan --repository-root <repo> --json/);
|
|
121
|
+
assert.match(setup, /oris-skills loop bootstrap --repository-root <repo>/);
|
|
122
|
+
assert.match(setup, /oris-skills flow clean-runtime --repository-root <repo> --dry-run/);
|
|
123
|
+
const repoMap = read("references/repo-map.md");
|
|
124
|
+
assert.match(repoMap, /never `node scripts\/\.\.\.` paths/);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
test("no markdown references the pre-2.0 layout", () => {
|
|
128
|
+
const offenders = [];
|
|
129
|
+
const walk = (dir) => {
|
|
130
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
131
|
+
if ([".git", "node_modules", ".cursor", ".claude", "dist", ".oris-flow"].includes(entry.name)) continue;
|
|
132
|
+
const full = path.join(dir, entry.name);
|
|
133
|
+
if (entry.isDirectory()) walk(full);
|
|
134
|
+
else if (entry.name.endsWith(".md") && entry.name !== "CHANGELOG.md") {
|
|
135
|
+
const text = fs.readFileSync(full, "utf8");
|
|
136
|
+
if (/flow\/oris\/|help\/skills\/|help\/references\//.test(text)) {
|
|
137
|
+
offenders.push(path.relative(root, full).replace(/\\/g, "/"));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
walk(root);
|
|
143
|
+
assert.deepEqual(offenders, []);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
test("uninstall and reinstall dry-runs show destructive plan before action", () => {
|
|
147
|
+
const homeDir = fs.mkdtempSync(path.join(os.tmpdir(), "oris-lifecycle-"));
|
|
148
|
+
try {
|
|
149
|
+
fs.mkdirSync(path.join(homeDir, ".cursor"), { recursive: true });
|
|
150
|
+
const uninstall = runCli(["uninstall", "--dry-run"], homeDir);
|
|
151
|
+
assert.equal(uninstall.status, 0, uninstall.stderr);
|
|
152
|
+
assert.match(uninstall.stdout, /Dry run uninstall plan/);
|
|
153
|
+
assert.match(uninstall.stdout, /Would remove/);
|
|
154
|
+
assert.match(uninstall.stdout, /oris-skills/);
|
|
155
|
+
|
|
156
|
+
const reinstall = runCli(["reinstall", "--dry-run"], homeDir);
|
|
157
|
+
assert.equal(reinstall.status, 0, reinstall.stderr);
|
|
158
|
+
assert.match(reinstall.stdout, /Dry run uninstall plan/);
|
|
159
|
+
assert.match(reinstall.stdout, /Would install/);
|
|
160
|
+
assert.ok(reinstall.stdout.indexOf("Dry run uninstall plan") < reinstall.stdout.indexOf("Would install"));
|
|
161
|
+
} finally {
|
|
162
|
+
fs.rmSync(homeDir, { recursive: true, force: true });
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
test("CLI exposes install, loop learnability, and flow helper commands", () => {
|
|
167
|
+
const homeDir = fs.mkdtempSync(path.join(os.tmpdir(), "oris-cli-help-"));
|
|
168
|
+
try {
|
|
169
|
+
const help = runCli(["help"], homeDir);
|
|
170
|
+
assert.equal(help.status, 0, help.stderr);
|
|
171
|
+
assert.match(help.stdout, /--agents cursor,claude,codex/);
|
|
172
|
+
assert.match(help.stdout, /oris-skills loop demo/);
|
|
173
|
+
assert.match(help.stdout, /oris-skills loop dry-run --loop <slug>/);
|
|
174
|
+
assert.match(help.stdout, /oris-skills loop verify --temp/);
|
|
175
|
+
assert.match(help.stdout, /oris-skills loop chat --action start --loop <slug>/);
|
|
176
|
+
assert.match(help.stdout, /oris-skills loop run --loop <slug> --agent codex\|claude/);
|
|
177
|
+
assert.match(help.stdout, /oris-skills flow scan/);
|
|
178
|
+
} finally {
|
|
179
|
+
fs.rmSync(homeDir, { recursive: true, force: true });
|
|
180
|
+
}
|
|
181
|
+
});
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import assert from "node:assert/strict";
|
|
4
|
+
import fs from "node:fs";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import test from "node:test";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
8
|
+
|
|
9
|
+
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
|
|
10
|
+
|
|
11
|
+
function read(relativePath) {
|
|
12
|
+
return JSON.parse(fs.readFileSync(path.join(root, relativePath), "utf8"));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
test("settings schema is the generic v1 contract", () => {
|
|
16
|
+
const schema = read("references/settings.schema.json");
|
|
17
|
+
assert.equal(schema.properties.version.const, 1);
|
|
18
|
+
assert.deepEqual(schema.required, ["version", "orisFlow", "defaultProfiles", "profiles"]);
|
|
19
|
+
assert.ok(schema.$defs.profile.properties.values);
|
|
20
|
+
assert.ok(schema.$defs.profile.properties.secrets);
|
|
21
|
+
assert.ok(schema.$defs.profile.properties.flags);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test("adapter schema v1 declares paths, commands, model aliases, profile, preflight", () => {
|
|
25
|
+
const schema = read("references/loop-adapter.schema.json");
|
|
26
|
+
assert.equal(schema.$id, "https://oris.dev/schemas/oris-loop-adapter-v1.json");
|
|
27
|
+
assert.equal(schema.properties.schemaVersion.const, 1);
|
|
28
|
+
assert.deepEqual(
|
|
29
|
+
schema.required,
|
|
30
|
+
["$schema", "schemaVersion", "repository", "paths", "commands", "profile", "preflight"],
|
|
31
|
+
);
|
|
32
|
+
assert.ok(schema.properties.paths.properties.loops);
|
|
33
|
+
assert.ok(schema.properties.models, "adapter schema must allow a model alias map");
|
|
34
|
+
assert.equal(schema.$defs.mapping.properties.secret.type, "boolean");
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test("loop document schema is v2 with approved gate, per-role models, and improve mode", () => {
|
|
38
|
+
const schema = read("references/loop.schema.json");
|
|
39
|
+
assert.equal(schema.$id, "https://oris.dev/schemas/oris-loop-v2.json");
|
|
40
|
+
assert.equal(schema.properties.schemaVersion.const, 2);
|
|
41
|
+
assert.ok(schema.required.includes("approved"));
|
|
42
|
+
assert.ok(!schema.required.includes("runtime"), "runtime field was removed in v2");
|
|
43
|
+
for (const role of ["default", "executor", "verifier", "doctor", "debriefer"]) {
|
|
44
|
+
assert.ok(schema.properties.models.properties[role], `models.${role}`);
|
|
45
|
+
}
|
|
46
|
+
assert.deepEqual(schema.properties.improve.properties.mode.enum, ["propose", "auto"]);
|
|
47
|
+
assert.equal(schema.$defs.model.type, "string", "models are free strings (inherit | alias | model id), not a hardcoded enum");
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test("repository map schema v1 allows stack-aware optional sections", () => {
|
|
51
|
+
const schema = read("references/repo-map.schema.json");
|
|
52
|
+
assert.equal(schema.properties.schemaVersion.const, 1);
|
|
53
|
+
assert.deepEqual(schema.required, ["$schema", "schemaVersion", "repository", "generatedAt", "updatedAt", "setup", "sections"]);
|
|
54
|
+
assert.ok(schema.$defs.sections.additionalProperties);
|
|
55
|
+
});
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: oris-flow
|
|
3
|
+
description: Oris entry point. Use when the user types /oris-flow, picks from its menu, or describes any software-flow goal (analyze, define criteria, plan, implement, fix, loop, docs). Routes to the right Oris skill in the same chat.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Oris Flow — Entry Point
|
|
7
|
+
|
|
8
|
+
The only command users must remember. READ the intent, ROUTE to one skill, ENTER it in the same chat.
|
|
9
|
+
|
|
10
|
+
RULES: follow `references/conventions.md`. This router NEVER writes documents, code, Git, or DevOps — the destination skill owns its own gates.
|
|
11
|
+
|
|
12
|
+
## Route
|
|
13
|
+
|
|
14
|
+
Match the desired outcome to ONE route:
|
|
15
|
+
|
|
16
|
+
| Route | When the user wants… | Enter |
|
|
17
|
+
|-------|----------------------|-------|
|
|
18
|
+
| setup | prepare / map / refresh the repo for Oris | `skills/oris-flow-setup/SKILL.md` |
|
|
19
|
+
| discover | understand or define product behavior | `skills/oris-flow-discover/SKILL.md` |
|
|
20
|
+
| criteria | acceptance criteria / QA checks | `skills/oris-flow-criteria/SKILL.md` |
|
|
21
|
+
| plan | a technical implementation plan | `skills/oris-flow-plan/SKILL.md` |
|
|
22
|
+
| implement | build from a plan or confirmed scope | `skills/oris-flow-implement/SKILL.md` |
|
|
23
|
+
| fix | fix a bug or regression | `skills/oris-flow-fix/SKILL.md` |
|
|
24
|
+
| loop | repeat work until verified (design, demo, run, tune) | `skills/oris-loop/SKILL.md` |
|
|
25
|
+
| docs | update task docs after a change | `skills/oris-flow-docs/SKILL.md` |
|
|
26
|
+
| help | how Oris works, install, troubleshooting | `skills/oris-help/SKILL.md` |
|
|
27
|
+
|
|
28
|
+
ROUTING:
|
|
29
|
+
1. IF intent is clear → say one line ("Entering <route>: <why>"), then READ and APPLY the destination skill immediately. NEVER tell the user to type another command.
|
|
30
|
+
2. IF intent is unclear → ask ONE menu question (below).
|
|
31
|
+
3. IF the user wants to analyze, rethink, or change an existing plan → route to the interview owner (discover / plan / loop), NEVER straight to implement.
|
|
32
|
+
4. IF `.oris-flow/manifest.json` is missing → recommend setup first; respect the user's choice.
|
|
33
|
+
5. Destination skills marked `disable-model-invocation` may still be entered from here — that flag only blocks unsolicited invocation from generic chat.
|
|
34
|
+
|
|
35
|
+
## Menu (low confidence)
|
|
36
|
+
|
|
37
|
+
ASK "What do you want to do?" localized to `uiLanguage`, options:
|
|
38
|
+
|
|
39
|
+
- Setup repository
|
|
40
|
+
- Understand / define behavior (discovery)
|
|
41
|
+
- Acceptance criteria
|
|
42
|
+
- Technical plan
|
|
43
|
+
- Implement or fix
|
|
44
|
+
- Loop: repeat until verified
|
|
45
|
+
- Update docs
|
|
46
|
+
- Help
|
|
47
|
+
- Explain the options / Spiega le opzioni
|
|
48
|
+
|
|
49
|
+
IF "Implement or fix" → one follow-up: new planned work (implement) or broken behavior (fix)?
|
|
50
|
+
IF "Explain the options" → explain briefly, re-ask the same question.
|
|
51
|
+
|
|
52
|
+
## Done when
|
|
53
|
+
|
|
54
|
+
- [ ] One route entered in the same chat, or the menu was asked.
|
|
55
|
+
- [ ] No writes happened before the destination skill's own gate.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: oris-flow-criteria
|
|
3
|
+
description: Generate or audit business-readable acceptance criteria with stable IDs, numbered steps, and observable outcomes. Use for acceptance-criteria intent or acceptance-criteria.md work. Ambiguous request - route to /oris-flow.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Acceptance Criteria
|
|
7
|
+
|
|
8
|
+
Generate verifiable, browser-observable criteria. These later feed loop VERIFIER prompts — precision here pays twice.
|
|
9
|
+
|
|
10
|
+
RULES: follow `references/conventions.md`. Doc standards: `references/doc-policy.md`.
|
|
11
|
+
NEVER write code, Git, or DevOps here.
|
|
12
|
+
|
|
13
|
+
## Generate privately first
|
|
14
|
+
|
|
15
|
+
1. SOURCES in order of trust: confirmed chat > task docs (`functional-analysis.md` preferred, never required — say once when missing) > current UI > code and tests.
|
|
16
|
+
2. DEDUCE create vs update: existing `acceptance-criteria.md` → update, PRESERVE IDs; never recycle a removed ID for different behavior.
|
|
17
|
+
3. IDs: `AC-001`, `AC-002`, … stable across revisions.
|
|
18
|
+
4. Each scenario: role + starting state, deterministic data, numbered user steps, observable outcome placed under the step that causes it, negative coverage, regressions to keep.
|
|
19
|
+
5. CLASSIFY each: `Verifiable` | `Needs setup/data` | `Blocked by Open QA`.
|
|
20
|
+
6. DISCARD criteria not checkable through observable product behavior. For unbuilt features: only confirmed intended behavior — NEVER invent labels or messages.
|
|
21
|
+
|
|
22
|
+
## Interview (only high-impact gaps)
|
|
23
|
+
|
|
24
|
+
ASK one at a time, only what docs/UI/code cannot answer: actor boundaries, required data/state, success message + visible result, blocked/negative cases, async states visible to the user, regressions, ambiguous wording. NEVER ask "anything else?".
|
|
25
|
+
|
|
26
|
+
## Write + gate
|
|
27
|
+
|
|
28
|
+
WRITE `docs/tasks/{task}/acceptance-criteria.md` (language `artifactLanguage`):
|
|
29
|
+
|
|
30
|
+
```markdown
|
|
31
|
+
# {Feature} — Acceptance Criteria
|
|
32
|
+
## AC-001 {scenario title} [Verifiable | Needs setup/data | Blocked by Open QA]
|
|
33
|
+
Role/state: … | Data: …
|
|
34
|
+
Steps:
|
|
35
|
+
1. …
|
|
36
|
+
→ observable outcome
|
|
37
|
+
Negative: … | Regressions: …
|
|
38
|
+
## Open QA
|
|
39
|
+
## Change history (date | source | change | reason)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
THEN ask ONE question: Approve document | Regenerate | Edit specific criteria | Cancel.
|
|
43
|
+
Document is confirmed ONLY on approval. AFTER: offer technical plan | verification loop | stop.
|
|
44
|
+
|
|
45
|
+
## Done when
|
|
46
|
+
|
|
47
|
+
- [ ] IDs stable; every scenario observable and classified.
|
|
48
|
+
- [ ] Questions only for gaps evidence could not close.
|
|
49
|
+
- [ ] Approval asked exactly once after writing.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: oris-flow-discover
|
|
3
|
+
description: Business-first functional discovery interview. Use to clarify what a feature should do, define product behavior, or produce functional-analysis.md. Ambiguous request - route to /oris-flow.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Discovery
|
|
7
|
+
|
|
8
|
+
Interview the stakeholder until the desired business behavior is clear enough to document. The cornerstone of the flow: everything downstream (criteria, plan, loops) builds on this.
|
|
9
|
+
|
|
10
|
+
RULES: follow `references/conventions.md`. Doc standards: `references/doc-policy.md`.
|
|
11
|
+
NEVER write code, Git, or DevOps here. WRITE `functional-analysis.md` only after the user explicitly chooses generation.
|
|
12
|
+
|
|
13
|
+
## Before asking
|
|
14
|
+
|
|
15
|
+
1. EXPLORE first: task folder (`docs/tasks/{task}/`), existing `functional-analysis.md` / `acceptance-criteria.md` / `implementation-plan.md`, project docs, setup map, code evidence, DevOps context when available.
|
|
16
|
+
2. DEDUCE create vs update: existing `functional-analysis.md` → update; missing → create. Ask only on contradictory signals.
|
|
17
|
+
3. Technical evidence = private input. TRANSLATE it to business language; never show file paths or code to the stakeholder.
|
|
18
|
+
|
|
19
|
+
## Interview
|
|
20
|
+
|
|
21
|
+
ASK one business decision at a time, recommended answer first, early-exit option always present.
|
|
22
|
+
BUSINESS ONLY: actors, roles, permissions, goals, current vs desired behavior, visible states, labels, messages, navigation, edge cases, empty/error states, scope in/out/deferred, rollout, priority.
|
|
23
|
+
NEVER ask about: files, APIs, services, tables, selectors, branches, tests, frameworks, implementation order.
|
|
24
|
+
WALK every branch of the decision tree until intent, boundaries, cases, and open points are explicit or intentionally parked. Do not stop at the first plausible answer.
|
|
25
|
+
ESTIMATE complexity in Fibonacci Story Points (1–21) from scope, dependencies, uncertainty, QA impact.
|
|
26
|
+
|
|
27
|
+
## Generation gate
|
|
28
|
+
|
|
29
|
+
SHOW compact summary: goal, confirmed behavior, scope in/out, open points, estimate.
|
|
30
|
+
ASK: generate the document | keep interviewing | explain.
|
|
31
|
+
ON generate → write `docs/tasks/{task}/functional-analysis.md` per the template below (language: `artifactLanguage`).
|
|
32
|
+
|
|
33
|
+
## Document template
|
|
34
|
+
|
|
35
|
+
```markdown
|
|
36
|
+
# {Feature} — Functional Analysis
|
|
37
|
+
## Goal (business value, one paragraph)
|
|
38
|
+
## Actors & permissions
|
|
39
|
+
## Behavior (current → desired, user-visible only, numbered flows)
|
|
40
|
+
## States & messages (labels, empty/error/loading states)
|
|
41
|
+
## Edge cases
|
|
42
|
+
## Scope (included | excluded | deferred)
|
|
43
|
+
## Open points
|
|
44
|
+
## Estimate (Story Points + rationale)
|
|
45
|
+
## Change history (date | source | change | reason)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
FACTS only from confirmed sources; open questions go to Open points — NEVER invent behavior.
|
|
49
|
+
|
|
50
|
+
## After writing
|
|
51
|
+
|
|
52
|
+
OFFER: acceptance criteria | technical plan | stop. Never auto-start the next phase.
|
|
53
|
+
|
|
54
|
+
## Done when
|
|
55
|
+
|
|
56
|
+
- [ ] Explored before asking; questions stayed business-only, one at a time.
|
|
57
|
+
- [ ] Document written only after explicit generation choice.
|
|
58
|
+
- [ ] No code, Git, or DevOps writes.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: oris-flow-docs
|
|
3
|
+
description: Update existing task documents after a later functional, QA, or implementation change. Use when documented behavior changed and docs/tasks files must record it.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Update Task Docs
|
|
8
|
+
|
|
9
|
+
Bring `docs/tasks/{task}/` documents in line with a later change, keeping the change traceable.
|
|
10
|
+
|
|
11
|
+
RULES: follow `references/conventions.md`. Doc standards: `references/doc-policy.md`.
|
|
12
|
+
|
|
13
|
+
## Workflow
|
|
14
|
+
|
|
15
|
+
1. IDENTIFY the task folder. IF unclear → ask which task; recommend the obvious recent one.
|
|
16
|
+
2. IF the change itself is vague → ask what changed before reading further.
|
|
17
|
+
3. READ the existing docs, COMPARE with the new reality, CLASSIFY the change: functional | criteria | technical.
|
|
18
|
+
4. ASK only unresolved questions, one at a time.
|
|
19
|
+
5. SUMMARIZE proposed updates; CONFIRM before writing.
|
|
20
|
+
6. UPDATE affected documents in place (language `artifactLanguage`):
|
|
21
|
+
- rewrite sections to the new behavior — no "changed!" notes scattered in the body;
|
|
22
|
+
- add one change-history row per document: date | source | short change | reason;
|
|
23
|
+
- keep unresolved risks in open points, never silently drop them;
|
|
24
|
+
- preserve acceptance-criteria IDs.
|
|
25
|
+
7. NEVER create a replacement task folder unless the user wants a new feature.
|
|
26
|
+
8. CLOSE with a concise summary. Offer next steps without auto-starting them.
|
|
27
|
+
|
|
28
|
+
## Done when
|
|
29
|
+
|
|
30
|
+
- [ ] Every affected document updated in place with a change-history row.
|
|
31
|
+
- [ ] Confirmation before writing; nothing else touched.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: oris-flow-fix
|
|
3
|
+
description: Triage, diagnose, and fix a bug with the smallest safe change. Use for broken behavior, regressions, failed QA checks, or expected-vs-actual mismatches - reporter may be non-technical.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Fix
|
|
8
|
+
|
|
9
|
+
Smallest safe change near the failing behavior. The caller may be non-technical — reconstruct context yourself.
|
|
10
|
+
|
|
11
|
+
RULES: follow `references/conventions.md`.
|
|
12
|
+
NEVER edit code before root cause, proposed fix, and verification plan are summarized and explicitly confirmed.
|
|
13
|
+
|
|
14
|
+
## Triage
|
|
15
|
+
|
|
16
|
+
1. IF no details given → ask ONE question (localized): "Which bug? Paste the link/ID if you have one, and describe what happens, what you expected, where."
|
|
17
|
+
2. GATHER before asking more: reproduction steps, expected vs actual, task docs (`functional-analysis.md`, `acceptance-criteria.md`, `implementation-plan.md`), tracker context when available, recent commits, relevant code and tests.
|
|
18
|
+
3. ASSUME bug report, not redesign. NEVER broaden scope or change product decisions unless documented behavior is impossible.
|
|
19
|
+
|
|
20
|
+
## Diagnose
|
|
21
|
+
|
|
22
|
+
- REPRODUCE or trace the failure path in code before proposing anything.
|
|
23
|
+
- FIND root cause, not symptom. Check whether the documented behavior (criteria/analysis) defines "correct".
|
|
24
|
+
- SUMMARIZE: root cause → proposed minimal fix → files → verification plan. CONFIRM explicitly.
|
|
25
|
+
|
|
26
|
+
## Fix
|
|
27
|
+
|
|
28
|
+
- SURGICAL change near the failure. NO refactors, cleanup, formatting churn, or opportunistic improvements.
|
|
29
|
+
- PRESERVE unrelated user changes.
|
|
30
|
+
- ADD a regression test when the area has test conventions.
|
|
31
|
+
|
|
32
|
+
## Verify + close
|
|
33
|
+
|
|
34
|
+
1. RUN the reproduction + targeted tests; broaden if the surface is shared.
|
|
35
|
+
2. SUMMARIZE: cause, change, verification, residual risk.
|
|
36
|
+
3. RECOMMEND: `/oris-loop` verification when criteria exist; docs update when documented behavior changed.
|
|
37
|
+
|
|
38
|
+
## Done when
|
|
39
|
+
|
|
40
|
+
- [ ] Root cause identified and confirmed before edits.
|
|
41
|
+
- [ ] Minimal change; regression verified.
|
|
42
|
+
- [ ] No unrelated code touched.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: oris-flow-implement
|
|
3
|
+
description: Implement a confirmed feature from implementation-plan.md or an explicitly confirmed technical recap. Use for build, code, implement, apply-the-plan intents after planning.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Implement
|
|
8
|
+
|
|
9
|
+
Execute the confirmed plan — nothing more, nothing less.
|
|
10
|
+
|
|
11
|
+
RULES: follow `references/conventions.md`.
|
|
12
|
+
NEVER edit code before BOTH the source (plan or recap) and the execution mode are confirmed.
|
|
13
|
+
|
|
14
|
+
## Prepare
|
|
15
|
+
|
|
16
|
+
1. FIND `docs/tasks/{task}/implementation-plan.md`. IF missing → reconstruct a technical recap from chat, task docs, and code; SHOW it; CONFIRM before any edit.
|
|
17
|
+
2. READ setup map, project standards, local skills/rules, tests and build conventions for the touched area.
|
|
18
|
+
3. MAP the code, tests, config, and translations the plan touches (parallel subagents when available).
|
|
19
|
+
|
|
20
|
+
## Execution mode (ask before first edit)
|
|
21
|
+
|
|
22
|
+
- `Step by step` (recommended) — one numbered `### n.` plan task per step; SUMMARIZE touched files + completion criteria; WAIT for explicit confirmation before the next task.
|
|
23
|
+
- `One shot` — all tasks in order, no stops between tasks.
|
|
24
|
+
|
|
25
|
+
## While coding
|
|
26
|
+
|
|
27
|
+
- FOLLOW existing project patterns; no new abstractions without need.
|
|
28
|
+
- STAY inside the confirmed scope; park discoveries as notes, don't chase them.
|
|
29
|
+
- ADD or update focused tests when practical.
|
|
30
|
+
- CLEAN as you finish (`references/clean-code-checklist.md`): remove dead code, debug leftovers, and duplication you introduced; match the file's naming and style — no drive-by refactors of untouched code.
|
|
31
|
+
- NEVER update DevOps unless explicitly asked.
|
|
32
|
+
|
|
33
|
+
## Verify + close
|
|
34
|
+
|
|
35
|
+
1. RUN targeted verification first; broaden when the touched surface is shared.
|
|
36
|
+
2. SUMMARIZE: touched files, verification results, residual risk.
|
|
37
|
+
3. RECOMMEND next: `/oris-loop` verification loop when acceptance criteria exist; otherwise update docs (`oris-flow-docs`).
|
|
38
|
+
|
|
39
|
+
## Done when
|
|
40
|
+
|
|
41
|
+
- [ ] Source and mode confirmed before edits.
|
|
42
|
+
- [ ] Only planned scope touched; verification ran.
|
|
43
|
+
- [ ] Next step recommended, not auto-started.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: oris-flow-plan
|
|
3
|
+
description: Technical implementation-plan interview before coding - file mapping, architecture choices, sequencing, verification strategy, implementation-plan.md. Ambiguous request - route to /oris-flow.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Technical Plan
|
|
7
|
+
|
|
8
|
+
Interview the technical owner until another agent or developer could execute the plan without guessing.
|
|
9
|
+
|
|
10
|
+
RULES: follow `references/conventions.md`. Doc standards: `references/doc-policy.md`.
|
|
11
|
+
NEVER write code, Git, or DevOps here. WRITE `implementation-plan.md` only after explicit generation choice.
|
|
12
|
+
|
|
13
|
+
## Before asking
|
|
14
|
+
|
|
15
|
+
1. EXPLORE: `functional-analysis.md` + `acceptance-criteria.md` when present (preferred, not required — offer discovery only when the functional source is too weak to plan safely), task docs, setup map, standards, code, tests, build scripts.
|
|
16
|
+
2. NEVER re-ask functional/QA questions already answered by docs or confirmed chat.
|
|
17
|
+
3. PREFER existing project patterns over new abstractions. Keep uncertainty visible — never invent architecture, field names, or commands.
|
|
18
|
+
|
|
19
|
+
## Interview
|
|
20
|
+
|
|
21
|
+
ASK one technical decision at a time, recommended answer first, early-exit always present:
|
|
22
|
+
ownership boundaries, files/symbols to touch, APIs/contracts, data model, permissions, feature flags, frontend integration, migrations, verification strategy, rollout, risk, sequencing.
|
|
23
|
+
|
|
24
|
+
## Generation gate
|
|
25
|
+
|
|
26
|
+
SHOW compact recap: approach, touched areas, sequence, verification, risks, open points.
|
|
27
|
+
ASK: generate the document | keep interviewing | explain.
|
|
28
|
+
ON generate → write `docs/tasks/{task}/implementation-plan.md` (language `artifactLanguage`):
|
|
29
|
+
|
|
30
|
+
```markdown
|
|
31
|
+
# {Feature} — Implementation Plan
|
|
32
|
+
## Approach (decisions + why, existing patterns referenced)
|
|
33
|
+
## Implementation plan
|
|
34
|
+
### 1. {task} (files, changes, completion criteria)
|
|
35
|
+
### 2. …
|
|
36
|
+
## Verification (commands, tests, what proves each step)
|
|
37
|
+
## Risks & open points
|
|
38
|
+
## Change history (date | source | change | reason)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Numbered `### n.` tasks are the execution steps `oris-flow-implement` will follow — keep each one bounded and independently verifiable.
|
|
42
|
+
|
|
43
|
+
## After writing
|
|
44
|
+
|
|
45
|
+
OFFER: implement | verification loop | stop. Never auto-start.
|
|
46
|
+
|
|
47
|
+
## Done when
|
|
48
|
+
|
|
49
|
+
- [ ] Explored before asking; only implementation questions asked.
|
|
50
|
+
- [ ] Plan tasks bounded with completion criteria.
|
|
51
|
+
- [ ] Document written only after explicit generation choice.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: oris-flow-setup
|
|
3
|
+
description: Prepare a repository for Oris - interview, scan, write .oris-flow/manifest.json + maps, arm loop hooks. Use for setup, map, refresh, or "prepare this repo for Oris" intents.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Oris Setup
|
|
8
|
+
|
|
9
|
+
GOAL: make the repo cheap for Oris to understand — manifest + maps + loop readiness. Writes ONLY after the user confirms the recap.
|
|
10
|
+
|
|
11
|
+
RULES: follow `references/conventions.md`. Map format: `references/repo-map.md`.
|
|
12
|
+
|
|
13
|
+
## Mode
|
|
14
|
+
|
|
15
|
+
IF `.oris-flow/manifest.json` exists → ask ONE question: refresh all | update one area | review stale sections | show summary (no writes) | recreate from scratch | language & profiles | clean runtime.
|
|
16
|
+
ELSE → create from scratch.
|
|
17
|
+
|
|
18
|
+
- "language & profiles" → Local Preferences below; touches only `~/.oris/settings.json`.
|
|
19
|
+
- "clean runtime" → preview with `oris-skills flow clean-runtime --repository-root <repo> --dry-run`, confirm, run without `--dry-run`.
|
|
20
|
+
|
|
21
|
+
## Workflow
|
|
22
|
+
|
|
23
|
+
1. CONFIRM the target repository root (ask only if multiple roots are plausible).
|
|
24
|
+
2. INTERVIEW before scanning: project context, key standards, test depth, protected areas.
|
|
25
|
+
3. SCAN: `oris-skills flow scan --repository-root <repo> --json` = deterministic baseline. Add parallel subagent scans (docs, frontend, backend/data, tests/build, local skills/rules) only when needed. Scan output = draft evidence, not truth.
|
|
26
|
+
4. DRAFT manifest + map sections with confidence flags; ask focused questions ONLY for ambiguous, high-impact facts.
|
|
27
|
+
5. ASK refresh policy (manual | monthly | after refactor | after test-layout change) — advisory only, never a scheduler.
|
|
28
|
+
6. ASK version control for the map: commit (team default) or gitignore. Record in manifest.
|
|
29
|
+
7. RECAP: repo, mode, detected stack, files to write, loop-readiness gaps, choices. CONFIRM explicitly.
|
|
30
|
+
8. WRITE `.oris-flow/manifest.json` + `.oris-flow/maps/**`, then apply:
|
|
31
|
+
- `oris-skills flow version-control --repository-root <repo> --mode commit|gitignore`
|
|
32
|
+
- `oris-skills loop bootstrap --repository-root <repo>` when adapter/hooks are missing.
|
|
33
|
+
9. OFFER next steps: discovery, technical plan, loop (mention `oris-skills loop demo` for first-timers), refresh one area, stop.
|
|
34
|
+
|
|
35
|
+
REFRESH runs keep user-confirmed values unless the scan proves them stale; update `updatedAt`, confidence, stale flags.
|
|
36
|
+
|
|
37
|
+
## Local Preferences
|
|
38
|
+
|
|
39
|
+
1. READ `~/.oris/settings.json` (defaults in `references/settings.md`).
|
|
40
|
+
2. ASK what to change: uiLanguage | artifactLanguage | default test profile | add/update/remove profile.
|
|
41
|
+
3. SHOW masked summary (passwords `***`), CONFIRM, write ONLY the settings file.
|
|
42
|
+
4. NEVER copy secrets into `.oris-flow/**`, docs, or loop state.
|
|
43
|
+
|
|
44
|
+
## Done when
|
|
45
|
+
|
|
46
|
+
- [ ] Mode chosen; scan before questions; questions only for real ambiguity.
|
|
47
|
+
- [ ] Explicit confirmation before every write.
|
|
48
|
+
- [ ] No secrets in repository files.
|
|
49
|
+
- [ ] Loop readiness bootstrapped or intentionally skipped.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: oris-help
|
|
3
|
+
description: Explain how to install, use, and troubleshoot Oris Skills. Use when the user asks how Oris works, what to type, how to install/update/uninstall, or why a skill is missing.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Oris Help
|
|
8
|
+
|
|
9
|
+
Answer in the user's language. Start with the next practical action. Keep it short; details on request.
|
|
10
|
+
|
|
11
|
+
## Quick answers
|
|
12
|
+
|
|
13
|
+
| Need | Answer |
|
|
14
|
+
|------|--------|
|
|
15
|
+
| Start anything | Type `/oris-flow` — it routes or shows the menu. It's the only command to remember. |
|
|
16
|
+
| Try loops safely | `oris-skills loop demo` → follow the 3 printed steps (`dry-run` previews, `chat --action start` runs). |
|
|
17
|
+
| Install / update | `npx oris-skills@latest install` (detects Cursor, Claude Code, Codex; or `--agents cursor,claude,codex`). Reload the agent afterwards. |
|
|
18
|
+
| Uninstall / reinstall | `npx oris-skills uninstall` / `npx oris-skills reinstall` (preview with `--dry-run`). |
|
|
19
|
+
| Stop a loop | `oris-skills loop chat --action stop` |
|
|
20
|
+
| Loop status | `oris-skills loop chat --action status` / `oris-skills loop list` |
|
|
21
|
+
| Skill missing after install | Reload the agent; check `~/.oris/oris-skills/` exists; re-run install with `--force`. |
|
|
22
|
+
| Hook not firing | `oris-skills loop verify --temp` self-checks the runtime; `oris-skills loop bootstrap` re-arms repo hooks. |
|
|
23
|
+
| Change language / test profiles | `/oris-flow` → Setup → language & profiles (settings live in `~/.oris/settings.json`). |
|
|
24
|
+
| Edit a loop's behavior | Edit the files in `.oris-flow/loops/{slug}/prompts/` — next pass obeys them. |
|
|
25
|
+
|
|
26
|
+
## Guardrails
|
|
27
|
+
|
|
28
|
+
- NEVER tell users to paste secrets anywhere.
|
|
29
|
+
- Skip internals (manifest JSON, hook mechanics) unless the user asks for technical troubleshooting.
|
|
30
|
+
- Deeper docs: `docs/user-guide.md`, `docs/architecture.md` in the bundle (`~/.oris/oris-skills/`).
|