원클릭으로
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 페이지를 검토하고 설치를 진행할 수 있습니다.
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.
SOC 직업 분류 기준
| 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