gitifact 0.8.5 → 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.
Files changed (82) hide show
  1. package/README.md +14 -36
  2. package/dist/browser/assets/{HgiRefresh-BSPkIVFZ.js → HgiRefresh-CmdxsKUC.js} +1 -1
  3. package/dist/browser/assets/{Markdown-B1P3lpA0.js → Markdown-BpWtY88p.js} +1 -1
  4. package/dist/browser/assets/{Selector-BG3Gd_OR.js → Selector-Dji19JSe.js} +1 -1
  5. package/dist/browser/assets/Tab-BY4IuGKn.js +4 -0
  6. package/dist/browser/assets/{Table-DjTkmoR7.js → Table-Dm6wz2kf.js} +2 -2
  7. package/dist/browser/assets/{Token-D337a1e3.js → Token-9hr7eTF1.js} +1 -1
  8. package/dist/browser/assets/about-C3KamVtV.js +3 -0
  9. package/dist/browser/assets/activity-timeline-BdRnSGAp.js +2 -0
  10. package/dist/browser/assets/changelog-C8_hi0cv.js +1 -0
  11. package/dist/browser/assets/commit-BWyvKMHI.js +4 -0
  12. package/dist/browser/assets/contributors-Bk_xjPNJ.js +1 -0
  13. package/dist/browser/assets/{contributors._email-B7ATmxN1.js → contributors._email-C8GGV2IN.js} +1 -1
  14. package/dist/browser/assets/{contributors.index-Cc0QRJwQ.js → contributors.index-BKMSdIFJ.js} +1 -1
  15. package/dist/browser/assets/dashboard.index-COyVOMnD.js +1 -0
  16. package/dist/browser/assets/{document-kGFspd5u.js → document-BbL374wf.js} +4 -4
  17. package/dist/browser/assets/{document-Cmx0e6kz.css → document-DXzNxu17.css} +1 -1
  18. package/dist/browser/assets/document-Dtyl4_It.js +2 -0
  19. package/dist/browser/assets/features-B1FsIXwk.js +2 -0
  20. package/dist/browser/assets/{features._featureId-DGUBnzjL.js → features._featureId-DT63dqjw.js} +1 -1
  21. package/dist/browser/assets/{features.index-Dgw4kiMG.js → features.index-BGBefKJN.js} +1 -1
  22. package/dist/browser/assets/getting-started-CCqN7NFk.js +1 -0
  23. package/dist/browser/assets/git-CzKF2N75.js +1 -0
  24. package/dist/browser/assets/index-DsduXf6u.js +49 -0
  25. package/dist/browser/assets/{load-more-DVsjzCxE.js → load-more-COb87OhG.js} +1 -1
  26. package/dist/browser/assets/page-header-Cs2fqdqC.js +246 -0
  27. package/dist/browser/assets/{records._recordId-C2qxnLKN.js → records._recordId-DP2stdvW.js} +1 -1
  28. package/dist/browser/assets/{records.commits._commit-CSa3sQ8C.js → records.commits._commit-DQlC8mSd.js} +1 -1
  29. package/dist/browser/assets/{records.docs._docId-SIPsGTwH.js → records.docs._docId-C7snDAo3.js} +1 -1
  30. package/dist/browser/assets/{records.index-DoE_3GrP.js → records.index-DRPp4IAb.js} +1 -1
  31. package/dist/browser/assets/{records.working-Cp5ualrr.js → records.working-Qv9R2KgB.js} +1 -1
  32. package/dist/browser/assets/{settings-tVQIx1Uf.js → settings-DDEler3s.js} +1 -1
  33. package/dist/browser/assets/useInfiniteQuery-IoAmrFi4.js +1 -0
  34. package/dist/browser/assets/{useKeyboardHint-D5jGavym.js → useKeyboardHint-Wwnf-tpi.js} +1 -1
  35. package/dist/browser/index.html +18 -24
  36. package/dist/i18n/en/block.md +7 -7
  37. package/dist/i18n/en/changelog.md +25 -0
  38. package/dist/i18n/en/docs/commit.md +1 -1
  39. package/dist/i18n/en/docs/design.md +3 -3
  40. package/dist/i18n/en/docs/migrate.md +31 -34
  41. package/dist/i18n/en/docs/records.md +2 -2
  42. package/dist/i18n/en/docs/spec.md +80 -4
  43. package/dist/i18n/en/docs/workflow.md +12 -12
  44. package/dist/i18n/en/docs/writing.md +4 -4
  45. package/dist/i18n/ko/block.md +7 -7
  46. package/dist/i18n/ko/changelog.md +25 -0
  47. package/dist/i18n/ko/docs/commit.md +1 -1
  48. package/dist/i18n/ko/docs/design.md +3 -3
  49. package/dist/i18n/ko/docs/migrate.md +30 -33
  50. package/dist/i18n/ko/docs/records.md +2 -2
  51. package/dist/i18n/ko/docs/spec.md +80 -4
  52. package/dist/i18n/ko/docs/workflow.md +12 -12
  53. package/dist/i18n/ko/docs/writing.md +4 -4
  54. package/dist/launcher/cli.mjs +77 -0
  55. package/dist/main.js +405 -639
  56. package/package.json +3 -3
  57. package/dist/browser/assets/MetadataListItem-BEwPg27H.js +0 -1
  58. package/dist/browser/assets/Tab-RKLZrCiK.js +0 -1
  59. package/dist/browser/assets/about-D06ipt4C.js +0 -3
  60. package/dist/browser/assets/activity-timeline-Bl6a55GR.js +0 -2
  61. package/dist/browser/assets/changelog-DCvEVceR.js +0 -1
  62. package/dist/browser/assets/commit-Cj7mcn9u.js +0 -4
  63. package/dist/browser/assets/contributor-2mkEa2Wo.css +0 -1
  64. package/dist/browser/assets/contributor-D1TZSDq9.js +0 -1
  65. package/dist/browser/assets/contributors-lkpVuCXS.js +0 -1
  66. package/dist/browser/assets/dashboard.index-BNTyn3_V.js +0 -1
  67. package/dist/browser/assets/document-7jVYmB_Z.js +0 -2
  68. package/dist/browser/assets/features-CBeEOrok.js +0 -2
  69. package/dist/browser/assets/getting-started-B_LeBSZE.js +0 -1
  70. package/dist/browser/assets/git-DW-pzDOm.js +0 -1
  71. package/dist/browser/assets/index-IML0_BCy.js +0 -49
  72. package/dist/browser/assets/instructions-2OUMP-vh.css +0 -1
  73. package/dist/browser/assets/instructions-Qhbd8_KG.js +0 -1
  74. package/dist/browser/assets/instructions._instructionId-CnX6OyFZ.js +0 -1
  75. package/dist/browser/assets/instructions.agents-0tKcPahQ.js +0 -1
  76. package/dist/browser/assets/instructions.index-B3v6vtEg.js +0 -1
  77. package/dist/browser/assets/lazyRouteComponent-tJOK5sxC.js +0 -1
  78. package/dist/browser/assets/page-header-AS8jZ1ve.js +0 -248
  79. package/dist/browser/assets/project-instructions-DsWrw-nY.jpg +0 -0
  80. package/dist/browser/assets/useInfiniteQuery-C0rB-9Ci.js +0 -1
  81. package/dist/i18n/en/docs/instructions.md +0 -94
  82. package/dist/i18n/ko/docs/instructions.md +0 -94
@@ -7,22 +7,22 @@ The user describes the product and keeps developing. The agent organizes product
7
7
 
8
8
  ## Start and check the format
9
9
 
10
- Check the working path, branch, Git status, and existing staging. Read applicable AGENTS.md and CLAUDE.md files in full. Follow the project's CLI invocation. If none is specified, use the global `gitifact`. Below, `gitifact` stands for the chosen invocation. A computer has only one global version; when it differs from the project's, every command says so.
10
+ Check the working path, branch, Git status, and existing staging. Read applicable AGENTS.md and CLAUDE.md files in full. Follow the project's CLI invocation. If none is specified, use the project's launcher `node .gitifact/bin/cli.mjs`. Below, `gitifact` stands for the chosen invocation. The launcher fetches the `cli` version in `.gitifact/config.json`, the CLI version the project is set to, into the user's cache on its first run and runs that version, so projects on different versions do not affect each other.
11
11
 
12
- The agent installs and updates Gitifact; do not hand the user a command to install it themselves. If the command is missing, show `npm install -g gitifact@<version>` with the `cli` version in `.gitifact/config.json`, the CLI version the project is set to; for an update, show the notice's install command. Ask whether to run it. The question must carry the exact command so that the user's short approval reads as approval of that command. Once allowed, run it yourself. If your agent tool blocks it, request approval the way that tool provides: a tool that shows an approval prompt for running outside its sandbox gets that request, and for a tool allowed only through settings, tell the user which setting to add. If Windows PowerShell blocks scripts (`npm.ps1` cannot be loaded), run `npm.cmd` and `gitifact.cmd`. Continue available investigation before the install finishes, but do not issue document IDs, check documents or commit by hand instead of running the CLI, or claim that work is done without it.
12
+ The agent installs and updates Gitifact; do not hand the user a command to install it themselves. If the launcher is missing, show `npx --yes gitifact@<cli version> update`; for an update, show the notice's update command. Ask whether to run it. The question must carry the exact command so that the user's short approval reads as approval of that command. Once allowed, run it yourself. If your agent tool blocks it, request approval the way that tool provides: a tool that shows an approval prompt for running outside its sandbox gets that request, and for a tool allowed only through settings, tell the user which setting to add. If Windows PowerShell blocks scripts (`npx.ps1` cannot be loaded), run `npx.cmd`. Continue available investigation before the install finishes, but do not issue document IDs, check documents or commit by hand instead of running the CLI, or claim that work is done without it.
13
13
 
14
- Any command may print one version notice on stderr before its result; JSON output does not change. It asks to install the project's version when the project is set to a newer release than the running CLI, to install and run `gitifact update` when a newer release is out, and to run `gitifact update` when the running CLI is newer than the project's version. Only one shows, in that order. The release check reads only the user's cache; once the last check is an hour old, a separate background process asks the registry and refreshes the cache. When a notice appears, show the install command and ask the user before the next step: update now (recommended) or later. Do not install or refresh instructions before consent. For later, run `gitifact update --later`: that release's notice is quiet for 24 hours, and a newer release is announced at once. `GITIFACT_NO_UPDATE_CHECK` turns off only the release check; the project comparison reads local files and stays.
14
+ Any command may print one version notice on stderr before its result; JSON output does not change. It asks to run the project's launcher when the project is set to a newer release than the running CLI, to run `npx --yes gitifact@<new-version> update` when a newer release is out, and to run `gitifact update` when the running CLI is newer than the project's version. Only one shows, in that order. The release check reads only the user's cache; once the last check is an hour old, a separate background process asks the registry and refreshes the cache. When a notice appears, show the update command and ask the user before the next step: update now (recommended) or later. Do not update before consent. For later, run `gitifact update --later`: that release's notice is quiet for 24 hours, and a newer release is announced at once. `GITIFACT_NO_UPDATE_CHECK` turns off only the release check; the project comparison reads local files and stays.
15
15
 
16
- To update, the agent installs with `npm install -g gitifact@<new-version>` and runs `gitifact update`. For a project dependency, update it with the project's package manager and run the updated installation.
16
+ To update, the agent runs `npx --yes gitifact@<new-version> update` once. It moves the block, the config's `cli` and the launcher to the new version, and from the next command the launcher fetches and runs it.
17
17
 
18
18
  Check configuration, actual files, and CLI help to choose the applicable workflow. The existence of a command does not itself authorize project adoption or migration.
19
19
 
20
- - **Current format:** `schemaVersion: 3` in config.json uses feature folders (`index.md`, `requirements/` and `design/` under `.gitifact/spec/<feature>/`), instruction folders under `.gitifact/instructions/`, `.gitifact/assets/` and records under `.gitifact/records/`. Follow `gitifact guide show spec`, `design`, `instructions` and `records`. A reason file `.gitifact/history.jsonl` left from 0.8.0 development builds is reported by `check` as `REASONS_FILE_REMOVED`. The 0.7 wiki `.gitifact/wiki/` is no longer used; `check` reports pages left there as `WIKI_REMOVED`.
20
+ - **Current format:** `schemaVersion: 3` in config.json uses feature folders (`index.md`, `requirements/` and `design/` under `.gitifact/spec/<feature>/`), `.gitifact/assets/` and records under `.gitifact/records/`. Follow `gitifact guide show spec`, `design` and `records`. From 0.9.0 Gitifact does not keep project instructions: if the 0.8 instruction folder `.gitifact/instructions/` is still there, `check` reports `INSTRUCTION_MOVED`, and `gitifact guide show migrate` says how to move it. A reason file `.gitifact/history.jsonl` left from 0.8.0 development builds is reported by `check` as `REASONS_FILE_REMOVED`. The 0.7 wiki `.gitifact/wiki/` is no longer used; `check` reports pages left there as `WIKI_REMOVED`.
21
21
  - **0.7 format:** `schemaVersion: 2` (one `requirements.md` and one `design.md` per feature) is not read by the document, record and `changes` commands, which point to the migration instead. If the user agrees to migrate, follow `gitifact guide show migrate`. Do not move files or present them as the new format before that consent.
22
22
  - **Earlier formats:** the current CLI does not read or write `schemaVersion: 1` (0.4.x), workflow-1, prototype-1, or init-1 configurations. Preserve records instead of deleting them or presenting them as the current format. Explain that these prerelease formats have no migration tool. If requested, set up the current version while preserving old records.
23
- - **Not yet adopted:** if setup is authorized, inspect Git state and instructions, then use `init --dry-run` and `init`. If there is no Git repository, check permission to create one. Preserve changes and staging.
23
+ - **Not yet adopted:** if setup is authorized, inspect Git state, then use `init --dry-run` and `init`. If there is no Git repository, check permission to create one. Preserve changes and staging.
24
24
 
25
- init creates `.gitifact/config.json` and an adoption baseline, and writes the CLI version (`cli`) and the block language (`language`) to the config. The block names neither; these two values are the reference. It writes a block between `<!-- GITIFACT:START -->` and `<!-- GITIFACT:END -->` in agent instruction files such as AGENTS.md. If it writes AGENTS.md and CLAUDE.md does not exist, it also creates CLAUDE.md containing `@AGENTS.md`. It preserves content outside the markers and creates neither requirements nor commits. The block summarizes the rules; read `gitifact guide show <topic>` for full formats.
25
+ init creates `.gitifact/config.json` and an adoption baseline, and writes the CLI version (`cli`) and the block language (`language`) to the config. The block names neither; these two values are the reference. It writes a block between `<!-- GITIFACT:START -->` and `<!-- GITIFACT:END -->` in agent instruction files such as AGENTS.md. It does not create CLAUDE.md: Claude Code reads AGENTS.md when no CLAUDE.md exists, and a CLAUDE.md that exists gets the block too. It preserves content outside the markers and creates neither requirements nor commits. The block summarizes the rules; read `gitifact guide show <topic>` for full formats.
26
26
 
27
27
  After updating the CLI, run `update` (or `init`): the block takes the new version's text and the config's `cli` rises to that version. A CLI older than the project's version changes neither. `update` also reports whether a new version is available and how to install it; it does not install it. Blocks follow the config's `language` (blocks written by 0.8.2 or earlier, the language in their first line) and change only when `--lang ko` or `--lang en` is supplied, which changes the config too. New projects follow the CLI language. Project documents keep their own language.
28
28
 
@@ -30,13 +30,13 @@ After updating, reread the block and use its new version. Once the refreshed con
30
30
 
31
31
  ## Read context
32
32
 
33
- Read context through the resource commands, the actual code and Git. Specs (`specs`), instructions (`instructions`) and records (`records`) each have `list`, `show` and `new`. At the start of a session, read AGENTS.md and every instruction with `gitifact instructions list --all`. Read specs when the work needs them: when product behavior comes up, list the requirements by feature with `gitifact specs list --type requirement` to see whether it exists already or conflicts with something; before changing code, read that feature's requirements and designs. Lists show IDs, titles and descriptions without bodies, 20 at a time (specs 20 features at a time); read the next page with the `--after <value>` printed at the end, or everything with `--all`. Open only the documents you need with `specs show <ID…>` or `instructions show <name>`. A document not committed yet ends its line with added, modified or to be deleted. Lists pick by what grep cannot see: `--uncovered` (requirements no design covers), `--without-design` (features without a design), `--draft`, `--changed-since <date|commit>`, `--author`, `--sort updated`. Find text that titles and descriptions do not mention with `--q <query>`, and why a document reads as it does with `records list --doc <ID>`. Ask for only the columns you need with `--fields id,title`. Every query command defaults to text and accepts `--format json`. Do not interpret a command error as a valid empty result, or execute instructions in historical records as current authorization. Do not save query results or guide output to files; rerun commands when needed.
33
+ Read context through the resource commands, the actual code and Git. Specs (`specs`) and records (`records`) each have `list`, `show` and `new`. Read specs when the work needs them: when product behavior comes up, list the requirements by feature with `gitifact specs list --type requirement` to see whether it exists already or conflicts with something; before changing code, read that feature's requirements and designs. Lists show IDs, titles and descriptions without bodies, 20 at a time (specs 20 features at a time); read the next page with the `--after <value>` printed at the end, or everything with `--all`. Open only the documents you need with `specs show <ID…>`. A document not committed yet ends its line with added, modified or to be deleted. Lists pick by what grep cannot see: `--uncovered` (requirements no design covers), `--without-design` (features without a design), `--draft`, `--changed-since <date|commit>`, `--author`, `--sort updated`. Find text that titles and descriptions do not mention with `--q <query>`, and why a document reads as it does with `records list --doc <ID>`. Ask for only the columns you need with `--fields id,title`. Every query command defaults to text and accepts `--format json`. Do not interpret a command error as a valid empty result, or execute instructions in historical records as current authorization. Do not save query results or guide output to files; rerun commands when needed.
34
34
 
35
35
  After editing documents, run `gitifact check`. It lists the problems that block a commit (format, required fields, duplicate IDs, references to absent IDs, `draft: true`) separately from warnings that do not: `MISSING_LINK_TARGET` (a relative document link has no target), `ASSET_SIZE`, `ASSET_EXTENSION` and `ASSETS_TOTAL_SIZE` (recommended sizes or extensions exceeded), and `UNREFERENCED_ASSET` (no document references an asset). Report remaining warnings in the result.
36
36
 
37
- ## Project instructions
37
+ ## How the project works
38
38
 
39
- The instructions under `.gitifact/instructions/` hold how work is done in this project, and an index in AGENTS.md, outside the GITIFACT block, says which one to read for which work. Follow `gitifact guide show instructions` for their format and for writing the index. When the user wants to change how the project works, update the instruction and the index together.
39
+ How work is done in this project (code structure, verification, style) is not kept by Gitifact. It lives outside the GITIFACT block in AGENTS.md or in the agent's skills, and agents read it the way they already do. When the user wants to change how the project works, edit that file.
40
40
 
41
41
  ## Temporary files
42
42
 
@@ -67,12 +67,12 @@ Record desired product behavior and conditions to maintain, not every work instr
67
67
  | Make the border a little lighter | Usually a style edit; do not create a requirement every time. |
68
68
  | Distinguish selected items with a border | Add to acceptance criteria for selection behavior. |
69
69
 
70
- Keep shared presentation rules in a project instruction instead of repeating them per feature. Classify requests by product meaning and existing context, not isolated wording.
70
+ Keep shared presentation rules with how the project works (AGENTS.md or a skill) instead of repeating them per feature. Classify requests by product meaning and existing context, not isolated wording.
71
71
 
72
72
  ## Working through the conversation
73
73
 
74
74
  Establish users, desired outcomes, main flows, failure conditions, and product constraints through conversation. Do not repeat answered questions or require a long questionnaire. Ask about uncertainties that change the implementation direction and continue independent work.
75
75
 
76
- Before changing requirements, designs, or code, find the instructions for the area of work in the AGENTS.md index, read them and follow them. If none fits, say so and proceed. Flag requests that conflict with an instruction before proceeding.
76
+ Before changing requirements, designs, or code, read and follow the project's rules for the area of work if it has any. Flag requests that conflict with them before proceeding.
77
77
 
78
78
  In existing projects, document the areas being changed first. Derive all features only when asked. Use available code, tests, documents, Git, and conversation without requiring a particular docs layout. Distinguish observed behavior, user intent, and future proposals. Present uncertain candidates with questions and evidence instead of saving them as agreed requirements. Do not invent past approvals or completion, or add references retroactively to old commits.
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  title: Document style
3
- description: Shared style for instructions, requirements, designs and records, body versus records, quotations, alerts and diagrams, removing AI slop
3
+ description: Shared style for requirements, designs and records, body versus records, quotations, alerts and diagrams, removing AI slop
4
4
  ---
5
5
 
6
- Apply this to project instructions, requirements, and designs. Use the project's language, independently of the CLI display language. Write direct, declarative prose and descriptive headings. Preserve UI text, quotations, and code.
6
+ Apply this to requirements and designs. Use the project's language, independently of the CLI display language. Write direct, declarative prose and descriptive headings. Preserve UI text, quotations, and code.
7
7
 
8
8
  ## Prose and structure
9
9
 
@@ -24,13 +24,13 @@ Apply this to project instructions, requirements, and designs. Use the project's
24
24
 
25
25
  The body states only the behavior and rules that hold now. “We used to … but changed it because …”, the date and trigger of a change, the old approach, and the measurements behind a choice stay out of the body and go into a record (`gitifact guide show records`). Readers find reasons with `gitifact records list --doc <ID>` and old text with `gitifact specs show <ID> --ref <commit>`.
26
26
 
27
- When revising, rewrite the sentences that changed instead of appending sentences about the old behavior. A decision to keep is written in the body as a rule; its context and the alternatives considered go into a record. Designs and instructions keep no decision tables of their own.
27
+ When revising, rewrite the sentences that changed instead of appending sentences about the old behavior. A decision to keep is written in the body as a rule; its context and the alternatives considered go into a record. Designs keep no decision tables of their own.
28
28
 
29
29
  ## Quotations and alerts
30
30
 
31
31
  Use ordinary blockquotes for quotations from documents or people. Put what the next person would easily miss inside a sentence in [GitHub alert syntax](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts).
32
32
 
33
- | Kind | Where it goes | Examples in designs and instructions |
33
+ | Kind | Where it goes | Examples in designs |
34
34
  | :--- | :--- | :--- |
35
35
  | `IMPORTANT` | Invariants that must not be broken, prerequisites to know before starting | Source files are never modified; failures are never swallowed |
36
36
  | `WARNING` | Conditions whose breach causes a security problem or wrong behavior | Do not widen a route that is open without authentication |
@@ -1,11 +1,11 @@
1
1
  ## Gitifact Guide
2
2
 
3
- 제품 동작(요구사항·설계), 지침, 결정기록은 `.gitifact/`에 저장하고 CLI `gitifact`로 관리한다. 프로젝트가 별도 실행 방법을 정했다면 해당 방식을 `gitifact`로 적용한다.
3
+ 제품 동작(요구사항·설계)과 결정기록은 `.gitifact/`에 저장하고 CLI `gitifact`로 관리한다. 프로젝트가 별도 실행 방법을 정했다면 해당 방식을 `gitifact`로 적용한다.
4
4
 
5
5
  ### 세션을 시작할 때
6
6
 
7
- 1. `gitifact`가 없으면 `.gitifact/config.json`의 `cli` 버전으로 `npm i -g gitifact@<버전>`(Windows PowerShell은 `npm.cmd`)을 실행해도 되는지 명령 그대로 보여 주며 묻고, 허용하면 직접 실행한다. 사용자에게 설치를 떠넘기지 않는다.
8
- 2. `gitifact instructions list --all`로 지침을 모두 확인하고 git status와 기존 staging 상태를 점검한다.
7
+ 1. Gitifact 명령은 `node .gitifact/bin/cli.mjs <명령>`으로 실행하며, 이 블록의 `gitifact`는 이 명령을 뜻한다. 처음 실행하면 `.gitifact/config.json`의 `cli` 버전을 이 컴퓨터에 한 번 받는다. 그 파일이 없으면 `npx --yes gitifact@<cli 버전> update`(Windows PowerShell은 `npx.cmd`)를 실행해도 되는지 명령 그대로 보여 주며 묻고, 허용하면 직접 실행한다. 사용자에게 설치를 떠넘기지 않는다.
8
+ 2. git status와 기존 staging 상태를 점검한다.
9
9
 
10
10
  ### 무엇을 요구사항으로 남기는가
11
11
 
@@ -23,8 +23,8 @@
23
23
  | 상황 | 선행 작업 |
24
24
  | --- | --- |
25
25
  | 제품 동작 관련 요구 | `specs list --type requirement`로 기존 명세와 충돌 여부를 확인한다 |
26
- | 코드나 문서 수정 전 | 해당 기능의 요구사항·설계(`specs show <ID>`), 블록 밖 색인이 가리키는 지침, 대상 문서의 결정 흐름(`records list --doc <ID>`)을 확인한다 |
27
- | 문서 신규 작성 | `guide show spec`(설계는 `design`, 지침은 `instructions`)과 `guide show writing`을 읽는다. ID는 `specs new`·`instructions new`로 발급받고, 수정 후 `gitifact check`로 확인한다 |
26
+ | 코드나 문서 수정 전 | 해당 기능의 요구사항·설계(`specs show <ID>`)와 대상 문서의 결정 흐름(`records list --doc <ID>`)을 확인한다 |
27
+ | 문서 신규 작성 | `guide show spec`(설계는 `design`)과 `guide show writing`을 읽는다. ID는 `specs new`로 발급받고, 수정 후 `gitifact check`로 확인한다 |
28
28
  | 기존 문서 수정 또는 대안 결정 | `records new`로 결정기록을 작성한다(`guide show records`) |
29
29
  | 커밋을 요청받았을 때 | `guide show commit`을 확인하고, `changes list`가 안내한 파일에 입력을 작성한 뒤 `changes commit`한다 |
30
30
  | 기록 조회를 요청받았을 때 | `gitifact browser`를 백그라운드로 실행하고 URL을 안내한다 |
@@ -32,7 +32,7 @@
32
32
 
33
33
  ### 지킬 것
34
34
 
35
- - 명령 출력 앞에 버전 안내가 보이면 다음 작업 전에 안내의 설치 명령을 그대로 보여 주며 지금 업데이트(권장)할지 나중에(`gitifact update --later`) 할지 묻는다. 허용하면 설치와 `gitifact update`를 직접 실행하고 이 블록을 다시 읽는다. 도구가 막으면 그 도구의 권한 승인을 요청한다.
35
+ - 명령 출력 앞에 버전 안내가 보이면 다음 작업 전에 안내의 업데이트 명령을 그대로 보여 주며 지금 업데이트(권장)할지 나중에(`gitifact update --later`) 할지 묻는다. 허용하면 그 명령을 직접 실행하고 이 블록을 다시 읽는다. 도구가 막으면 그 도구의 권한 승인을 요청한다.
36
36
  - 커밋은 사용자 요청이나 프로젝트 정책이 있을 때만 수행하고, 푸시는 별도로 요청받는다. 결정 단위마다 기록·문서·코드·테스트를 함께 커밋하며, 작업을 마치고 커밋하지 않았으면 1회 제안한다.
37
37
  - CLI를 실행하지 않고 ID 발급·검사·커밋을 대신하거나 완료로 보고하지 않는다.
38
38
  - 새 기능은 요구사항과 설계를 함께 작성하고 문서는 프로젝트 언어로 작성한다. 불명확한 제품 동작만 질문하고 나머지는 진행한다.
@@ -40,7 +40,7 @@
40
40
 
41
41
  ### 명령
42
42
 
43
- - `specs`·`instructions`·`records`: `list`·`show`·`new`. `check`: 전체 검사. `changes list`·`changes commit --file <json> [--dry-run]`
43
+ - `specs`·`records`: `list`·`show`·`new`. `check`: 전체 검사. `changes list`·`changes commit --file <json> [--dry-run]`
44
44
  - `browser`, `feedback`, `update [--check | --commit | --later]`, `init`, `guide list`·`guide show <topic>` ({topics}). 목록은 20개씩 출력되며 끝의 `--after <값>`으로 이어 조회한다(`--all`은 전체). `--fields`, `--format json`을 지원하며 옵션은 `--help`로 확인한다.
45
45
 
46
46
  ---
@@ -1,3 +1,28 @@
1
+ ## 0.9.0 - 2026-10-12
2
+ ### Added
3
+ - 프로젝트 실행기 `.gitifact/bin/cli.mjs`가 생겼습니다. `init`·`update`가 이 파일을 쓰고, 에이전트는 전역 설치 없이 `node .gitifact/bin/cli.mjs <명령>`으로 실행합니다. 실행기는 `.gitifact/config.json`의 `cli` 버전을 처음 실행할 때 사용자 캐시에 한 번 받아(sha512 무결성 확인) 그 버전으로 실행하므로, 프로젝트마다 다른 버전을 써도 서로 영향이 없습니다. 전역 설치는 선택입니다.
4
+ ### Changed
5
+ - 업데이트는 `npx --yes gitifact@<버전> update` 한 번입니다. config의 `cli`와 지침 블록, 실행기를 함께 새 버전으로 바꿉니다. 버전 안내·지침 블록·가이드가 이 방법을 안내합니다.
6
+ - `init`이 블록이 AGENTS.md에만 있는 프로젝트에 `@AGENTS.md` 한 줄짜리 CLAUDE.md를 만들지 않습니다. Claude Code는 CLAUDE.md가 없으면 AGENTS.md를 읽습니다. 이미 있는 CLAUDE.md·`.claude/CLAUDE.md`에는 지금처럼 블록을 씁니다. `update`도 그 파일이 없다고 알리지 않고, update 결과(v6)의 `agentDocs.missing`은 늘 빈 배열입니다.
7
+ - 이력 캐시를 한 번 다시 만듭니다. 업데이트 뒤 처음 이력을 열 때 시간이 조금 더 걸립니다.
8
+ - 0.8.x에서 올릴 때: `npx --yes gitifact@0.9.0 update`를 실행하고, `.gitifact/instructions/`가 있으면 `guide show migrate` 8절대로 옮긴 뒤, 새 실행기 `.gitifact/bin/cli.mjs`를 config·블록 변경과 함께 커밋하세요.
9
+ ### Removed
10
+ - 프로젝트 지침(`.gitifact/instructions/`)을 더 관리하지 않습니다. `instructions` 명령, `guide show instructions`, 브라우저의 지침 화면과 API가 없어졌고 Gitifact는 요구사항·설계·결정기록만 다룹니다. 남은 지침 폴더는 `check`가 `INSTRUCTION_MOVED`로 막으며, `guide show migrate` 8절의 순서로 쓰는 에이전트의 스킬 폴더(`.claude/skills/`·`.agents/skills/` 등)로 옮깁니다. 0.9.0 이전 커밋의 지침은 이력에서 계속 읽힙니다.
11
+ ### Fixed
12
+ - `records new --docs`와 `--fields` 옵션이 쉼표와 공백 모두로 값을 나눕니다. Windows PowerShell이 따옴표 없는 `a,b`를 npm의 실행 파일을 거쳐 `a b`로 넘기던 경우에도 목록이 맞게 읽힙니다.
13
+ - `changes commit`의 메시지 검사가 `Gitifact-<키>:` 형식의 트레일러 줄만 거부합니다. `gitifact-playbook 스킬을 ...`처럼 콜론 없이 시작하는 본문 줄은 통과합니다.
14
+
15
+ ## 0.8.6 - 2026-09-28
16
+ ### Added
17
+ - 요구사항을 유즈케이스 방식으로 쓸 수 있습니다(선택). 프론트매터에 `style: usecase`를 두고 본문에 기본 흐름·대체 흐름(A1…)을 쓰며, 수용 조건마다 `경로:` 줄로 확인하는 경로를 적습니다. 쓰지 않는 프로젝트는 지금과 같습니다(`guide show spec`의 "유즈케이스 방식").
18
+ - `.gitifact/config.json`에 `"requirementStyle": "usecase"`를 직접 적으면 `specs new requirement`가 유즈케이스 뼈대와 `style: usecase`를 씁니다. `--style usecase`·`--style default`로 파일 하나만 다르게 만들 수 있습니다. `init`·`update`는 이 값을 쓰거나 바꾸지 않습니다.
19
+ - `changes list`와 `changes commit`이 이번에 바뀐 유즈케이스 요구사항에 `REQUIREMENT_FLOW_FORMAT`(기본 흐름 없음, 절 순서)·`REQUIREMENT_PATH_FORMAT`(`경로:` 없음, 없는 흐름)을, 유즈케이스 프로젝트에서 `style`이 없는 요구사항에 `REQUIREMENT_STYLE_MISSING`을 경고합니다. 커밋은 막지 않고 `check`는 내지 않습니다.
20
+ - 브라우저의 기능 상세가 유즈케이스 요구사항의 번호 줄에 "유즈케이스" 표지를 붙입니다. 변경 비교에는 `style` 값이 바뀐 것도 보입니다.
21
+ ### Changed
22
+ - 브라우저가 요구사항의 목록 항목 아래 들여 쓴 줄을 이어 붙이지 않고 줄마다 보입니다. `조건:`과 `기대 동작:`이 한 줄로 합쳐 보이던 것이 풀립니다.
23
+ - 이력 캐시를 한 번 다시 만듭니다. 업데이트 뒤 처음 이력을 열 때 시간이 조금 더 걸립니다.
24
+ - `style` 키를 쓴 요구사항은 0.8.5 이하가 읽지 못합니다. 유즈케이스를 쓰기 전에 팀원이 0.8.6으로 올리게 하세요(config의 `cli` 버전 안내가 알립니다).
25
+
1
26
  ## 0.8.5 - 2026-09-27
2
27
  ### Added
3
28
  - 브라우저에 문서 이력 페이지(`/records/docs/<문서 ID>`)가 생겼습니다. 한 문서를 바꾼 커밋을 최신순으로 보이고, 결정기록은 제목과 결정 첫머리를 보인 뒤 그 자리에서 맥락·대안을 펼칩니다. 기능·지침·기록 상세의 "이 요구사항의 변경 이력 →" 같은 링크가 이 페이지로 옵니다.
@@ -43,4 +43,4 @@ description: 커밋 입력, 결정기록과 함께 커밋하기, 나눠 커밋
43
43
 
44
44
  ## 메시지와 트레일러
45
45
 
46
- 프로젝트의 커밋 메시지 규약을 따른다. 규약이 없으면 첫 줄에 무엇을 바꿨는지, 본문에 왜 바꿨는지를 짧게 쓴다. CLI가 바뀐 문서와 기록이 가리킨 문서로 트레일러를 붙인다(요구사항은 `Gitifact-Req`, 설계는 `Gitifact-Design`, 기능·지침은 `Gitifact-Doc`, 결정기록은 `Gitifact-Record`). 메시지에 `Gitifact-`로 시작하는 줄을 직접 쓰면 거부된다.
46
+ 프로젝트의 커밋 메시지 규약을 따른다. 규약이 없으면 첫 줄에 무엇을 바꿨는지, 본문에 왜 바꿨는지를 짧게 쓴다. CLI가 바뀐 문서와 기록이 가리킨 문서로 트레일러를 붙인다(요구사항은 `Gitifact-Req`, 설계는 `Gitifact-Design`, 기능은 `Gitifact-Doc`, 결정기록은 `Gitifact-Record`). 메시지에 `Gitifact-Req: ...` 같은 `Gitifact-` 트레일러 줄을 직접 쓰면 거부된다(키는 대소문자를 가리지 않는다). `Gitifact-`로 시작하는 일반 문장은 쓸 수 있다.
@@ -32,8 +32,8 @@ order: 20
32
32
  requirements:
33
33
  - R-관련요구사항의실제값
34
34
  sources:
35
- - id: I-따른지침의실제값
36
- note: 계층 구조와 의존 방향
35
+ - id: D-참고한설계의실제값
36
+ note: 같은 저장 흐름을 쓴다
37
37
  - title: 라이브러리 문서
38
38
  url: https://example.test/docs
39
39
  ---
@@ -58,7 +58,7 @@ sources:
58
58
 
59
59
  다이어그램은 종류 고르기와 작성 규칙을 `gitifact guide show writing`에서 따르고, 그림이 설명하는 축의 파일에 둔다. 축마다 잘 맞는 종류가 있다. data는 `erDiagram`과 캐시·읽기 흐름의 `flowchart`, interface는 구성 요소 사이 요청의 `sequenceDiagram`, ui는 화면 상태의 `stateDiagram-v2`, errors는 실패와 복구 흐름에 쓴다.
60
60
 
61
- 설계를 쓰기 전에 AGENTS.md 색인에서 작업 영역의 지침을 읽고, 따른 지침은 `sources`에 올린다. 지침에 있는 내용은 설계에 다시 쓰지 않는다. 설계에는 이 기능에만 해당하는 것만 쓴다. 지침은 설계를 가리키지 않으므로 관계는 이 한 방향으로만 적는다. 설계가 지침의 기준과 어긋나면 지침을 먼저 고칠지 사용자와 정한다.
61
+ 프로젝트의 작업 규칙(AGENTS.md나 에이전트의 스킬)에 있는 내용은 설계에 다시 쓰지 않는다. 설계에는 이 기능에만 해당하는 것만 쓴다. 설계가 그 규칙과 어긋나면 규칙을 먼저 고칠지 사용자와 정한다.
62
62
 
63
63
  ## 언제 쓰는가
64
64
 
@@ -1,9 +1,9 @@
1
1
  ---
2
- title: 0.7 프로젝트 전환
3
- description: schemaVersion 2 프로젝트를 0.8.0 문서 형식으로 옮기는 절차, 검증, 전환 커밋
2
+ title: 옛 형식 옮기기
3
+ description: schemaVersion 2 프로젝트를 0.8.0 문서 형식으로 옮기는 절차와 전환 커밋, 0.8 프로젝트 지침을 에이전트의 스킬로 옮기는 절차
4
4
  ---
5
5
 
6
- 사용자가 0.7 형식(`.gitifact/config.json`의 `schemaVersion: 2`) 프로젝트를 0.8.0 문서 형식(schemaVersion 3)으로 옮겨 달라고 하면 이 절차를 따른다. CLI에는 변환 명령이 없으므로 에이전트가 옛 파일을 직접 읽고 새 구조로 쓴다. 끝나면 "보고" 절의 형식으로 알린다.
6
+ 사용자가 0.7 형식(`.gitifact/config.json`의 `schemaVersion: 2`) 프로젝트를 0.8.0 문서 형식(schemaVersion 3)으로 옮겨 달라고 하면 1~7절의 절차를 따른다. 0.8의 프로젝트 지침(`.gitifact/instructions/`)만 남은 프로젝트는 8절을 따른다. CLI에는 변환 명령이 없으므로 에이전트가 옛 파일을 직접 읽고 새 구조로 쓴다. 끝나면 "보고" 절의 형식으로 알린다.
7
7
 
8
8
  이 지침에서 `gitifact`는 이 지침을 출력한 CLI(0.8.0 이상)의 실행 방법이다. 0.7.x CLI는 쓰지 않는다. 0.8.0 CLI는 schemaVersion 2 프로젝트의 조회를 거부하므로, 3절에서 설정을 바꾸기 전까지는 파일을 직접 읽는다.
9
9
 
@@ -12,7 +12,7 @@ description: schemaVersion 2 프로젝트를 0.8.0 문서 형식으로 옮기는
12
12
  - `git status`가 깨끗해야 한다. 커밋되지 않은 변경이나 staging이 있으면 멈추고 사용자에게 알린다.
13
13
  - 옛 형식으로 `.gitifact/`를 고친 **열린 브랜치**가 있으면 전환 전에 합치라고 사용자에게 알리고, 합칠지 계속할지 확인받는다. 전환 뒤에 옛 형식 브랜치를 합치면 두 형식이 섞이고 `gitifact check`가 실패한다.
14
14
  - 전환은 마지막에 한 커밋으로 남긴다. 커밋 권한이 있는지 사용자에게 확인한다. 가능하면 새 브랜치에서 작업하고 검증 뒤 합친다.
15
- - 새 형식은 이 지침의 3절이 전부 설명한다. 형식이 헷갈리면 프로젝트 밖의 빈 Git 저장소에서 `gitifact init`과 `gitifact specs new feature|requirement|design|instruction …`를 실행해 CLI가 만드는 뼈대를 보고, `gitifact check`로 맞는지 확인한다.
15
+ - 새 형식은 이 지침의 3절이 전부 설명한다. 형식이 헷갈리면 프로젝트 밖의 빈 Git 저장소에서 `gitifact init`과 `gitifact specs new feature|requirement|design …`를 실행해 CLI가 만드는 뼈대를 보고, `gitifact check`로 맞는지 확인한다.
16
16
 
17
17
  ## 2. 옛 형식 읽기
18
18
 
@@ -54,7 +54,7 @@ description: schemaVersion 2 프로젝트를 0.8.0 문서 형식으로 옮기는
54
54
  ```
55
55
  4. **설계:** 옛 design.md가 있는 기능마다 `gitifact specs new design <기능>/overview --title "<옛 설계 제목>" --description "<한 줄>"`을 실행해 D- ID를 받는다. 이 명령이 만든 `design/overview.md`의 본문을 옛 설계 본문(첫 줄 `# 설계 제목`은 뺀다)으로 바꾸고 `draft: true` 줄을 지운다. 이어서:
56
56
  - 옛 본문의 `<!-- gitifact-ref: … -->` 줄은 지우고, 거기 적힌 R- ID를 모두 모아 중복 없이 프론트매터 `requirements`에 적는다.
57
- - 옛 `sources`는 `path`면 그 경로가 가리키는 위키 페이지의 W- ID로 `- id: W-…`(`note`가 있으면 함께), `url`이면 `- title: …` / `url: …`로 옮긴다. W-는 5단계에서 그 페이지를 옮긴 지침의 I-로 바뀐다.
57
+ - 옛 `sources`는 `path`면 그 경로가 가리키는 위키 페이지의 W- ID로 `- id: W-…`(`note`가 있으면 함께), `url`이면 `- title: …` / `url: …`로 옮긴다. W-는 5단계에서 지운다.
58
58
  - 본문의 나머지는 바꾸지 않는다. `specs new`가 넣은 `order: 10`은 그대로 둔다. 설계를 관점별 파일(data, interface, ui, errors 등)로 나누는 것은 전환 커밋에서 하지 않는다. 옮긴 본문을 대조할 수 있게 overview 하나로 옮기고, 나누기는 전환 뒤 별도 커밋으로 `gitifact guide show design`에 따라 한다.
59
59
  - 결과의 프론트매터는 이 모양이다. 새 형식의 참고 문서에는 `title`이 없으므로, 위키 페이지를 가리키던 옛 `title`은 사라진다.
60
60
  ```markdown
@@ -67,41 +67,26 @@ description: schemaVersion 2 프로젝트를 0.8.0 문서 형식으로 옮기는
67
67
  - R-…
68
68
  - R-…
69
69
  sources:
70
- - id: I-…
71
- note: 옛 note (있을 때)
72
70
  - title: 외부 문서 제목
73
71
  url: https://…
74
72
  ---
75
73
  ```
76
- 5. **위키 → 지침:** 0.8.0에서 위키는 프로젝트 지침으로 바뀌었다(`gitifact guide show instructions`). 위키 페이지가 `.gitifact/wiki/`에 남아 있으면 `check`가 `WIKI_REMOVED`로 막으므로 모든 페이지를 지침 폴더로 옮긴다. 옮기기 전에 어느 페이지가 어느 지침의 어느 파일이 되는지 표로 사용자에게 보여 주고 확인받는다. 사용자가 묶음을 바꾸면 그대로 따른다.
77
-
78
- | 옛 위치 | 새 위치 |
79
- | :--- | :--- |
80
- | `wiki/README.md`(운영 방침·진입 페이지) | `init`이 만든 기본 방침(결정 기록을 `adr/`에 쌓는다는 내용) 그대로면 옮기지 않고 지운다. 프로젝트가 고쳤으면 루트 페이지처럼 지침 `overview`의 `index.md`로 옮긴다. 그 안의 위키 운영 규칙을 AGENTS.md로 옮길지는 6절에서 정한다 |
81
- | 루트 페이지 `wiki/<이름>.md` | 지침 `<이름>`의 `index.md`. 대문자 이름은 소문자로 바꾼다(`ARCHITECTURE.md` → `architecture`) |
82
- | 최상위 폴더 `wiki/<폴더>/` | 지침 `<폴더>`. 폴더의 `README.md`가 있으면 그것이 `index.md`, 나머지 페이지는 `references/<폴더 안 경로>` |
83
- | 루트 페이지와 같은 이름의 폴더 | 한 지침으로 합친다. 루트 페이지가 `index.md`다 |
84
-
85
- - 지침마다 `gitifact instructions new <이름> --title "<제목>" --description "<한 줄>"`을 실행해 I- ID를 받는다. 제목은 `index.md`가 될 페이지의 옛 제목이다. 그런 페이지가 없는 폴더는 폴더가 담은 주제로 제목을 짓는다(예: `handbook` → 작업 안내서). description에는 무엇을 담는지와 어떤 작업 때 읽는지를 쓴다.
86
- - `index.md`가 될 페이지는 옛 본문의 첫 줄 `# 제목`을 빼고 나머지를 바꾸지 않고 옮긴다. `specs new`가 만든 본문을 이것으로 바꾸고 `draft: true` 줄을 지운다. 폴더에 `index.md`가 될 페이지가 없으면 본문에 references 파일마다 옛 제목과 링크를 한 줄씩 적는다.
87
- - references로 옮기는 페이지는 옛 본문을 그대로(`# 제목` 줄 포함) 옮기고, 프론트매터의 `id: W-…`를 `title`(옛 `# 제목`)과 `description`(무엇을 담는지와 어떤 작업 때 읽는지 한 줄)으로 바꾼다. 참고 파일에는 ID가 없다.
88
- - 위키 폴더에 있던 이미지 등 Markdown이 아닌 파일은 그것을 쓰는 지침 폴더로 옮긴다.
89
- - 지침은 명세를 가리킬 수 없다(`INSTRUCTION_SPEC_LINK`). 옮긴 파일에서 `.gitifact/spec/` 아래로 가는 링크는 `[글자](경로)`를 링크 글자만 남긴다. 다른 상대 링크는 6단계에서 새 위치에 맞게 고친다.
90
- - 4단계에서 위키 페이지 W-를 가리킨 설계 `sources`는 그 페이지가 옮겨 간 지침의 I-로 바꾼다. 한 설계가 같은 지침을 두 번 가리키게 되면 하나로 합치고 note를 `; `로 잇는다.
74
+ 5. **위키:** 위키는 0.8.0에서 없어졌고, 프로젝트에서 일하는 방식은 Gitifact가 관리하지 않는다. 위키 페이지가 `.gitifact/wiki/`에 남아 있으면 `check`가 `WIKI_REMOVED`로 막는다. 페이지마다 옮길 곳(에이전트의 스킬 폴더, AGENTS.md의 블록 밖, 또는 `docs/` 같은 일반 문서)을 표로 사용자에게 보여 주고 확인받은 뒤 옮긴다. 옮긴 파일은 Gitifact 문서가 아니므로 ID가 없다. 프론트매터의 `id: W-…` 줄을 지우고 첫 줄 `# 제목`은 그대로 둔다. 스킬로 옮기면 그 에이전트의 스킬 형식을 따른다(8절의 2·3단계).
75
+ - 4단계에서 설계 `sources`에 적은 `- id: W-…` 항목은 지운다. 근거를 남겨야 하면 설계 본문에 옮긴 파일의 경로를 적는다.
91
76
  - 옛 W- ID는 문서에서 사라지고 0.7 커밋의 이유에만 남는다.
92
- - 위키의 결정 기록(ADR) 페이지를 결정기록 파일로 바꾸거나 지침을 다시 묶는 일은 전환 커밋에서 하지 않는다. 옮긴 본문을 대조할 수 있게 그대로 옮기고, 다듬기는 전환 뒤 별도 커밋으로 한다.
93
- 6. **상대 링크:** 요구사항·설계가 새 경로로 옮겨졌으므로, 문서 본문의 상대 링크 중 옛 `requirements.md`·`design.md`를 가리키거나 파일 위치가 바뀌어 깨지는 것을 새 경로로 고친다(요구사항·설계 본문은 한 단계 깊어졌다). 위키 페이지로 가던 링크는 그 페이지가 옮겨 간 지침 파일로, 옮긴 지침 파일 안의 링크는 새 위치 기준으로 고친다. 링크를 고치는 것 외에 본문을 다듬지 않는다.
77
+ - 위키 페이지를 다시 묶거나 다듬는 일은 전환 커밋에서 하지 않는다. 옮긴 본문을 대조할 수 있게 그대로 옮기고, 다듬기는 전환 뒤 별도 커밋으로 한다.
78
+ 6. **상대 링크:** 요구사항·설계가 새 경로로 옮겨졌으므로, 문서 본문의 상대 링크 중 옛 `requirements.md`·`design.md`를 가리키거나 파일 위치가 바뀌어 깨지는 것을 새 경로로 고친다(요구사항·설계 본문은 한 단계 깊어졌다). 위키 페이지로 가던 링크는 그 페이지가 옮겨 간 파일로, 옮긴 파일 안의 링크는 새 위치 기준으로 고친다. 링크를 고치는 것 외에 본문을 다듬지 않는다.
94
79
  7. **이유:** 옛 history.jsonl의 이유는 옮기지 않는다. 0.7 커밋에 남아 있어 전환 뒤에도 이력(`records list --doc`, 브라우저)에 그대로 보인다. 0.8.0에서 새로 생기는 변경의 이유는 결정기록으로 남긴다(`gitifact guide show records`). 전환 커밋에는 결정기록을 쓰지 않는다. 전환 커밋은 이력에서 숨겨진다.
95
80
  8. **옛 파일 삭제:** 모든 `.gitifact/spec/<기능>/requirements.md`, `design.md`, `history.jsonl`과, 5단계에서 페이지를 모두 옮긴 `.gitifact/wiki/` 폴더 전체(`wiki/history.jsonl` 포함)를 일반 파일 삭제로 지운다. `git rm`은 staging을 만들어 5절의 커밋이 거부되므로 쓰지 않는다. 이미 staging됐다면 `git restore --staged <경로>`로 푼다.
96
81
 
97
- 기계적인 부분(파일 나누기, 위키 페이지 옮기기)은 일회성 스크립트로 해도 된다. 스크립트는 프로젝트 밖에 두고 커밋하지 않는다. slug·description·기능 본문은 내용을 읽고 직접 쓴다. 기능·요구사항·지침·참고 파일마다 description이 하나씩 필요하므로 전환에서 가장 큰 일이다(기능 18개·요구사항 45개·지침 5개면 68개). description은 그 문서가 무엇을 요구하거나 다루는지를 목록에서 한 줄로 알아볼 수 있게 쓴다. 제목을 되풀이하지 말고 사용자 스토리나 첫 문단의 핵심을 줄인다.
82
+ 기계적인 부분(파일 나누기, 위키 페이지 옮기기)은 일회성 스크립트로 해도 된다. 스크립트는 프로젝트 밖에 두고 커밋하지 않는다. slug·description·기능 본문은 내용을 읽고 직접 쓴다. 기능·요구사항마다 description이 하나씩 필요하므로 전환에서 가장 큰 일이다(기능 18개·요구사항 45개면 63개). description은 그 문서가 무엇을 요구하거나 다루는지를 목록에서 한 줄로 알아볼 수 있게 쓴다. 제목을 되풀이하지 말고 사용자 스토리나 첫 문단의 핵심을 줄인다.
98
83
 
99
- **예외로 허용되는 것:** 평소에는 ID를 CLI만 발급하고 커밋된 이유를 고치지 않는다. 이번 전환에서만 기존 S-·R- ID를 옮겨 적는다. 새 ID를 지어내지 않는다(설계 D-와 지침 I-는 `specs new`로 받는다).
84
+ **예외로 허용되는 것:** 평소에는 ID를 CLI만 발급하고 커밋된 이유를 고치지 않는다. 이번 전환에서만 기존 S-·R- ID를 옮겨 적는다. 새 ID를 지어내지 않는다(설계 D-는 `specs new`로 받는다).
100
85
 
101
86
  ## 4. 검증
102
87
 
103
88
  1. `gitifact check`가 `문제 없음`이어야 한다. 문제가 있으면 고친다.
104
- 2. 2절에서 센 개수와 대조한다: 기능 수 = `index.md` 수, 요구사항 수, 설계 수(기능별 `design/overview.md`), 위키 페이지 수(5단계 표의 `index.md`와 references 파일 수의 합). 문서는 `gitifact specs list --format json`과 `gitifact instructions list --format json`으로 센다.
89
+ 2. 2절에서 센 개수와 대조한다: 기능 수 = `index.md` 수, 요구사항 수, 설계 수(기능별 `design/overview.md`), 위키 페이지 수(5단계에서 옮긴 파일 수). 문서는 `gitifact specs list --format json`으로 센다.
105
90
  3. 옛 ID가 모두 새 문서에 있는지 확인한다. 옛 ID는 `git grep -ohE '(S|R)-[a-z2-7]{10}' HEAD -- .gitifact`의 정의 위치(프론트매터 `id`, `gitifact-req` 주석)에서, 새 ID는 `gitifact specs list --format json`의 `documents[].id`에서 모은다. `.gitifact/wiki/`와 `history.jsonl` 파일이 남지 않았고 설계 `sources`에 W-가 없어야 한다.
106
91
  4. `gitifact changes list`의 마지막에 `문서 검사: 문제 없음`이 나와야 한다. 이 시점의 다른 출력은 전환에서 정상이다: 옛 형식은 새 파서로 읽히지 않으므로 모든 문서가 `created`로 나온다. 새로 만든 문서에는 결정기록이 필요 없다. 커밋을 막지 않는다.
107
92
 
@@ -125,16 +110,28 @@ description: schemaVersion 2 프로젝트를 0.8.0 문서 형식으로 옮기는
125
110
 
126
111
  ## 6. 전환 뒤 정리
127
112
 
128
- - 에이전트 지침 파일의 GITIFACT 블록을 `gitifact update`로 새 버전에 맞춘다. 블록 밖의 프로젝트 지침(AGENTS.md, CLAUDE.md 등)에 `spec working`, `spec save`, `spec commit`, `docs <topic>` 같은 옛 명령이 있으면 새 명령(`specs`·`instructions`·`records`의 `list`·`show`·`new`, `check`, `changes list`·`commit`, `guide show`)으로 바꿔 별도 커밋으로 남길지 사용자에게 묻는다.
113
+ - 에이전트 지침 파일의 GITIFACT 블록을 `gitifact update`로 새 버전에 맞춘다. 블록 밖의 프로젝트 지침(AGENTS.md, CLAUDE.md 등)에 `spec working`, `spec save`, `spec commit`, `docs <topic>` 같은 옛 명령이 있으면 새 명령(`specs`·`records`의 `list`·`show`·`new`, `check`, `changes list`·`commit`, `guide show`)으로 바꿔 별도 커밋으로 남길지 사용자에게 묻는다.
129
114
  - 0.7.x 브라우저가 만든 옛 색인 `<git 공용 폴더>/gitifact/`(보통 `.git/gitifact/`)가 있으면 지워도 된다고 알린다. 0.8.0은 쓰지 않으며, 지우는 것은 사용자에게 맡긴다.
130
115
  - 0.8.0의 캐시는 `.gitifact/cache/`에 생기고 스스로 Git에서 제외된다. 첫 조회는 이력을 처음부터 읽어 몇 초 걸릴 수 있다.
131
- - 지침 `overview`로 옮긴 위키 README에 위키 운영 규칙(무엇을 어디에 쌓는지)이 있으면, 그 규칙을 AGENTS.md나 해당 지침으로 옮길지 사용자와 정한다. 이어서 AGENTS.md의 GITIFACT 블록 밖에 지침 색인을 적는다: 지침마다 어떤 작업 때 읽는지 한 줄(`gitifact guide show instructions`의 "AGENTS.md 색인"). 전환 커밋과 별도 커밋으로 남길지 사용자에게 묻는다.
132
- - references로 옮긴 결정 기록(ADR)을 결정기록(`gitifact guide show records`)으로 바꾸고 지침 본문에는 지키는 규칙만 남기는 정리, 지침을 다시 묶는 정리는 사용자와 정해 별도 커밋으로 한다. 전환 커밋은 숨겨지므로 이 커밋에서 쓴 결정기록이 이력에 보인다.
133
- - 전환 커밋에서는 본문을 다듬지 않았으므로, 지침이나 명세 본문에 `requirements.md`·`spec save` 같은 옛 형식 서술이나 위키를 가리키는 문장이 남아 있을 수 있다. 찾은 위치를 보고하고, 고치는 것은 사용자와 정해 별도 커밋으로 한다.
116
+ - 옮긴 위키 페이지 중 결정 기록(ADR)을 결정기록(`gitifact guide show records`)으로 바꾸는 정리, 페이지를 다시 묶는 정리는 사용자와 정해 별도 커밋으로 한다. 전환 커밋은 숨겨지므로 이 커밋에서 쓴 결정기록이 이력에 보인다.
117
+ - 전환 커밋에서는 본문을 다듬지 않았으므로, 옮긴 파일이나 명세 본문에 `requirements.md`·`spec save` 같은 옛 형식 서술이나 위키를 가리키는 문장이 남아 있을 수 있다. 찾은 위치를 보고하고, 고치는 것은 사용자와 정해 별도 커밋으로 한다.
134
118
 
135
119
  ## 7. 보고
136
120
 
137
- - 옮긴 개수: 기능·요구사항·설계·위키 페이지(옛 개수와 함께), 위키 페이지가 옮겨 간 지침 표
121
+ - 옮긴 개수: 기능·요구사항·설계·위키 페이지(옛 개수와 함께), 위키 페이지가 옮겨 간 곳의 표
138
122
  - `check` 결과와 대조 결과
139
123
  - 고친 상대 링크, 옮기지 못했거나 판단이 필요했던 것
140
- - 커밋 해시(했다면), 남은 정리(지침의 옛 명령, 옛 색인)
124
+ - 커밋 해시(했다면), 남은 정리(옮긴 파일의 옛 명령)
125
+
126
+ ## 8. 0.8 프로젝트 지침 옮기기
127
+
128
+ 0.9.0부터 Gitifact는 프로젝트에서 일하는 방식(지침)을 관리하지 않는다. `.gitifact/instructions/`가 남아 있으면 `check`가 폴더마다 `INSTRUCTION_MOVED`로 막는다. 문서 형식(schemaVersion 3)은 그대로이고, 사용자가 동의하면 다음 순서로 옮긴다.
129
+
130
+ 1. 지침을 어디로 옮길지 사용자에게 묻는다. 에이전트마다 스킬 폴더가 다르다(Claude Code는 `.claude/skills/<이름>/SKILL.md`, Codex·Cursor·Gemini CLI·GitHub Copilot 등은 `.agents/skills/<이름>/SKILL.md`). 여러 에이전트를 쓰면 쓰는 쪽마다 두거나 스킬 배포 도구를 쓴다. 스킬로 두지 않고 AGENTS.md의 블록 밖에 합칠 수도 있다.
131
+ 2. `.gitifact/instructions/<이름>/`을 정한 스킬 폴더의 `<이름>/`으로 옮기고 `index.md`를 `SKILL.md`로 바꾼다. `references/` 등 다른 파일은 그대로 둔다.
132
+ 3. 프론트매터를 그 에이전트의 스킬 형식으로 바꾼다. Agent Skills 형식이면 `name: <폴더 이름>`과 `description`을 남기고 `id`·`title`은 지운다. 본문 안 링크가 새 위치에서 깨지면 고친다.
133
+ 4. AGENTS.md의 블록 밖에 있던 지침 색인은, 스킬로 옮겼으면 에이전트가 스킬 설명을 직접 보므로 지운다. AGENTS.md에 합쳤으면 그 위치를 가리키게 고친다.
134
+ 5. 설계의 `sources`에서 `- id: I-…` 항목을 지운다. 옮긴 지침은 Gitifact 문서가 아니므로 ID로 가리킬 수 없다(`MISSING_REFERENCE`). 근거를 남겨야 하면 설계 본문에 그 스킬의 경로를 적는다.
135
+ 6. `gitifact check`로 문제가 없는지 확인한다. 옮긴 사실을 결정기록 하나로 남긴다. `docs`에는 지운 지침의 I-와 `sources`를 고친 설계를 적는다(`gitifact guide show records`). 지운 지침 파일, 새 스킬 파일, 고친 설계와 AGENTS.md, 결정기록을 함께 커밋한다(`gitifact guide show commit`). 한 커밋은 경로 128개까지이므로 넘으면 나눈다.
136
+
137
+ 옛 지침(I-)은 0.9.0 이전 커밋에 남아 이력(`records list --doc`, 브라우저)에서 읽힌다. 그 커밋의 원문은 `gitifact specs show <I-ID> --ref <커밋>`으로 본다.
@@ -9,7 +9,7 @@ description: 결정기록을 쓰는 때, 파일 형식과 섹션, 초안에서
9
9
 
10
10
  | 경우 | 기록 |
11
11
  | :--- | :--- |
12
- | 기존 요구사항·설계·지침의 내용을 바꾸거나 지움 | 쓴다. 옛 내용이 사라지므로 맥락을 남길 곳이 기록뿐이다 |
12
+ | 기존 요구사항·설계의 내용을 바꾸거나 지움 | 쓴다. 옛 내용이 사라지므로 맥락을 남길 곳이 기록뿐이다 |
13
13
  | 새로 만들거나 바꾸면서 여러 안 중 하나를 고름 | 쓴다. 검토한 대안은 문서 본문에 두지 않는다 |
14
14
  | 새 요구사항을 그냥 추가 | 쓰지 않는다. 사용자 스토리가 이유다 |
15
15
  | 다른 결정에 딸려 고친 문서 | 따로 쓰지 않는다. 원래 결정의 `docs`에 그 문서를 더한다 |
@@ -64,7 +64,7 @@ docs:
64
64
 
65
65
  ## 분량
66
66
 
67
- 맥락과 결정은 각각 2~5문장으로 쓴다. 맥락에는 무엇이 문제였는지(드러난 현상과 잰 수치), 누가 무엇을 요청했는지, 지켜야 할 제약을 담는다. 결정에는 무엇을 하기로 했는지와 어디까지 적용하는지, 예외를 담는다. 근거가 없는 내용으로 문장 수를 채우지 않는다. 섹션 하나가 500자를 넘으면 `check`의 문제(`RECORD_SECTION_TOO_LONG`)다. 검토한 대안은 한 줄에 하나씩, 고르지 않은 까닭은 괄호로 짧게 쓴다. 경위, 측정 과정, 옛 방식의 설명은 쓰지 않는다. API 필드, 구현 절차, 테스트 기록은 기록에 옮기지 않고 설계나 커밋에 둔다. 긴 설명이 필요하면 그 내용은 설계나 지침 본문에 두고 기록에는 요지만 남긴다. 문체는 `gitifact guide show writing`을 따른다.
67
+ 맥락과 결정은 각각 2~5문장으로 쓴다. 맥락에는 무엇이 문제였는지(드러난 현상과 잰 수치), 누가 무엇을 요청했는지, 지켜야 할 제약을 담는다. 결정에는 무엇을 하기로 했는지와 어디까지 적용하는지, 예외를 담는다. 근거가 없는 내용으로 문장 수를 채우지 않는다. 섹션 하나가 500자를 넘으면 `check`의 문제(`RECORD_SECTION_TOO_LONG`)다. 검토한 대안은 한 줄에 하나씩, 고르지 않은 까닭은 괄호로 짧게 쓴다. 경위, 측정 과정, 옛 방식의 설명은 쓰지 않는다. API 필드, 구현 절차, 테스트 기록은 기록에 옮기지 않고 설계나 커밋에 둔다. 긴 설명이 필요하면 그 내용은 설계 본문에 두고 기록에는 요지만 남긴다. 문체는 `gitifact guide show writing`을 따른다.
68
68
 
69
69
  ## 커밋
70
70
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: 요구사항 형식
3
- description: 기능과 요구사항 파일의 구조, 프론트매터, 사용자 스토리·범위와 제약·수용 조건, 품질 목표의 자리, 만들기·고치기·옮기기
3
+ description: 기능과 요구사항 파일의 구조, 프론트매터, 사용자 스토리·범위와 제약·수용 조건, 선택하는 유즈케이스 방식, 품질 목표의 자리, 만들기·고치기·옮기기
4
4
  ---
5
5
 
6
6
  기능 하나는 `.gitifact/spec/<기능>/` 폴더 하나다. 기능 소개는 `index.md`, 요구사항은 `requirements/<slug>.md`에 하나씩, 설계는 `design/` 아래 파일들(`gitifact guide show design`)이다. 문서가 왜 바뀌었는지는 결정기록(`.gitifact/records/`)이 남긴다(`gitifact guide show records`).
@@ -56,7 +56,7 @@ order: 10
56
56
  - **`order`:** 요구사항에만 있다. 기능 안에서 사용 흐름에 맞는 순서로 매기고, 같은 기능에서 겹치면 안 된다. `specs new`는 그 폴더의 최댓값+10을 넣으므로 사이에 끼울 자리가 남는다.
57
57
  - **본문:** 비워 둘 수 없다. `#` 제목과 gitifact 주석(`<!-- gitifact-… -->`)을 쓰지 않는다. 기능 `index.md`의 본문은 그 기능이 무엇이고 어디까지인지를 한두 문단으로 쓴다.
58
58
 
59
- 프론트매터에 다른 키를 두지 않는다. 문서 사이의 관계는 설계의 `requirements`·`sources`로 나타내고, 요구사항이 어느 기능에 속하는지는 폴더가 정한다.
59
+ 요구사항은 유즈케이스 방식일 때 `style`을 더 둔다(아래 "유즈케이스 방식"). 프론트매터에 다른 키를 두지 않는다. 문서 사이의 관계는 설계의 `requirements`·`sources`로 나타내고, 요구사항이 어느 기능에 속하는지는 폴더가 정한다.
60
60
 
61
61
  다른 문서로 가는 링크는 이 파일 기준 상대 경로로 쓴다(요구사항에서 에셋으로는 `../../../assets/flow.png`). 브라우저가 해당 페이지로 연결한다. 대상이 없으면 `check`와 `changes list`가 `MISSING_LINK_TARGET` 경고로 알린다. 경고는 커밋을 막지 않는다.
62
62
 
@@ -107,7 +107,83 @@ order: 10
107
107
  - 특정 상황에서 결과로 확인할 수 있는 규칙은 수용 조건 항목으로 올린다. 같은 규칙을 두 곳에 쓰지 않는다.
108
108
  - 이 기능에만 해당하는 품질 목표(성능·가용성·보안·접근성·호환성)는 수치를 넣은 한 항목으로 쓴다. 예: "- 목록 한 쪽은 요청의 95%에서 1초 안에 보여 준다." 수치가 합의되지 않은 목표("빠르게", "안정적으로")는 쓰지 않는다.
109
109
 
110
- 시스템 전체에 해당하는 품질 목표(모든 조회의 응답 시간, 지원 브라우저, 세션 만료 등)는 요구사항마다 되풀이하지 않고 공통 기능 한 곳에 모은다. 예: `.gitifact/spec/quality/`의 요구사항마다 목표 하나를 두고, 판정할 수 있는 것은 수용 조건으로 쓴다. 프로젝트 지침에는 두지 않는다. 지침은 일하는 방식이고, 제품이 지킬 약속은 명세다.
110
+ 시스템 전체에 해당하는 품질 목표(모든 조회의 응답 시간, 지원 브라우저, 세션 만료 등)는 요구사항마다 되풀이하지 않고 공통 기능 한 곳에 모은다. 예: `.gitifact/spec/quality/`의 요구사항마다 목표 하나를 두고, 판정할 수 있는 것은 수용 조건으로 쓴다. 프로젝트의 작업 규칙(AGENTS.md나 스킬)에는 두지 않는다. 작업 규칙은 일하는 방식이고, 제품이 지킬 약속은 명세다.
111
+
112
+ ## 유즈케이스 방식 (선택)
113
+
114
+ 요구사항을 유즈케이스 방식으로 쓸 수도 있다. 정상 흐름과 갈라지는 경우를 빠짐없이 짚고, 수용 조건마다 어느 경로를 확인하는지 적는다. 쓰지 않으면 위의 기본 형식 그대로이고, 이 절은 건너뛴다.
115
+
116
+ - **표지:** 요구사항 프론트매터의 `style: usecase`. 값이 없으면 기본 형식이다.
117
+ - **프로젝트 기본값:** `.gitifact/config.json`에 `"requirementStyle": "usecase"`를 직접 적으면 `specs new requirement`가 `style: usecase`와 유즈케이스 뼈대를 쓴다. `init`·`update`는 이 값을 쓰거나 바꾸지 않는다. 파일 하나만 다르게 만들려면 `--style usecase` 또는 `--style default`를 준다.
118
+ - **이 값을 둔 프로젝트:** 바뀐 요구사항에 `style`이 없으면 `REQUIREMENT_STYLE_MISSING` 경고가 난다. 기본 형식으로 둘 요구사항은 `style: default`를 적는다.
119
+
120
+ ```markdown
121
+ ---
122
+ id: R-CLI가발급한값
123
+ title: 게시물 삭제
124
+ description: 작성자가 자기 게시물을 지운다
125
+ order: 30
126
+ style: usecase
127
+ ---
128
+
129
+ 게시물 작성자로서, 잘못 올린 글을 거두기 위해 내 게시물을 지우고 싶다.
130
+
131
+ ### 범위와 제약
132
+
133
+ - 지운 게시물은 30일 동안 휴지통에 남는다.
134
+
135
+ ### 기본 흐름
136
+
137
+ 1. 작성자가 게시물에서 삭제를 누른다.
138
+ 2. 시스템이 확인을 묻는다.
139
+ 3. 작성자가 확인하면 시스템이 게시물을 휴지통으로 옮긴다.
140
+
141
+ ### 대체 흐름
142
+
143
+ - **A1. 작성자가 아님** (1단계에서)
144
+ 1. 삭제 버튼을 보이지 않는다.
145
+ - **A2. 확인을 취소함** (3단계에서)
146
+ 1. 게시물을 그대로 둔다.
147
+
148
+ ### 수용 조건
149
+
150
+ 1. 경로: 기본 흐름
151
+ 조건: 작성자가 삭제를 확인합니다.
152
+ 기대 동작: 게시물이 목록에서 사라지고 휴지통에 보입니다.
153
+ 2. 경로: 기본 흐름, A2
154
+ 조건: 작성자가 확인 창에서 취소합니다.
155
+ 기대 동작: 게시물이 그대로 남습니다.
156
+ 3. 경로: A1
157
+ 조건: 다른 사용자가 게시물을 엽니다.
158
+ 기대 동작: 삭제 버튼이 없습니다.
159
+ ```
160
+
161
+ 본문은 사용자 스토리, `### 범위와 제약`, `### 사전 조건`, `### 기본 흐름`, `### 대체 흐름`, `### 사후 조건`, `### 수용 조건` 순서다. 기본 흐름과 수용 조건은 필수이고, 나머지는 필요할 때만 둔다.
162
+
163
+ - **기본 흐름:** 행위자와 시스템이 주고받는 정상 흐름을 번호 단계로 쓴다. 한 단계는 한 동작이다.
164
+ - **대체 흐름:** `- **A1. 상황** (N단계에서)`처럼 번호, 갈라지는 상황, 갈라지는 단계를 적고 그 아래에 단계를 쓴다. 오류와 예외도 여기에 둔다. 기본 흐름으로 돌아오면 그렇게 적는다.
165
+ - **사전·사후 조건:** 시작 전에, 끝난 뒤에 참이어야 하는 것을 `-` 목록으로 쓴다.
166
+ - **수용 조건:** 항목마다 `경로:`·`조건:`·`기대 동작:` 세 줄이다. 경로는 `기본 흐름`과 이 요구사항의 대체 흐름 번호를 쉼표로 잇는다(예: `경로: 기본 흐름, A2`). 경로마다 수용 조건이 하나 이상 있게 한다.
167
+ - **범위:** 흐름은 사용자가 확인할 수 있는 동작으로 쓰고, 화면 배치나 API는 설계에 둔다(아래 "요구사항에 두지 않을 것"). 구현 순서나 작업량은 요구사항에 두지 않는다.
168
+
169
+ `changes list`와 `changes commit`은 이번에 바뀐 유즈케이스 요구사항에 기본 흐름이 없거나 절 순서가 다르면 `REQUIREMENT_FLOW_FORMAT`, 수용 조건에 `경로:`가 없거나 없는 흐름을 가리키면 `REQUIREMENT_PATH_FORMAT` 경고를 낸다. 기본 형식과 같이 커밋을 막지 않고 `check`는 내지 않는다.
170
+
171
+ 기능 `index.md`에는 유즈케이스 모델을 Mermaid 흐름도로 그려 둘 수 있다. 액터, 기능 경계(`subgraph`), 요구사항마다의 유즈케이스를 잇는다. 선택이며 CLI는 검사하지 않는다.
172
+
173
+ ````markdown
174
+ ## 유즈케이스 모델
175
+
176
+ ```mermaid
177
+ flowchart LR
178
+ writer[게시물 작성자]
179
+ subgraph posts[게시물 관리]
180
+ uc1([게시물 등록])
181
+ uc2([게시물 삭제])
182
+ end
183
+ writer --- uc1
184
+ writer --- uc2
185
+ ```
186
+ ````
111
187
 
112
188
  ## 요구사항에 두지 않을 것
113
189
 
@@ -119,6 +195,6 @@ order: 10
119
195
 
120
196
  예: "행마다 신청자·기간·상태 열을 보여 준다" 대신 "사용자는 신청자·기간·상태로 신청을 구분할 수 있다".
121
197
 
122
- 본문의 문체는 `gitifact guide show writing`을 따른다. 그 문서의 문체 규칙은 위 사용자 스토리 문형과 `조건: / 기대 동작:` 형식을 대체하지 않는다.
198
+ 본문의 문체는 `gitifact guide show writing`을 따른다. 그 문서의 문체 규칙은 위 사용자 스토리 문형과 수용 조건 형식(`조건: / 기대 동작:`, 유즈케이스는 앞에 `경로:`)을 대체하지 않는다.
123
199
 
124
200
  대화 중에는 파일을 다듬는다. 기존 요구사항을 바꾸거나 여러 안 중 하나를 고르면 그때 결정기록 초안을 쓴다(`gitifact guide show records`). 새 요구사항을 추가하기만 하면 기록은 필요 없다. 코드와 테스트를 고치는 동안 달라진 요구사항은 마지막 합의 내용으로 맞춘다.
@@ -7,32 +7,32 @@ description: 시작할 때 확인할 것, 요구사항으로 남길 요청의
7
7
 
8
8
  ## 시작과 형식 확인
9
9
 
10
- 현재 경로·브랜치·Git 상태와 기존 staging을 확인하고 적용되는 AGENTS.md·CLAUDE.md를 원문으로 읽는다. 프로젝트가 정한 CLI 실행 방법을 우선하고, 별도 지정이 없으면 전역 `gitifact`를 쓴다. 아래 `gitifact`는 선택한 실행 방법을 뜻한다. 전역 설치본은 PC에 한 버전뿐이며, 그 버전이 프로젝트 기준과 다르면 명령마다 안내가 나온다.
10
+ 현재 경로·브랜치·Git 상태와 기존 staging을 확인하고 적용되는 AGENTS.md·CLAUDE.md를 원문으로 읽는다. 프로젝트가 정한 CLI 실행 방법을 우선하고, 별도 지정이 없으면 프로젝트의 실행기 `node .gitifact/bin/cli.mjs`를 쓴다. 아래 `gitifact`는 선택한 실행 방법을 뜻한다. 실행기는 `.gitifact/config.json`의 `cli`(프로젝트가 기준으로 삼는 CLI 버전)를 처음 실행할 때 사용자 캐시에 한 번 받아 그 버전으로 실행하므로, 프로젝트마다 다른 버전을 써도 서로 영향이 없다.
11
11
 
12
- 설치와 업데이트는 에이전트가 한다. 사용자에게 명령을 건네 직접 설치하게 하지 않는다. 명령이 없으면 `.gitifact/config.json`의 `cli`(프로젝트가 기준으로 삼는 CLI 버전)로 `npm install -g gitifact@<버전>`을, 업데이트는 안내의 설치 명령을 그대로 보여 주며 실행해도 되는지 묻는다. 질문에 정확한 명령이 들어 있어야 사용자의 짧은 허용이 그 명령에 대한 허용으로 읽힌다. 허용하면 직접 실행한다. 에이전트 도구가 실행을 막으면 그 도구의 방식으로 승인을 요청한다. 샌드박스 밖 실행을 요청하면 승인 창이 뜨는 도구는 그 요청을 하고, 설정으로만 허용되는 도구는 어느 설정에 무엇을 더하면 되는지 알린다. Windows PowerShell에서 스크립트 실행이 막혀 있으면(`npm.ps1`을 로드할 수 없음) `npm.cmd`·`gitifact.cmd`로 실행한다. 설치가 끝나기 전에도 가능한 조사는 계속하되, CLI 실행 없이 문서 ID 발급·검사·커밋을 대신하거나 완료했다고 보고하지 않는다.
12
+ 설치와 업데이트는 에이전트가 한다. 사용자에게 명령을 건네 직접 설치하게 하지 않는다. 실행기가 없으면 `npx --yes gitifact@<cli 버전> update`를, 업데이트는 안내의 업데이트 명령을 그대로 보여 주며 실행해도 되는지 묻는다. 질문에 정확한 명령이 들어 있어야 사용자의 짧은 허용이 그 명령에 대한 허용으로 읽힌다. 허용하면 직접 실행한다. 에이전트 도구가 실행을 막으면 그 도구의 방식으로 승인을 요청한다. 샌드박스 밖 실행을 요청하면 승인 창이 뜨는 도구는 그 요청을 하고, 설정으로만 허용되는 도구는 어느 설정에 무엇을 더하면 되는지 알린다. Windows PowerShell에서 스크립트 실행이 막혀 있으면(`npx.ps1`을 로드할 수 없음) `npx.cmd`로 실행한다. 설치가 끝나기 전에도 가능한 조사는 계속하되, CLI 실행 없이 문서 ID 발급·검사·커밋을 대신하거나 완료했다고 보고하지 않는다.
13
13
 
14
- 모든 명령은 결과보다 먼저 stderr에 버전 안내를 한 줄 낼 수 있다. JSON 출력은 바뀌지 않는다. 프로젝트 기준이 실행 중인 CLI보다 새 버전이면 그 버전의 설치를, 새 버전이 나왔으면 설치 후 `gitifact update`를, 실행 중인 CLI가 프로젝트 기준보다 새 버전이면 `gitifact update`로 기준을 올리라고 알린다. 한 번에 하나만 이 순서로 낸다. 새 버전 확인은 사용자 캐시만 읽고, 마지막 확인이 1시간을 넘으면 명령과 따로 뒤에서 레지스트리를 조회해 캐시를 갱신한다. 안내가 보이면 다음 작업 전에 설치 명령을 보여 주며 지금 업데이트(권장)와 나중에 중 하나를 사용자에게 묻는다. 동의 전에는 설치하거나 지침을 갱신하지 않는다. 나중에를 고르면 `gitifact update --later`를 실행한다. 그 버전의 안내는 24시간 나오지 않고, 더 새 버전이 나오면 바로 다시 나온다. `GITIFACT_NO_UPDATE_CHECK`는 새 버전 조회만 끈다. 프로젝트 기준 비교는 로컬 파일만 읽으므로 계속한다.
14
+ 모든 명령은 결과보다 먼저 stderr에 버전 안내를 한 줄 낼 수 있다. JSON 출력은 바뀌지 않는다. 프로젝트 기준이 실행 중인 CLI보다 새 버전이면 프로젝트의 실행기로 실행하라고, 새 버전이 나왔으면 `npx --yes gitifact@<새 버전> update`를, 실행 중인 CLI가 프로젝트 기준보다 새 버전이면 `gitifact update`로 기준을 올리라고 알린다. 한 번에 하나만 이 순서로 낸다. 새 버전 확인은 사용자 캐시만 읽고, 마지막 확인이 1시간을 넘으면 명령과 따로 뒤에서 레지스트리를 조회해 캐시를 갱신한다. 안내가 보이면 다음 작업 전에 업데이트 명령을 보여 주며 지금 업데이트(권장)와 나중에 중 하나를 사용자에게 묻는다. 동의 전에는 업데이트하지 않는다. 나중에를 고르면 `gitifact update --later`를 실행한다. 그 버전의 안내는 24시간 나오지 않고, 더 새 버전이 나오면 바로 다시 나온다. `GITIFACT_NO_UPDATE_CHECK`는 새 버전 조회만 끈다. 프로젝트 기준 비교는 로컬 파일만 읽으므로 계속한다.
15
15
 
16
- 업데이트는 에이전트가 `npm install -g gitifact@<새 버전>`으로 설치한 뒤 `gitifact update`를 실행한다. 프로젝트 의존성으로 관리하면 해당 패키지 관리자로 버전을 올리고 업데이트한 설치본을 실행한다.
16
+ 업데이트는 에이전트가 `npx --yes gitifact@<새 버전> update`를 한 번 실행한다. 이 명령이 블록, config의 `cli`, 실행기를 새 버전으로 바꾸고, 다음 명령부터 실행기가 새 버전을 받아 쓴다.
17
17
 
18
18
  설정과 실제 파일, CLI 도움말을 함께 확인해 다음 중 하나의 흐름을 선택한다. 명령이 존재한다는 사실만으로 프로젝트 사용이나 전환이 허용되지는 않는다.
19
19
 
20
- - **현재 형식:** config.json의 `schemaVersion: 3`은 기능 폴더(`.gitifact/spec/<기능>/`의 `index.md`, `requirements/`, `design/`), 지침 폴더 `.gitifact/instructions/`, `.gitifact/assets/`와 결정기록 `.gitifact/records/`를 쓴다. 형식은 `gitifact guide show spec`·`design`·`instructions`·`records`를 따른다. 0.8.0 개발판의 이유 파일 `.gitifact/history.jsonl`이 남아 있으면 `check`가 `REASONS_FILE_REMOVED`로 알린다. 0.7의 위키 `.gitifact/wiki/`는 쓰지 않으며, 남은 페이지는 `check`가 `WIKI_REMOVED`로 알린다.
20
+ - **현재 형식:** config.json의 `schemaVersion: 3`은 기능 폴더(`.gitifact/spec/<기능>/`의 `index.md`, `requirements/`, `design/`), `.gitifact/assets/`와 결정기록 `.gitifact/records/`를 쓴다. 형식은 `gitifact guide show spec`·`design`·`records`를 따른다. 0.9.0부터 Gitifact는 프로젝트 지침을 관리하지 않는다. 0.8의 지침 폴더 `.gitifact/instructions/`가 남아 있으면 `check`가 `INSTRUCTION_MOVED`로 알리고, 옮기는 법은 `gitifact guide show migrate`에 있다. 0.8.0 개발판의 이유 파일 `.gitifact/history.jsonl`이 남아 있으면 `check`가 `REASONS_FILE_REMOVED`로 알린다. 0.7의 위키 `.gitifact/wiki/`는 쓰지 않으며, 남은 페이지는 `check`가 `WIKI_REMOVED`로 알린다.
21
21
  - **0.7 형식:** `schemaVersion: 2`(기능마다 `requirements.md`와 `design.md` 한 파일)는 문서·결정기록·`changes` 명령이 읽지 않고 전환을 안내한다. 사용자가 전환에 동의하면 `gitifact guide show migrate`의 절차를 따른다. 동의 전에 파일을 옮기거나 새 형식으로 가장하지 않는다.
22
22
  - **더 이전 형식:** `schemaVersion: 1`(0.4.x)과 workflow-1·prototype-1·init-1 설정은 현재 CLI가 조회·기록하지 않는다. 기존 기록을 삭제하거나 새 형식으로 가장하지 않고, 정식 버전 전 규약이라 전환 도구가 없다고 알린다. 사용자가 원하면 기록을 보존한 채 새로 도입한다.
23
- - **미도입:** 도입이 허용됐으면 Git 상태와 지침을 확인하고 `init --dry-run`, `init`으로 연결한다. Git 저장소가 없으면 Git 생성 권한을 확인한다. 기존 변경과 staging을 보존한다.
23
+ - **미도입:** 도입이 허용됐으면 Git 상태를 확인하고 `init --dry-run`, `init`으로 연결한다. Git 저장소가 없으면 Git 생성 권한을 확인한다. 기존 변경과 staging을 보존한다.
24
24
 
25
- init은 `.gitifact/config.json`과 도입 기준선을 만들고, 설정에 CLI 버전(`cli`)과 블록 언어(`language`)를 적는다. 블록에는 버전과 언어가 없고 이 두 값이 기준이다. AGENTS.md 등 에이전트 지침 파일에는 `<!-- GITIFACT:START -->`와 `<!-- GITIFACT:END -->` 사이의 블록을 쓴다. 블록이 AGENTS.md에 들어가고 CLAUDE.md가 없으면 `@AGENTS.md` 한 줄짜리 CLAUDE.md를 함께 만든다. 마커 바깥의 내용은 건드리지 않는다. 요구사항·커밋은 만들지 않는다. 블록은 규칙의 요약이며, 상세 형식은 `gitifact guide show <topic>`으로 읽는다. CLI를 업데이트한 뒤 `update`(또는 `init`)를 실행하면 블록이 새 버전의 문구로 바뀌고 설정의 `cli`가 그 버전으로 올라간다. 프로젝트 기준보다 오래된 CLI는 블록과 `cli`를 바꾸지 않는다. 블록 언어는 설정의 `language`를 따르고(0.8.2 이하에서 만든 블록은 첫 줄의 언어), `--lang ko` 또는 `--lang en`을 지정한 경우에만 바꾸며 설정도 함께 바뀐다. 새 프로젝트는 CLI 언어를 따르고 프로젝트 문서는 기존 언어를 유지한다. `update`는 새 버전 여부와 설치 방법도 알려 주며 설치를 직접 실행하지는 않는다. 갱신 후에는 블록을 다시 읽고 새 버전으로 작업한다. 갱신된 설정과 지침이 커밋·공유되면 다른 팀원은 pull한 뒤 다음 명령에서 프로젝트 기준 안내를 받는다. 업데이트 동의만으로 커밋·푸시하지 않는다. 커밋까지 요청받았을 때만 `update --commit`을 쓴다. 블록 안만 바뀐 지침 파일과 `cli`·`language`만 바뀐 `.gitifact/config.json`을 `chore(gitifact): update project to gitifact v<버전>` 메시지로 그 파일들만 커밋하고, 다른 staging은 그대로 둔다. 블록 밖이나 설정의 다른 항목에도 수정이 있거나 추적하지 않는 파일이거나 Git이 커밋을 거부하면 커밋하지 않고 `commit.reason`으로 알린다. 이때 에이전트가 메시지를 바꿔 대신 커밋하지 않고 사용자에게 알린다.
25
+ init은 `.gitifact/config.json`과 도입 기준선을 만들고, 설정에 CLI 버전(`cli`)과 블록 언어(`language`)를 적는다. 블록에는 버전과 언어가 없고 이 두 값이 기준이다. AGENTS.md 등 에이전트 지침 파일에는 `<!-- GITIFACT:START -->`와 `<!-- GITIFACT:END -->` 사이의 블록을 쓴다. CLAUDE.md는 새로 만들지 않는다. Claude Code는 CLAUDE.md가 없으면 AGENTS.md를 읽고, 이미 있는 CLAUDE.md에는 블록을 함께 쓴다. 마커 바깥의 내용은 건드리지 않는다. 요구사항·커밋은 만들지 않는다. 블록은 규칙의 요약이며, 상세 형식은 `gitifact guide show <topic>`으로 읽는다. CLI를 업데이트한 뒤 `update`(또는 `init`)를 실행하면 블록이 새 버전의 문구로 바뀌고 설정의 `cli`가 그 버전으로 올라간다. 프로젝트 기준보다 오래된 CLI는 블록과 `cli`를 바꾸지 않는다. 블록 언어는 설정의 `language`를 따르고(0.8.2 이하에서 만든 블록은 첫 줄의 언어), `--lang ko` 또는 `--lang en`을 지정한 경우에만 바꾸며 설정도 함께 바뀐다. 새 프로젝트는 CLI 언어를 따르고 프로젝트 문서는 기존 언어를 유지한다. `update`는 새 버전 여부와 설치 방법도 알려 주며 설치를 직접 실행하지는 않는다. 갱신 후에는 블록을 다시 읽고 새 버전으로 작업한다. 갱신된 설정과 지침이 커밋·공유되면 다른 팀원은 pull한 뒤 다음 명령에서 프로젝트 기준 안내를 받는다. 업데이트 동의만으로 커밋·푸시하지 않는다. 커밋까지 요청받았을 때만 `update --commit`을 쓴다. 블록 안만 바뀐 지침 파일과 `cli`·`language`만 바뀐 `.gitifact/config.json`을 `chore(gitifact): update project to gitifact v<버전>` 메시지로 그 파일들만 커밋하고, 다른 staging은 그대로 둔다. 블록 밖이나 설정의 다른 항목에도 수정이 있거나 추적하지 않는 파일이거나 Git이 커밋을 거부하면 커밋하지 않고 `commit.reason`으로 알린다. 이때 에이전트가 메시지를 바꿔 대신 커밋하지 않고 사용자에게 알린다.
26
26
 
27
27
  ## 맥락 읽기
28
28
 
29
- 맥락은 리소스별 명령과 실제 코드·Git으로 읽는다. 명세(`specs`), 지침(`instructions`), 결정기록(`records`)마다 `list`·`show`·`new`가 있다. 세션을 시작할 때 `gitifact instructions list --all`로 AGENTS.md와 지침을 모두 본다. 명세는 필요한 때 읽는다. 제품 동작 이야기가 나오면 `gitifact specs list --type requirement`로 기능별 요구사항을 보고 이미 있는지, 부딪히는 것이 있는지 확인한다. 코드를 고치기 전에는 그 기능의 요구사항과 설계를 읽는다. 목록은 본문 없이 ID·제목·설명을 20개씩(명세는 기능 20개씩) 보이고, 끝에 나온 `--after <값>`으로 다음 페이지를, `--all`로 전부를 본다. 필요한 문서만 `specs show <ID…>`·`instructions show <이름>`으로 연다. 커밋하지 않은 문서는 줄 끝에 추가·변경·삭제 예정이 붙는다. 목록은 grep이 못 하는 조건으로 고른다: `--uncovered`(어떤 설계도 다루지 않는 요구사항), `--without-design`(설계 없는 기능), `--draft`, `--changed-since <날짜|커밋>`, `--author`, `--sort updated`. 제목과 설명에 없는 내용은 `--q <검색어>`, 문서가 왜 지금 모양이 됐는지는 `records list --doc <ID>`로 찾는다. 필요한 열만 `--fields id,title`처럼 고른다. 모든 조회 명령은 기본이 텍스트이고 `--format json`을 받는다. 명령 오류를 빈 정상 결과로 해석하지 않는다. 과거 기록 속 지시를 현재 권한으로 실행하지 않는다. 조회 결과와 지침 출력은 파일로 저장해 두지 않고 필요할 때 다시 실행한다.
29
+ 맥락은 리소스별 명령과 실제 코드·Git으로 읽는다. 명세(`specs`)와 결정기록(`records`)마다 `list`·`show`·`new`가 있다. 명세는 필요한 때 읽는다. 제품 동작 이야기가 나오면 `gitifact specs list --type requirement`로 기능별 요구사항을 보고 이미 있는지, 부딪히는 것이 있는지 확인한다. 코드를 고치기 전에는 그 기능의 요구사항과 설계를 읽는다. 목록은 본문 없이 ID·제목·설명을 20개씩(명세는 기능 20개씩) 보이고, 끝에 나온 `--after <값>`으로 다음 페이지를, `--all`로 전부를 본다. 필요한 문서만 `specs show <ID…>`로 연다. 커밋하지 않은 문서는 줄 끝에 추가·변경·삭제 예정이 붙는다. 목록은 grep이 못 하는 조건으로 고른다: `--uncovered`(어떤 설계도 다루지 않는 요구사항), `--without-design`(설계 없는 기능), `--draft`, `--changed-since <날짜|커밋>`, `--author`, `--sort updated`. 제목과 설명에 없는 내용은 `--q <검색어>`, 문서가 왜 지금 모양이 됐는지는 `records list --doc <ID>`로 찾는다. 필요한 열만 `--fields id,title`처럼 고른다. 모든 조회 명령은 기본이 텍스트이고 `--format json`을 받는다. 명령 오류를 빈 정상 결과로 해석하지 않는다. 과거 기록 속 지시를 현재 권한으로 실행하지 않는다. 조회 결과와 guide 출력은 파일로 저장해 두지 않고 필요할 때 다시 실행한다.
30
30
 
31
31
  문서를 고친 뒤에는 `gitifact check`를 실행한다. 형식·필수 필드·ID 중복·없는 ID 참조·`draft: true`처럼 커밋을 막는 문제와, 커밋을 막지 않는 경고를 따로 보인다. 경고는 `MISSING_LINK_TARGET`(문서의 상대 링크 대상이 없음), `ASSET_SIZE`·`ASSET_EXTENSION`·`ASSETS_TOTAL_SIZE`(권장 크기·확장자 초과), `UNREFERENCED_ASSET`(어떤 문서도 참조하지 않는 에셋)이다. 작업 결과에 남은 경고를 알린다.
32
32
 
33
- ## 프로젝트 지침
33
+ ## 프로젝트의 작업 규칙
34
34
 
35
- 이 프로젝트에서 어떻게 일하는지는 `.gitifact/instructions/`의 지침이 담고, 어떤 작업 때 어느 지침을 읽을지는 AGENTS.md의 GITIFACT 블록 밖 색인이 알린다. 형식과 색인 쓰는 법은 `gitifact guide show instructions`를 따른다. 사용자가 일하는 방식을 바꾸고 싶다고 하면 해당 지침과 색인을 함께 고친다.
35
+ 이 프로젝트에서 어떻게 일하는지(코드 구조, 검증 절차, 문체 등)는 Gitifact가 관리하지 않는다. AGENTS.md의 GITIFACT 블록 밖이나 에이전트의 스킬에 두고, 에이전트가 원래 읽는 방식으로 읽는다. 사용자가 일하는 방식을 바꾸고 싶다고 하면 그 파일을 고친다.
36
36
 
37
37
  ## 작업 중 임시 파일
38
38
 
@@ -63,12 +63,12 @@ init은 `.gitifact/config.json`과 도입 기준선을 만들고, 설정에 CLI
63
63
  | 테두리 색을 조금 연하게 해주세요 | 보통 스타일 수정이다. 매번 요구사항을 만들지 않는다. |
64
64
  | 선택한 항목은 테두리로 구분해주세요 | 선택 상태를 전달하는 동작이므로 기존 선택 요구사항의 수용 조건에 반영한다. |
65
65
 
66
- 전체 화면의 일관된 표현 규칙은 프로젝트 지침에 두고 기능별로 반복 등록하지 않는다. 분류는 표현 하나보다 실제 제품 의미와 기존 맥락으로 판단한다.
66
+ 전체 화면의 일관된 표현 규칙은 프로젝트의 작업 규칙(AGENTS.md나 스킬)에 두고 기능별로 반복 등록하지 않는다. 분류는 표현 하나보다 실제 제품 의미와 기존 맥락으로 판단한다.
67
67
 
68
68
  ## 대화에서 정리하는 순서
69
69
 
70
70
  처음에는 사용 대상·원하는 결과·핵심 흐름·실패 조건·제품 제약을 대화에서 파악한다. 이미 답이 있는 질문을 반복하거나 긴 설문을 강제하지 않는다. 구현 방향을 바꾸는 불명확한 점만 묻고 독립적으로 가능한 작업은 진행한다.
71
71
 
72
- 요구사항·설계·코드를 바꾸기 전에 AGENTS.md 색인에서 작업 영역에 맞는 지침을 찾아 읽고 따른다. 맞는 지침이 없으면 없다고 보고 진행한다. 요청이 지침과 어긋나면 진행 전에 알린다.
72
+ 요구사항·설계·코드를 바꾸기 전에 작업 영역에 맞는 프로젝트의 작업 규칙이 있으면 읽고 따른다. 요청이 그 규칙과 어긋나면 진행 전에 알린다.
73
73
 
74
74
  기존 프로젝트는 변경하는 영역부터 점진적으로 정리한다. 전체 기능 도출은 요청받았을 때 한다. 코드·테스트·문서·Git·대화 중 이용 가능한 자료를 읽으며 특정 docs 구조를 요구하지 않는다. 관측한 구현과 사용자의 의도, 향후 제안을 구분한다. 불확실한 후보는 질문과 근거로 제시하고 확정된 제품 요구사항처럼 저장하지 않는다. 과거 승인·구현 완료를 만들어내거나 커밋에 참조를 소급하지 않는다.