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
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  title: 문서 문체
3
- description: 지침·요구사항·설계·결정기록에 공통으로 적용하는 문체, 본문과 결정기록의 구분, 인용·Alert·다이어그램, AI 슬롭 제거
3
+ description: 요구사항·설계·결정기록에 공통으로 적용하는 문체, 본문과 결정기록의 구분, 인용·Alert·다이어그램, AI 슬롭 제거
4
4
  ---
5
5
 
6
- 프로젝트 지침·요구사항·설계에 모두 적용한다. 문서는 CLI 표시 언어와 무관하게 프로젝트의 언어로 쓴다. 본문은 '~한다', '~이다'로 통일하고 제목은 내용을 나타내는 명사형으로 쓴다. 화면 문구·인용·코드의 표현은 유지한다.
6
+ 요구사항·설계에 모두 적용한다. 문서는 CLI 표시 언어와 무관하게 프로젝트의 언어로 쓴다. 본문은 '~한다', '~이다'로 통일하고 제목은 내용을 나타내는 명사형으로 쓴다. 화면 문구·인용·코드의 표현은 유지한다.
7
7
 
8
8
  ## 서술과 구성
9
9
 
@@ -24,13 +24,13 @@ description: 지침·요구사항·설계·결정기록에 공통으로 적용
24
24
 
25
25
  본문에는 지금 유효한 동작과 규칙만 쓴다. '전에는 …했는데 …라서 바꿨다', 바꾼 날짜와 계기, 옛 방식, 측정해 가며 고른 과정은 본문에 두지 않고 결정기록에 쓴다(`gitifact guide show records`). 읽는 사람은 이유를 `gitifact records list --doc <ID>`로, 옛 원문을 `gitifact specs show <ID> --ref <커밋>`으로 본다.
26
26
 
27
- 문서를 고칠 때는 바뀐 문장을 고쳐 쓰고 옛 동작을 설명하는 문장을 덧붙이지 않는다. 지켜야 할 결정은 본문에 규칙으로 쓰고, 그 맥락과 검토한 대안은 결정기록에 둔다. 설계나 지침에 결정 표를 따로 두지 않는다.
27
+ 문서를 고칠 때는 바뀐 문장을 고쳐 쓰고 옛 동작을 설명하는 문장을 덧붙이지 않는다. 지켜야 할 결정은 본문에 규칙으로 쓰고, 그 맥락과 검토한 대안은 결정기록에 둔다. 설계에 결정 표를 따로 두지 않는다.
28
28
 
29
29
  ## 인용과 Alert
30
30
 
31
31
  일반 인용구는 다른 문서나 발언을 인용할 때 쓴다. 문장 속에 묻히면 다음 작업자가 놓치기 쉬운 내용은 [GitHub Alert 문법](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
- | 종류 | 쓰는 자리 | 설계·지침의 예 |
33
+ | 종류 | 쓰는 자리 | 설계의 예 |
34
34
  | :--- | :--- | :--- |
35
35
  | `IMPORTANT` | 깨면 안 되는 불변 조건, 작업 전에 알아야 할 필수 조건 | 원본 파일을 바꾸지 않는다, 실패를 조용히 삼키지 않는다 |
36
36
  | `WARNING` | 어기면 보안 문제나 잘못된 동작으로 이어지는 조건 | 인증 없이 열린 경로의 범위를 넓히지 않는다 |
@@ -0,0 +1,77 @@
1
+ // Gitifact launcher, written by `gitifact init` and `gitifact update`; do not edit, the next update rewrites it.
2
+ // It runs the Gitifact release this project is on (`cli` in ../config.json): `node .gitifact/bin/cli.mjs <command>`.
3
+ // The release is kept once per computer in the user's cache, fetched from the npm registry the first time and checked
4
+ // against the registry's integrity. GITIFACT_PACKAGE names a local package file to use instead (an unpublished build).
5
+ import { spawnSync } from 'node:child_process';
6
+ import { createHash } from 'node:crypto';
7
+ import { existsSync, mkdirSync, mkdtempSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
8
+ import { homedir } from 'node:os';
9
+ import { dirname, join, normalize, sep } from 'node:path';
10
+ import { gunzipSync } from 'node:zlib';
11
+
12
+ const fail = message => { process.stderr.write('gitifact launcher: ' + message + '\n'); process.exit(1); };
13
+
14
+ let version;
15
+ try { version = JSON.parse(readFileSync(join(import.meta.dirname, '..', 'config.json'), 'utf8')).cli; }
16
+ catch { fail('cannot read .gitifact/config.json next to this launcher.'); }
17
+ if (typeof version !== 'string' || !/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(version)) fail('.gitifact/config.json has no valid "cli" version.');
18
+
19
+ // The same per-user cache folder the CLI keeps its update check in.
20
+ const env = process.env; const home = homedir();
21
+ const cacheRoot = env.GITIFACT_CACHE_DIR || (process.platform === 'win32' ? join(env.LOCALAPPDATA || join(home, 'AppData', 'Local'), 'gitifact')
22
+ : process.platform === 'darwin' ? join(home, 'Library', 'Caches', 'gitifact') : join(env.XDG_CACHE_HOME || join(home, '.cache'), 'gitifact'));
23
+ const releases = join(cacheRoot, 'cli');
24
+ const main = join(releases, version, 'package', 'dist', 'main.js');
25
+
26
+ /** The files of a gzipped tar, by path: enough of ustar, pax and GNU long names for an npm package. */
27
+ function untar(gzipped) {
28
+ const data = gunzipSync(gzipped); const files = new Map();
29
+ const text = (start, length) => data.subarray(start, start + length).toString('utf8').replace(/\0.*$/s, '');
30
+ let offset = 0; let longName;
31
+ while (offset + 512 <= data.length) {
32
+ if (data[offset] === 0) break;
33
+ const size = parseInt(text(offset + 124, 12).trim() || '0', 8); const type = String.fromCharCode(data[offset + 156] || 48);
34
+ const body = data.subarray(offset + 512, offset + 512 + size);
35
+ let name = longName ?? ((text(offset + 345, 155) ? text(offset + 345, 155) + '/' : '') + text(offset, 100)); longName = undefined;
36
+ if (type === 'x') { const path = /(?:^|\n)\d+ path=([^\n]*)\n/.exec(body.toString('utf8')); if (path) longName = path[1]; }
37
+ else if (type === 'L') longName = body.toString('utf8').replace(/\0.*$/s, '');
38
+ else if (type === '0' || type === '7') files.set(name, body);
39
+ offset += 512 + Math.ceil(size / 512) * 512;
40
+ }
41
+ return files;
42
+ }
43
+
44
+ /** Unpacks a package into the cache as `<version>/package`, all at once so a half-written release is never run. */
45
+ function unpack(tarball) {
46
+ mkdirSync(releases, { recursive: true });
47
+ const staging = mkdtempSync(join(releases, '.tmp-'));
48
+ try {
49
+ for (const [name, body] of untar(tarball)) {
50
+ const path = normalize(join(staging, name));
51
+ if (!path.startsWith(staging + sep)) throw new Error('the package holds a path outside itself: ' + name);
52
+ mkdirSync(dirname(path), { recursive: true }); writeFileSync(path, body);
53
+ }
54
+ const unpacked = JSON.parse(readFileSync(join(staging, 'package', 'package.json'), 'utf8'));
55
+ if (unpacked.name !== 'gitifact' || unpacked.version !== version) throw new Error('the package is ' + unpacked.name + '@' + unpacked.version + ', not gitifact@' + version + '.');
56
+ try { renameSync(staging, join(releases, version)); }
57
+ catch (error) { if (!existsSync(main)) throw error; }
58
+ } finally { rmSync(staging, { recursive: true, force: true }); }
59
+ }
60
+
61
+ async function fetchRelease() {
62
+ const registry = (env.npm_config_registry || 'https://registry.npmjs.org').replace(/\/+$/, '');
63
+ process.stderr.write('gitifact launcher: fetching gitifact@' + version + ' once for this computer…\n');
64
+ const manifest = await fetch(registry + '/gitifact/' + version).then(r => r.ok ? r.json() : fail('the registry has no gitifact@' + version + ' (' + r.status + ').'));
65
+ const { tarball, integrity } = manifest.dist ?? {};
66
+ if (!tarball || !/^sha512-/.test(integrity ?? '')) fail('the registry answer for gitifact@' + version + ' has no sha512 integrity.');
67
+ const bytes = Buffer.from(await fetch(tarball).then(r => r.ok ? r.arrayBuffer() : fail('could not download ' + tarball + ' (' + r.status + ').')));
68
+ if ('sha512-' + createHash('sha512').update(bytes).digest('base64') !== integrity) fail('the downloaded package does not match the registry integrity.');
69
+ return bytes;
70
+ }
71
+
72
+ if (!existsSync(main)) {
73
+ try { unpack(env.GITIFACT_PACKAGE ? readFileSync(env.GITIFACT_PACKAGE) : await fetchRelease()); }
74
+ catch (error) { fail('could not prepare gitifact@' + version + ': ' + (error?.message ?? error)); }
75
+ }
76
+ const run = spawnSync(process.execPath, [main, ...process.argv.slice(2)], { stdio: 'inherit' });
77
+ process.exit(run.status ?? 1);