بنقرة واحدة
speckit-constitution
Create or update project governing principles and development guidelines.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Create or update project governing principles and development guidelines.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Consumer-facing guide to hosting an interactive FS.Skia.UI app — the keyboard/pointer input surface, the preview-vs-tree render distinction, and the windowed-fullscreen blur caveat.
Build Skia-rendered FS.Skia.UI Controls, rich text, chart controls, graph controls, DataGrid, custom wrappers, and generated product examples.
Generated product guidance for Skia-rendered FS.Skia.UI Controls, rich text, chart controls, graph controls, DataGrid, and custom wrappers.
Wire a generated FS.Skia.UI product to the desktop viewer host.
Understand and work with the internal keyed VDOM diff over the lowered Control<'msg> IR (feature 067) — its key-first-then-positional matching, the NodePatch/ChildOp operation set, the totality/determinism/identity-at-rest/round-trip invariants, and the module's disposition (internal, property-tested, wired onto the live render path via RetainedRender in feature 091 and current through feature 103 — layout/bounds cache, injected-delta animation clock, visual-state cross-fade). Use when reading the diff invariants, extending the property tests, or working on the wired retained render path.
Maintainer-facing guide to the FS.Skia.UI.Controls.Elmish interactive-host seam — how runInteractiveApp drives the retained render structure each frame (RetainedRender.step over the keyed diff), advances per-identity animation clocks from an injected Tick delta, stamps runtime visual state pre-reconcile, routes keys focus-first through routeFocusedKey, and resolves pointer hits to a stable identity via retainedHitTest. Use when reading or extending the live controls host loop, the per-frame retained-state/clock/visual-state wiring, or the key/pointer routing seam.
| name | speckit-constitution |
| description | Create or update project governing principles and development guidelines. |
| compatibility | Requires spec-kit project structure with .specify/ directory |
| metadata | {"author":"github-spec-kit","source":"preset:fsharp-opinionated"} |
Check for extension hooks (before constitution):
.specify/extensions.yml from the project root (if present) and collect entries under the hooks.before_constitution key..specify/extensions/*/*.yml file in sorted order, parse each, and collect its hooks.before_constitution entries too — so a hook registered only in a per-extension file (e.g. the feedback extension at .specify/extensions/feedback/feedback.yml) is still discovered and runs.(extension, command) (first occurrence wins, so a hook declared in both files runs once).optional: true hook that is discovered but not executed this phase, emit one line so the skip is a visible decision: Note: optional hook {extension}:{command} is registered but was not run (skipped).enabled is explicitly false. Treat hooks without an enabled field as enabled.condition expressions:
condition field, or it is null/empty, treat the hook as executablecondition, skip it and leave condition evaluation to the HookExecutor implementationoptional flag:
optional: true):
## Extension Hooks
**Optional Pre-Hook**: {extension}
Command: `/{command}`
Description: {description}
Prompt: {prompt}
To execute: `/{command}`
optional: false):
## Extension Hooks
**Automatic Pre-Hook**: {extension}
Executing: `/{command}`
EXECUTE_COMMAND: {command}
Wait for the result of the hook command before proceeding to constitution setup.
before_constitution git.initialize hook (optional: false) is mandatory — under auto_execute_hooks: true it auto-runs and you wait for the repository to be initialized before populating the constitution..specify/extensions.yml does not exist, skip silentlyPopulate .specify/memory/constitution.md from the preset's
constitution-template.md. The template contains three kinds of sections,
marked by HTML comments:
<!-- REQUIRED --> — placeholders MUST be filled. Ask the user for each.<!-- TAILORABLE --> — tune per project. Ask the user what's appropriate
for this project's domain and stack. You MAY add or reword bullets within
these sections.<!-- LOCKED --> — do NOT modify these sections. The seven Core Principles,
Change Classification, Workflow & Quality Gates, and Governance sections
are shared doctrine across every project using this preset. If the user
explicitly asks to modify a locked section, pause and confirm: "This
section is marked LOCKED because it's shared across every project using
the fsharp-opinionated preset. Are you sure you want a per-project
amendment, or should this become an upstream preset change?"The REQUIRED section uses these placeholders. Ask for each:
[PROJECT_NAME] — the project's display name (often matches the repo name).[CONSTITUTION_VERSION] — start at 1.0.0 for a new project.[RATIFICATION_DATE] — today's date in YYYY-MM-DD.[LAST_AMENDED_DATE] — same as ratification on first write.The TAILORABLE section uses these placeholders. Offer reasonable defaults and let the user accept or override:
[PACK_OUTPUT_PATH] — default ~/.local/share/nuget-local/.[LOGGING_LIBRARY] — default "not yet selected; see ADR when chosen."
Common F# choices: Serilog, Microsoft.Extensions.Logging, Logary.[PROJECT_CONSTRAINTS] — any project-specific rules (runtime target,
deployment target, supported OS). If none, write "None beyond the
defaults above.".specify/memory/constitution.md.<!-- LOCKED -->
marker lines go.Do not overwrite silently. Diff the existing file against the current template and offer three options:
Check for extension hooks (after constitution): After the constitution is populated, discover hooks across all extension files (multi-file discovery), not just the central file:
.specify/extensions.yml from the project root (if present) and collect entries under the hooks.after_constitution key..specify/extensions/*/*.yml file in sorted order, parse each, and collect its hooks.after_constitution entries too — so a hook registered only in a per-extension file (e.g. the feedback extension at .specify/extensions/feedback/feedback.yml) is still discovered and runs on phase completion.(extension, command) (first occurrence wins, so a hook declared in both files runs once).settings.auto_execute_hooks: true in .specify/extensions.yml, a mandatory hook (optional: false) auto-runs with no confirmation; an optional hook (optional: true) is always surfaced ("To execute: /{command}") and is never force-run by auto_execute_hooks; a hook with a non-empty condition is never evaluated by this skill — evaluation is left to the executor and the notice reports the resolved decision. When auto_execute_hooks: false, even mandatory hooks are surfaced for confirmation.(extension, command), emit one consolidated notice for the phase so the operator never hand-reconciles files — a promoted feedback hook (optional: false) appears as auto-run, never as a surfaced optional:
## Effective hooks for constitution
- {extension}:{command} — auto-run (mandatory; auto_execute_hooks=true)
- {extension}:{command} — surfaced (optional)
- {extension}:{command} — skipped (enabled: false)
- {extension}:{command} — condition-deferred
optional: true hook that is discovered but not executed this phase, emit one line so the skip is a visible decision: Note: optional hook {extension}:{command} is registered but was not run (skipped).enabled is explicitly false. Treat hooks without an enabled field as enabled.condition expressions:
condition field, or it is null/empty, treat the hook as executablecondition, skip it and leave condition evaluation to the HookExecutor implementationoptional flag:
optional: true):
## Extension Hooks
**Optional Hook**: {extension}
Command: `/{command}`
Description: {description}
Prompt: {prompt}
To execute: `/{command}`
optional: false):
## Extension Hooks
**Automatic Hook**: {extension}
Executing: `/{command}`
EXECUTE_COMMAND: {command}
.specify/extensions.yml does not exist, skip silently