@ccoalm/ccl-skills 0.8.0 → 0.9.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/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/mobile-quality-release.md +5 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/manual-invocation-and-prompts.md +6 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/defect-diagnosis/SKILL.md +1 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/feature-risk-router/SKILL.md +3 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/architecture-playbook.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/multi-tenant-isolation.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/state-machine-task-patterns.md +2 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/inference-capacity-operations.md +24 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/llm-client-gateway.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/model-prompt-evaluation.md +4 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/contracts-and-state.md +5 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/references/async-lifecycle-and-performance.md +1 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/SKILL.md +3 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/metrics-conventions.md +8 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/sli-slo-design.md +2 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/canary-and-rollout-strategy.md +16 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/promotion-gate-and-review.md +9 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/SKILL.md +6 -6
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/code-review-checklist.md +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/delivery-lifecycle.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/rd-standards-doc-family-checklist.md +1 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-system-source-of-truth.md +2 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/platform-mobile-patterns.md +2 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/tokens-and-components.md +1 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/ui-ux-audit.md +8 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/multi-tenant-isolation.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/state-machine-task-patterns.md +2 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/SKILL.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/SKILL.md +4 -4
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/description-authoring.md +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/dual-track-review-gate.md +9 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-register.md +49 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-to-skill-extraction.md +12 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/classical-test-design-techniques.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc-review-and-prioritization.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/update-lifecycle.md +2 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/SKILL.md +9 -9
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/ci-fixtures-and-flake-control.md +5 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/e2e-real-flow-testing.md +2 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/integration-contract-testing.md +10 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/test-code-authoring-patterns.md +2 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/test-topology-and-commands.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/SKILL.md +2 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/annotation-driven-revision.md +9 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/figure-and-table-craft.md +8 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/SKILL.md +1 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/react-architecture.md +3 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/web-quality-release.md +37 -4
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/web-ui-quality.md +10 -1
- package/dist/assets/release.json +56 -51
- package/package.json +1 -1
|
@@ -20,6 +20,20 @@ For API-backed pages, centralize these mechanics in the client or the narrowest
|
|
|
20
20
|
| User error mapping | Show readable state near the affected region; keep raw transport details for logs/devtools, not UI copy | Component test asserts visible message and retry/next action |
|
|
21
21
|
| Long work | Expose task id/status, polling/retry/backoff, stale result protection, refresh recovery, and final status | API-client test plus browser smoke for one pending-to-final flow |
|
|
22
22
|
|
|
23
|
+
## Streaming Client Mechanics (SSE / WebSocket Chat, Live Logs, Progressive Results)
|
|
24
|
+
|
|
25
|
+
For AI-chat, live-log, or progressive-result surfaces consuming SSE/WebSocket streams, centralize these behaviors in the stream client wrapper (visible streaming *states* are enumerated in `references/complex-workspace-patterns.md`; provider-call retry/continuation semantics are owned by `llm-inference-integration/references/llm-client-gateway.md`):
|
|
26
|
+
|
|
27
|
+
- **Retry asymmetry**: automatic connection retry (bounded exponential backoff plus a connect timeout) is safe only when establishing the connection cannot re-trigger the operation — i.e. when subscribing/reconnecting to an existing server-issued operation or stream id, or when the send carries an idempotency key with an acknowledged dispatch boundary. Once a stream has consumed ANY event whose handler has a non-idempotent effect — a start/processing event that fired analytics or stateful handlers counts, not only visible deltas or dispatched tool events — automatic resubscription additionally requires a resume position — a resume cursor / SSE `Last-Event-ID` whose delivery semantics are verified strictly-after (an inclusive cursor or ambiguous-disconnect boundary replay re-delivers the boundary event), or paired with stable per-event ids plus client-side deduplication and idempotent side-effect handling — because a server that replays history or delivers at-least-once around the disconnect hands the new attempt events the stale-attempt guard reads as current, double-applying text, analytics, or tool side effects; without a resume mechanism, terminate for explicit user retry instead, and cover the overlapping-replay-after-disconnect case with a regression test. Per-tab attempt tokens, latches, and dedup state do not span browsing contexts: when two tabs can subscribe to the same operation, side-effectful handlers (tool dispatch, analytics, mutations) need server-side idempotency keyed by operation/event id as the primary control; a client-side single-executor election is an acceptable supplement ONLY with an atomic exclusive mechanism — the Web Locks API, or a lease with expiry and a fencing token the server validates — because two tabs reading ordinary shared state can both observe "no executor" and both claim it; without one of these, both tabs will independently execute the same replayed events. A POST-style send that starts billed generation or dispatches work server-side before the first delta arrives must NOT be auto-resubmitted on connect timeout or lost response — and a lost acknowledgement is an UNKNOWN dispatch, not a failure: the server may have accepted the operation, so the user-driven retry must reuse the original idempotency key or first reconcile the operation's server-side status before a new send is allowed, or the "safe" manual retry double-charges and repeats tool side effects; and never blind-retry a stream that already emitted visible deltas or dispatched tool calls — a replay duplicates them (the partial-stream discipline on the provider side owns when continuation is safe; ambiguous provider-call retry policy routes to `llm-inference-integration`). When no eligible resume/deduplication mechanism exists — or its retry budget is exhausted — mid-stream failure becomes a terminal error state with an explicit user-driven retry/regenerate, never an automatic reconnect-and-replay.
|
|
28
|
+
- **Guaranteed terminal state**: when the current attempt's transport closes — mid-stream error, abnormal close, or a NORMAL close — without an already-latched recognized terminal event, and the close is not eligible for automatic resubscription (per the retry-asymmetry rule above) or the reconnect budget is exhausted, synthesize a local terminal event and push it through the same message pipeline, so every streamed message provably reaches done/error/canceled (cover the clean-close-after-unknown-status case in a regression: a newer server emitting an unrecognized terminal status then closing normally must not leave the operation pending forever). While an eligible resubscription is still in budget, supersede the closed attempt first, suppress its terminal callback, and keep the operation visibly pending until the final transport attempt resolves — latching failure on a transient disconnect fires terminal side effects that a successful reconnect then cannot cleanly undo. A spinner that can never resolve on mid-stream drop is the recurring production bug this prevents. Terminal state is a per-attempt latch: the first end/error/canceled transition for an attempt wins, closes/aborts that attempt's transport, and every later callback for that attempt token — later terminal, close, and error callbacks AND ordinary data/tool events from a late open or buffered delivery on the same transport — is rejected; one failing connection can fire error then abnormal-close, or deliver a buffered delta after the UI went terminal, and without the full-coverage latch those double-fire state transitions, analytics, or tool-result handling.
|
|
29
|
+
- **Stale-stream guard covers synthesized events too**: tag each connection attempt with a monotonic token; every consumer — incoming stream events AND the locally synthesized terminal/close/error callbacks above — checks the token and drops anything from a superseded attempt, and abort the previous `AbortController` before opening a successor. Aborting the predecessor fires its own close/error handler, so an unguarded synthesized terminal event from the dead attempt overwrites the successor's UI state; an intentional abort of a superseded attempt emits nothing, and user cancellation of the *current* attempt is modeled as `cancel-requested` until the transport confirms teardown — if a buffered server `end` arrives first, resolve the operation as completed (the work may already be done and billed) and surface that instead of a `canceled` state whose retry would repeat the charge; only an unconfirmed teardown synthesizes `canceled` (branch on the abort reason, not just on "closed abnormally").
|
|
30
|
+
- **Reconnect policy is declared data, not scattered constants**: `{enabled, maxRetries, initialDelayMs, maxDelayMs, connectTimeoutMs, idleTimeoutMs}` on the transport wrapper; connect-timeout fires its own event so the UI distinguishes "still connecting" from "failed", and the idle/heartbeat timeout catches the proxy-buffered stall where the connection opened successfully but no event, close, or error ever arrives — without it the terminal-state guarantee (which triggers on closure) never fires and the UI stays pending forever.
|
|
31
|
+
- **Transport behind one interface, with declared degradation**: WS/SSE/polling behind a single event-surface interface so SSE-hostile networks (buffering proxies, restrictive gateways) degrade to polling without changing consumers — degradation is conditional on the server actually exposing the fallback protocol; when no polling/read endpoint exists (a WebSocket-only backend), a blocked transport resolves to the explicit unsupported/network-error terminal state rather than emitting semantically incompatible requests. Fetch-based SSE libraries need deliberate settings: background-tab behavior, abort wiring, and suppressing the library's built-in auto-retry when the wrapper owns retry policy.
|
|
32
|
+
- **Status enum → UI state via one lookup table**: map the wire message-status enum (e.g. start/processing/executed/end/error/canceled) to loading/disabled/retry UI in one table — not scattered conditionals per component. An unknown status maps to an explicit unsupported/error presentation with telemetry, keeping send/retry controls conservatively disabled until a recognized terminal event resolves the operation; treating unknown as "not loading" re-enables actions while the server may still be working and double-fires them.
|
|
33
|
+
- **Reload recovery is server-replayed history** through the same message pipeline with an `isHistory` flag that suppresses side effects (no tool re-execution, no analytics double-fire); add client-side partial-message persistence only when the product genuinely needs offline drafts.
|
|
34
|
+
- **Client-executed tool/action failures report back into the agent loop** as a terminal tool result; a console-only error leaves the backend agent waiting forever — that is a hang, not an error state.
|
|
35
|
+
- **Trace propagation applies mid-stream**: read the trace id from the stream response headers or first event and attach it to the message state, so a broken stream is supportable like any failed request.
|
|
36
|
+
|
|
23
37
|
## Test Layers
|
|
24
38
|
|
|
25
39
|
- Unit tests: pure mapping, validation, reducers, derived data, error translation, and utility behavior.
|
|
@@ -33,12 +47,30 @@ For API-backed pages, centralize these mechanics in the client or the narrowest
|
|
|
33
47
|
- Check bundle growth, code splitting, image optimization, caching headers, long tasks, unnecessary rerenders, list rendering, hydration/runtime errors, and Core Web Vitals risk.
|
|
34
48
|
- Build-time environment variables must be explicit; do not hide production behavior behind local-only defaults.
|
|
35
49
|
- Release checks should include build, smoke route, error monitoring, analytics event sanity, rollback or feature flag path, and cache invalidation/CDN implications when relevant.
|
|
50
|
+
- **Request waterfalls are a top-priority review category** (Vercel's impact-ranked React guidance grades sequential-to-parallel fixes as the 2-10× class): start independent async work before awaiting and join with `Promise.all`, defer an `await` into the branch that actually consumes it, avoid chained sequential awaits in route handlers / server components / effects, and place Suspense boundaries so the shell streams while slow regions resolve.
|
|
51
|
+
- **Bundle-size discipline**: import concrete module paths instead of barrel files (a barrel import can pull the whole package into the graph), keep import paths statically analyzable for tree-shaking, dynamic-import heavy or below-the-fold components, and preload on user intent (hover/focus) rather than eagerly.
|
|
52
|
+
|
|
53
|
+
## SEO And Discoverability (Public-Facing Pages)
|
|
54
|
+
|
|
55
|
+
Applies to marketing, content, docs, landing, and any page meant to be found via search or unfurled in social/chat previews. Auth-gated consoles and internal workbenches are exempt, but their public shells (landing, login, share/preview pages) are not. Grounded in Google Search Central, `schema.org`, and `ogp.me` (verified 2026-08); when in doubt those docs are authoritative, not memory.
|
|
56
|
+
|
|
57
|
+
- **Indexable pages need a unique, descriptive `<title>` and meta description per page** — no boilerplate duplicated across routes, no keyword stuffing. For SPAs this means route-level title/description management (framework metadata API or a head manager), not one static `index.html` title.
|
|
58
|
+
- **Variants whose primary content is duplicate or substantially equivalent declare `rel=canonical`** to pick the representative URL and consolidate signals; the canonical page carries a self-referential one. A parameterized URL is NOT automatically a duplicate — a filter/category landing page with distinct indexable content keeps its own canonical (canonicalizing it away tells the crawler it is non-representative and can drop it from results); decide indexability per parameterized route family, not by the presence of query parameters.
|
|
59
|
+
- **Keep-out uses `noindex` (meta tag or `X-Robots-Tag`), and the page must NOT be blocked by robots.txt** — a robots.txt block hides the `noindex` from the crawler; robots.txt manages crawl traffic, it does not remove pages from the index. Blocking a should-be-indexed page's JS/CSS in robots.txt also breaks rendering-based indexing.
|
|
60
|
+
- **XML sitemap when the site is large, new, or weakly interlinked**; a small (~<500 well-linked pages) site usually doesn't need one.
|
|
61
|
+
- **Structured data as JSON-LD** (Google's recommended format) with `schema.org` vocabulary for surfaces that qualify for rich results (articles, products, FAQs, breadcrumbs); validate with the Rich Results Test rather than eyeballing.
|
|
62
|
+
- **Social preview: the Open Graph required set is `og:title`, `og:type`, `og:image`, `og:url`** (add `og:image:alt` with any `og:image`); with incomplete Open Graph metadata the preview becomes incomplete or platform-dependent (platforms may fall back to ordinary HTML metadata or their own tags). Verify the unfurl with the target platforms' debuggers when share traffic matters.
|
|
63
|
+
- **Multilingual pages use bidirectional `hreflang`** (every variant lists itself plus all others — non-reciprocal tags are ignored), absolute URLs, and `x-default` for unmatched languages. Localized variants with distinct content (different languages, or regional pages with real differences) keep their own self-referential canonical — canonicalizing translations to the default-language URL marks them non-representative and removes them from localized results, defeating the hreflang set; same-language regional near-duplicates may share a canonical representative per the duplicate rule above, and hreflang then annotates the canonical set.
|
|
64
|
+
- **Client-rendered React has JS-SEO constraints**: Google renders JS in a deferred headless-Chromium queue, so (1) navigation must be real `<a href>` links (router `<Link>` components render one; click-handler-only navigation is invisible to crawling), (2) no fragment-based routing for indexable content — use History API paths, (3) soft-404s need a real 404/410 status (or a JS-injected `noindex` when the server can't), (4) primary content must not require user interaction to load, and (5) Google itself still recommends SSR/pre-rendering for critical content ("not all bots can run JavaScript"). For content-heavy public surfaces this is an SSR/SSG/Islands adoption signal per `Framework-Era Patterns` below.
|
|
65
|
+
- **Core Web Vitals are used by Google's ranking systems** (good thresholds: LCP ≤ 2.5 s, INP ≤ 200 ms, CLS ≤ 0.1, at the 75th percentile of field data) and mobile-first indexing is fully rolled out — the mobile rendering is the indexed one, so mobile CWV and mobile-rendered content parity are the release-gate numbers for public pages.
|
|
66
|
+
- **Verify deterministically**: Lighthouse SEO category, the Rich Results Test, or a fetch-and-parse check beats hand review; for changed public routes assert title/description/canonical/OG in a component test or the browser smoke — asserting canonical VALUE per route class, not mere presence: distinct indexable pages self-canonicalize, duplicate variants resolve to their intended representative, and the canonical target is a successful indexable URL (not a redirect or error) — a presence-only check stays green while every route canonicalizes to the home page and drops out of results; keep the check in CI for the marketing/content app rather than re-auditing by hand each release.
|
|
67
|
+
- Primary pages per rule cluster (all under `developers.google.com/search/docs` unless noted): titles/descriptions → `appearance/title-link`, `appearance/snippet`; canonical → `crawling-indexing/consolidate-duplicate-urls`; noindex vs robots → `crawling-indexing/block-indexing`, `crawling-indexing/robots/intro`; sitemap → `crawling-indexing/sitemaps/overview`; structured data → `appearance/structured-data/intro-structured-data`; social preview → `ogp.me`; hreflang → `specialty/international/localized-versions`; JS SEO → `crawling-indexing/javascript/javascript-seo-basics` and `.../lazy-loading`; CWV/mobile-first → `appearance/page-experience`, `appearance/core-web-vitals`, `crawling-indexing/mobile/mobile-sites-mobile-first-indexing`.
|
|
36
68
|
|
|
37
69
|
## Build Tooling Currency
|
|
38
70
|
|
|
39
71
|
- **Vite 8 (released 2026-03) is the current stable**, shipping Rolldown as the default Rust-based bundler (10-30x faster builds, full plugin compatibility per Vite's own announcement). **Vite 7** (Node.js 20.19+/22.12+ required, Node 18 dropped; ESM-only distribution) remains the previous stable line for teams not yet ready for the Rolldown migration trade-off (Rust-toolchain debugging, plugin compat audit). Migration cadence: upgrade Node first if pinned to Node 18; then plan Vite 7 → 8 with a build-perf + plugin-compat smoke before flipping defaults. The historical `rolldown-vite` opt-in package is no longer the path forward — Vite 8 ships Rolldown directly.
|
|
40
72
|
- **Tailwind CSS v4 (stable Jan 2025) uses CSS-first configuration**: no `tailwind.config.js` for new projects; configure via `@theme { --color-brand: ... }` directives in the same CSS file that imports Tailwind. The first-party Vite plugin + automatic content detection eliminates most config; full builds 5x faster, incremental 100x faster than v3. Migration from v3 to v4 is not free (config shape, plugin API, some utility-class differences) — the migration guide is authoritative; do not infer migration steps from training-data memory.
|
|
41
|
-
- **Biome v2 (June 2025, "Biotype") for formatter + linter** when the team wants ESLint + Prettier collapsed into one Rust tool. Type-aware linting without TypeScript compiler dependency (Biome implements its own type inference for lint rules — this does NOT replace `tsc --noEmit` in CI for full type-check);
|
|
73
|
+
- **Biome v2 (June 2025, "Biotype") for formatter + linter** when the team wants ESLint + Prettier collapsed into one Rust tool. Type-aware linting without TypeScript compiler dependency (Biome implements its own type inference for lint rules — this does NOT replace `tsc --noEmit` in CI for full type-check); 520+ lint rules (many inspired by other linters — verified 526 as of 2026-08); CSS formatting/linting stable since v1.9; `biome migrate eslint` automates most config porting. Trade-off: smaller plugin ecosystem than ESLint; if the project depends on niche ESLint plugins (custom org rules, framework-specific lint), audit those before migrating. ESLint flat config + Prettier remains valid for teams with deep ESLint plugin investment.
|
|
42
74
|
- **React Compiler ESLint plugin**: when React Compiler is enabled (per `react-architecture.md`), keep `eslint-plugin-react-hooks` at the version that ships the compiler-aware preset; the recommended preset enforces the rules Compiler relies on (no mutating props, deterministic render, etc.). Without it the compiler may silently skip components that violate its assumptions.
|
|
43
75
|
|
|
44
76
|
## Framework-Era Patterns (When To Adopt, When To Defer)
|
|
@@ -50,7 +82,7 @@ Several React-adjacent architectures became visible in industry conversation (RS
|
|
|
50
82
|
- **Adoption condition**: the app is on a framework/runtime with **production-supported RSC and Server Functions enabled for this app path** — Next.js App Router in RSC mode is the canonical example; other frameworks ship RSC as opt-in or experimental on specific paths. Framework-native loaders / actions (Remix / React Router framework mode, Modern.js, RedwoodJS) are valid server data patterns but are NOT automatically RSC / Server Actions — `loader` / `action` / `useFetcher` are their own primitive. Mixing hand-rolled RSC into a Vite + React Router v6 SPA is a research project, not a delivery path.
|
|
51
83
|
- **Where RSC pays off**: content-heavy pages with mostly read traffic and small mutation surface (marketing, docs, dashboards with a stable read shape, list/detail screens). The data dependency moves to the server; the client bundle shrinks; first-load latency drops.
|
|
52
84
|
- **Where it does not**: highly-interactive workbench surfaces (the chart/table workbenches in `react-architecture.md`'s heavy-dashboard pattern), live-collaboration editors, anything whose interactivity-to-content ratio is high. The "use server" / "use client" boundary becomes a maintenance tax that outweighs the SSR win.
|
|
53
|
-
- **Server Actions / Server Functions** (`'use server'`) are async network calls with serializable args, designed for mutations / form POST paths where the framework owns revalidation. They can replace some fetch-based form submissions on RSC frameworks (progressive enhancement: form works without JS). They are NOT a general data-fetching replacement and they are not meant for retrofitting the API surface on a non-RSC framework.
|
|
85
|
+
- **Server Actions / Server Functions** (`'use server'`) are async network calls with serializable args, designed for mutations / form POST paths where the framework owns revalidation. They can replace some fetch-based form submissions on RSC frameworks (progressive enhancement: form works without JS). They are NOT a general data-fetching replacement and they are not meant for retrofitting the API surface on a non-RSC framework. **Every Server Action is a publicly reachable HTTP endpoint regardless of where it sits in the component tree — authenticate and authorize inside each action body**; UI-level gating or "the button is only rendered for admins" is not access control. On Next App Router, declare fetch caching semantics explicitly (`cache` / `next.revalidate` per the pinned major's docs) rather than relying on implicit defaults, which have changed across majors.
|
|
54
86
|
- **Streaming SSR with `<Suspense>` boundaries** is independent of RSC and works in plain React 18+: choose Suspense boundaries that match user-visible regions (header / nav / primary content / secondary panel) so the slowest region does not block the rest. Boundary placement is design — every fallback geometry must match the resolved region or layout jumps when the fallback resolves. Pair with `ErrorBoundary` at the same node — Suspense alone catches loading, not failure.
|
|
55
87
|
- **Don't pick the framework for the buzz; pick it for the deploy story.** Many SaaS / admin / data-console apps already work on Vite + React Router + TanStack Query and would gain little from migrating to App Router; the migration cost (auth, middleware, build pipeline, hosting, third-party SSR compatibility) is real.
|
|
56
88
|
|
|
@@ -81,7 +113,7 @@ When the front-end build output (HTML, JS, CSS, assets) is served from object st
|
|
|
81
113
|
- **Storage layout**: the build artifacts of each lane live under a stable prefix; the lane prefix is the unit of isolation. The standard lane (production baseline) has its own well-known prefix. The router resolves an inbound request to a `(lane, prefix, path)` tuple and serves the matching object.
|
|
82
114
|
- **Bucket separation by trust**: protected lanes (canary, preview, tenant-isolated, internal) and the public production baseline MUST live in separate buckets — the production baseline can be public-readable for CDN performance; protected lanes MUST be in a private bucket with identity-bound or network-bound origin access control. Mixing public and protected lanes in one bucket is a finding, because any per-prefix policy is easy to misconfigure into a public exposure.
|
|
83
115
|
- **Origin access control choice depends on the topology, but the lane-resolution contract is the same**: when a managed CDN fetches directly from object storage, use the provider's CDN-bound origin-access mechanism (S3 OAC bound to CloudFront, OSS-CDN equivalent) — but direct CDN-to-bucket is valid only for immutable public baseline assets that need no lane resolution, token exchange, manifest verification, or response-header control. Any path that needs lane resolution / preview-token validation / response-header policy / structured logging MUST go through the router; routing it directly via CDN bypasses the entire trust model. When a custom router proxies bytes from object storage, the router authenticates with its own IAM / service-account identity that has the minimum required permissions, and the bucket policy restricts access to that identity (and to the CDN-bound identity if a CDN sits in front). Do not rely on `Referer`-based bucket policies — `Referer` is client-set and trivially spoofable by non-browser clients (curl, scripts, native apps). The "TOS equivalent" or any other provider's equivalent must be identity-bound or network-bound and resistant to client-supplied header spoofing.
|
|
84
|
-
- **Immutable artifact prefixes**: each deployment writes to a fresh content-addressed prefix (e.g. `<commit-sha>/`); existing prefixes are never overwritten. The deploy step uploads all artifacts, verifies them against a generated build manifest (per-file expected size + content checksum via the provider's authoritative checksum API — `x-amz-checksum-*` on S3, equivalents on OSS / GCS / TOS), and only then flips the active manifest to the new prefix. ETag is not a reliable content checksum for multipart uploads — do not equate ETag match with content match.
|
|
116
|
+
- **Immutable artifact prefixes**: each deployment writes to a fresh content-addressed prefix (e.g. `<commit-sha>/`); existing prefixes are never overwritten. The deploy step uploads all artifacts, verifies them against a generated build manifest (per-file expected size + content checksum via the provider's authoritative checksum API — `x-amz-checksum-*` on S3, equivalents on OSS / GCS / TOS; for multipart uploads use the full-object checksum type where the algorithm/provider supports it; when only a parts-composite checksum is available, do not compare it against the manifest's whole-file digest — verify by independently reading back the completed object and hashing it with the manifest's algorithm), and only then flips the active manifest to the new prefix. ETag is not a reliable content checksum for multipart uploads — do not equate ETag match with content match.
|
|
85
117
|
- **Artifact retention and GC**: old immutable prefixes are kept for at least `max(CDN cache TTL, browser cache TTL, service-worker cache TTL, rollback window)` after they stop being active. Premature GC orphans live clients still holding old HTML that references old chunks → blank screens and chunk-load errors. Retention policy is part of the deployment contract, not an afterthought; GC is a separate scheduled job with explicit safety margins, never tied to "deploy succeeded" timing.
|
|
86
118
|
|
|
87
119
|
### Trust Model For Lane Selection
|
|
@@ -170,7 +202,7 @@ For portfolios with multiple React apps sharing a back-end:
|
|
|
170
202
|
|
|
171
203
|
- PR gate must run remotely (GitLab CI / GitHub Actions / equivalent), not only as a local pre-commit hook. Pre-commit catches obvious lint/format problems; PR-level gates catch what locally was skipped, what dirty branches drag in, and what the merge introduces.
|
|
172
204
|
- Required PR gate stages, in this order: install (frozen lockfile) → type check (`tsc --noEmit`) → lint → unit/component tests → build. Skipping any of these because "the local hook ran" is a recurring source of broken main branches.
|
|
173
|
-
- Husky + lint-staged + `verify-commit` are the local layer; they enforce style and message format. They are not a substitute for the PR gate.
|
|
205
|
+
- Husky + lint-staged + `verify-commit` are the local layer; they enforce style and message format. They are not a substitute for the PR gate — local hooks vanish under `--no-verify`, and correctness lint rules downgraded to `warn` severity gate nothing anywhere; rules that matter are `error` in the remote gate.
|
|
174
206
|
- Lane / environment separation in CI (online vs offline lanes, canary vs production deploy targets) belongs at the deploy stage, not at the build stage. Build artifacts should be lane-independent where possible; lane choice is a deploy-time variable.
|
|
175
207
|
- A portfolio without remote PR gates is a deliberate trade-off (fast iteration, small team, single owner) or an oversight; document which. Adding PR gates retroactively to ten apps is expensive — start one app at a time with the lightest gate (type check + lint + build) and expand.
|
|
176
208
|
|
|
@@ -188,3 +220,4 @@ A portfolio with **zero unit tests, zero component tests, and zero E2E** across
|
|
|
188
220
|
- Dead dependencies (declared in package.json with zero imports) are a recurring finding when multiple authors edit shared starter templates. Lint or a per-CI step (e.g., `depcheck`) catches them.
|
|
189
221
|
- Per-app `@umijs/max` / `next` / `vite` major-version skew (`4.0.x` to `4.4.x` across apps in the same portfolio) is a finding; cap the skew and run a periodic bump pass on the lowest-pinned app.
|
|
190
222
|
- Generated outputs (OneAPI clients, Hertz/Kitex stubs, OpenAPI clients) check into the repo and run formatter-skip rules; CI should fail when generated output is stale relative to the IDL/schema source.
|
|
223
|
+
- Optional deterministic React health scan: `react-doctor` (npm; by the react-scan/Million authors; young 0.x line — verified real and maintained 2026-08) scans correctness/performance/security/accessibility and outputs a 0–100 score; `--scope changed` restricts findings to files changed vs the base branch, which makes a cheap "score must not regress" PR ratchet. Supplement to — not replacement for — the ecosystem ESLint/typed-lint executors in `testing-strategy/references/fitness-functions.md` §4.1.3; pin the version in CI rather than `@latest`, and never wire any scanner mode that fetches and obeys remote playbook prompts at run time (remote-instruction execution is an untrusted-content hole, per `llm-inference-integration` trust rules).
|
package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/web-ui-quality.md
CHANGED
|
@@ -12,11 +12,19 @@
|
|
|
12
12
|
- Behavioral: pending, disabled, retry, cancel, duplicate-submit, offline/stale, partial, and interrupted states are visible where relevant.
|
|
13
13
|
- Psychology: the screen reduces uncertainty, waiting anxiety, fear of mistakes, and loss of control.
|
|
14
14
|
|
|
15
|
+
## Design-Token Diff Review
|
|
16
|
+
|
|
17
|
+
Before declaring a visible UI change complete, review the diff itself against the design-token source (design-system tokens, theme variables, documented semantic values — token/`DESIGN`-doc ownership per `product-ui-ux-design`):
|
|
18
|
+
|
|
19
|
+
- Scan the changed paths for likely hard-coded visual values, e.g. `rg -n '#[0-9a-fA-F]{3,8}\b|rgba?\(|hsla?\(|box-shadow:|linear-gradient|font-family:' -- <changed-paths>` — keep the `--` option terminator and collect the path list without shell word-splitting against an explicit review range — `git diff --name-only -z <base>...HEAD` for committed changes, `git diff --cached --name-only -z` for staged ones (a bare `git diff --name-only` sees only unstaged edits and silently yields an empty list on a committed candidate — treat an empty path list as a failed scan, not a pass) — so a repository-controlled filename starting with `-` cannot be parsed as an `rg` option (`--pre` would execute content instead of scanning it). Tune the pattern to the styling system (Tailwind arbitrary values `[...]`, styled-components literals, inline `style=`).
|
|
20
|
+
- Classify every hit three ways: (1) approved token/primitive usage or a documented exception (e.g. chart-adapter series colors); (2) pre-existing code outside the requested change — do not report it as caused by this change, and do not copy it either: an old component carrying a non-compliant value is not permission to repeat that value; (3) a new violation — fix it by referencing the theme/token primitive instead of restating its literal value.
|
|
21
|
+
- If the requested visual result cannot be achieved with the defined tokens/patterns, stop and route the gap to the design-system owner (`product-ui-ux-design`'s design-system source-of-truth path) instead of silently inventing a new color, radius, shadow, or type style; record the escalation in the change.
|
|
22
|
+
|
|
15
23
|
## Accessibility
|
|
16
24
|
|
|
17
25
|
- Prefer semantic HTML before ARIA. Use buttons for actions and links for navigation.
|
|
18
26
|
- Every interactive control needs an accessible name, keyboard reachability, visible focus, and a clear disabled/loading state.
|
|
19
|
-
- Forms need labels, validation messages associated with fields, error summary when useful, and keyboard-friendly submit/retry behavior.
|
|
27
|
+
- Forms need labels, validation messages associated with fields, error summary when useful, and keyboard-friendly submit/retry behavior. Form micro-contract worth enforcing in review: never block paste; keep submit enabled while the user is still editing, but latch an accepted submission synchronously — before the first await of validation/serialization/token acquisition — so a second click or Enter cannot dispatch twice, releasing the latch on the submission's terminal state (failure, and success too for reusable same-page forms like chat/comment/search); Enter submits the focused input and ⌘/Ctrl+Enter submits from a textarea; validate after input instead of blocking free typing; on failed submit, focus the first invalid field; warn before route-leave with unsaved changes; stay password-manager/2FA compatible (real inputs with `autocomplete` attributes).
|
|
20
28
|
- Modals, popovers, menus, and drawers need focus management, escape/outside-click behavior where appropriate, and return focus on close.
|
|
21
29
|
- Check contrast, text wrapping, zoom/text scaling, and screen reader names for icon-only controls.
|
|
22
30
|
|
|
@@ -25,6 +33,7 @@
|
|
|
25
33
|
- Define stable dimensions for fixed-format UI such as grids, toolbars, tables, boards, and controls.
|
|
26
34
|
- Define the primary viewport, stress viewport, and collapse rule before coding. Secondary panels, filters, metadata, and previews should collapse or dock before the primary reading/editing region becomes unusable.
|
|
27
35
|
- Use virtualization or pagination for large lists/tables when rendering cost becomes visible.
|
|
36
|
+
- Numeric floors worth enforcing in code review: interactive hit targets ≥ 24×24 CSS px (WCAG 2.2 SC 2.5.8 AA — spacing/inline/UA-default exceptions exist; platform HIGs recommend ~44-48 px on touch), mobile input font-size ≥ 16px (prevents iOS focus zoom), never disable user zoom (`user-scalable=no` / `maximum-scale=1` in the viewport meta is an accessibility finding), and flex/grid text truncation needs `min-width: 0` on the shrinking child or `overflow` clipping never engages.
|
|
28
37
|
- Preserve useful URL state for shareable/filterable pages.
|
|
29
38
|
- Handle back/forward, reload, auth expiry, offline/stale data, and browser storage expiry deliberately.
|
|
30
39
|
- Long task and upload/review pages should model route-leave, reload, polling timeout, stale task, and terminal failure as component states when the user could lose work or confidence.
|
package/dist/assets/release.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": 1,
|
|
3
3
|
"npmPackage": "@ccoalm/ccl-skills",
|
|
4
|
-
"version": "0.
|
|
5
|
-
"sourceCommit": "
|
|
4
|
+
"version": "0.9.0",
|
|
5
|
+
"sourceCommit": "b001ca5b8c8663c579fbc1c815ca493418d97183",
|
|
6
6
|
"sourceState": "clean",
|
|
7
7
|
"files": [
|
|
8
8
|
{
|
|
@@ -252,7 +252,7 @@
|
|
|
252
252
|
},
|
|
253
253
|
{
|
|
254
254
|
"path": "marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/mobile-quality-release.md",
|
|
255
|
-
"sha256": "
|
|
255
|
+
"sha256": "a17804e52b7e6f3d9914c49d3ad7dd93ff22b596a92a1d1f6a1d6947f45262fb",
|
|
256
256
|
"mode": 420
|
|
257
257
|
},
|
|
258
258
|
{
|
|
@@ -277,7 +277,7 @@
|
|
|
277
277
|
},
|
|
278
278
|
{
|
|
279
279
|
"path": "marketplace/plugins/ccl-skills/skills/code-review/references/manual-invocation-and-prompts.md",
|
|
280
|
-
"sha256": "
|
|
280
|
+
"sha256": "7e2fba79714418428748dfbc055d06a67c048ec6e12f1b6b3a441f81d2c05a24",
|
|
281
281
|
"mode": 420
|
|
282
282
|
},
|
|
283
283
|
{
|
|
@@ -517,7 +517,7 @@
|
|
|
517
517
|
},
|
|
518
518
|
{
|
|
519
519
|
"path": "marketplace/plugins/ccl-skills/skills/defect-diagnosis/SKILL.md",
|
|
520
|
-
"sha256": "
|
|
520
|
+
"sha256": "134b5313c5ee63d6b297f969a1a85ee96369cdc4d0efccb1d8268131095158b5",
|
|
521
521
|
"mode": 420
|
|
522
522
|
},
|
|
523
523
|
{
|
|
@@ -532,7 +532,7 @@
|
|
|
532
532
|
},
|
|
533
533
|
{
|
|
534
534
|
"path": "marketplace/plugins/ccl-skills/skills/feature-risk-router/SKILL.md",
|
|
535
|
-
"sha256": "
|
|
535
|
+
"sha256": "a60b3c557274c1256e6ec9103d8d6545e285c2f154303b6ede88acae8e44611e",
|
|
536
536
|
"mode": 420
|
|
537
537
|
},
|
|
538
538
|
{
|
|
@@ -547,7 +547,7 @@
|
|
|
547
547
|
},
|
|
548
548
|
{
|
|
549
549
|
"path": "marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/architecture-playbook.md",
|
|
550
|
-
"sha256": "
|
|
550
|
+
"sha256": "fb8a7068c722e4f861014b830d72ae4b84b17a146b5f101121bf21f83f374d35",
|
|
551
551
|
"mode": 420
|
|
552
552
|
},
|
|
553
553
|
{
|
|
@@ -617,7 +617,7 @@
|
|
|
617
617
|
},
|
|
618
618
|
{
|
|
619
619
|
"path": "marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/multi-tenant-isolation.md",
|
|
620
|
-
"sha256": "
|
|
620
|
+
"sha256": "420e7394792e0207a67031bca902f404260e8126fa310daae9246f7bcda4b54e",
|
|
621
621
|
"mode": 420
|
|
622
622
|
},
|
|
623
623
|
{
|
|
@@ -817,7 +817,7 @@
|
|
|
817
817
|
},
|
|
818
818
|
{
|
|
819
819
|
"path": "marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/state-machine-task-patterns.md",
|
|
820
|
-
"sha256": "
|
|
820
|
+
"sha256": "63a517682277577630cb385f38060431f59ee2453b32b6f842c2d7f41b412c7a",
|
|
821
821
|
"mode": 420
|
|
822
822
|
},
|
|
823
823
|
{
|
|
@@ -927,17 +927,17 @@
|
|
|
927
927
|
},
|
|
928
928
|
{
|
|
929
929
|
"path": "marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/inference-capacity-operations.md",
|
|
930
|
-
"sha256": "
|
|
930
|
+
"sha256": "277da0425806778dfd5dd02886fec6d5b695d5e0a9b3cc461e71b67014dc37a6",
|
|
931
931
|
"mode": 420
|
|
932
932
|
},
|
|
933
933
|
{
|
|
934
934
|
"path": "marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/llm-client-gateway.md",
|
|
935
|
-
"sha256": "
|
|
935
|
+
"sha256": "c528c26e39ad9fd9a3d3482bd472c855f9ff5eef1b2e1743d234365f744e2f66",
|
|
936
936
|
"mode": 420
|
|
937
937
|
},
|
|
938
938
|
{
|
|
939
939
|
"path": "marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/model-prompt-evaluation.md",
|
|
940
|
-
"sha256": "
|
|
940
|
+
"sha256": "e1b5913ef3f229f79a2874660d58b2d9991ab4a307ec29864b7c63d114d69900",
|
|
941
941
|
"mode": 420
|
|
942
942
|
},
|
|
943
943
|
{
|
|
@@ -957,7 +957,7 @@
|
|
|
957
957
|
},
|
|
958
958
|
{
|
|
959
959
|
"path": "marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/contracts-and-state.md",
|
|
960
|
-
"sha256": "
|
|
960
|
+
"sha256": "2b74b8ccb20fbd0067744d876914f503365849bdef4fb647a41502df03028bf7",
|
|
961
961
|
"mode": 420
|
|
962
962
|
},
|
|
963
963
|
{
|
|
@@ -1057,7 +1057,7 @@
|
|
|
1057
1057
|
},
|
|
1058
1058
|
{
|
|
1059
1059
|
"path": "marketplace/plugins/ccl-skills/skills/nodejs-service-dev/references/async-lifecycle-and-performance.md",
|
|
1060
|
-
"sha256": "
|
|
1060
|
+
"sha256": "0cc63ac7259ed1f83a90aec1cfa0f43ea61db6227d7499a929ef74cabb2a36f3",
|
|
1061
1061
|
"mode": 420
|
|
1062
1062
|
},
|
|
1063
1063
|
{
|
|
@@ -1112,7 +1112,7 @@
|
|
|
1112
1112
|
},
|
|
1113
1113
|
{
|
|
1114
1114
|
"path": "marketplace/plugins/ccl-skills/skills/platform-observability/references/metrics-conventions.md",
|
|
1115
|
-
"sha256": "
|
|
1115
|
+
"sha256": "910403cdad807963602db76767dbddc0b3d8c7a7f45420034a79efe271e7004a",
|
|
1116
1116
|
"mode": 420
|
|
1117
1117
|
},
|
|
1118
1118
|
{
|
|
@@ -1122,7 +1122,7 @@
|
|
|
1122
1122
|
},
|
|
1123
1123
|
{
|
|
1124
1124
|
"path": "marketplace/plugins/ccl-skills/skills/platform-observability/references/sli-slo-design.md",
|
|
1125
|
-
"sha256": "
|
|
1125
|
+
"sha256": "9287f4512677528f3e1ebc0cd0a20be87086ed7a75f9c968beb27864ff282397",
|
|
1126
1126
|
"mode": 420
|
|
1127
1127
|
},
|
|
1128
1128
|
{
|
|
@@ -1132,7 +1132,7 @@
|
|
|
1132
1132
|
},
|
|
1133
1133
|
{
|
|
1134
1134
|
"path": "marketplace/plugins/ccl-skills/skills/platform-observability/SKILL.md",
|
|
1135
|
-
"sha256": "
|
|
1135
|
+
"sha256": "1d73a36f4d4e9511df81588054eba288a1db1efb5f2437a515929326142a15a8",
|
|
1136
1136
|
"mode": 420
|
|
1137
1137
|
},
|
|
1138
1138
|
{
|
|
@@ -1142,7 +1142,7 @@
|
|
|
1142
1142
|
},
|
|
1143
1143
|
{
|
|
1144
1144
|
"path": "marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/canary-and-rollout-strategy.md",
|
|
1145
|
-
"sha256": "
|
|
1145
|
+
"sha256": "f00a767d9bf9c90834a60b709fb51e6453c6866d4a95fc4b8bbbf54f3a59f0b7",
|
|
1146
1146
|
"mode": 420
|
|
1147
1147
|
},
|
|
1148
1148
|
{
|
|
@@ -1182,7 +1182,7 @@
|
|
|
1182
1182
|
},
|
|
1183
1183
|
{
|
|
1184
1184
|
"path": "marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/promotion-gate-and-review.md",
|
|
1185
|
-
"sha256": "
|
|
1185
|
+
"sha256": "0dc8cfd330ec779556a8d8133e370da77b75d7d8537eca10e9c6081af427bff7",
|
|
1186
1186
|
"mode": 420
|
|
1187
1187
|
},
|
|
1188
1188
|
{
|
|
@@ -1322,7 +1322,7 @@
|
|
|
1322
1322
|
},
|
|
1323
1323
|
{
|
|
1324
1324
|
"path": "marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/code-review-checklist.md",
|
|
1325
|
-
"sha256": "
|
|
1325
|
+
"sha256": "5ec943716a500eb43399162f02e628229886df10320b6bcae3842690b1f24630",
|
|
1326
1326
|
"mode": 420
|
|
1327
1327
|
},
|
|
1328
1328
|
{
|
|
@@ -1332,7 +1332,7 @@
|
|
|
1332
1332
|
},
|
|
1333
1333
|
{
|
|
1334
1334
|
"path": "marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/delivery-lifecycle.md",
|
|
1335
|
-
"sha256": "
|
|
1335
|
+
"sha256": "adb63f5aa873dea2292e43b1478eecac1557f3fd0382cea1202826bb70c26cbd",
|
|
1336
1336
|
"mode": 420
|
|
1337
1337
|
},
|
|
1338
1338
|
{
|
|
@@ -1417,7 +1417,7 @@
|
|
|
1417
1417
|
},
|
|
1418
1418
|
{
|
|
1419
1419
|
"path": "marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/rd-standards-doc-family-checklist.md",
|
|
1420
|
-
"sha256": "
|
|
1420
|
+
"sha256": "f88d85cfb4ebd7ec292a46472df365d8c97ca776b6ab4a5024d7bfe54bc093f3",
|
|
1421
1421
|
"mode": 420
|
|
1422
1422
|
},
|
|
1423
1423
|
{
|
|
@@ -1472,7 +1472,7 @@
|
|
|
1472
1472
|
},
|
|
1473
1473
|
{
|
|
1474
1474
|
"path": "marketplace/plugins/ccl-skills/skills/product-rd-workflow/SKILL.md",
|
|
1475
|
-
"sha256": "
|
|
1475
|
+
"sha256": "163284827131517277532acd6f67b08b17efa1d31a74db465a733587962a9f65",
|
|
1476
1476
|
"mode": 420
|
|
1477
1477
|
},
|
|
1478
1478
|
{
|
|
@@ -1517,7 +1517,7 @@
|
|
|
1517
1517
|
},
|
|
1518
1518
|
{
|
|
1519
1519
|
"path": "marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-system-source-of-truth.md",
|
|
1520
|
-
"sha256": "
|
|
1520
|
+
"sha256": "278753a7e7502859e8ae3aa6ac20a48003563961f112fbb9cdf360c2298b7139",
|
|
1521
1521
|
"mode": 420
|
|
1522
1522
|
},
|
|
1523
1523
|
{
|
|
@@ -1557,7 +1557,7 @@
|
|
|
1557
1557
|
},
|
|
1558
1558
|
{
|
|
1559
1559
|
"path": "marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/platform-mobile-patterns.md",
|
|
1560
|
-
"sha256": "
|
|
1560
|
+
"sha256": "a27ad0c10ac35e2f98b221bdb6b49ea1d07a05bd7039e0ff7e50bc9808f72e45",
|
|
1561
1561
|
"mode": 420
|
|
1562
1562
|
},
|
|
1563
1563
|
{
|
|
@@ -1592,7 +1592,7 @@
|
|
|
1592
1592
|
},
|
|
1593
1593
|
{
|
|
1594
1594
|
"path": "marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/tokens-and-components.md",
|
|
1595
|
-
"sha256": "
|
|
1595
|
+
"sha256": "449871eab22e2c21b54e18c0dda3d7842b601e5d1bac1fd53d117fe79380bc39",
|
|
1596
1596
|
"mode": 420
|
|
1597
1597
|
},
|
|
1598
1598
|
{
|
|
@@ -1602,7 +1602,7 @@
|
|
|
1602
1602
|
},
|
|
1603
1603
|
{
|
|
1604
1604
|
"path": "marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/ui-ux-audit.md",
|
|
1605
|
-
"sha256": "
|
|
1605
|
+
"sha256": "5b2e7d1ac1a4b68193e11eb54bda556cc8071e5110bfea7799b4afba48dd7de0",
|
|
1606
1606
|
"mode": 420
|
|
1607
1607
|
},
|
|
1608
1608
|
{
|
|
@@ -1687,7 +1687,7 @@
|
|
|
1687
1687
|
},
|
|
1688
1688
|
{
|
|
1689
1689
|
"path": "marketplace/plugins/ccl-skills/skills/python-service-architecture/references/multi-tenant-isolation.md",
|
|
1690
|
-
"sha256": "
|
|
1690
|
+
"sha256": "a90db84925cf6b60dbcc81066e447f95424e00784ffc9757a8cc669496c3a82f",
|
|
1691
1691
|
"mode": 420
|
|
1692
1692
|
},
|
|
1693
1693
|
{
|
|
@@ -1832,7 +1832,7 @@
|
|
|
1832
1832
|
},
|
|
1833
1833
|
{
|
|
1834
1834
|
"path": "marketplace/plugins/ccl-skills/skills/python-service-dev/references/state-machine-task-patterns.md",
|
|
1835
|
-
"sha256": "
|
|
1835
|
+
"sha256": "f3220c9f041bcd7fdc0e0dd6e36ab6483563a6bf1fc3b590a23ec66a7e673354",
|
|
1836
1836
|
"mode": 420
|
|
1837
1837
|
},
|
|
1838
1838
|
{
|
|
@@ -1897,7 +1897,7 @@
|
|
|
1897
1897
|
},
|
|
1898
1898
|
{
|
|
1899
1899
|
"path": "marketplace/plugins/ccl-skills/skills/release-coordination/SKILL.md",
|
|
1900
|
-
"sha256": "
|
|
1900
|
+
"sha256": "60018442768303688817af99187fa7d7d803d534a78c29ddf45fc75607cbba7a",
|
|
1901
1901
|
"mode": 420
|
|
1902
1902
|
},
|
|
1903
1903
|
{
|
|
@@ -2007,12 +2007,12 @@
|
|
|
2007
2007
|
},
|
|
2008
2008
|
{
|
|
2009
2009
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/description-authoring.md",
|
|
2010
|
-
"sha256": "
|
|
2010
|
+
"sha256": "ea77cc38146edd8e1afd1dd5c220b04aff9269b531bdf25b768d25e33ce3ee86",
|
|
2011
2011
|
"mode": 420
|
|
2012
2012
|
},
|
|
2013
2013
|
{
|
|
2014
2014
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/dual-track-review-gate.md",
|
|
2015
|
-
"sha256": "
|
|
2015
|
+
"sha256": "087a55c0d819f7482d445bc6a375a730231af5c1b4b71ac48731901c26f6a9dd",
|
|
2016
2016
|
"mode": 420
|
|
2017
2017
|
},
|
|
2018
2018
|
{
|
|
@@ -2117,12 +2117,12 @@
|
|
|
2117
2117
|
},
|
|
2118
2118
|
{
|
|
2119
2119
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-register.md",
|
|
2120
|
-
"sha256": "
|
|
2120
|
+
"sha256": "6e754e1eed7e9bfcecab72840cf28d5d90d2897c50c15f1d701c77cc74acaf0a",
|
|
2121
2121
|
"mode": 420
|
|
2122
2122
|
},
|
|
2123
2123
|
{
|
|
2124
2124
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-to-skill-extraction.md",
|
|
2125
|
-
"sha256": "
|
|
2125
|
+
"sha256": "8ea17e4e71159252de8d162e579a1909eed9f1eca170b87e206930adc3073eec",
|
|
2126
2126
|
"mode": 420
|
|
2127
2127
|
},
|
|
2128
2128
|
{
|
|
@@ -2477,7 +2477,7 @@
|
|
|
2477
2477
|
},
|
|
2478
2478
|
{
|
|
2479
2479
|
"path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/SKILL.md",
|
|
2480
|
-
"sha256": "
|
|
2480
|
+
"sha256": "6cbf106acc98bb26f63f8b81c6288aaaa41902e7018dbd1ecd2cf08ebc0ed609",
|
|
2481
2481
|
"mode": 420
|
|
2482
2482
|
},
|
|
2483
2483
|
{
|
|
@@ -2542,7 +2542,7 @@
|
|
|
2542
2542
|
},
|
|
2543
2543
|
{
|
|
2544
2544
|
"path": "marketplace/plugins/ccl-skills/skills/test-artifact-management/references/classical-test-design-techniques.md",
|
|
2545
|
-
"sha256": "
|
|
2545
|
+
"sha256": "193bda4e4751c9bbab4225542fa9986ea57a26066872a85fef1906e8eea994e5",
|
|
2546
2546
|
"mode": 420
|
|
2547
2547
|
},
|
|
2548
2548
|
{
|
|
@@ -2602,7 +2602,7 @@
|
|
|
2602
2602
|
},
|
|
2603
2603
|
{
|
|
2604
2604
|
"path": "marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc-review-and-prioritization.md",
|
|
2605
|
-
"sha256": "
|
|
2605
|
+
"sha256": "0c49f201de768fcb3490f046fb89617d1f481b7f3dfefab8d311eb619e18a208",
|
|
2606
2606
|
"mode": 420
|
|
2607
2607
|
},
|
|
2608
2608
|
{
|
|
@@ -2612,7 +2612,7 @@
|
|
|
2612
2612
|
},
|
|
2613
2613
|
{
|
|
2614
2614
|
"path": "marketplace/plugins/ccl-skills/skills/test-artifact-management/references/update-lifecycle.md",
|
|
2615
|
-
"sha256": "
|
|
2615
|
+
"sha256": "0872518408b0967aedbd9ff69b58527298006b1731bc72e8e35e88d2d0d338c6",
|
|
2616
2616
|
"mode": 420
|
|
2617
2617
|
},
|
|
2618
2618
|
{
|
|
@@ -2627,7 +2627,7 @@
|
|
|
2627
2627
|
},
|
|
2628
2628
|
{
|
|
2629
2629
|
"path": "marketplace/plugins/ccl-skills/skills/testing-strategy/references/ci-fixtures-and-flake-control.md",
|
|
2630
|
-
"sha256": "
|
|
2630
|
+
"sha256": "139a79639c172c7b67f2960c254d5bd258a961bac57d619025b549967f2933cd",
|
|
2631
2631
|
"mode": 420
|
|
2632
2632
|
},
|
|
2633
2633
|
{
|
|
@@ -2647,7 +2647,7 @@
|
|
|
2647
2647
|
},
|
|
2648
2648
|
{
|
|
2649
2649
|
"path": "marketplace/plugins/ccl-skills/skills/testing-strategy/references/e2e-real-flow-testing.md",
|
|
2650
|
-
"sha256": "
|
|
2650
|
+
"sha256": "32d0442895af48e5ea6fdb741ac7a1d28299c178686fb5674fd59b2969db6c23",
|
|
2651
2651
|
"mode": 420
|
|
2652
2652
|
},
|
|
2653
2653
|
{
|
|
@@ -2657,7 +2657,7 @@
|
|
|
2657
2657
|
},
|
|
2658
2658
|
{
|
|
2659
2659
|
"path": "marketplace/plugins/ccl-skills/skills/testing-strategy/references/integration-contract-testing.md",
|
|
2660
|
-
"sha256": "
|
|
2660
|
+
"sha256": "533a9da3c6bdade5232d7f16ab90c20da467cd4393c75f753a31d6155a2c034c",
|
|
2661
2661
|
"mode": 420
|
|
2662
2662
|
},
|
|
2663
2663
|
{
|
|
@@ -2692,7 +2692,7 @@
|
|
|
2692
2692
|
},
|
|
2693
2693
|
{
|
|
2694
2694
|
"path": "marketplace/plugins/ccl-skills/skills/testing-strategy/references/test-code-authoring-patterns.md",
|
|
2695
|
-
"sha256": "
|
|
2695
|
+
"sha256": "099f95cf4ab5cbf291e16ba7e8b7363ba49922b443bd4ff24deca32cb3a0ad8b",
|
|
2696
2696
|
"mode": 420
|
|
2697
2697
|
},
|
|
2698
2698
|
{
|
|
@@ -2702,7 +2702,7 @@
|
|
|
2702
2702
|
},
|
|
2703
2703
|
{
|
|
2704
2704
|
"path": "marketplace/plugins/ccl-skills/skills/testing-strategy/references/test-topology-and-commands.md",
|
|
2705
|
-
"sha256": "
|
|
2705
|
+
"sha256": "d808af85d5a91b12b8650535ab86446a2b8ff35196d011e61bd6a989b5386dd7",
|
|
2706
2706
|
"mode": 420
|
|
2707
2707
|
},
|
|
2708
2708
|
{
|
|
@@ -2762,7 +2762,7 @@
|
|
|
2762
2762
|
},
|
|
2763
2763
|
{
|
|
2764
2764
|
"path": "marketplace/plugins/ccl-skills/skills/testing-strategy/SKILL.md",
|
|
2765
|
-
"sha256": "
|
|
2765
|
+
"sha256": "db42b8dcf62c77ce6374abc3926e84cbcd45ab04f6a7f7663e88c55cf2507eff",
|
|
2766
2766
|
"mode": 420
|
|
2767
2767
|
},
|
|
2768
2768
|
{
|
|
@@ -2770,6 +2770,11 @@
|
|
|
2770
2770
|
"sha256": "8f4178ff2287485c40f9b3f9eb765a0626360a35796f239186943d8e91e8aaa9",
|
|
2771
2771
|
"mode": 420
|
|
2772
2772
|
},
|
|
2773
|
+
{
|
|
2774
|
+
"path": "marketplace/plugins/ccl-skills/skills/tighten-doc/references/annotation-driven-revision.md",
|
|
2775
|
+
"sha256": "eaf5adc225ecd47e555611e5a1b9768fbe725204384dd96461408b81646c7fd1",
|
|
2776
|
+
"mode": 420
|
|
2777
|
+
},
|
|
2773
2778
|
{
|
|
2774
2779
|
"path": "marketplace/plugins/ccl-skills/skills/tighten-doc/references/comment-safe-feishu.md",
|
|
2775
2780
|
"sha256": "c930ab39dd676da34c202c46c798441fdf2699271a5aff17d52c1dbd87df77f7",
|
|
@@ -2797,7 +2802,7 @@
|
|
|
2797
2802
|
},
|
|
2798
2803
|
{
|
|
2799
2804
|
"path": "marketplace/plugins/ccl-skills/skills/tighten-doc/references/figure-and-table-craft.md",
|
|
2800
|
-
"sha256": "
|
|
2805
|
+
"sha256": "49c9701f114b7194d72b34fc5eba4bf25445ca1ac32d57af1be2c234131be3af",
|
|
2801
2806
|
"mode": 420
|
|
2802
2807
|
},
|
|
2803
2808
|
{
|
|
@@ -3072,7 +3077,7 @@
|
|
|
3072
3077
|
},
|
|
3073
3078
|
{
|
|
3074
3079
|
"path": "marketplace/plugins/ccl-skills/skills/tighten-doc/SKILL.md",
|
|
3075
|
-
"sha256": "
|
|
3080
|
+
"sha256": "75b0c8fb65803056d9b7535b300a37a3a26fb0125b20adbbcd7cb14ba7461991",
|
|
3076
3081
|
"mode": 420
|
|
3077
3082
|
},
|
|
3078
3083
|
{
|
|
@@ -3092,7 +3097,7 @@
|
|
|
3092
3097
|
},
|
|
3093
3098
|
{
|
|
3094
3099
|
"path": "marketplace/plugins/ccl-skills/skills/web-react-dev/references/react-architecture.md",
|
|
3095
|
-
"sha256": "
|
|
3100
|
+
"sha256": "0635db0d1931b531fba67a921edd7bb83689594b565ff82ac2140deaf966a9f8",
|
|
3096
3101
|
"mode": 420
|
|
3097
3102
|
},
|
|
3098
3103
|
{
|
|
@@ -3102,17 +3107,17 @@
|
|
|
3102
3107
|
},
|
|
3103
3108
|
{
|
|
3104
3109
|
"path": "marketplace/plugins/ccl-skills/skills/web-react-dev/references/web-quality-release.md",
|
|
3105
|
-
"sha256": "
|
|
3110
|
+
"sha256": "35fc6b18e8809c1abeba12069fcb8be983e0e629d7760c5bd2ef52f150e276f4",
|
|
3106
3111
|
"mode": 420
|
|
3107
3112
|
},
|
|
3108
3113
|
{
|
|
3109
3114
|
"path": "marketplace/plugins/ccl-skills/skills/web-react-dev/references/web-ui-quality.md",
|
|
3110
|
-
"sha256": "
|
|
3115
|
+
"sha256": "48672a5a63af505a34d9ccb0e03ef1d2b02e79460e7d227b8b4ae82a4648b6bc",
|
|
3111
3116
|
"mode": 420
|
|
3112
3117
|
},
|
|
3113
3118
|
{
|
|
3114
3119
|
"path": "marketplace/plugins/ccl-skills/skills/web-react-dev/SKILL.md",
|
|
3115
|
-
"sha256": "
|
|
3120
|
+
"sha256": "3d60fa18aa37299dc0b9672126243146ee62c9c41d8707bf09e455e810506cb9",
|
|
3116
3121
|
"mode": 420
|
|
3117
3122
|
},
|
|
3118
3123
|
{
|
|
@@ -3308,5 +3313,5 @@
|
|
|
3308
3313
|
"mode": 420
|
|
3309
3314
|
}
|
|
3310
3315
|
],
|
|
3311
|
-
"snapshotHash": "
|
|
3316
|
+
"snapshotHash": "360d37909bfd9e874a189e5013f5aaf2c65fea33329bc3f4fba9c7078c052d83"
|
|
3312
3317
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ccoalm/ccl-skills",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Reusable workflows that help coding agents plan, build, test, review, and release software — for Claude Code, Codex, and OpenCode",
|
|
5
5
|
"keywords": ["skills", "agent-skills", "claude", "claude-code", "codex", "opencode", "agent", "ai", "ai-agents", "cli", "anthropic", "developer-tools"],
|
|
6
6
|
"type": "module",
|