Compare commits
5 Commits
f5c2ae140e
...
8511fe20b3
| Author | SHA1 | Date |
|---|---|---|
|
|
8511fe20b3 | |
|
|
fa909a8916 | |
|
|
e0ea6a0500 | |
|
|
c91db0db4b | |
|
|
1a85069b75 |
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
name: validate-workflow
|
||||||
|
description: "Run a checklist against a document with thorough analysis and produce a validation report"
|
||||||
|
---
|
||||||
|
|
||||||
|
Follow the instructions in [workflow.md](workflow.md).
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
type: skill
|
||||||
|
|
@ -0,0 +1,88 @@
|
||||||
|
# Validate Workflow Output
|
||||||
|
|
||||||
|
**Goal:** Run a checklist against a document with thorough analysis and produce a validation report.
|
||||||
|
|
||||||
|
**Inputs:**
|
||||||
|
|
||||||
|
- **workflow** (required) — Workflow path containing `checklist.md`
|
||||||
|
- **checklist** (optional) — Checklist to validate against (defaults to the workflow's `checklist.md`)
|
||||||
|
- **document** (optional) — Document to validate (ask user if not specified)
|
||||||
|
|
||||||
|
## STEPS
|
||||||
|
|
||||||
|
### Step 1: Setup
|
||||||
|
|
||||||
|
- If checklist not provided, load `checklist.md` from the workflow location
|
||||||
|
- Try to fuzzy-match files similar to the input document name; if document not provided or unsure, ask user: "Which document should I validate?"
|
||||||
|
- Load both the checklist and document
|
||||||
|
|
||||||
|
### Step 2: Validate (CRITICAL)
|
||||||
|
|
||||||
|
**For EVERY checklist item, WITHOUT SKIPPING ANY:**
|
||||||
|
|
||||||
|
1. Read the requirement carefully
|
||||||
|
2. Search the document for evidence along with any ancillary loaded documents or artifacts (quotes with line numbers)
|
||||||
|
3. Analyze deeply — look for explicit AND implied coverage
|
||||||
|
|
||||||
|
**Mark each item as:**
|
||||||
|
|
||||||
|
- **PASS** `✓` — Requirement fully met (provide evidence)
|
||||||
|
- **PARTIAL** `⚠` — Some coverage but incomplete (explain gaps)
|
||||||
|
- **FAIL** `✗` — Not met or severely deficient (explain why)
|
||||||
|
- **N/A** `➖` — Not applicable (explain reason)
|
||||||
|
|
||||||
|
**DO NOT SKIP ANY SECTIONS OR ITEMS.**
|
||||||
|
|
||||||
|
### Step 3: Generate Report
|
||||||
|
|
||||||
|
Create `validation-report-{timestamp}.md` in the document's folder with the following format:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Validation Report
|
||||||
|
|
||||||
|
**Document:** {document-path}
|
||||||
|
**Checklist:** {checklist-path}
|
||||||
|
**Date:** {timestamp}
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Overall: X/Y passed (Z%)
|
||||||
|
- Critical Issues: {count}
|
||||||
|
|
||||||
|
## Section Results
|
||||||
|
|
||||||
|
### {Section Name}
|
||||||
|
|
||||||
|
Pass Rate: X/Y (Z%)
|
||||||
|
|
||||||
|
[MARK] {Item description}
|
||||||
|
Evidence: {Quote with line# or explanation}
|
||||||
|
{If FAIL/PARTIAL: Impact: {why this matters}}
|
||||||
|
|
||||||
|
## Failed Items
|
||||||
|
|
||||||
|
{All ✗ items with recommendations}
|
||||||
|
|
||||||
|
## Partial Items
|
||||||
|
|
||||||
|
{All ⚠ items with what's missing}
|
||||||
|
|
||||||
|
## Recommendations
|
||||||
|
|
||||||
|
1. Must Fix: {critical failures}
|
||||||
|
2. Should Improve: {important gaps}
|
||||||
|
3. Consider: {minor improvements}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 4: Summary for User
|
||||||
|
|
||||||
|
- Present section-by-section summary
|
||||||
|
- Highlight all critical issues
|
||||||
|
- Provide path to saved report
|
||||||
|
- **HALT** — do not continue unless user asks
|
||||||
|
|
||||||
|
## HALT CONDITIONS
|
||||||
|
|
||||||
|
- HALT after presenting summary in Step 4
|
||||||
|
- HALT with error if no checklist is found and none is provided
|
||||||
|
- HALT with error if no document is found and user does not specify one
|
||||||
|
|
@ -102,6 +102,13 @@ platforms:
|
||||||
- .iflow/commands
|
- .iflow/commands
|
||||||
target_dir: .iflow/skills
|
target_dir: .iflow/skills
|
||||||
|
|
||||||
|
junie:
|
||||||
|
name: "Junie"
|
||||||
|
preferred: false
|
||||||
|
installer:
|
||||||
|
target_dir: .agents/skills
|
||||||
|
ancestor_conflict_check: false
|
||||||
|
|
||||||
kilo:
|
kilo:
|
||||||
name: "KiloCoder"
|
name: "KiloCoder"
|
||||||
preferred: false
|
preferred: false
|
||||||
|
|
|
||||||
|
|
@ -313,10 +313,41 @@ class ExternalModuleManager {
|
||||||
|
|
||||||
// The module-definition specifies the path to module.yaml relative to repo root
|
// The module-definition specifies the path to module.yaml relative to repo root
|
||||||
// We need to return the directory containing module.yaml
|
// We need to return the directory containing module.yaml
|
||||||
const moduleDefinitionPath = moduleInfo.moduleDefinition; // e.g., 'src/module.yaml'
|
const moduleDefinitionPath = moduleInfo.moduleDefinition; // e.g., 'skills/module.yaml'
|
||||||
const moduleDir = path.dirname(path.join(cloneDir, moduleDefinitionPath));
|
const configuredPath = path.join(cloneDir, moduleDefinitionPath);
|
||||||
|
|
||||||
return moduleDir;
|
if (await fs.pathExists(configuredPath)) {
|
||||||
|
return path.dirname(configuredPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback: search skills/ and src/ (root level and one level deep for subfolders)
|
||||||
|
for (const dir of ['skills', 'src']) {
|
||||||
|
const rootCandidate = path.join(cloneDir, dir, 'module.yaml');
|
||||||
|
if (await fs.pathExists(rootCandidate)) {
|
||||||
|
return path.dirname(rootCandidate);
|
||||||
|
}
|
||||||
|
const dirPath = path.join(cloneDir, dir);
|
||||||
|
if (await fs.pathExists(dirPath)) {
|
||||||
|
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
||||||
|
for (const entry of entries) {
|
||||||
|
if (entry.isDirectory()) {
|
||||||
|
const subCandidate = path.join(dirPath, entry.name, 'module.yaml');
|
||||||
|
if (await fs.pathExists(subCandidate)) {
|
||||||
|
return path.dirname(subCandidate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check repo root as last fallback
|
||||||
|
const rootCandidate = path.join(cloneDir, 'module.yaml');
|
||||||
|
if (await fs.pathExists(rootCandidate)) {
|
||||||
|
return path.dirname(rootCandidate);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nothing found: return configured path (preserves old behavior for error messaging)
|
||||||
|
return path.dirname(configuredPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -127,6 +127,12 @@ platforms:
|
||||||
category: ide
|
category: ide
|
||||||
description: "AI-powered IDE with cascade flows"
|
description: "AI-powered IDE with cascade flows"
|
||||||
|
|
||||||
|
junie:
|
||||||
|
name: "Junie"
|
||||||
|
preferred: false
|
||||||
|
category: cli
|
||||||
|
description: "AI coding agent by JetBrains"
|
||||||
|
|
||||||
ona:
|
ona:
|
||||||
name: "Ona"
|
name: "Ona"
|
||||||
preferred: false
|
preferred: false
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue