@boyingliu01/xp-gate 0.9.0 → 0.9.2
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/adapters/cpp.sh +3 -3
- package/adapters/dart.sh +2 -2
- package/adapters/flutter.sh +2 -2
- package/adapters/java.sh +4 -4
- package/adapters/kotlin.sh +4 -4
- package/adapters/objectivec.sh +2 -2
- package/adapters/plugins/p3c-java/scripts/install-maven-p3c.sh +3 -3
- package/adapters/plugins/whalecloud-java/scripts/install-maven-whalecloud.sh +3 -3
- package/adapters/powershell.sh +3 -3
- package/adapters/python.sh +2 -2
- package/adapters/shell.sh +3 -3
- package/adapters/swift.sh +2 -2
- package/package.json +1 -1
- package/plugins/claude-code/.claude-plugin/plugin.json +1 -1
- package/plugins/claude-code/skills/admin-template-guidelines/SKILL.md +6 -797
- package/plugins/claude-code/skills/admin-template-guidelines/references/rule-1.md +91 -0
- package/plugins/claude-code/skills/admin-template-guidelines/references/rule-2.md +155 -0
- package/plugins/claude-code/skills/admin-template-guidelines/references/rule-3.md +70 -0
- package/plugins/claude-code/skills/admin-template-guidelines/references/rule-4.md +154 -0
- package/plugins/claude-code/skills/admin-template-guidelines/references/rule-5.md +126 -0
- package/plugins/claude-code/skills/admin-template-guidelines/references/rule-6.md +180 -0
- package/plugins/claude-code/skills/delphi-review/SKILL.md +59 -361
- package/plugins/claude-code/skills/delphi-review/references/orchestrator-dispatch.md +64 -0
- package/plugins/claude-code/skills/delphi-review/references/round-templates.md +67 -0
- package/plugins/claude-code/skills/ralph-loop/SKILL.md +87 -429
- package/plugins/claude-code/skills/ralph-loop/references/components.md +113 -0
- package/plugins/claude-code/skills/ralph-loop/references/workflow-details.md +99 -0
- package/plugins/claude-code/skills/test-specification-alignment/SKILL.md +97 -599
- package/plugins/opencode/package.json +1 -1
- package/plugins/opencode/skills/admin-template-guidelines/SKILL.md +6 -797
- package/plugins/opencode/skills/admin-template-guidelines/references/rule-1.md +91 -0
- package/plugins/opencode/skills/admin-template-guidelines/references/rule-2.md +155 -0
- package/plugins/opencode/skills/admin-template-guidelines/references/rule-3.md +70 -0
- package/plugins/opencode/skills/admin-template-guidelines/references/rule-4.md +154 -0
- package/plugins/opencode/skills/admin-template-guidelines/references/rule-5.md +126 -0
- package/plugins/opencode/skills/admin-template-guidelines/references/rule-6.md +180 -0
- package/plugins/opencode/skills/delphi-review/SKILL.md +59 -361
- package/plugins/opencode/skills/delphi-review/references/orchestrator-dispatch.md +64 -0
- package/plugins/opencode/skills/delphi-review/references/round-templates.md +67 -0
- package/plugins/opencode/skills/ralph-loop/SKILL.md +87 -429
- package/plugins/opencode/skills/ralph-loop/references/components.md +113 -0
- package/plugins/opencode/skills/ralph-loop/references/workflow-details.md +99 -0
- package/plugins/opencode/skills/test-specification-alignment/SKILL.md +97 -599
- package/skills/admin-template-guidelines/SKILL.md +6 -797
- package/skills/admin-template-guidelines/references/rule-1.md +91 -0
- package/skills/admin-template-guidelines/references/rule-2.md +155 -0
- package/skills/admin-template-guidelines/references/rule-3.md +70 -0
- package/skills/admin-template-guidelines/references/rule-4.md +154 -0
- package/skills/admin-template-guidelines/references/rule-5.md +126 -0
- package/skills/admin-template-guidelines/references/rule-6.md +180 -0
- package/skills/delphi-review/SKILL.md +59 -361
- package/skills/delphi-review/references/orchestrator-dispatch.md +64 -0
- package/skills/delphi-review/references/round-templates.md +67 -0
- package/skills/ralph-loop/SKILL.md +87 -429
- package/skills/ralph-loop/references/components.md +113 -0
- package/skills/ralph-loop/references/workflow-details.md +99 -0
- package/skills/test-specification-alignment/SKILL.md +97 -599
- package/plugins/claude-code/skills/ralph-loop/references/components/memory.md +0 -55
- package/plugins/claude-code/skills/ralph-loop/references/components/middleware.md +0 -54
- package/plugins/claude-code/skills/ralph-loop/references/components/skill-invocations.md +0 -39
- package/plugins/claude-code/skills/ralph-loop/references/components/system-prompt.md +0 -24
- package/plugins/claude-code/skills/ralph-loop/references/components/tool-descriptions.md +0 -32
- package/plugins/opencode/skills/ralph-loop/references/components/memory.md +0 -55
- package/plugins/opencode/skills/ralph-loop/references/components/middleware.md +0 -54
- package/plugins/opencode/skills/ralph-loop/references/components/skill-invocations.md +0 -39
- package/plugins/opencode/skills/ralph-loop/references/components/system-prompt.md +0 -24
- package/plugins/opencode/skills/ralph-loop/references/components/tool-descriptions.md +0 -32
- package/skills/ralph-loop/references/components/memory.md +0 -55
- package/skills/ralph-loop/references/components/middleware.md +0 -54
- package/skills/ralph-loop/references/components/skill-invocations.md +0 -39
- package/skills/ralph-loop/references/components/system-prompt.md +0 -24
- package/skills/ralph-loop/references/components/tool-descriptions.md +0 -32
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# Rule 6: HTMX + Alpine Separation — Examples
|
|
2
|
+
|
|
3
|
+
## ❌ 错误示例:HTMX 与 Alpine 混用
|
|
4
|
+
|
|
5
|
+
```nunjucks
|
|
6
|
+
{# admin/views/plans.njk — 反模式 #}
|
|
7
|
+
|
|
8
|
+
{# 使用 Alpine 做服务端请求 — 职责错误 #}
|
|
9
|
+
<div x-data="{ plans: [], loading: false }"
|
|
10
|
+
x-init="loading = true; fetch('/admin/api/plans').then(r => r.json()).then(d => plans = d); loading = false">
|
|
11
|
+
<template x-for="plan in plans" :key="plan.id">
|
|
12
|
+
<div>
|
|
13
|
+
<span x-text="plan.name"></span>
|
|
14
|
+
{# 删除操作使用 Alpine 而非 HTMX — 失去服务端渲染优势 #}
|
|
15
|
+
<button @click="fetch('/admin/plans/' + plan.id, { method: 'DELETE' })
|
|
16
|
+
.then(() => plans = plans.filter(p => p.id !== plan.id))">
|
|
17
|
+
Delete
|
|
18
|
+
</button>
|
|
19
|
+
</div>
|
|
20
|
+
</template>
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
{# HTMX 驱动下拉菜单状态 — 职责错误 #}
|
|
24
|
+
<div hx-get="/admin/plans" hx-swap="innerHTML">
|
|
25
|
+
<button hx-on::after-request="this.nextElementSibling.style.display = 'block'">
|
|
26
|
+
Show Filters
|
|
27
|
+
</button>
|
|
28
|
+
<div style="display: none">
|
|
29
|
+
<input type="text" name="search" placeholder="Search..."
|
|
30
|
+
hx-get="/admin/plans" hx-trigger="keyup changed delay:300ms" />
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## ✅ 正确示例:职责分离
|
|
36
|
+
|
|
37
|
+
```nunjucks
|
|
38
|
+
{# admin/views/plans.njk #}
|
|
39
|
+
|
|
40
|
+
{# 整体布局与内容列表由 HTMX 驱动 #}
|
|
41
|
+
<div id="plans-content" hx-boost="true">
|
|
42
|
+
<div class="header-bar" x-data="{ showFilters: false }">
|
|
43
|
+
<h1>Interview Plans</h1>
|
|
44
|
+
|
|
45
|
+
{# 下拉菜单状态由 Alpine 管理 #}
|
|
46
|
+
<button type="button" @click="showFilters = !showFilters"
|
|
47
|
+
:class="{ 'active': showFilters }">
|
|
48
|
+
Filters
|
|
49
|
+
</button>
|
|
50
|
+
|
|
51
|
+
{# Alpine 控制本地显示/隐藏 #}
|
|
52
|
+
<div x-show="showFilters" x-transition class="filter-panel">
|
|
53
|
+
{# 搜索输入通过 HTMX 触发服务端请求 #}
|
|
54
|
+
<input type="text" name="search" placeholder="Search plans..."
|
|
55
|
+
hx-get="/admin/plans"
|
|
56
|
+
hx-target="#plans-list"
|
|
57
|
+
hx-trigger="keyup changed delay:300ms"
|
|
58
|
+
hx-indicator=".search-spinner" />
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
{# 列表内容完全由 HTMX 服务端渲染 #}
|
|
63
|
+
<div id="plans-list">
|
|
64
|
+
{% for plan in plans %}
|
|
65
|
+
<div class="plan-card" id="plan-{{ plan.id }}">
|
|
66
|
+
<h3>{{ plan.name }}</h3>
|
|
67
|
+
<p>Status: {{ plan.status | upper }}</p>
|
|
68
|
+
<p>Completion: {{ plan.completionRate | round(1) }}%</p>
|
|
69
|
+
|
|
70
|
+
<div class="actions">
|
|
71
|
+
{# 删除操作通过 HTMX 提交,服务端响应更新 DOM #}
|
|
72
|
+
<button class="btn-danger"
|
|
73
|
+
hx-delete="/admin/plans/{{ plan.id }}"
|
|
74
|
+
hx-target="#plan-{{ plan.id }}"
|
|
75
|
+
hx-swap="outerHTML"
|
|
76
|
+
hx-confirm="Are you sure you want to delete this plan?"
|
|
77
|
+
x-data="{ deleting: false }"
|
|
78
|
+
hx-on::before-request="deleting = true"
|
|
79
|
+
hx-on::after-request="deleting = false">
|
|
80
|
+
<span x-show="!deleting">Delete</span>
|
|
81
|
+
<span x-show="deleting" class="spinner">Deleting...</span>
|
|
82
|
+
</button>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
{% endfor %}
|
|
86
|
+
</div>
|
|
87
|
+
</div>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
```nunjucks
|
|
91
|
+
{# admin/views/modals/confirm-delete.njk — Modal 由 Alpine 管理 #}
|
|
92
|
+
|
|
93
|
+
<div x-data="{ open: false, targetId: null, targetName: '' }"
|
|
94
|
+
@open-modal.window="open = true; targetId = $event.detail.id; targetName = $event.detail.name"
|
|
95
|
+
x-show="open"
|
|
96
|
+
x-cloak
|
|
97
|
+
class="modal-backdrop"
|
|
98
|
+
@click.self="open = false">
|
|
99
|
+
|
|
100
|
+
<div class="modal-content" x-transition>
|
|
101
|
+
<h2>Confirm Delete</h2>
|
|
102
|
+
<p>Are you sure you want to delete "<span x-text="targetName"></span>"?</p>
|
|
103
|
+
|
|
104
|
+
<div class="modal-actions">
|
|
105
|
+
<button @click="open = false">Cancel</button>
|
|
106
|
+
|
|
107
|
+
{# 真正的删除操作通过 HTMX 提交 #}
|
|
108
|
+
<button class="btn-danger"
|
|
109
|
+
hx-delete="/admin/plans/"
|
|
110
|
+
hx-vals='js:{ id: targetId }'
|
|
111
|
+
hx-target="#plans-list"
|
|
112
|
+
@click="open = false">
|
|
113
|
+
Confirm Delete
|
|
114
|
+
</button>
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
</div>
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
```nunjucks
|
|
121
|
+
{# admin/views/templates/edit.njk — 表单字段本地验证由 Alpine 管理 #}
|
|
122
|
+
|
|
123
|
+
<form x-data="{
|
|
124
|
+
name: '',
|
|
125
|
+
nameError: '',
|
|
126
|
+
content: '',
|
|
127
|
+
contentError: '',
|
|
128
|
+
get isValid() {
|
|
129
|
+
return this.name.length > 0 && this.content.length > 0 && !this.nameError && !this.contentError;
|
|
130
|
+
},
|
|
131
|
+
validateName(value) {
|
|
132
|
+
this.name = value;
|
|
133
|
+
this.nameError = value.length < 3 ? 'Name must be at least 3 characters.' : '';
|
|
134
|
+
},
|
|
135
|
+
validateContent(value) {
|
|
136
|
+
this.content = value;
|
|
137
|
+
this.contentError = value.trim().length === 0 ? 'Content cannot be empty.' : '';
|
|
138
|
+
}
|
|
139
|
+
}" hx-post="/admin/templates/{{ template.id }}"
|
|
140
|
+
hx-target="#form-result"
|
|
141
|
+
hx-swap="innerHTML"
|
|
142
|
+
hx-on::before-request="if (!isValid) { $event.preventDefault(); }">
|
|
143
|
+
|
|
144
|
+
<div class="form-group">
|
|
145
|
+
<label for="name">Template Name</label>
|
|
146
|
+
<input type="text" id="name" name="name"
|
|
147
|
+
x-model="name"
|
|
148
|
+
@input="validateName(name)"
|
|
149
|
+
:class="{ 'error': nameError }"
|
|
150
|
+
value="{{ template.name }}" />
|
|
151
|
+
<span x-show="nameError" x-text="nameError" class="field-error"></span>
|
|
152
|
+
</div>
|
|
153
|
+
|
|
154
|
+
<div class="form-group">
|
|
155
|
+
<label for="content">Template Content</label>
|
|
156
|
+
<textarea id="content" name="content" rows="20"
|
|
157
|
+
x-model="content"
|
|
158
|
+
@input="validateContent(content)"
|
|
159
|
+
:class="{ 'error': contentError }">{{ template.content }}</textarea>
|
|
160
|
+
<span x-show="contentError" x-text="contentError" class="field-error"></span>
|
|
161
|
+
</div>
|
|
162
|
+
|
|
163
|
+
<div class="form-actions">
|
|
164
|
+
<button type="submit" :disabled="!isValid" class="btn-primary">
|
|
165
|
+
Save Template
|
|
166
|
+
</button>
|
|
167
|
+
<a href="/admin/templates" class="btn-secondary">Cancel</a>
|
|
168
|
+
</div>
|
|
169
|
+
</form>
|
|
170
|
+
|
|
171
|
+
{# HTMX 响应结果区域 #}
|
|
172
|
+
<div id="form-result"></div>
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## 分离原则
|
|
176
|
+
|
|
177
|
+
1. **HTMX 是服务端与 DOM 之间的桥梁** — 所有数据变更、页面导航、内容更新必须通过 HTMX
|
|
178
|
+
2. **Alpine 是组件状态的管理者** — 只管理不需要服务端参与的 UI 状态(开关、显隐、验证)
|
|
179
|
+
3. **HTMX 属性不应操作 DOM 状态** — `hx-on::after-request` 里不应出现 `element.style.display`
|
|
180
|
+
4. **Alpine 方法不应发起 fetch** — `@click="fetch('/api/...')"` 是反模式,应用 `hx-get/hx-post`
|