create-agentic-repo 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/LICENSE +21 -0
- package/README.md +50 -0
- package/bin/create-agentic-repo.js +5 -0
- package/lib/cli.js +139 -0
- package/lib/fs-utils.js +119 -0
- package/lib/scaffold.js +69 -0
- package/package.json +33 -0
- package/templates/minimal/00_inbox/README.md +8 -0
- package/templates/minimal/01_harness/RULES.md +33 -0
- package/templates/minimal/01_harness/SKILLS_INDEX.md +7 -0
- package/templates/minimal/01_harness/STACK.md +8 -0
- package/templates/minimal/01_harness/TASKFLOW.md +51 -0
- package/templates/minimal/02_context/BRIEF.md +7 -0
- package/templates/minimal/02_context/CONSTRAINTS.md +9 -0
- package/templates/minimal/02_context/FACTS.md +10 -0
- package/templates/minimal/02_context/GLOSSARY.md +6 -0
- package/templates/minimal/02_context/LINKS.md +6 -0
- package/templates/minimal/03_specs/backlog.md +6 -0
- package/templates/minimal/03_specs/decisions.md +5 -0
- package/templates/minimal/03_specs/now/001_now.md +35 -0
- package/templates/minimal/04_outputs/.keep +0 -0
- package/templates/minimal/05_scratch/.keep +0 -0
- package/templates/minimal/README.md +10 -0
- package/templates/minimal/runners/antigravity.md +7 -0
- package/templates/minimal/runners/claude.md +7 -0
- package/templates/minimal/runners/codex.md +7 -0
- package/templates/minimal/shared/agents/distiller/AGENT.md +30 -0
- package/templates/minimal/shared/agents/maker/AGENT.md +30 -0
- package/templates/minimal/shared/agents/planner/AGENT.md +30 -0
- package/templates/minimal/shared/agents/reviewer/AGENT.md +30 -0
- package/templates/minimal/shared/skills/distill-context/SKILL.md +28 -0
- package/templates/minimal/shared/skills/qa-review/SKILL.md +24 -0
- package/templates/minimal/shared/skills/ship-output/SKILL.md +24 -0
- package/templates/minimal/shared/skills/skill-creator/LICENSE.txt +202 -0
- package/templates/minimal/shared/skills/skill-creator/SKILL.md +479 -0
- package/templates/minimal/shared/skills/skill-creator/agents/analyzer.md +274 -0
- package/templates/minimal/shared/skills/skill-creator/agents/comparator.md +202 -0
- package/templates/minimal/shared/skills/skill-creator/agents/grader.md +223 -0
- package/templates/minimal/shared/skills/skill-creator/assets/eval_review.html +146 -0
- package/templates/minimal/shared/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/templates/minimal/shared/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/templates/minimal/shared/skills/skill-creator/references/schemas.md +430 -0
- package/templates/minimal/shared/skills/skill-creator/scripts/__init__.py +0 -0
- package/templates/minimal/shared/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/templates/minimal/shared/skills/skill-creator/scripts/generate_report.py +326 -0
- package/templates/minimal/shared/skills/skill-creator/scripts/improve_description.py +248 -0
- package/templates/minimal/shared/skills/skill-creator/scripts/package_skill.py +136 -0
- package/templates/minimal/shared/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/templates/minimal/shared/skills/skill-creator/scripts/run_eval.py +310 -0
- package/templates/minimal/shared/skills/skill-creator/scripts/run_loop.py +332 -0
- package/templates/minimal/shared/skills/skill-creator/scripts/utils.py +47 -0
- package/templates/minimal/shared/skills/write-spec/SKILL.md +26 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 create-agentic-repo contributors
|
|
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.
|
package/README.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# create-agentic-repo
|
|
2
|
+
|
|
3
|
+
Scaffold a context-lean **Agentic Repo Harness v2** workspace for Claude, Codex, and Antigravity.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm i -g create-agentic-repo
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Or run directly:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx create-agentic-repo my-project --template minimal --yes
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
create-agentic-repo <name> [options]
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Options
|
|
24
|
+
|
|
25
|
+
- `--template minimal` Template to use (only `minimal` for now).
|
|
26
|
+
- `--yes` Non-interactive mode. If `<name>` is omitted, defaults to `agentic-repo`.
|
|
27
|
+
- `--no-git` Skip `git init` in the generated project.
|
|
28
|
+
- `--dry-run` Show actions without writing files.
|
|
29
|
+
- `-h, --help` Show help.
|
|
30
|
+
|
|
31
|
+
## What it generates
|
|
32
|
+
|
|
33
|
+
`minimal` creates a harness-first tree:
|
|
34
|
+
|
|
35
|
+
- `00_inbox/` rich raw context drop zone
|
|
36
|
+
- `01_harness/` always-on lean rules/taskflow
|
|
37
|
+
- `02_context/` distilled 5-minute context
|
|
38
|
+
- `03_specs/` one active spec + backlog/decisions
|
|
39
|
+
- `04_outputs/`, `05_scratch/`
|
|
40
|
+
- `shared/skills/` on-demand skills (includes vendored `skill-creator`)
|
|
41
|
+
- `shared/agents/` role agents (one folder per agent)
|
|
42
|
+
- `runners/` adapters for Claude/Codex/Antigravity
|
|
43
|
+
|
|
44
|
+
## Development
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
npm run smoke
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
The smoke test scaffolds a temp project, verifies critical files, validates placeholder replacement, and checks `--dry-run` behavior.
|
package/lib/cli.js
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const { scaffoldProject } = require('./scaffold');
|
|
3
|
+
|
|
4
|
+
function printHelp() {
|
|
5
|
+
console.log('create-agentic-repo');
|
|
6
|
+
console.log('');
|
|
7
|
+
console.log('Usage:');
|
|
8
|
+
console.log(' create-agentic-repo <name> [options]');
|
|
9
|
+
console.log('');
|
|
10
|
+
console.log('Options:');
|
|
11
|
+
console.log(' --template <name> Template to use (default: minimal)');
|
|
12
|
+
console.log(' --yes Non-interactive mode');
|
|
13
|
+
console.log(' --no-git Skip git init in generated project');
|
|
14
|
+
console.log(' --dry-run Show actions without creating files');
|
|
15
|
+
console.log(' -h, --help Show help');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function parseArgs(argv) {
|
|
19
|
+
let name;
|
|
20
|
+
let template = 'minimal';
|
|
21
|
+
let yes = false;
|
|
22
|
+
let noGit = false;
|
|
23
|
+
let dryRun = false;
|
|
24
|
+
|
|
25
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
26
|
+
const arg = argv[i];
|
|
27
|
+
|
|
28
|
+
if (arg === '-h' || arg === '--help') {
|
|
29
|
+
return { help: true };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (arg === '--yes') {
|
|
33
|
+
yes = true;
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (arg === '--no-git') {
|
|
38
|
+
noGit = true;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (arg === '--dry-run') {
|
|
43
|
+
dryRun = true;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (arg === '--template') {
|
|
48
|
+
template = argv[i + 1];
|
|
49
|
+
i += 1;
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (arg.startsWith('--template=')) {
|
|
54
|
+
template = arg.slice('--template='.length);
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (arg.startsWith('-')) {
|
|
59
|
+
throw new Error(`Unknown option: ${arg}`);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (!name) {
|
|
63
|
+
name = arg;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
throw new Error(`Unexpected argument: ${arg}`);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (!name && yes) {
|
|
71
|
+
name = 'agentic-repo';
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (!name) {
|
|
75
|
+
throw new Error('Project name is required (or pass --yes to use default name).');
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (template !== 'minimal') {
|
|
79
|
+
throw new Error(`Unsupported template: ${template}. Only "minimal" is available.`);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return {
|
|
83
|
+
dryRun,
|
|
84
|
+
help: false,
|
|
85
|
+
name,
|
|
86
|
+
noGit,
|
|
87
|
+
template,
|
|
88
|
+
yes,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function printNextSteps(projectName) {
|
|
93
|
+
console.log('');
|
|
94
|
+
console.log('Next steps:');
|
|
95
|
+
console.log(`1) cd ${projectName}`);
|
|
96
|
+
console.log('2) Drop your raw context into 00_inbox/');
|
|
97
|
+
console.log('3) Run Distill using 01_harness/TASKFLOW.md');
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function main() {
|
|
101
|
+
try {
|
|
102
|
+
const parsed = parseArgs(process.argv.slice(2));
|
|
103
|
+
if (parsed.help) {
|
|
104
|
+
printHelp();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const projectName = parsed.name;
|
|
109
|
+
const targetDir = path.resolve(process.cwd(), projectName);
|
|
110
|
+
const logger = (line) => console.log(line);
|
|
111
|
+
|
|
112
|
+
scaffoldProject({
|
|
113
|
+
dryRun: parsed.dryRun,
|
|
114
|
+
logger,
|
|
115
|
+
noGit: parsed.noGit,
|
|
116
|
+
projectName,
|
|
117
|
+
targetDir,
|
|
118
|
+
template: parsed.template,
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
if (parsed.dryRun) {
|
|
122
|
+
console.log('');
|
|
123
|
+
console.log('Dry run complete. No files were written.');
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
console.log('');
|
|
128
|
+
console.log(`Created ${projectName}.`);
|
|
129
|
+
printNextSteps(projectName);
|
|
130
|
+
} catch (error) {
|
|
131
|
+
console.error(`Error: ${error.message}`);
|
|
132
|
+
process.exitCode = 1;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
module.exports = {
|
|
137
|
+
main,
|
|
138
|
+
parseArgs,
|
|
139
|
+
};
|
package/lib/fs-utils.js
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
const fs = require('node:fs');
|
|
2
|
+
const path = require('node:path');
|
|
3
|
+
|
|
4
|
+
function pathExists(targetPath) {
|
|
5
|
+
try {
|
|
6
|
+
fs.accessSync(targetPath);
|
|
7
|
+
return true;
|
|
8
|
+
} catch {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function isDirectoryEmpty(dirPath) {
|
|
14
|
+
return fs.readdirSync(dirPath).length === 0;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function copyDirectoryRecursive(srcDir, destDir, options) {
|
|
18
|
+
const { dryRun, logger } = options;
|
|
19
|
+
|
|
20
|
+
if (!dryRun) {
|
|
21
|
+
fs.mkdirSync(destDir, { recursive: true });
|
|
22
|
+
}
|
|
23
|
+
logger(`[copy] ${destDir}`);
|
|
24
|
+
|
|
25
|
+
const entries = fs.readdirSync(srcDir, { withFileTypes: true });
|
|
26
|
+
for (const entry of entries) {
|
|
27
|
+
const srcPath = path.join(srcDir, entry.name);
|
|
28
|
+
const destPath = path.join(destDir, entry.name);
|
|
29
|
+
|
|
30
|
+
if (entry.isDirectory()) {
|
|
31
|
+
copyDirectoryRecursive(srcPath, destPath, options);
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (entry.isFile()) {
|
|
36
|
+
logger(`[copy] ${destPath}`);
|
|
37
|
+
if (!dryRun) {
|
|
38
|
+
fs.copyFileSync(srcPath, destPath);
|
|
39
|
+
const srcMode = fs.statSync(srcPath).mode;
|
|
40
|
+
fs.chmodSync(destPath, srcMode);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function replacePlaceholdersInTextFiles(rootDir, replacements, options) {
|
|
47
|
+
const { dryRun, logger } = options;
|
|
48
|
+
const textExtensions = new Set(['.md', '.txt']);
|
|
49
|
+
|
|
50
|
+
function walk(currentDir) {
|
|
51
|
+
const entries = fs.readdirSync(currentDir, { withFileTypes: true });
|
|
52
|
+
|
|
53
|
+
for (const entry of entries) {
|
|
54
|
+
const filePath = path.join(currentDir, entry.name);
|
|
55
|
+
if (entry.isDirectory()) {
|
|
56
|
+
walk(filePath);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (!entry.isFile()) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
65
|
+
if (!textExtensions.has(ext)) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const original = fs.readFileSync(filePath, 'utf8');
|
|
70
|
+
let next = original;
|
|
71
|
+
|
|
72
|
+
for (const [token, value] of Object.entries(replacements)) {
|
|
73
|
+
next = next.split(token).join(value);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (next !== original) {
|
|
77
|
+
logger(`[replace] ${filePath}`);
|
|
78
|
+
if (!dryRun) {
|
|
79
|
+
fs.writeFileSync(filePath, next, 'utf8');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
walk(rootDir);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function ensureKeepFilesForEmptyDirs(rootDir, options) {
|
|
89
|
+
const { dryRun, logger } = options;
|
|
90
|
+
|
|
91
|
+
function visit(currentDir) {
|
|
92
|
+
const entries = fs.readdirSync(currentDir, { withFileTypes: true });
|
|
93
|
+
|
|
94
|
+
for (const entry of entries) {
|
|
95
|
+
if (entry.isDirectory()) {
|
|
96
|
+
visit(path.join(currentDir, entry.name));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const remaining = fs.readdirSync(currentDir);
|
|
101
|
+
if (remaining.length === 0) {
|
|
102
|
+
const keepPath = path.join(currentDir, '.keep');
|
|
103
|
+
logger(`[keep] ${keepPath}`);
|
|
104
|
+
if (!dryRun) {
|
|
105
|
+
fs.writeFileSync(keepPath, '', 'utf8');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
visit(rootDir);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
module.exports = {
|
|
114
|
+
copyDirectoryRecursive,
|
|
115
|
+
ensureKeepFilesForEmptyDirs,
|
|
116
|
+
isDirectoryEmpty,
|
|
117
|
+
pathExists,
|
|
118
|
+
replacePlaceholdersInTextFiles,
|
|
119
|
+
};
|
package/lib/scaffold.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const { spawnSync } = require('node:child_process');
|
|
3
|
+
const {
|
|
4
|
+
copyDirectoryRecursive,
|
|
5
|
+
ensureKeepFilesForEmptyDirs,
|
|
6
|
+
isDirectoryEmpty,
|
|
7
|
+
pathExists,
|
|
8
|
+
replacePlaceholdersInTextFiles,
|
|
9
|
+
} = require('./fs-utils');
|
|
10
|
+
|
|
11
|
+
function scaffoldProject(options) {
|
|
12
|
+
const {
|
|
13
|
+
projectName,
|
|
14
|
+
targetDir,
|
|
15
|
+
template,
|
|
16
|
+
dryRun,
|
|
17
|
+
noGit,
|
|
18
|
+
logger,
|
|
19
|
+
} = options;
|
|
20
|
+
|
|
21
|
+
const templateDir = path.resolve(__dirname, '..', 'templates', template);
|
|
22
|
+
if (!pathExists(templateDir)) {
|
|
23
|
+
throw new Error(`Unknown template: ${template}`);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (pathExists(targetDir) && !isDirectoryEmpty(targetDir)) {
|
|
27
|
+
throw new Error(`Target directory already exists and is not empty: ${targetDir}`);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
logger(`[info] template=${template}`);
|
|
31
|
+
logger(`[info] project=${projectName}`);
|
|
32
|
+
logger(`[info] target=${targetDir}`);
|
|
33
|
+
|
|
34
|
+
copyDirectoryRecursive(templateDir, targetDir, { dryRun, logger });
|
|
35
|
+
|
|
36
|
+
if (dryRun) {
|
|
37
|
+
logger('[dry-run] placeholder replacement skipped (no files written)');
|
|
38
|
+
logger('[dry-run] empty-dir .keep check skipped (no files written)');
|
|
39
|
+
} else {
|
|
40
|
+
replacePlaceholdersInTextFiles(
|
|
41
|
+
targetDir,
|
|
42
|
+
{ '{{PROJECT_NAME}}': projectName },
|
|
43
|
+
{ dryRun, logger }
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
ensureKeepFilesForEmptyDirs(targetDir, { dryRun, logger });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (!noGit) {
|
|
50
|
+
if (dryRun) {
|
|
51
|
+
logger(`[git] would run: git init (${targetDir})`);
|
|
52
|
+
} else {
|
|
53
|
+
const result = spawnSync('git', ['init'], {
|
|
54
|
+
cwd: targetDir,
|
|
55
|
+
stdio: 'ignore',
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
if (result.status !== 0) {
|
|
59
|
+
logger('[warn] git init failed; continue manually if needed.');
|
|
60
|
+
} else {
|
|
61
|
+
logger('[git] initialized repository');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
module.exports = {
|
|
68
|
+
scaffoldProject,
|
|
69
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "create-agentic-repo",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Scaffold context-lean Agentic Repo Harness v2 workspaces.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "",
|
|
7
|
+
"type": "commonjs",
|
|
8
|
+
"main": "lib/cli.js",
|
|
9
|
+
"bin": {
|
|
10
|
+
"create-agentic-repo": "bin/create-agentic-repo.js"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"bin",
|
|
14
|
+
"lib",
|
|
15
|
+
"templates",
|
|
16
|
+
"README.md",
|
|
17
|
+
"LICENSE"
|
|
18
|
+
],
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=18"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"smoke": "node scripts/smoke-test.js",
|
|
24
|
+
"test": "npm run smoke"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"agentic",
|
|
28
|
+
"scaffold",
|
|
29
|
+
"cli",
|
|
30
|
+
"harness",
|
|
31
|
+
"spec-driven"
|
|
32
|
+
]
|
|
33
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# RULES
|
|
2
|
+
|
|
3
|
+
These rules are always-on.
|
|
4
|
+
|
|
5
|
+
## Truth and unknowns
|
|
6
|
+
- Do not invent facts.
|
|
7
|
+
- If information is missing, mark it as `Unknown`.
|
|
8
|
+
- Ask focused questions only when needed to proceed.
|
|
9
|
+
|
|
10
|
+
## Anti-bloat
|
|
11
|
+
- Do not copy `00_inbox` into working files.
|
|
12
|
+
- Keep `02_context` readable in 5 minutes.
|
|
13
|
+
- Move heavy guidance into `shared/skills/`.
|
|
14
|
+
|
|
15
|
+
## Spec discipline
|
|
16
|
+
- Work from one active spec at a time in `03_specs/now/`.
|
|
17
|
+
- Update acceptance criteria before shipping.
|
|
18
|
+
- Keep backlog items in `03_specs/backlog.md` as one-line entries.
|
|
19
|
+
|
|
20
|
+
## Output discipline
|
|
21
|
+
- Final deliverables must go to `04_outputs/`.
|
|
22
|
+
- Working debris goes to `05_scratch/`.
|
|
23
|
+
- Use predictable names for deliverables: `YYYY-MM-DD_topic_v1.md`.
|
|
24
|
+
|
|
25
|
+
## QA gate before close
|
|
26
|
+
- Verify each acceptance criterion explicitly.
|
|
27
|
+
- List unresolved `Unknown` items.
|
|
28
|
+
- State risks and next step if not done.
|
|
29
|
+
|
|
30
|
+
## Naming and format
|
|
31
|
+
- Use clear file names and short headings.
|
|
32
|
+
- Prefer concise bullets over long prose.
|
|
33
|
+
- Keep docs actionable and skimmable.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# SKILLS_INDEX
|
|
2
|
+
|
|
3
|
+
- `distill-context` (heavy/manual): distills raw inbox into compact context files.
|
|
4
|
+
- `write-spec` (light): creates one SDD-light spec from distilled context.
|
|
5
|
+
- `ship-output` (light): produces the final deliverable in `04_outputs/`.
|
|
6
|
+
- `qa-review` (light): validates output against acceptance checklist.
|
|
7
|
+
- `skill-creator` (strategic/heavy): creates and iterates skills with eval loop.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# TASKFLOW
|
|
2
|
+
|
|
3
|
+
Use this loop every time:
|
|
4
|
+
|
|
5
|
+
1. Seed
|
|
6
|
+
2. Distill
|
|
7
|
+
3. Spec
|
|
8
|
+
4. Ship
|
|
9
|
+
5. QA
|
|
10
|
+
|
|
11
|
+
Only one active spec at a time.
|
|
12
|
+
|
|
13
|
+
## Distill prompt (copy/paste)
|
|
14
|
+
|
|
15
|
+
```text
|
|
16
|
+
Read 00_inbox/ and distill only what is needed into:
|
|
17
|
+
- 02_context/BRIEF.md
|
|
18
|
+
- 02_context/FACTS.md
|
|
19
|
+
- 02_context/CONSTRAINTS.md
|
|
20
|
+
- 02_context/LINKS.md
|
|
21
|
+
- 02_context/GLOSSARY.md (if needed)
|
|
22
|
+
|
|
23
|
+
Rules:
|
|
24
|
+
- keep total context readable in 5 minutes
|
|
25
|
+
- separate facts from assumptions
|
|
26
|
+
- mark unknowns explicitly
|
|
27
|
+
- do not move raw dumps into 02_context
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Write spec prompt (copy/paste)
|
|
31
|
+
|
|
32
|
+
```text
|
|
33
|
+
Using 02_context, create one active spec in 03_specs/now/001_now.md with:
|
|
34
|
+
- Outcome
|
|
35
|
+
- Scope / No-scope
|
|
36
|
+
- Inputs
|
|
37
|
+
- Deliverable path and format
|
|
38
|
+
- Acceptance criteria checklist
|
|
39
|
+
- Risks / edge cases
|
|
40
|
+
- Open questions (max 8)
|
|
41
|
+
|
|
42
|
+
Keep it execution-ready and concise.
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## QA gate checklist
|
|
46
|
+
|
|
47
|
+
- [ ] Deliverable exists in `04_outputs/`
|
|
48
|
+
- [ ] Acceptance criteria all checked
|
|
49
|
+
- [ ] Unknowns listed
|
|
50
|
+
- [ ] Risks noted with mitigation
|
|
51
|
+
- [ ] Next action is clear
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# 001_now
|
|
2
|
+
|
|
3
|
+
## Outcome
|
|
4
|
+
- What must exist at the end:
|
|
5
|
+
|
|
6
|
+
## Scope
|
|
7
|
+
- In scope:
|
|
8
|
+
- Out of scope:
|
|
9
|
+
|
|
10
|
+
## Inputs
|
|
11
|
+
- Files:
|
|
12
|
+
- Links:
|
|
13
|
+
- Data:
|
|
14
|
+
|
|
15
|
+
## Deliverable
|
|
16
|
+
- Path: `04_outputs/YYYY-MM-DD_topic_v1.md`
|
|
17
|
+
- Format:
|
|
18
|
+
|
|
19
|
+
## Acceptance Criteria
|
|
20
|
+
- [ ] Criterion 1
|
|
21
|
+
- [ ] Criterion 2
|
|
22
|
+
- [ ] Criterion 3
|
|
23
|
+
- [ ] Criterion 4
|
|
24
|
+
- [ ] Criterion 5
|
|
25
|
+
- [ ] Criterion 6
|
|
26
|
+
- [ ] Criterion 7
|
|
27
|
+
- [ ] Criterion 8
|
|
28
|
+
|
|
29
|
+
## Risks and Edge Cases
|
|
30
|
+
- Risk:
|
|
31
|
+
- Edge case:
|
|
32
|
+
|
|
33
|
+
## Open Questions
|
|
34
|
+
- Q1:
|
|
35
|
+
- Q2:
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# {{PROJECT_NAME}}
|
|
2
|
+
|
|
3
|
+
Agentic Repo Harness v2 workspace.
|
|
4
|
+
|
|
5
|
+
## Start Here
|
|
6
|
+
|
|
7
|
+
1. Drop all raw material into `00_inbox/`.
|
|
8
|
+
2. Use `01_harness/TASKFLOW.md` to run Seed -> Distill -> Spec -> Ship -> QA.
|
|
9
|
+
3. Keep one active spec in `03_specs/now/`.
|
|
10
|
+
4. Put deliverables in `04_outputs/`.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Antigravity Runner
|
|
2
|
+
|
|
3
|
+
1. Anchor workflow on `01_harness/` files.
|
|
4
|
+
2. Delegate heavy tasks via relevant skill folders in `shared/skills/`.
|
|
5
|
+
3. Keep context distilled in `02_context/` and work from one spec.
|
|
6
|
+
4. Route deliverables to `04_outputs/`.
|
|
7
|
+
5. Finish with QA gate verification.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Claude Runner
|
|
2
|
+
|
|
3
|
+
1. Read `01_harness/RULES.md` and `01_harness/TASKFLOW.md` first.
|
|
4
|
+
2. Load only the needed skill from `shared/skills/`.
|
|
5
|
+
3. Keep one active spec in `03_specs/now/`.
|
|
6
|
+
4. Write final deliverables to `04_outputs/`.
|
|
7
|
+
5. Run QA gate from `TASKFLOW.md` before closing.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Codex Runner
|
|
2
|
+
|
|
3
|
+
1. Start with `01_harness/RULES.md` and `TASKFLOW.md`.
|
|
4
|
+
2. Use on-demand skills under `shared/skills/` for heavy workflows.
|
|
5
|
+
3. Execute from one active spec only.
|
|
6
|
+
4. Store final artifacts in `04_outputs/`.
|
|
7
|
+
5. Complete QA checklist before marking done.
|