Token导航 LogoToken导航TokenDH.com
研究检索操作浏览器github未标认证来源可访问许可证需确认审计提醒

spatie-package-skeletonspatie 包骨架

Agent Skill

spatie-package-skeleton 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

343

周安装

14

GitHub Stars

937

下载量

110
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

unknown

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:spatie-package-skeleton(spatie 包骨架)
来源仓库:https://github.com/freekmurze/dotfiles
仓库路径:skills/spatie-package-skeleton
安装命令:
npx skills add https://github.com/freekmurze/dotfiles --skill spatie-package-skeleton
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/freekmurze/dotfiles --skill spatie-package-skeleton

简介

用于查找、检索和筛选相关信息,支持包骨架相关的知识获取。

  • 适合在 Codex、Claude、Cursor、Gemini CLI 中需要基于关键词定位候选结果时使用。
  • 通过 GitHub 安装,建议结合原始 README 了解具体用法。
  • 使用前应确认权限范围、维护状态及是否触发联网或文件读写行为。
  • spatie-package-skeleton 属于研究检索类 Skill,可作为该场景下的辅助能力补充。

SKILL.md

Creating a Laravel Package with Spatie's Skeleton

Prerequisites

  • gh CLI installed and authenticated
  • php available in PATH
  • composer available in PATH

Workflow

1. Gather Package Details

Ask the user for:

  • Vendor name (e.g. spatie) — the GitHub org or username
  • Package name (e.g. laravel-cool-feature) — the repo/package name
  • Package description — one-liner for composer.json
  • Visibility — public or private (default: public)

Use defaults where sensible:

  • Author name: from git config user.name
  • Author email: from git config user.email
  • Author username: from gh auth status
  • Vendor namespace: PascalCase of vendor name (e.g. Spatie)
  • Class name: TitleCase of package name without laravel- prefix (e.g. CoolFeature)

2. Create the Repository from Template

gh repo create <vendor>/<package-name> --template spatie/package-skeleton-laravel --public --clone
cd <package-name>

If the user wants a private repo, use --private instead of --public.

3. Configure the Package (Manual Replacement)

WARNING: Do NOT pipe stdin to configure.php. The script's child processes (gh auth status, git log, git config) consume lines from the piped stdin, causing inputs to shift and produce garbled results. Instead, do the replacements manually:

  1. Run sed to replace all placeholder strings across the repo:
find . -type f -not -path './.git/*' -not -path './vendor/*' -not -name 'configure.php' -exec sed -i '' \
  -e 's/:author_name/Author Name/g' \
  -e 's/:author_username/authorusername/g' \
  -e 's/author@domain\.com/author@email.com/g' \
  -e 's/:vendor_name/Vendor Name/g' \
  -e 's/:vendor_slug/vendorslug/g' \
  -e 's/VendorName/VendorNamespace/g' \
  -e 's/:package_slug_without_prefix/package-without-prefix/g' \
  -e 's/:package_slug/package-name/g' \
  -e 's/:package_name/package-name/g' \
  -e 's/:package_description/Package description here/g' \
  -e 's/Skeleton/ClassName/g' \
  -e 's/skeleton/package-name/g' \
  -e 's/migration_table_name/package_without_prefix/g' \
  -e 's/variable/variableName/g' \
  {} +

Important: The order of -e flags matters. Replace :package_slug_without_prefix before :package_slug to avoid partial matches. Replace Skeleton (PascalCase) before skeleton (lowercase).

  1. Rename the skeleton files:
mv src/Skeleton.php src/ClassName.php
mv src/SkeletonServiceProvider.php src/ClassNameServiceProvider.php
mv src/Facades/Skeleton.php src/Facades/ClassName.php
mv src/Commands/SkeletonCommand.php src/Commands/ClassNameCommand.php
mv config/skeleton.php config/package-without-prefix.php
mv database/migrations/create_skeleton_table.php.stub database/migrations/create_package_without_prefix_table.php.stub
  1. Delete configure.php and run composer install:
rm configure.php
composer install

Use a longer timeout (5 minutes) for composer install.

4. Verify Setup

After the script completes:

# Check the directory structure
ls -la src/
# Verify composer.json looks correct
cat composer.json | head -20
# Check tests passed during setup

5. Initial Commit and Push

The configure script modifies all files but doesn't commit. Create the initial commit:

git add -A
git commit -m "Configure package skeleton"
git push -u origin main

6. Report to User

Tell the user:

  • The repo URL (e.g. https://github.com/<vendor>/<package-name>)
  • The namespace (e.g. VendorNamespace\ClassName)
  • Key files to start editing:

- src/<ClassName>.php — main package class - src/<ClassName>ServiceProvider.php — service provider - config/<package-slug>.php — configuration - tests/ — test directory

Post-Setup Reference

Directory Structure

src/
  YourClass.php                    # Main package class
  YourClassServiceProvider.php     # Service provider (uses spatie/laravel-package-tools)
  Facades/YourClass.php            # Facade
  Commands/YourClassCommand.php    # Artisan command stub
config/
  your-package.php                 # Published config file
database/
  factories/ModelFactory.php       # Factory template (commented out)
  migrations/create_table.php.stub # Migration stub
resources/views/                   # Blade views
tests/
  TestCase.php                     # Extends Orchestra\Testbench\TestCase
  ArchTest.php                     # Architecture tests (no dd/dump/ray)
  ExampleTest.php                  # Starter test
  Pest.php                         # Pest config binding TestCase

Service Provider Configuration

Uses spatie/laravel-package-tools:

public function configurePackage(Package $package): void
{
    $package
        ->name('your-package')
        ->hasConfigFile()
        ->hasViews()
        ->hasMigration('create_your_package_table')
        ->hasCommand(YourClassCommand::class);
}

Remove methods you don't need. Delete corresponding directories/files too:

  • No database? Delete database/ and remove ->hasMigration()
  • No commands? Delete src/Commands/ and remove ->hasCommand()
  • No views? Delete resources/views/ and remove ->hasViews()
  • No facade? Delete src/Facades/ and remove facade alias from composer.json extra.laravel.aliases
  • No config? Delete config/ and remove ->hasConfigFile()

Testing

composer test       # Run tests
composer format     # Run code style fixer
composer analyse    # Run static analysis

Adding an Install Command

use Spatie\LaravelPackageTools\Commands\InstallCommand;

$package->hasInstallCommand(function (InstallCommand $command) {
    $command
        ->publishConfigFile()
        ->publishMigrations()
        ->askToRunMigrations()
        ->askToStarRepoOnGitHub('vendor/package-name');
});

API Design Principles

  • Optimize for easy usage. The API exposed to users should be as simple as possible. Every public method, facade call, and middleware should feel obvious and require minimal setup.
  • Use well-named methods. Method names should be intuitive and self-documenting. Prefer descriptive names over terse ones — the user should understand what a method does without reading its implementation. Use verb-first method names (clear(), forget(), save()).
  • Follow Spatie PHP/Laravel guidelines. All code must follow the conventions described in the php-guidelines-from-spatie skill.

Package patters

Fluent/Chainable APIs

Builder-style classes where every setter returns $this. Users should be able to chain configuration calls naturally.

Pdf::view('invoice', $data)->format('a4')->landscape()->save('invoice.pdf');

Sensible Defaults

The package should work well out of the box with zero configuration. Only require explicit setup for non-standard use cases. Provide safe defaults in the config file and apply them when values aren't explicitly set.

Facade + Factory for Clean State

Back facades with a factory that creates a fresh builder per call to prevent state bleed between requests.

// Factory intercepts calls via __call() to create fresh builder instances
class PdfFactory {
    public function __call($method, $parameters) {
        return (clone $this->builder)->$method(...$parameters);
    }
}

Enums Over Strings

Use PHP enums for any fixed set of options instead of string constants. This gives type safety and IDE support.

Value Objects for Options

Group related settings into small readonly classes (like PdfOptions, ScreenshotOptions) rather than passing many loose parameters between layers.

Descriptive Exception Classes

Name exceptions after what went wrong and provide static factory methods for specific scenarios with helpful error messages:

class CouldNotGeneratePdf extends Exception
{
    public static function browsershotNotInstalled(): static
    {
        return new static('To use Browsershot, install it via `composer require spatie/browsershot`.');
    }
}

Traits for Cross-Cutting Concerns

Use Conditionable (for when()/unless() chaining), Macroable (for runtime extension), and Dumpable (for debugging) on builder classes.

Small Interfaces for Extensibility

Define interfaces for components users might want to swap. Keep them small — one or two methods is ideal:

interface PdfDriver {
    public function generatePdf(string $html, ...): string;
    public function savePdf(string $html, ..., string $path): void;
}

Config-Driven Class Bindings

Let users swap implementations via config rather than requiring service provider overrides:

// config/your-package.php
'driver' => env('LARAVEL_PDF_DRIVER', 'browsershot'),
'cache_profile' => App\CacheProfiles\CustomCacheProfile::class,
'hasher' => App\Hashers\CustomHasher::class,

Testing Fakes with Rich Assertions

Provide a ::fake() method on the facade that swaps in a fake builder. Track calls and offer assertion methods:

Pdf::fake();
// ... code that generates PDFs ...
Pdf::assertSaved(fn ($pdf, $path) => $path === 'invoice.pdf');
Pdf::assertQueued();
Pdf::assertNotQueued();

Events at Key Moments

Fire events for important lifecycle moments so users can hook into the workflow without modifying package code.

Anti-Pattern: Config Option Creep

Don't add small config options for every customization request. Instead, give users full control via class extension.

Pattern: Events Instead of Hook Config Options

Fire events and let users listen:

event(new TransformerStarting($transformer, $url));
$transformer->transform();
event(new TransformerEnded($transformer, $url, $result));

Pattern: Configurable Models

Let users specify their own model class in config:

// config
'model' => Spatie\Package\Models\Result::class,

// In package code — always resolve from config:
$model = config('your-package.model');
$model::find($id);

Pattern: Configurable Jobs

Let users specify their own job class in config:

'process_job' => Spatie\Package\Jobs\ProcessJob::class,

Pattern: Action Classes

Wrap small pieces of functionality in action classes registered in config:

'actions' => [
    'fetch_content' => Spatie\Package\Actions\FetchContentAction::class,
],

Users override by extending and registering their custom action.

Queued Operations with Callbacks

For expensive operations, provide saveQueued() that returns a wrapper around PendingDispatch with then()/catch() callbacks:

Pdf::view('invoice', $data)
    ->saveQueued('invoice.pdf')
    ->then(fn ($path) => /* success */)
    ->catch(fn ($e) => /* failure */)
    ->onQueue('pdfs');

Consistent Naming Conventions

  • Suffix event classes with Event
  • Suffix notification classes with Notification
  • Suffix config data classes with Config
  • Use {Service}Driver for driver implementations
  • Use Could Not... for exception classes
  • Use Fake prefix for test doubles

Config File Comments

Always add block comments above each config key or group explaining what it does:

return [
    /*
     * When disabled, the middleware will not convert any responses.
     */
    'enabled' => env('PACKAGE_ENABLED', true),

    /*
     * The driver used to perform the operation.
     * Supported: "local", "cloud"
     */
    'driver' => env('PACKAGE_DRIVER', 'local'),

    'cache' => [
        /*
         * How long results should be cached, in seconds.
         */
        'ttl' => (int) env('PACKAGE_CACHE_TTL', 3600),
    ],
];

Use /* */ block comments (not //). Mention supported values, defaults, and any non-obvious behavior. Keep comments concise — one to three lines.

Miscellaneous

  • do not add down methods to migration
  • do not use else statements — return early instead
  • do not use compound if statements — split into multiple ifs or use guard clauses
  • use protected visibility over private

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

Codex

36.5%
按下载量换算40

Claude

30.15%
按下载量换算33

Cursor

16.35%
按下载量换算18

Gemini CLI

9.12%
按下载量换算10

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

可疑

权限和风险

操作浏览器

该 Skill 可能涉及浏览器控制能力,使用时可能读取或操作网页内容,需要在受控环境中确认权限边界。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在 warning/failed 结果,不能写成本站确认安全。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills