papermc-skill 1.1.0 → 1.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/.cursor/rules/paper-plugin-dev.mdc +23 -0
- package/.cursorrules +6 -0
- package/.paseo/rules.md +8 -0
- package/.pi/rules.md +8 -0
- package/.windsurfrules +7 -0
- package/CHANGELOG.md +31 -0
- package/CLAUDE.md +27 -0
- package/CODEX.md +12 -0
- package/DEEPSEEK.md +18 -0
- package/README.md +66 -26
- package/bin/cli.js +461 -36
- package/docs/12-data-components-and-display-entities.md +264 -0
- package/docs/13-multi-agent-system-and-tooling.md +90 -0
- package/package.json +16 -4
- package/skills/paper-plugin-dev/SKILL.md +144 -110
- package/templates/paper-modern-template/.gradle/9.7.1/checksums/checksums.lock +0 -0
- package/templates/paper-modern-template/.gradle/9.7.1/checksums/md5-checksums.bin +0 -0
- package/templates/paper-modern-template/.gradle/9.7.1/checksums/sha1-checksums.bin +0 -0
- package/templates/paper-modern-template/.gradle/9.7.1/executionHistory/executionHistory.bin +0 -0
- package/templates/paper-modern-template/.gradle/9.7.1/executionHistory/executionHistory.lock +0 -0
- package/templates/paper-modern-template/.gradle/9.7.1/fileHashes/fileHashes.bin +0 -0
- package/templates/paper-modern-template/.gradle/9.7.1/fileHashes/fileHashes.lock +0 -0
- package/templates/paper-modern-template/.gradle/9.7.1/kotlin-dsl-plugin-entries/kotlin-dsl-plugin-entries.lock +0 -0
- package/templates/paper-modern-template/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/templates/paper-modern-template/.gradle/buildOutputCleanup/cache.properties +1 -1
- package/templates/paper-modern-template/build/tmp/compileJava/previous-compilation-data.bin +0 -0
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
# 12. Modern Data Components & Display Entities (MC 1.20.5 — 26.x)
|
|
2
|
+
|
|
3
|
+
## 📌 Paradigm Shift: From Legacy NBT & ItemMeta to Data Components
|
|
4
|
+
|
|
5
|
+
Beginning with **Minecraft 1.20.5** and continuing through **Minecraft 1.21+ and 26.x**, Mojang completely overhauled the item stack architecture.
|
|
6
|
+
- **Legacy NBT tags on ItemStacks are gone**.
|
|
7
|
+
- In their place is the **Data Component System**: a strictly-typed, immutable, performant, and schema-validated component pipeline.
|
|
8
|
+
- Paper exposes this via `io.papermc.paper.datacomponent.DataComponentTypes` and modern item manipulation methods directly on `ItemStack`.
|
|
9
|
+
|
|
10
|
+
> [!IMPORTANT]
|
|
11
|
+
> Never use legacy `net.minecraft.nbt` or reflection to modify item properties in modern Paper plugins. Use `ItemStack#setData(DataComponentType, Object)` or `ItemStack#getData(DataComponentType)`.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 🛠️ 1. Modern Data Components in Action
|
|
16
|
+
|
|
17
|
+
### A. Modifying Data Components Directly on ItemStack
|
|
18
|
+
Paper allows direct mutation of components without cloning `ItemMeta`:
|
|
19
|
+
|
|
20
|
+
```java
|
|
21
|
+
package com.example.paperplugin.item;
|
|
22
|
+
|
|
23
|
+
import io.papermc.paper.datacomponent.DataComponentTypes;
|
|
24
|
+
import io.papermc.paper.datacomponent.item.CustomModelData;
|
|
25
|
+
import io.papermc.paper.datacomponent.item.FoodProperties;
|
|
26
|
+
import io.papermc.paper.datacomponent.item.ItemLore;
|
|
27
|
+
import io.papermc.paper.datacomponent.item.Tool;
|
|
28
|
+
import net.kyori.adventure.text.Component;
|
|
29
|
+
import net.kyori.adventure.text.format.NamedTextColor;
|
|
30
|
+
import net.kyori.adventure.text.format.TextDecoration;
|
|
31
|
+
import org.bukkit.Material;
|
|
32
|
+
import org.bukkit.inventory.ItemStack;
|
|
33
|
+
|
|
34
|
+
import java.util.List;
|
|
35
|
+
|
|
36
|
+
public final class ModernItemFactory {
|
|
37
|
+
|
|
38
|
+
public static ItemStack createMythicBlade() {
|
|
39
|
+
ItemStack blade = ItemStack.of(Material.NETHERITE_SWORD);
|
|
40
|
+
|
|
41
|
+
// 1. Direct Item Name (styled with MiniMessage/Adventure)
|
|
42
|
+
blade.setData(DataComponentTypes.ITEM_NAME, Component.text("Voidreaver Blade", NamedTextColor.LIGHT_PURPLE, TextDecoration.BOLD));
|
|
43
|
+
|
|
44
|
+
// 2. Direct Item Lore
|
|
45
|
+
blade.setData(DataComponentTypes.LORE, ItemLore.lore(List.of(
|
|
46
|
+
Component.text("Forged in the heart of the End dimension.", NamedTextColor.GRAY),
|
|
47
|
+
Component.empty(),
|
|
48
|
+
Component.text("⚡ Right-click to discharge void kinetic energy.", NamedTextColor.DARK_PURPLE)
|
|
49
|
+
)));
|
|
50
|
+
|
|
51
|
+
// 3. Custom Model Data (Modern float/flag/string/int support)
|
|
52
|
+
blade.setData(DataComponentTypes.CUSTOM_MODEL_DATA, CustomModelData.customModelData()
|
|
53
|
+
.addFloat(1.5f)
|
|
54
|
+
.addFlag(true)
|
|
55
|
+
.addString("mythic_blade_tier_3")
|
|
56
|
+
.build()
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
// 4. Custom Max Stack Size
|
|
60
|
+
blade.setData(DataComponentTypes.MAX_STACK_SIZE, 1);
|
|
61
|
+
|
|
62
|
+
// 5. Enchantment Glint Override (Glow without dummy enchantments!)
|
|
63
|
+
blade.setData(DataComponentTypes.ENCHANTMENT_GLINT_OVERRIDE, true);
|
|
64
|
+
|
|
65
|
+
// 6. Unbreakable Flag
|
|
66
|
+
blade.setData(DataComponentTypes.UNBREAKABLE, true);
|
|
67
|
+
|
|
68
|
+
return blade;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
public static ItemStack createEnchantedGoldenBerry() {
|
|
72
|
+
ItemStack berry = ItemStack.of(Material.SWEET_BERRIES);
|
|
73
|
+
|
|
74
|
+
// Set custom edible Food Properties on ANY item!
|
|
75
|
+
bladeLikeFood(berry);
|
|
76
|
+
|
|
77
|
+
return berry;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
private static void bladeLikeFood(ItemStack item) {
|
|
81
|
+
item.setData(DataComponentTypes.FOOD, FoodProperties.food()
|
|
82
|
+
.nutrition(6)
|
|
83
|
+
.saturation(10.0f)
|
|
84
|
+
.canAlwaysEat() // Can eat even when hunger bar is full
|
|
85
|
+
.build()
|
|
86
|
+
);
|
|
87
|
+
item.setData(DataComponentTypes.ITEM_NAME, Component.text("Aetheria Nectar Berry", NamedTextColor.GOLD));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 🎭 2. Display Entities: Zero-Lag Visual FX & Holograms
|
|
95
|
+
|
|
96
|
+
In legacy plugins, floating text and custom visuals required invisible `ArmorStand` entities.
|
|
97
|
+
**Armor stands are notoriously laggy**: they tick gravity, collisions, equipment slots, and poses every server tick.
|
|
98
|
+
|
|
99
|
+
**Display Entities** (`TextDisplay`, `ItemDisplay`, `BlockDisplay`) introduced in modern Minecraft are:
|
|
100
|
+
1. **Zero-Tick Lag**: Display entities do not have AI or physics ticking loops.
|
|
101
|
+
2. **Smooth Interpolation**: The Minecraft client natively interpolates translation, rotation, and scale at full client framerate (60-240 FPS).
|
|
102
|
+
3. **Billboarding**: Automatic camera tracking (`CENTER`, `VERTICAL`, `HORIZONTAL`).
|
|
103
|
+
|
|
104
|
+
### Smooth Matrix Transformations (`org.joml.Matrix4f`)
|
|
105
|
+
Paper integrates the high-performance **JOML** (Java OpenGL Math Library) for 3D transformations.
|
|
106
|
+
|
|
107
|
+
```java
|
|
108
|
+
package com.example.paperplugin.display;
|
|
109
|
+
|
|
110
|
+
import net.kyori.adventure.text.Component;
|
|
111
|
+
import net.kyori.adventure.text.format.NamedTextColor;
|
|
112
|
+
import net.kyori.adventure.text.format.TextDecoration;
|
|
113
|
+
import org.bukkit.Color;
|
|
114
|
+
import org.bukkit.Location;
|
|
115
|
+
import org.bukkit.Material;
|
|
116
|
+
import org.bukkit.entity.Display;
|
|
117
|
+
import org.bukkit.entity.ItemDisplay;
|
|
118
|
+
import org.bukkit.entity.TextDisplay;
|
|
119
|
+
import org.bukkit.inventory.ItemStack;
|
|
120
|
+
import org.bukkit.util.Transformation;
|
|
121
|
+
import org.joml.AxisAngle4f;
|
|
122
|
+
import org.joml.Vector3f;
|
|
123
|
+
|
|
124
|
+
public final class HologramManager {
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Spawns a floating holographic sign with smooth client-side interpolation.
|
|
128
|
+
*/
|
|
129
|
+
public static TextDisplay spawnFloatingTitle(Location loc, Component text) {
|
|
130
|
+
return loc.getWorld().spawn(loc, TextDisplay.class, display -> {
|
|
131
|
+
display.text(text);
|
|
132
|
+
display.setBillboard(Display.Billboard.CENTER); // Always faces player
|
|
133
|
+
display.setDefaultBackground(false);
|
|
134
|
+
display.setBackgroundColor(Color.fromARGB(140, 15, 15, 25));
|
|
135
|
+
display.setShadowed(true);
|
|
136
|
+
display.setSeeThrough(false);
|
|
137
|
+
|
|
138
|
+
// Display view distance
|
|
139
|
+
display.setViewRange(0.8f);
|
|
140
|
+
|
|
141
|
+
// Initial scale & position transformation
|
|
142
|
+
Transformation transform = new Transformation(
|
|
143
|
+
new Vector3f(0f, 0f, 0f), // Translation
|
|
144
|
+
new AxisAngle4f(0f, 0f, 1f, 0f), // Left rotation
|
|
145
|
+
new Vector3f(1.2f, 1.2f, 1.2f), // Scale (120%)
|
|
146
|
+
new AxisAngle4f(0f, 0f, 1f, 0f) // Right rotation
|
|
147
|
+
);
|
|
148
|
+
display.setTransformation(transform);
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Spawns a spinning, floating 3D item icon above a pedestal.
|
|
154
|
+
*/
|
|
155
|
+
public static ItemDisplay spawnRotatingPedestalItem(Location loc, ItemStack item) {
|
|
156
|
+
return loc.getWorld().spawn(loc, ItemDisplay.class, display -> {
|
|
157
|
+
display.setItemStack(item);
|
|
158
|
+
display.setItemDisplayTransform(ItemDisplay.ItemDisplayTransform.GROUND);
|
|
159
|
+
display.setBillboard(Display.Billboard.FIXED);
|
|
160
|
+
|
|
161
|
+
// Set up client-side 20-tick smooth interpolation
|
|
162
|
+
display.setInterpolationDuration(20);
|
|
163
|
+
display.setInterpolationDelay(0);
|
|
164
|
+
|
|
165
|
+
// Initial transformation
|
|
166
|
+
Transformation initial = new Transformation(
|
|
167
|
+
new Vector3f(0f, 0.5f, 0f),
|
|
168
|
+
new AxisAngle4f(0f, 0f, 1f, 0f),
|
|
169
|
+
new Vector3f(1.5f, 1.5f, 1.5f),
|
|
170
|
+
new AxisAngle4f(0f, 0f, 1f, 0f)
|
|
171
|
+
);
|
|
172
|
+
display.setTransformation(initial);
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Smoothly rotates the display entity over time using client interpolation.
|
|
178
|
+
*/
|
|
179
|
+
public static void rotateDisplaySmoothly(Display display, float angleRadians, int durationTicks) {
|
|
180
|
+
display.setInterpolationDuration(durationTicks);
|
|
181
|
+
display.setInterpolationDelay(0);
|
|
182
|
+
|
|
183
|
+
Transformation current = display.getTransformation();
|
|
184
|
+
Transformation next = new Transformation(
|
|
185
|
+
current.getTranslation(),
|
|
186
|
+
new AxisAngle4f(angleRadians, 0f, 1f, 0f), // Rotate around Y axis
|
|
187
|
+
current.getScale(),
|
|
188
|
+
current.getRightRotation()
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
display.setTransformation(next);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## ⚡ 3. 1.21 Tricky Trials & Mace Combat Kinematics
|
|
199
|
+
|
|
200
|
+
Minecraft 1.21 introduced the **Mace**, **Wind Charges**, and dynamic physics combat mechanics.
|
|
201
|
+
|
|
202
|
+
### Mace Kinetic Smash Mechanics
|
|
203
|
+
The Mace scales damage dynamically based on fall distance, resetting the attacker's fall distance upon a successful hit:
|
|
204
|
+
|
|
205
|
+
```java
|
|
206
|
+
package com.example.paperplugin.combat;
|
|
207
|
+
|
|
208
|
+
import net.kyori.adventure.text.Component;
|
|
209
|
+
import net.kyori.adventure.text.format.NamedTextColor;
|
|
210
|
+
import org.bukkit.Location;
|
|
211
|
+
import org.bukkit.Material;
|
|
212
|
+
import org.bukkit.Particle;
|
|
213
|
+
import org.bukkit.Sound;
|
|
214
|
+
import org.bukkit.entity.LivingEntity;
|
|
215
|
+
import org.bukkit.entity.Player;
|
|
216
|
+
import org.bukkit.event.EventHandler;
|
|
217
|
+
import org.bukkit.event.EventPriority;
|
|
218
|
+
import org.bukkit.event.Listener;
|
|
219
|
+
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
|
220
|
+
import org.bukkit.util.Vector;
|
|
221
|
+
|
|
222
|
+
public final class ModernCombatListener implements Listener {
|
|
223
|
+
|
|
224
|
+
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
|
225
|
+
public void onMaceSmash(EntityDamageByEntityEvent event) {
|
|
226
|
+
if (!(event.getDamager() instanceof Player attacker)) return;
|
|
227
|
+
if (!(event.getEntity() instanceof LivingEntity victim)) return;
|
|
228
|
+
|
|
229
|
+
// Verify weapon
|
|
230
|
+
if (attacker.getInventory().getItemInMainHand().getType() != Material.MACE) return;
|
|
231
|
+
|
|
232
|
+
float fallDistance = attacker.getFallDistance();
|
|
233
|
+
if (fallDistance > 1.5f) {
|
|
234
|
+
// Smash attack succeeded!
|
|
235
|
+
double bonusDamage = Math.min(fallDistance * 3.5, 40.0); // Safe numeric cap
|
|
236
|
+
event.setDamage(event.getDamage() + bonusDamage);
|
|
237
|
+
|
|
238
|
+
Location hitLoc = victim.getLocation();
|
|
239
|
+
|
|
240
|
+
// Spawn modern Tricky Trials visual & acoustic feedback
|
|
241
|
+
hitLoc.getWorld().spawnParticle(Particle.TRIAL_SPAWNER_DETECTION, hitLoc.add(0, 0.5, 0), 25, 0.4, 0.2, 0.4, 0.05);
|
|
242
|
+
hitLoc.getWorld().playSound(hitLoc, Sound.ITEM_MACE_SMASH_GROUND, 1.2f, 1.0f);
|
|
243
|
+
|
|
244
|
+
// Produce kinetic radial shockwave knockback on nearby hostile entities
|
|
245
|
+
hitLoc.getWorld().getNearbyLivingEntities(hitLoc, 4.0, e -> !e.equals(attacker) && !e.equals(victim))
|
|
246
|
+
.forEach(nearby -> {
|
|
247
|
+
Vector impulse = nearby.getLocation().toVector().subtract(hitLoc.toVector()).normalize().multiply(1.2).setY(0.4);
|
|
248
|
+
nearby.setVelocity(impulse);
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
attacker.sendActionBar(Component.text("⚡ KINETIC SMASH: +" + String.format("%.1f", bonusDamage) + " DMG", NamedTextColor.GOLD));
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## 🛡️ Best Practices & Gotchas
|
|
260
|
+
|
|
261
|
+
1. **Never Cast Data Components**: Always check `itemStack.hasData(DataComponentTypes.XXX)` before reading `itemStack.getData(DataComponentTypes.XXX)`.
|
|
262
|
+
2. **Clean Display Entity Lifecycles**: When removing holograms, always invoke `display.remove()` and clean up stored entity UUIDs. Never store `TextDisplay` references in static collections.
|
|
263
|
+
3. **JOML Thread Safety**: `Matrix4f`, `Vector3f`, and `Transformation` are value objects. Create them locally on demand rather than sharing mutable instances across async threads.
|
|
264
|
+
4. **Folia Compatibility**: Always execute `world.spawn(loc, Display.class, ...)` on the Folia region scheduler corresponding to `loc`.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# 13. Multi-Agent System & Universal AI Tooling Setup
|
|
2
|
+
|
|
3
|
+
Modern Minecraft plugin engineering demands high precision, zero memory leaks, thread safety across Folia regions, and exploit-proof business logic.
|
|
4
|
+
**PaperMC Skill** is designed to work seamlessly as a universal agentic skill across all premier AI coding platforms:
|
|
5
|
+
|
|
6
|
+
- 🌌 **Antigravity / agy** (Google Antigravity & AGY CLI)
|
|
7
|
+
- 🧠 **Claude Code** (Anthropic)
|
|
8
|
+
- ⚡ **OpenAI Codex / Codex CLI**
|
|
9
|
+
- 🖱️ **Cursor IDE**
|
|
10
|
+
- 🐋 **DeepSeek Harness**
|
|
11
|
+
- 🧭 **Paseo**
|
|
12
|
+
- 🥧 **pi.dev**
|
|
13
|
+
- 🏄 **Windsurf IDE**
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 🚀 One-Command Universal Installation
|
|
18
|
+
|
|
19
|
+
Install the PaperMC development skill into any agent environment using the zero-dependency CLI:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Interactive Mode (choose your target agent)
|
|
23
|
+
npx papermc-skill install-skill
|
|
24
|
+
|
|
25
|
+
# Install globally to all supported agent configurations
|
|
26
|
+
npx papermc-skill install-skill --all
|
|
27
|
+
|
|
28
|
+
# Target a specific AI Agent
|
|
29
|
+
npx papermc-skill install-skill --agent agy # Antigravity (~/.gemini/config/skills)
|
|
30
|
+
npx papermc-skill install-skill --agent claude # Claude Code (~/.claude & CLAUDE.md)
|
|
31
|
+
npx papermc-skill install-skill --agent codex # OpenAI Codex (~/.codex & CODEX.md)
|
|
32
|
+
npx papermc-skill install-skill --agent cursor # Cursor (.cursor/rules & .cursorrules)
|
|
33
|
+
npx papermc-skill install-skill --agent deepseek # DeepSeek Harness (~/.deepseek & DEEPSEEK.md)
|
|
34
|
+
npx papermc-skill install-skill --agent paseo # Paseo (~/.paseo & .paseo/rules.md)
|
|
35
|
+
npx papermc-skill install-skill --agent pi # pi.dev (~/.pi & .pi/rules.md)
|
|
36
|
+
npx papermc-skill install-skill --agent windsurf # Windsurf (.windsurfrules)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 🤖 Detailed Agent Configuration Guidelines
|
|
42
|
+
|
|
43
|
+
### 1. Google Antigravity / agy CLI
|
|
44
|
+
- **Global Path**: `~/.gemini/config/skills/paper-plugin-dev/`
|
|
45
|
+
- **Workspace Path**: `.agents/skills/paper-plugin-dev/`
|
|
46
|
+
- **Behavior**: Antigravity automatically indexes `SKILL.md` in its semantic agent registry. When working on any repository with Java, Gradle, or `paper-plugin.yml`, Antigravity activates the skill to enforce Folia threading rules, MiniMessage color parsing, and exploit prevention.
|
|
47
|
+
|
|
48
|
+
### 2. Claude Code (Anthropic)
|
|
49
|
+
- **Local Rule File**: `CLAUDE.md` in workspace root.
|
|
50
|
+
- **Global Skill Directory**: `~/.claude/skills/paper-plugin-dev/`
|
|
51
|
+
- **Claude Code Invocation**:
|
|
52
|
+
Claude Code reads `CLAUDE.md` upon session startup. The file instructs Claude to:
|
|
53
|
+
1. Ban legacy `ChatColor` and `org.bukkit.scheduler.BukkitRunnable`.
|
|
54
|
+
2. Implement `io.papermc.paper.threadedregions.scheduler.RegionScheduler` on Folia.
|
|
55
|
+
3. Validate all economy / number arguments against NaN and infinite numbers.
|
|
56
|
+
4. Run `npx papermc-skill audit` before concluding PRs or git commits.
|
|
57
|
+
|
|
58
|
+
### 3. OpenAI Codex
|
|
59
|
+
- **Workspace Directive**: `CODEX.md` in workspace root.
|
|
60
|
+
- **Global Store**: `~/.codex/skills/paper-plugin-dev/`
|
|
61
|
+
- **Codex Instructions**: Codex references the strict recipes in `skills/paper-plugin-dev/SKILL.md` when generating commands with Brigadier or storing persistent data via `PersistentDataContainer`.
|
|
62
|
+
|
|
63
|
+
### 4. Cursor IDE
|
|
64
|
+
- **Rule Specification**: `.cursor/rules/paper-plugin-dev.mdc`
|
|
65
|
+
- **Glob Pattern**: `**/*.java`, `**/*.gradle.kts`, `**/paper-plugin.yml`, `**/config.yml`
|
|
66
|
+
- **Cursor Integration**: Whenever you edit Java files or gradle configurations in Cursor, Cursor applies the MDC rule to enforce Adventure component building, asynchronous database queries, and debounce-protected GUI handlers.
|
|
67
|
+
|
|
68
|
+
### 5. DeepSeek Harness
|
|
69
|
+
- **Workspace File**: `DEEPSEEK.md`
|
|
70
|
+
- **Global Harness**: `~/.deepseek/skills/paper-plugin-dev/`
|
|
71
|
+
- **DeepSeek Execution**: DeepSeek models use step-by-step reasoning on concurrency boundaries to ensure no synchronous block or inventory mutation occurs off the Bukkit/Folia main tick thread.
|
|
72
|
+
|
|
73
|
+
### 6. Paseo & pi.dev
|
|
74
|
+
- **Paseo**: `.paseo/rules.md` and `~/.paseo/skills/paper-plugin-dev/`
|
|
75
|
+
- **pi.dev**: `.pi/rules.md` and `~/.pi/skills/paper-plugin-dev/`
|
|
76
|
+
- Both agents automatically digest the markdown instructions and provide proactive suggestions when scaffolding plugins.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## 🛡️ Built-in Security & Quality Gate
|
|
81
|
+
|
|
82
|
+
No matter which agent you use, ensure the AI executes the automated auditor before shipping code:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
# Audit plugin codebase for vulnerabilities and outdated APIs
|
|
86
|
+
npx papermc-skill audit
|
|
87
|
+
|
|
88
|
+
# Verify PaperMC version compatibility
|
|
89
|
+
npx papermc-skill check-update
|
|
90
|
+
```
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "papermc-skill",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Interactive CLI and architectural development skill for modern Paper & Folia Minecraft Java plugins",
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "Interactive CLI, multi-agent AI installer, and architectural development skill for modern Paper & Folia Minecraft Java plugins",
|
|
5
5
|
"main": "bin/cli.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"papermc-skill": "bin/cli.js"
|
|
@@ -13,6 +13,14 @@
|
|
|
13
13
|
"docs",
|
|
14
14
|
"skills",
|
|
15
15
|
"assets",
|
|
16
|
+
"CLAUDE.md",
|
|
17
|
+
"CODEX.md",
|
|
18
|
+
"DEEPSEEK.md",
|
|
19
|
+
".cursor",
|
|
20
|
+
".cursorrules",
|
|
21
|
+
".paseo",
|
|
22
|
+
".pi",
|
|
23
|
+
".windsurfrules",
|
|
16
24
|
"README.md",
|
|
17
25
|
"CHANGELOG.md",
|
|
18
26
|
"LICENSE"
|
|
@@ -25,8 +33,12 @@
|
|
|
25
33
|
"minecraft-plugin",
|
|
26
34
|
"adventure-api",
|
|
27
35
|
"minimessage",
|
|
28
|
-
"
|
|
29
|
-
"
|
|
36
|
+
"data-components",
|
|
37
|
+
"display-entities",
|
|
38
|
+
"claude-code",
|
|
39
|
+
"cursor",
|
|
40
|
+
"deepseek",
|
|
41
|
+
"openai-codex",
|
|
30
42
|
"npx"
|
|
31
43
|
],
|
|
32
44
|
"author": "Ardian Ryan <https://github.com/ardianryan>",
|