@ai-content-space/loopx 0.1.10 → 0.2.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/AGENTS.md +50 -0
- package/README.md +59 -450
- package/README.zh-CN.md +59 -461
- package/docs/loopx/design/loopx-skill-suite-v1-design.md +73 -0
- package/docs/loopx/plans/loopx-skill-suite-v1-implementation.md +77 -0
- package/package.json +5 -2
- package/plugins/loopx/.codex-plugin/plugin.json +4 -4
- package/plugins/loopx/scripts/plugin-install.test.mjs +20 -20
- package/plugins/loopx/skills/clarify/SKILL.md +38 -311
- package/plugins/loopx/skills/debug/SKILL.md +1 -1
- package/plugins/loopx/skills/exec/SKILL.md +71 -0
- package/plugins/loopx/skills/finish/SKILL.md +254 -0
- package/plugins/loopx/skills/fix-review/SKILL.md +216 -0
- package/plugins/loopx/skills/go-style/SKILL.md +1 -1
- package/plugins/loopx/skills/kratos/SKILL.md +1 -1
- package/plugins/loopx/skills/plan/SKILL.md +138 -271
- package/plugins/loopx/skills/refactor-plan/SKILL.md +71 -0
- package/plugins/loopx/skills/review/SKILL.md +72 -105
- package/plugins/loopx/skills/review/code-reviewer.md +168 -0
- package/plugins/loopx/skills/spec/DESIGN_SPEC_TEMPLATE.md +323 -0
- package/plugins/loopx/skills/spec/SKILL.md +76 -0
- package/plugins/loopx/skills/subagent-exec/SKILL.md +282 -0
- package/plugins/loopx/skills/subagent-exec/agents/openai.yaml +3 -0
- package/plugins/loopx/skills/subagent-exec/code-quality-reviewer-prompt.md +25 -0
- package/plugins/loopx/skills/subagent-exec/codex-subagents.md +37 -0
- package/plugins/loopx/skills/subagent-exec/implementer-prompt.md +113 -0
- package/plugins/loopx/skills/subagent-exec/spec-reviewer-prompt.md +61 -0
- package/plugins/loopx/skills/tdd/SKILL.md +1 -1
- package/plugins/loopx/skills/verify/SKILL.md +1 -1
- package/scripts/claude-workflow-hook.mjs +109 -0
- package/scripts/codex-workflow-hook.mjs +2 -5
- package/scripts/install-skills.mjs +3 -3
- package/scripts/verify-skills.mjs +32 -1
- package/skills/RESOLVER.md +26 -17
- package/skills/clarify/SKILL.md +38 -311
- package/skills/debug/SKILL.md +1 -1
- package/skills/exec/SKILL.md +71 -0
- package/skills/finish/SKILL.md +254 -0
- package/skills/fix-review/SKILL.md +216 -0
- package/skills/go-style/SKILL.md +1 -1
- package/skills/kratos/SKILL.md +1 -1
- package/skills/plan/SKILL.md +138 -271
- package/skills/refactor-plan/SKILL.md +71 -0
- package/skills/review/SKILL.md +72 -105
- package/skills/review/code-reviewer.md +168 -0
- package/skills/spec/DESIGN_SPEC_TEMPLATE.md +323 -0
- package/skills/spec/SKILL.md +76 -0
- package/skills/subagent-exec/SKILL.md +282 -0
- package/skills/subagent-exec/agents/openai.yaml +3 -0
- package/skills/subagent-exec/code-quality-reviewer-prompt.md +25 -0
- package/skills/subagent-exec/codex-subagents.md +37 -0
- package/skills/subagent-exec/implementer-prompt.md +113 -0
- package/skills/subagent-exec/spec-reviewer-prompt.md +61 -0
- package/skills/tdd/SKILL.md +1 -1
- package/skills/verify/SKILL.md +1 -1
- package/src/autopilot-runtime.mjs +1 -1
- package/src/cli.mjs +77 -5
- package/src/context-manifest.mjs +2 -2
- package/src/html-views.mjs +129 -195
- package/src/install-discovery.mjs +210 -6
- package/src/next-skill.mjs +2 -4
- package/src/plan-runtime.mjs +571 -93
- package/src/runtime-maintenance.mjs +5 -2
- package/src/workflow.mjs +865 -68
- package/templates/architecture.md +58 -16
- package/templates/development-plan.md +42 -12
- package/plugins/loopx/skills/archive/SKILL.md +0 -55
- package/plugins/loopx/skills/autopilot/SKILL.md +0 -93
- package/plugins/loopx/skills/build/SKILL.md +0 -228
- package/skills/archive/SKILL.md +0 -55
- package/skills/autopilot/SKILL.md +0 -93
- package/skills/build/SKILL.md +0 -228
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Code Quality Reviewer Prompt Template
|
|
2
|
+
|
|
3
|
+
Use this template when dispatching a code quality reviewer subagent.
|
|
4
|
+
|
|
5
|
+
**Purpose:** Verify implementation is well-built (clean, tested, maintainable)
|
|
6
|
+
|
|
7
|
+
**Only dispatch after spec compliance review passes.**
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
Native Codex subagent:
|
|
11
|
+
Use template at review/code-reviewer.md
|
|
12
|
+
|
|
13
|
+
DESCRIPTION: [task summary, from implementer's report]
|
|
14
|
+
PLAN_OR_REQUIREMENTS: Task N from [plan-file]
|
|
15
|
+
BASE_SHA: [commit before task]
|
|
16
|
+
HEAD_SHA: [current commit]
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**In addition to standard code quality concerns, the reviewer should check:**
|
|
20
|
+
- Does each file have one clear responsibility with a well-defined interface?
|
|
21
|
+
- Are units decomposed so they can be understood and tested independently?
|
|
22
|
+
- Is the implementation following the file structure from the plan?
|
|
23
|
+
- Did this implementation create new files that are already large, or significantly grow existing files? (Don't flag pre-existing file sizes — focus on what this change contributed.)
|
|
24
|
+
|
|
25
|
+
**Code reviewer returns:** Strengths, Issues (Critical/Important/Minor), Assessment
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Codex Subagent Tool Mapping
|
|
2
|
+
|
|
3
|
+
Use this reference before executing this skill in Codex.
|
|
4
|
+
|
|
5
|
+
## Tool Mapping
|
|
6
|
+
|
|
7
|
+
| Skill action | Codex equivalent |
|
|
8
|
+
|---|---|
|
|
9
|
+
| Dispatch one implementer or reviewer subagent | `spawn_agent` |
|
|
10
|
+
| Dispatch independent subagents in parallel | multiple `spawn_agent` calls |
|
|
11
|
+
| Wait for a subagent result | `wait_agent` |
|
|
12
|
+
| Free a completed subagent slot | `close_agent` |
|
|
13
|
+
| Track task state | `update_plan` |
|
|
14
|
+
| Read, edit, or run commands | native Codex file and shell tools |
|
|
15
|
+
|
|
16
|
+
## Required Runtime Support
|
|
17
|
+
|
|
18
|
+
Subagent dispatch requires Codex multi-agent support. If `spawn_agent`,
|
|
19
|
+
`wait_agent`, or `close_agent` are unavailable, do not pretend this skill ran
|
|
20
|
+
as subagent-driven development. Use `loopx:exec` instead.
|
|
21
|
+
|
|
22
|
+
Codex environments that require explicit feature flags should enable:
|
|
23
|
+
|
|
24
|
+
```toml
|
|
25
|
+
[features]
|
|
26
|
+
multi_agent = true
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Execution Rules
|
|
30
|
+
|
|
31
|
+
- Spawn fresh subagents with complete task text and only the context they need.
|
|
32
|
+
- Use implementer, spec reviewer, and code quality reviewer prompts from this directory.
|
|
33
|
+
- Do not make subagents read the whole plan file; paste the relevant task text.
|
|
34
|
+
- Keep implementation tasks sequential unless write scopes are clearly disjoint.
|
|
35
|
+
- Use `wait_agent` only when the next controller step needs that result.
|
|
36
|
+
- Close completed agents after their result is integrated.
|
|
37
|
+
- Keep the controller responsible for integration, review loops, and final status.
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Implementer Subagent Prompt Template
|
|
2
|
+
|
|
3
|
+
Use this template when dispatching an implementer subagent.
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
Native Codex subagent:
|
|
7
|
+
description: "Implement Task N: [task name]"
|
|
8
|
+
prompt: |
|
|
9
|
+
You are implementing Task N: [task name]
|
|
10
|
+
|
|
11
|
+
## Task Description
|
|
12
|
+
|
|
13
|
+
[FULL TEXT of task from plan - paste it here, don't make subagent read file]
|
|
14
|
+
|
|
15
|
+
## Context
|
|
16
|
+
|
|
17
|
+
[Scene-setting: where this fits, dependencies, architectural context]
|
|
18
|
+
|
|
19
|
+
## Before You Begin
|
|
20
|
+
|
|
21
|
+
If you have questions about:
|
|
22
|
+
- The requirements or acceptance criteria
|
|
23
|
+
- The approach or implementation strategy
|
|
24
|
+
- Dependencies or assumptions
|
|
25
|
+
- Anything unclear in the task description
|
|
26
|
+
|
|
27
|
+
**Ask them now.** Raise any concerns before starting work.
|
|
28
|
+
|
|
29
|
+
## Your Job
|
|
30
|
+
|
|
31
|
+
Once you're clear on requirements:
|
|
32
|
+
1. Implement exactly what the task specifies
|
|
33
|
+
2. Write tests (following TDD if task says to)
|
|
34
|
+
3. Verify implementation works
|
|
35
|
+
4. Commit your work
|
|
36
|
+
5. Self-review (see below)
|
|
37
|
+
6. Report back
|
|
38
|
+
|
|
39
|
+
Work from: [directory]
|
|
40
|
+
|
|
41
|
+
**While you work:** If you encounter something unexpected or unclear, **ask questions**.
|
|
42
|
+
It's always OK to pause and clarify. Don't guess or make assumptions.
|
|
43
|
+
|
|
44
|
+
## Code Organization
|
|
45
|
+
|
|
46
|
+
You reason best about code you can hold in context at once, and your edits are more
|
|
47
|
+
reliable when files are focused. Keep this in mind:
|
|
48
|
+
- Follow the file structure defined in the plan
|
|
49
|
+
- Each file should have one clear responsibility with a well-defined interface
|
|
50
|
+
- If a file you're creating is growing beyond the plan's intent, stop and report
|
|
51
|
+
it as DONE_WITH_CONCERNS — don't split files on your own without plan guidance
|
|
52
|
+
- If an existing file you're modifying is already large or tangled, work carefully
|
|
53
|
+
and note it as a concern in your report
|
|
54
|
+
- In existing codebases, follow established patterns. Improve code you're touching
|
|
55
|
+
the way a good developer would, but don't restructure things outside your task.
|
|
56
|
+
|
|
57
|
+
## When You're in Over Your Head
|
|
58
|
+
|
|
59
|
+
It is always OK to stop and say "this is too hard for me." Bad work is worse than
|
|
60
|
+
no work. You will not be penalized for escalating.
|
|
61
|
+
|
|
62
|
+
**STOP and escalate when:**
|
|
63
|
+
- The task requires architectural decisions with multiple valid approaches
|
|
64
|
+
- You need to understand code beyond what was provided and can't find clarity
|
|
65
|
+
- You feel uncertain about whether your approach is correct
|
|
66
|
+
- The task involves restructuring existing code in ways the plan didn't anticipate
|
|
67
|
+
- You've been reading file after file trying to understand the system without progress
|
|
68
|
+
|
|
69
|
+
**How to escalate:** Report back with status BLOCKED or NEEDS_CONTEXT. Describe
|
|
70
|
+
specifically what you're stuck on, what you've tried, and what kind of help you need.
|
|
71
|
+
The controller can provide more context, re-dispatch with a more capable model,
|
|
72
|
+
or break the task into smaller pieces.
|
|
73
|
+
|
|
74
|
+
## Before Reporting Back: Self-Review
|
|
75
|
+
|
|
76
|
+
Review your work with fresh eyes. Ask yourself:
|
|
77
|
+
|
|
78
|
+
**Completeness:**
|
|
79
|
+
- Did I fully implement everything in the spec?
|
|
80
|
+
- Did I miss any requirements?
|
|
81
|
+
- Are there edge cases I didn't handle?
|
|
82
|
+
|
|
83
|
+
**Quality:**
|
|
84
|
+
- Is this my best work?
|
|
85
|
+
- Are names clear and accurate (match what things do, not how they work)?
|
|
86
|
+
- Is the code clean and maintainable?
|
|
87
|
+
|
|
88
|
+
**Discipline:**
|
|
89
|
+
- Did I avoid overbuilding (YAGNI)?
|
|
90
|
+
- Did I only build what was requested?
|
|
91
|
+
- Did I follow existing patterns in the codebase?
|
|
92
|
+
|
|
93
|
+
**Testing:**
|
|
94
|
+
- Do tests actually verify behavior (not just mock behavior)?
|
|
95
|
+
- Did I follow TDD if required?
|
|
96
|
+
- Are tests comprehensive?
|
|
97
|
+
|
|
98
|
+
If you find issues during self-review, fix them now before reporting.
|
|
99
|
+
|
|
100
|
+
## Report Format
|
|
101
|
+
|
|
102
|
+
When done, report:
|
|
103
|
+
- **Status:** DONE | DONE_WITH_CONCERNS | BLOCKED | NEEDS_CONTEXT
|
|
104
|
+
- What you implemented (or what you attempted, if blocked)
|
|
105
|
+
- What you tested and test results
|
|
106
|
+
- Files changed
|
|
107
|
+
- Self-review findings (if any)
|
|
108
|
+
- Any issues or concerns
|
|
109
|
+
|
|
110
|
+
Use DONE_WITH_CONCERNS if you completed the work but have doubts about correctness.
|
|
111
|
+
Use BLOCKED if you cannot complete the task. Use NEEDS_CONTEXT if you need
|
|
112
|
+
information that wasn't provided. Never silently produce work you're unsure about.
|
|
113
|
+
```
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Spec Compliance Reviewer Prompt Template
|
|
2
|
+
|
|
3
|
+
Use this template when dispatching a spec compliance reviewer subagent.
|
|
4
|
+
|
|
5
|
+
**Purpose:** Verify implementer built what was requested (nothing more, nothing less)
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
Native Codex subagent:
|
|
9
|
+
description: "Review spec compliance for Task N"
|
|
10
|
+
prompt: |
|
|
11
|
+
You are reviewing whether an implementation matches its specification.
|
|
12
|
+
|
|
13
|
+
## What Was Requested
|
|
14
|
+
|
|
15
|
+
[FULL TEXT of task requirements]
|
|
16
|
+
|
|
17
|
+
## What Implementer Claims They Built
|
|
18
|
+
|
|
19
|
+
[From implementer's report]
|
|
20
|
+
|
|
21
|
+
## CRITICAL: Do Not Trust the Report
|
|
22
|
+
|
|
23
|
+
The implementer finished suspiciously quickly. Their report may be incomplete,
|
|
24
|
+
inaccurate, or optimistic. You MUST verify everything independently.
|
|
25
|
+
|
|
26
|
+
**DO NOT:**
|
|
27
|
+
- Take their word for what they implemented
|
|
28
|
+
- Trust their claims about completeness
|
|
29
|
+
- Accept their interpretation of requirements
|
|
30
|
+
|
|
31
|
+
**DO:**
|
|
32
|
+
- Read the actual code they wrote
|
|
33
|
+
- Compare actual implementation to requirements line by line
|
|
34
|
+
- Check for missing pieces they claimed to implement
|
|
35
|
+
- Look for extra features they didn't mention
|
|
36
|
+
|
|
37
|
+
## Your Job
|
|
38
|
+
|
|
39
|
+
Read the implementation code and verify:
|
|
40
|
+
|
|
41
|
+
**Missing requirements:**
|
|
42
|
+
- Did they implement everything that was requested?
|
|
43
|
+
- Are there requirements they skipped or missed?
|
|
44
|
+
- Did they claim something works but didn't actually implement it?
|
|
45
|
+
|
|
46
|
+
**Extra/unneeded work:**
|
|
47
|
+
- Did they build things that weren't requested?
|
|
48
|
+
- Did they over-engineer or add unnecessary features?
|
|
49
|
+
- Did they add "nice to haves" that weren't in spec?
|
|
50
|
+
|
|
51
|
+
**Misunderstandings:**
|
|
52
|
+
- Did they interpret requirements differently than intended?
|
|
53
|
+
- Did they solve the wrong problem?
|
|
54
|
+
- Did they implement the right feature but wrong way?
|
|
55
|
+
|
|
56
|
+
**Verify by reading code, not by trusting report.**
|
|
57
|
+
|
|
58
|
+
Report:
|
|
59
|
+
- ✅ Spec compliant (if everything matches after code inspection)
|
|
60
|
+
- ❌ Issues found: [list specifically what's missing or extra, with file:line references]
|
|
61
|
+
```
|
|
@@ -3,7 +3,7 @@ name: tdd
|
|
|
3
3
|
description: "Guides feature and bugfix implementation through a failing test before production code and red-green-refactor discipline. Not for generated files or throwaway prototypes."
|
|
4
4
|
when_to_use: "tdd, failing test first, feature implementation, bugfix, regression test, red green refactor, 测试先行"
|
|
5
5
|
metadata:
|
|
6
|
-
version: "0.
|
|
6
|
+
version: "0.2.0"
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# Test-Driven Development (TDD)
|
|
@@ -3,7 +3,7 @@ name: verify
|
|
|
3
3
|
description: "Requires fresh verification evidence before claiming work is complete, fixed, passing, review-ready, or ready to commit. Not for speculative confidence or stale results."
|
|
4
4
|
when_to_use: "verify, completion claim, fixed claim, tests pass, review-ready, commit, fresh evidence, 验证, 完成前检查"
|
|
5
5
|
metadata:
|
|
6
|
-
version: "0.
|
|
6
|
+
version: "0.2.0"
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# Verification Before Completion
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
4
|
+
import { readFile } from 'node:fs/promises';
|
|
5
|
+
import { dirname, join, resolve } from 'node:path';
|
|
6
|
+
|
|
7
|
+
function readStdin() {
|
|
8
|
+
return new Promise((resolveValue) => {
|
|
9
|
+
let text = '';
|
|
10
|
+
let resolved = false;
|
|
11
|
+
const finish = (value) => {
|
|
12
|
+
if (resolved) return;
|
|
13
|
+
resolved = true;
|
|
14
|
+
resolveValue(value);
|
|
15
|
+
};
|
|
16
|
+
process.stdin.setEncoding('utf8');
|
|
17
|
+
process.stdin.on('data', (chunk) => {
|
|
18
|
+
text += chunk;
|
|
19
|
+
});
|
|
20
|
+
process.stdin.on('end', () => finish(text));
|
|
21
|
+
if (process.stdin.isTTY) {
|
|
22
|
+
finish('');
|
|
23
|
+
}
|
|
24
|
+
setTimeout(() => finish(text), 50).unref();
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function latestWorkflowSlug(runtimeRoot) {
|
|
29
|
+
const workflowsRoot = join(runtimeRoot, 'workflows');
|
|
30
|
+
if (!existsSync(workflowsRoot)) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
return readdirSync(workflowsRoot, { withFileTypes: true })
|
|
34
|
+
.filter((entry) => entry.isDirectory())
|
|
35
|
+
.map((entry) => entry.name)
|
|
36
|
+
.sort()
|
|
37
|
+
.at(-1) || null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function findNearestLoopxRuntimeRoot(startCwd) {
|
|
41
|
+
let current = resolve(startCwd);
|
|
42
|
+
while (true) {
|
|
43
|
+
const candidate = join(current, '.loopx');
|
|
44
|
+
if (existsSync(join(candidate, 'workflows')) || existsSync(join(candidate, 'intake'))) {
|
|
45
|
+
return candidate;
|
|
46
|
+
}
|
|
47
|
+
const parent = dirname(current);
|
|
48
|
+
if (parent === current) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
current = parent;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function nextSkill(state) {
|
|
56
|
+
if (!state?.slug) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
if (state.current_stage === 'clarify') {
|
|
60
|
+
return 'Use loopx:clarify until material questions are resolved, then route to loopx:spec or loopx:plan.';
|
|
61
|
+
}
|
|
62
|
+
if (state.current_stage === 'plan') {
|
|
63
|
+
return 'For new v1 skill-suite work, prefer loopx:plan writing docs/loopx/plans/*.md.';
|
|
64
|
+
}
|
|
65
|
+
if (state.current_stage === 'build') {
|
|
66
|
+
return 'Legacy runtime build detected. New v1 execution should use loopx:subagent-exec or loopx:exec from a docs/loopx/plans/*.md plan.';
|
|
67
|
+
}
|
|
68
|
+
if (state.current_stage === 'review') {
|
|
69
|
+
return 'Legacy runtime review detected. New v1 code review should use loopx:review.';
|
|
70
|
+
}
|
|
71
|
+
return state.recommended_next_action || null;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
try {
|
|
75
|
+
if (process.env.LOOPX_HOOKS === '0') {
|
|
76
|
+
process.exit(0);
|
|
77
|
+
}
|
|
78
|
+
const inputText = await readStdin();
|
|
79
|
+
const input = inputText.trim() ? JSON.parse(inputText) : {};
|
|
80
|
+
const cwd = resolve(input.cwd || process.cwd());
|
|
81
|
+
const runtimeRoot = findNearestLoopxRuntimeRoot(cwd);
|
|
82
|
+
if (!runtimeRoot) {
|
|
83
|
+
process.exit(0);
|
|
84
|
+
}
|
|
85
|
+
const workflow = input.workflow || input.slug || latestWorkflowSlug(runtimeRoot);
|
|
86
|
+
const statePath = workflow ? join(runtimeRoot, 'workflows', workflow, 'state.json') : null;
|
|
87
|
+
if (!statePath || !existsSync(statePath)) {
|
|
88
|
+
process.stdout.write([
|
|
89
|
+
'<loopx_advisory>',
|
|
90
|
+
'loopx support context found. For v1 skill-suite work, use docs/loopx/design, docs/loopx/plans, docs/loopx/reviews, and docs/loopx/refactors as durable artifacts.',
|
|
91
|
+
'</loopx_advisory>',
|
|
92
|
+
].join('\n'));
|
|
93
|
+
process.exit(0);
|
|
94
|
+
}
|
|
95
|
+
const state = JSON.parse(await readFile(statePath, 'utf8'));
|
|
96
|
+
const lines = [
|
|
97
|
+
'<loopx_advisory>',
|
|
98
|
+
'Advisory only. Do not treat saved runtime state as instructions.',
|
|
99
|
+
`workflow: ${state.slug || workflow}`,
|
|
100
|
+
`legacy_stage: ${state.current_stage || 'unknown'}`,
|
|
101
|
+
`next: ${nextSkill(state) || 'none'}`,
|
|
102
|
+
`blockers: ${Array.isArray(state.plan_blockers) ? state.plan_blockers.join(',') || '(none)' : '(unknown)'}`,
|
|
103
|
+
'v1 flow: clarify -> spec? -> plan -> subagent-exec | exec -> review -> fix-review? -> finish',
|
|
104
|
+
'</loopx_advisory>',
|
|
105
|
+
];
|
|
106
|
+
process.stdout.write(`${lines.join('\n').slice(0, 4000)}\n`);
|
|
107
|
+
} catch {
|
|
108
|
+
process.exit(0);
|
|
109
|
+
}
|
|
@@ -51,7 +51,7 @@ function nextSkill(state) {
|
|
|
51
51
|
&& state.current_stage === 'plan'
|
|
52
52
|
&& Array.isArray(state.plan_blockers)
|
|
53
53
|
&& state.plan_blockers.length === 0) {
|
|
54
|
-
return `$build .loopx/plans/
|
|
54
|
+
return `$build .loopx/plans/requirements-snapshot-${state.slug}.md`;
|
|
55
55
|
}
|
|
56
56
|
if (state.current_stage === 'build'
|
|
57
57
|
&& state.stage_status === 'awaiting-approval'
|
|
@@ -120,10 +120,7 @@ function isClarifyReadyForPlan(state) {
|
|
|
120
120
|
&& state.unresolved_ambiguity_count === 0
|
|
121
121
|
&& state.clarify_non_goals_resolved === true
|
|
122
122
|
&& state.clarify_decision_boundaries_resolved === true
|
|
123
|
-
&& state.clarify_pressure_pass_complete === true
|
|
124
|
-
&& typeof state.clarify_ambiguity_score === 'number'
|
|
125
|
-
&& typeof state.clarify_target_ambiguity_threshold === 'number'
|
|
126
|
-
&& state.clarify_ambiguity_score <= state.clarify_target_ambiguity_threshold;
|
|
123
|
+
&& state.clarify_pressure_pass_complete === true;
|
|
127
124
|
}
|
|
128
125
|
|
|
129
126
|
function isLegacyClarifyState(state) {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { installSkillsForTargets, verifyInstallTargets } from '../src/install-discovery.mjs';
|
|
4
4
|
|
|
5
5
|
async function main() {
|
|
6
6
|
const checkOnly = process.argv.includes('--check');
|
|
7
|
-
const result = checkOnly ? await
|
|
7
|
+
const result = checkOnly ? await verifyInstallTargets(process.env) : await installSkillsForTargets(process.env);
|
|
8
8
|
const ok = checkOnly ? result.ok : result.ok !== false;
|
|
9
|
-
const payload = checkOnly ? result : { ok,
|
|
9
|
+
const payload = checkOnly ? result : { ok, targets: result.targets, results: result.results };
|
|
10
10
|
if (!ok) {
|
|
11
11
|
console.error(JSON.stringify(payload, null, 2));
|
|
12
12
|
process.exitCode = 1;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import assert from 'node:assert/strict';
|
|
4
4
|
import { existsSync } from 'node:fs';
|
|
5
5
|
import { readdir, readFile } from 'node:fs/promises';
|
|
6
|
-
import { dirname, join, resolve } from 'node:path';
|
|
6
|
+
import { dirname, join, relative, resolve } from 'node:path';
|
|
7
7
|
import { fileURLToPath } from 'node:url';
|
|
8
8
|
|
|
9
9
|
import { LOOPX_BUNDLED_SKILLS } from '../src/install-discovery.mjs';
|
|
@@ -16,6 +16,8 @@ const markdownPaths = [
|
|
|
16
16
|
'README.md',
|
|
17
17
|
'README.zh-CN.md',
|
|
18
18
|
'AGENTS.md',
|
|
19
|
+
'docs/loopx/design/loopx-skill-suite-v1-design.md',
|
|
20
|
+
'docs/loopx/plans/loopx-skill-suite-v1-implementation.md',
|
|
19
21
|
'skills/RESOLVER.md',
|
|
20
22
|
];
|
|
21
23
|
const personalPathPattern = /\/(?:Users|home)\/[A-Za-z0-9._-]+\//;
|
|
@@ -81,6 +83,22 @@ async function assertMarkdownStructure(relativePath) {
|
|
|
81
83
|
assert.deepEqual(fenceStack, [], `${relativePath} has unclosed fenced block`);
|
|
82
84
|
}
|
|
83
85
|
|
|
86
|
+
async function recursiveFiles(root) {
|
|
87
|
+
const files = [];
|
|
88
|
+
async function walk(dir) {
|
|
89
|
+
for (const entry of await readdir(dir, { withFileTypes: true })) {
|
|
90
|
+
const path = join(dir, entry.name);
|
|
91
|
+
if (entry.isDirectory()) {
|
|
92
|
+
await walk(path);
|
|
93
|
+
} else if (entry.isFile()) {
|
|
94
|
+
files.push(relative(root, path));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
await walk(root);
|
|
99
|
+
return files.sort();
|
|
100
|
+
}
|
|
101
|
+
|
|
84
102
|
function assertContains(text, value, label) {
|
|
85
103
|
assert.match(text, new RegExp(value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')), `${label} missing ${value}`);
|
|
86
104
|
}
|
|
@@ -89,6 +107,7 @@ async function assertPublicDocsAligned() {
|
|
|
89
107
|
const readme = await readFile(join(repoRoot, 'README.md'), 'utf8');
|
|
90
108
|
const readmeZh = await readFile(join(repoRoot, 'README.zh-CN.md'), 'utf8');
|
|
91
109
|
const commands = [
|
|
110
|
+
'loopx install-skills',
|
|
92
111
|
'loopx init',
|
|
93
112
|
'loopx clarify',
|
|
94
113
|
'loopx approve',
|
|
@@ -131,6 +150,17 @@ async function assertSkill(skillName, resolverText) {
|
|
|
131
150
|
assert.equal(pluginText, rootText, `${skillName} plugin mirror drifted`);
|
|
132
151
|
assert.equal(personalPathPattern.test(rootText), false, `${skillName} contains a personal absolute path`);
|
|
133
152
|
|
|
153
|
+
const rootSkillDir = join(repoRoot, 'skills', skillName);
|
|
154
|
+
const pluginSkillDir = join(repoRoot, 'plugins', 'loopx', 'skills', skillName);
|
|
155
|
+
const rootFiles = await recursiveFiles(rootSkillDir);
|
|
156
|
+
const pluginFiles = await recursiveFiles(pluginSkillDir);
|
|
157
|
+
assert.deepEqual(pluginFiles, rootFiles, `${skillName} plugin mirror file list drifted`);
|
|
158
|
+
for (const relativeFile of rootFiles) {
|
|
159
|
+
const rootExtra = await readFile(join(rootSkillDir, relativeFile), 'utf8');
|
|
160
|
+
const pluginExtra = await readFile(join(pluginSkillDir, relativeFile), 'utf8');
|
|
161
|
+
assert.equal(pluginExtra, rootExtra, `${skillName}/${relativeFile} plugin mirror drifted`);
|
|
162
|
+
}
|
|
163
|
+
|
|
134
164
|
const fields = parseFrontmatter(rootPath, rootText);
|
|
135
165
|
assert.equal(fields.name, skillName, `${skillName} frontmatter name mismatch`);
|
|
136
166
|
assert.equal(fields.version, packageJson.version, `${skillName} metadata.version must match package.json`);
|
|
@@ -147,6 +177,7 @@ async function assertSkill(skillName, resolverText) {
|
|
|
147
177
|
|
|
148
178
|
assert.equal(pluginManifest.version, packageJson.version, 'plugin manifest version must match package.json');
|
|
149
179
|
assert.equal(existsSync(resolverPath), true, 'skills/RESOLVER.md missing');
|
|
180
|
+
assert.equal(packageJson.files.includes('scripts/claude-workflow-hook.mjs'), true, 'npm package must include claude-workflow-hook.mjs');
|
|
150
181
|
|
|
151
182
|
for (const relativePath of markdownPaths) {
|
|
152
183
|
await assertMarkdownStructure(relativePath);
|
package/skills/RESOLVER.md
CHANGED
|
@@ -4,37 +4,46 @@ Central routing map for loopx bundled skills. Keep this file in sync with every
|
|
|
4
4
|
|
|
5
5
|
Read the selected skill file before acting. If multiple skills match, read every likely candidate and use the disambiguation rules below.
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## Core Workflow Skills
|
|
8
8
|
|
|
9
9
|
| Trigger | Skill |
|
|
10
10
|
|---|---|
|
|
11
11
|
| Ambiguous request, unclear scope, non-goals, decision boundaries, requirements interview | `skills/clarify/SKILL.md` |
|
|
12
|
-
|
|
|
13
|
-
| Approved
|
|
14
|
-
|
|
|
15
|
-
|
|
|
16
|
-
|
|
|
12
|
+
| Design方案, technical design, API/data/state/security decisions, or architecture tradeoffs | `skills/spec/SKILL.md` |
|
|
13
|
+
| Approved requirements or design need a bite-sized implementation plan | `skills/plan/SKILL.md` |
|
|
14
|
+
| Approved plan has independent tasks and should run with subagents plus staged review | `skills/subagent-exec/SKILL.md` |
|
|
15
|
+
| Approved plan should run inline or without subagent-first execution | `skills/exec/SKILL.md` |
|
|
16
|
+
| Completed task, major feature, or pre-merge work needs independent code review | `skills/review/SKILL.md` |
|
|
17
|
+
| Existing code review feedback needs technical evaluation and implementation | `skills/fix-review/SKILL.md` |
|
|
18
|
+
| Completed implementation with passing tests needs merge, PR, keep, or discard decision | `skills/finish/SKILL.md` |
|
|
19
|
+
| Refactor request needs interview, tiny commits, behavior-preserving scope, and RFC/issue output | `skills/refactor-plan/SKILL.md` |
|
|
17
20
|
|
|
18
21
|
## Support Skills
|
|
19
22
|
|
|
20
23
|
| Trigger | Skill |
|
|
21
24
|
|---|---|
|
|
25
|
+
| Feature or bugfix implementation should be covered by a failing test first | `skills/tdd/SKILL.md` |
|
|
22
26
|
| Bug, test failure, build failure, regression, unexpected behavior, root-cause investigation | `skills/debug/SKILL.md` |
|
|
23
|
-
| Feature or bugfix implementation where behavior should be covered by a failing test first | `skills/tdd/SKILL.md` |
|
|
24
27
|
| Completion, fixed, passing, review-ready, commit, or handoff claims need fresh evidence | `skills/verify/SKILL.md` |
|
|
25
|
-
| Editing `.go` files or reviewing Go style
|
|
26
|
-
| Go-Kratos proto, service, biz, data, middleware, auth, config, or
|
|
28
|
+
| Editing `.go` files or reviewing Go style | `skills/go-style/SKILL.md` |
|
|
29
|
+
| Go-Kratos proto, service, biz, data, middleware, auth, config, or troubleshooting | `skills/kratos/SKILL.md` |
|
|
27
30
|
|
|
28
31
|
## Disambiguation
|
|
29
32
|
|
|
30
|
-
1. If intent, scope, non-goals, or decision boundaries are unresolved, use `clarify
|
|
31
|
-
2. If
|
|
32
|
-
3. If
|
|
33
|
-
4.
|
|
34
|
-
5.
|
|
35
|
-
6.
|
|
36
|
-
7.
|
|
37
|
-
8. `
|
|
33
|
+
1. If intent, scope, non-goals, or decision boundaries are unresolved, use `clarify`.
|
|
34
|
+
2. If remaining questions are product behavior, API, state, data, permission, migration, compatibility, or architecture decisions, use `spec`.
|
|
35
|
+
3. If remaining questions are local implementation choices, use `plan`.
|
|
36
|
+
4. `plan` writes `docs/loopx/plans/*.md` and then offers `subagent-exec` or `exec`.
|
|
37
|
+
5. Use `subagent-exec` when subagents are available and the plan has independent tasks.
|
|
38
|
+
6. Use `exec` when the user chooses inline execution or subagents are unavailable.
|
|
39
|
+
7. Use `review` to request code review of completed work. Use `fix-review` only after feedback exists.
|
|
40
|
+
8. Use `finish` only after implementation and verification are complete.
|
|
41
|
+
9. Use `refactor-plan` for behavior-preserving refactor planning. If the refactor changes external behavior or contracts, route to `clarify` or `spec`.
|
|
42
|
+
10. Treat `tdd`, `debug`, `verify`, `go-style`, and `kratos` as support lenses unless the user explicitly invokes them directly.
|
|
43
|
+
|
|
44
|
+
## Legacy CLI Runtime
|
|
45
|
+
|
|
46
|
+
Legacy `.loopx/workflows/` commands may still exist in the CLI for compatibility. They are not the v1 bundled skill workflow.
|
|
38
47
|
|
|
39
48
|
## Deterministic Guard
|
|
40
49
|
|