swallowkit 1.0.0-beta.54 → 1.0.0-beta.56

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 (138) hide show
  1. package/dist/cli/commands/add-auth.d.ts.map +1 -1
  2. package/dist/cli/commands/add-auth.js +154 -157
  3. package/dist/cli/commands/add-auth.js.map +1 -1
  4. package/dist/cli/commands/init.d.ts +5 -0
  5. package/dist/cli/commands/init.d.ts.map +1 -1
  6. package/dist/cli/commands/init.js +178 -25
  7. package/dist/cli/commands/init.js.map +1 -1
  8. package/dist/cli/commands/scaffold.d.ts +7 -2
  9. package/dist/cli/commands/scaffold.d.ts.map +1 -1
  10. package/dist/cli/commands/scaffold.js +111 -123
  11. package/dist/cli/commands/scaffold.js.map +1 -1
  12. package/dist/cli/index.d.ts.map +1 -1
  13. package/dist/cli/index.js +127 -2
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/core/config.d.ts +1 -1
  16. package/dist/core/config.d.ts.map +1 -1
  17. package/dist/core/config.js +8 -4
  18. package/dist/core/config.js.map +1 -1
  19. package/dist/core/operations/auth-operations.d.ts +57 -0
  20. package/dist/core/operations/auth-operations.d.ts.map +1 -0
  21. package/dist/core/operations/auth-operations.js +269 -0
  22. package/dist/core/operations/auth-operations.js.map +1 -0
  23. package/dist/core/operations/create-model.d.ts.map +1 -1
  24. package/dist/core/operations/create-model.js +23 -13
  25. package/dist/core/operations/create-model.js.map +1 -1
  26. package/dist/core/operations/file-session.d.ts +53 -0
  27. package/dist/core/operations/file-session.d.ts.map +1 -0
  28. package/dist/core/operations/file-session.js +195 -0
  29. package/dist/core/operations/file-session.js.map +1 -0
  30. package/dist/core/operations/provision-operations.d.ts +52 -0
  31. package/dist/core/operations/provision-operations.d.ts.map +1 -0
  32. package/dist/core/operations/provision-operations.js +211 -0
  33. package/dist/core/operations/provision-operations.js.map +1 -0
  34. package/dist/core/operations/runtime.d.ts +5 -0
  35. package/dist/core/operations/runtime.d.ts.map +1 -1
  36. package/dist/core/operations/runtime.js +23 -0
  37. package/dist/core/operations/runtime.js.map +1 -1
  38. package/dist/core/operations/scaffold-apply.d.ts +21 -0
  39. package/dist/core/operations/scaffold-apply.d.ts.map +1 -0
  40. package/dist/core/operations/scaffold-apply.js +57 -0
  41. package/dist/core/operations/scaffold-apply.js.map +1 -0
  42. package/dist/core/operations/scaffold-machine.d.ts.map +1 -1
  43. package/dist/core/operations/scaffold-machine.js +1 -13
  44. package/dist/core/operations/scaffold-machine.js.map +1 -1
  45. package/dist/core/operations/scaffold-plan.d.ts +43 -0
  46. package/dist/core/operations/scaffold-plan.d.ts.map +1 -0
  47. package/dist/core/operations/scaffold-plan.js +195 -0
  48. package/dist/core/operations/scaffold-plan.js.map +1 -0
  49. package/dist/core/project/artifacts.d.ts +58 -0
  50. package/dist/core/project/artifacts.d.ts.map +1 -0
  51. package/dist/core/project/artifacts.js +179 -0
  52. package/dist/core/project/artifacts.js.map +1 -0
  53. package/dist/core/project/boundaries.d.ts +50 -0
  54. package/dist/core/project/boundaries.d.ts.map +1 -0
  55. package/dist/core/project/boundaries.js +117 -0
  56. package/dist/core/project/boundaries.js.map +1 -0
  57. package/dist/core/project/drift.d.ts +29 -0
  58. package/dist/core/project/drift.d.ts.map +1 -0
  59. package/dist/core/project/drift.js +188 -0
  60. package/dist/core/project/drift.js.map +1 -0
  61. package/dist/core/project/infra.d.ts +49 -0
  62. package/dist/core/project/infra.d.ts.map +1 -0
  63. package/dist/core/project/infra.js +167 -0
  64. package/dist/core/project/infra.js.map +1 -0
  65. package/dist/core/project/state.d.ts +15 -0
  66. package/dist/core/project/state.d.ts.map +1 -0
  67. package/dist/core/project/state.js +106 -0
  68. package/dist/core/project/state.js.map +1 -0
  69. package/dist/core/project/workflows.d.ts +43 -0
  70. package/dist/core/project/workflows.d.ts.map +1 -0
  71. package/dist/core/project/workflows.js +255 -0
  72. package/dist/core/project/workflows.js.map +1 -0
  73. package/dist/core/scaffold/auth-generator.d.ts +1 -1
  74. package/dist/core/scaffold/auth-generator.d.ts.map +1 -1
  75. package/dist/core/scaffold/auth-generator.js +108 -52
  76. package/dist/core/scaffold/auth-generator.js.map +1 -1
  77. package/dist/core/scaffold/functions-generator.js +9 -9
  78. package/dist/core/scaffold/nextjs-generator.js +6 -6
  79. package/dist/core/scaffold/ui-generator.js +19 -19
  80. package/dist/core/scaffold/ui-generator.js.map +1 -1
  81. package/dist/core/verify/index.d.ts +62 -0
  82. package/dist/core/verify/index.d.ts.map +1 -0
  83. package/dist/core/verify/index.js +343 -0
  84. package/dist/core/verify/index.js.map +1 -0
  85. package/dist/machine/contracts.d.ts +8 -0
  86. package/dist/machine/contracts.d.ts.map +1 -1
  87. package/dist/machine/errors.d.ts +4 -1
  88. package/dist/machine/errors.d.ts.map +1 -1
  89. package/dist/machine/errors.js +9 -1
  90. package/dist/machine/errors.js.map +1 -1
  91. package/dist/machine/index.d.ts.map +1 -1
  92. package/dist/machine/index.js +350 -16
  93. package/dist/machine/index.js.map +1 -1
  94. package/dist/mcp/index.d.ts.map +1 -1
  95. package/dist/mcp/index.js +202 -1
  96. package/dist/mcp/index.js.map +1 -1
  97. package/dist/types/index.d.ts +14 -0
  98. package/dist/types/index.d.ts.map +1 -1
  99. package/package.json +1 -1
  100. package/src/__tests__/__snapshots__/functions-generator.test.ts.snap +17 -17
  101. package/src/__tests__/__snapshots__/nextjs-generator.test.ts.snap +6 -6
  102. package/src/__tests__/__snapshots__/ui-generator.test.ts.snap +11 -11
  103. package/src/__tests__/agent-loop-phase34.test.ts +449 -0
  104. package/src/__tests__/bff-swa-auth.test.ts +275 -0
  105. package/src/__tests__/file-session.test.ts +98 -0
  106. package/src/__tests__/init.test.ts +50 -0
  107. package/src/__tests__/mcp.test.ts +113 -5
  108. package/src/__tests__/multi-auth.test.ts +1 -1
  109. package/src/__tests__/plan-apply.test.ts +294 -0
  110. package/src/cli/commands/add-auth.ts +164 -164
  111. package/src/cli/commands/init.ts +186 -24
  112. package/src/cli/commands/scaffold.ts +128 -129
  113. package/src/cli/index.ts +148 -2
  114. package/src/core/config.ts +5 -4
  115. package/src/core/operations/auth-operations.ts +353 -0
  116. package/src/core/operations/create-model.ts +25 -13
  117. package/src/core/operations/file-session.ts +210 -0
  118. package/src/core/operations/provision-operations.ts +297 -0
  119. package/src/core/operations/runtime.ts +23 -0
  120. package/src/core/operations/scaffold-apply.ts +106 -0
  121. package/src/core/operations/scaffold-machine.ts +2 -16
  122. package/src/core/operations/scaffold-plan.ts +224 -0
  123. package/src/core/project/artifacts.ts +205 -0
  124. package/src/core/project/boundaries.ts +170 -0
  125. package/src/core/project/drift.ts +202 -0
  126. package/src/core/project/infra.ts +196 -0
  127. package/src/core/project/state.ts +77 -0
  128. package/src/core/project/workflows.ts +249 -0
  129. package/src/core/scaffold/auth-generator.ts +119 -60
  130. package/src/core/scaffold/functions-generator.ts +9 -9
  131. package/src/core/scaffold/nextjs-generator.ts +6 -6
  132. package/src/core/scaffold/ui-generator.ts +19 -19
  133. package/src/core/verify/index.ts +392 -0
  134. package/src/machine/contracts.ts +16 -0
  135. package/src/machine/errors.ts +12 -1
  136. package/src/machine/index.ts +444 -15
  137. package/src/mcp/index.ts +198 -2
  138. package/src/types/index.ts +17 -0
@@ -0,0 +1,195 @@
1
+ "use strict";
2
+ /**
3
+ * Plan Scaffold — scaffold を collect モードで実行し、書き込み予定を差分計画として返す。
4
+ * ディスクへの書き込みは一切行わない。
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.planScaffoldOperation = planScaffoldOperation;
41
+ exports.verifyPlanFingerprints = verifyPlanFingerprints;
42
+ const crypto = __importStar(require("crypto"));
43
+ const path = __importStar(require("path"));
44
+ const scaffold_1 = require("../../cli/commands/scaffold");
45
+ const version_1 = require("../../version");
46
+ const artifacts_1 = require("../project/artifacts");
47
+ const state_1 = require("../project/state");
48
+ const file_session_1 = require("./file-session");
49
+ const runtime_1 = require("./runtime");
50
+ function deriveScaffoldErrorMessage(messages) {
51
+ return (0, runtime_1.deriveCapturedErrorMessage)(messages, "Scaffold plan failed.");
52
+ }
53
+ /**
54
+ * scaffold を collect セッションで実行し、記録された操作を返す。
55
+ */
56
+ async function collectScaffoldOperations(options) {
57
+ const session = new file_session_1.FileOperationSession("collect");
58
+ const originalMachineOutput = process.env.SWALLOWKIT_MACHINE_OUTPUT;
59
+ process.env.SWALLOWKIT_MACHINE_OUTPUT = "1";
60
+ try {
61
+ const captured = await (0, runtime_1.captureConsoleMessagesWithError)(async () => {
62
+ await (0, runtime_1.interceptProcessExit)(async () => {
63
+ await (0, file_session_1.runWithFileSession)(session, async () => {
64
+ await (0, scaffold_1.scaffoldCommand)({
65
+ model: options.model,
66
+ functionsDir: options.functionsDir,
67
+ apiDir: options.apiDir,
68
+ apiOnly: options.apiOnly,
69
+ });
70
+ });
71
+ });
72
+ });
73
+ if (captured.error) {
74
+ if (captured.error instanceof runtime_1.ProcessExitInterceptError) {
75
+ throw new Error(deriveScaffoldErrorMessage(captured.messages));
76
+ }
77
+ if (captured.error instanceof Error) {
78
+ throw captured.error;
79
+ }
80
+ throw new Error(deriveScaffoldErrorMessage(captured.messages));
81
+ }
82
+ return session;
83
+ }
84
+ finally {
85
+ if (originalMachineOutput === undefined) {
86
+ delete process.env.SWALLOWKIT_MACHINE_OUTPUT;
87
+ }
88
+ else {
89
+ process.env.SWALLOWKIT_MACHINE_OUTPUT = originalMachineOutput;
90
+ }
91
+ }
92
+ }
93
+ async function planScaffoldOperation(options) {
94
+ const projectRoot = process.cwd();
95
+ const session = await collectScaffoldOperations(options);
96
+ const ledger = (0, artifacts_1.loadArtifactLedger)(projectRoot);
97
+ const operations = [];
98
+ const fingerprints = {};
99
+ const warnings = [...session.warnings];
100
+ for (const op of session.operations) {
101
+ fingerprints[op.path] = op.previousHash;
102
+ let action;
103
+ let conflict = false;
104
+ let conflictReason;
105
+ switch (op.action) {
106
+ case "create":
107
+ action = "create";
108
+ break;
109
+ case "skip":
110
+ action = "skip";
111
+ break;
112
+ case "append":
113
+ action = "append";
114
+ break;
115
+ case "delete":
116
+ action = "delete";
117
+ break;
118
+ case "modify": {
119
+ const record = ledger ? (0, artifacts_1.findArtifactRecord)(ledger, op.path) : undefined;
120
+ if (record && record.contentHash === op.previousHash) {
121
+ // 生成後に変更されていない managed ファイルの再生成 — 安全
122
+ action = "update";
123
+ }
124
+ else if (record) {
125
+ action = "overwrite";
126
+ conflict = true;
127
+ conflictReason = "modified-after-generation";
128
+ }
129
+ else {
130
+ action = "overwrite";
131
+ conflict = true;
132
+ conflictReason = "unknown-provenance";
133
+ warnings.push(`unknown-provenance: ${op.path} exists but is not tracked in .swallowkit/artifacts.json; regenerating will overwrite it.`);
134
+ }
135
+ break;
136
+ }
137
+ }
138
+ operations.push({
139
+ path: op.path,
140
+ action,
141
+ ownership: op.ownership,
142
+ conflict,
143
+ ...(conflictReason ? { conflictReason } : {}),
144
+ });
145
+ }
146
+ // モデルファイル自体も fingerprint に含め、Plan 後のスキーマ変更を stale として検出する
147
+ try {
148
+ const modelPath = (0, scaffold_1.resolveModelPath)(options.model);
149
+ fingerprints[(0, file_session_1.toProjectRelativePath)(projectRoot, modelPath)] = (0, file_session_1.hashFileIfExists)(modelPath);
150
+ }
151
+ catch {
152
+ // resolveModelPath が失敗する場合は collectScaffoldOperations 側で既に失敗している
153
+ }
154
+ const conflicts = operations.filter((op) => op.conflict);
155
+ const planId = crypto
156
+ .createHash("sha256")
157
+ .update(JSON.stringify({
158
+ model: options.model,
159
+ options: { functionsDir: options.functionsDir, apiDir: options.apiDir, apiOnly: options.apiOnly },
160
+ operations: operations.map((op) => ({ path: op.path, action: op.action })),
161
+ fingerprints,
162
+ }))
163
+ .digest("hex")
164
+ .slice(0, 12);
165
+ const plan = {
166
+ planId,
167
+ planType: "scaffold",
168
+ model: options.model,
169
+ options: {
170
+ ...(options.functionsDir ? { functionsDir: options.functionsDir } : {}),
171
+ ...(options.apiDir ? { apiDir: options.apiDir } : {}),
172
+ ...(options.apiOnly !== undefined ? { apiOnly: options.apiOnly } : {}),
173
+ },
174
+ createdAt: new Date().toISOString(),
175
+ swallowkitVersion: (0, version_1.getSwallowKitVersion)(),
176
+ operations,
177
+ warnings,
178
+ conflicts,
179
+ requiresApproval: conflicts.length > 0,
180
+ fingerprints,
181
+ };
182
+ (0, state_1.savePlanState)(plan, projectRoot);
183
+ return plan;
184
+ }
185
+ function verifyPlanFingerprints(plan, projectRoot = process.cwd()) {
186
+ const changedFiles = [];
187
+ for (const [relativePath, expectedHash] of Object.entries(plan.fingerprints)) {
188
+ const currentHash = (0, file_session_1.hashFileIfExists)(path.join(projectRoot, relativePath));
189
+ if (currentHash !== expectedHash) {
190
+ changedFiles.push(relativePath);
191
+ }
192
+ }
193
+ return { fresh: changedFiles.length === 0, changedFiles };
194
+ }
195
+ //# sourceMappingURL=scaffold-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-plan.js","sourceRoot":"","sources":["../../../src/core/operations/scaffold-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Artifact Ledger — `.swallowkit/artifacts.json`
3
+ *
4
+ * SwallowKit が生成・管理するファイルの所有権(Ownership)、内容ハッシュ、
5
+ * 生成元スキーマのハッシュ、Generator バージョンを記録する台帳。
6
+ * Git 管理を前提とし、Drift 検出と Plan の衝突判定の基礎データとなる。
7
+ */
8
+ import { ArtifactOwnership, RecordedFileOperation } from "../operations/file-session";
9
+ export declare const SWALLOWKIT_ARTIFACTS_PATH: string;
10
+ export declare const SWALLOWKIT_ARTIFACTS_VERSION = 1;
11
+ export type ArtifactLastOperation = "create" | "update" | "append" | "delete";
12
+ export interface ArtifactRecord {
13
+ /** Project-relative POSIX path */
14
+ path: string;
15
+ ownership: ArtifactOwnership;
16
+ /** Logical generator name, e.g. "scaffold", "create-model" */
17
+ generator: string;
18
+ generatorVersion: string;
19
+ /** Entity name the artifact was generated from, if any */
20
+ sourceModel?: string;
21
+ /** sha256 (LF normalized) of the source model file at generation time */
22
+ schemaHash?: string;
23
+ /** sha256 (LF normalized) of the artifact content at generation time */
24
+ contentHash: string;
25
+ generatedAt: string;
26
+ lastOperation: ArtifactLastOperation;
27
+ }
28
+ export interface ArtifactLedger {
29
+ version: number;
30
+ swallowkitVersion: string;
31
+ artifacts: ArtifactRecord[];
32
+ }
33
+ export declare function loadArtifactLedger(projectRoot?: string): ArtifactLedger | null;
34
+ export declare function saveArtifactLedger(ledger: ArtifactLedger, projectRoot?: string): void;
35
+ export declare function findArtifactRecord(ledger: ArtifactLedger | null, relativePath: string): ArtifactRecord | undefined;
36
+ export interface RecordArtifactContext {
37
+ /** sha256 of the source model file, when the operation batch originates from one model */
38
+ schemaHash?: string;
39
+ /** Fallback source model name */
40
+ sourceModel?: string;
41
+ }
42
+ /**
43
+ * セッションで記録された操作を台帳へ反映する。
44
+ * - skip は台帳更新しない(既存記録があれば schemaHash のみ更新)
45
+ * - delete は台帳からレコードを削除する
46
+ */
47
+ export declare function recordSessionOperations(operations: RecordedFileOperation[], context?: RecordArtifactContext, projectRoot?: string): ArtifactLedger;
48
+ export interface InspectedArtifact extends ArtifactRecord {
49
+ exists: boolean;
50
+ /** true when the current on-disk content differs from the recorded contentHash */
51
+ modified: boolean;
52
+ }
53
+ export declare function inspectArtifacts(projectRoot?: string): {
54
+ ledgerFound: boolean;
55
+ swallowkitVersion: string | null;
56
+ artifacts: InspectedArtifact[];
57
+ };
58
+ //# sourceMappingURL=artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../../src/core/project/artifacts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EAEtB,MAAM,4BAA4B,CAAC;AAEpC,eAAO,MAAM,yBAAyB,QAA6C,CAAC;AACpF,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE9E,MAAM,WAAW,cAAc;IAC7B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,iBAAiB,CAAC;IAC7B,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,qBAAqB,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,cAAc,EAAE,CAAC;CAC7B;AAED,wBAAgB,kBAAkB,CAAC,WAAW,GAAE,MAAsB,GAAG,cAAc,GAAG,IAAI,CAW7F;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,GAAE,MAAsB,GAAG,IAAI,CASpG;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,cAAc,GAAG,IAAI,EAC7B,YAAY,EAAE,MAAM,GACnB,cAAc,GAAG,SAAS,CAE5B;AAiBD,MAAM,WAAW,qBAAqB;IACpC,0FAA0F;IAC1F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,qBAAqB,EAAE,EACnC,OAAO,GAAE,qBAA0B,EACnC,WAAW,GAAE,MAAsB,GAClC,cAAc,CAgEhB;AAED,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,MAAM,EAAE,OAAO,CAAC;IAChB,kFAAkF;IAClF,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,WAAW,GAAE,MAAsB,GAAG;IACrE,WAAW,EAAE,OAAO,CAAC;IACrB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,SAAS,EAAE,iBAAiB,EAAE,CAAC;CAChC,CAqBA"}
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ /**
3
+ * Artifact Ledger — `.swallowkit/artifacts.json`
4
+ *
5
+ * SwallowKit が生成・管理するファイルの所有権(Ownership)、内容ハッシュ、
6
+ * 生成元スキーマのハッシュ、Generator バージョンを記録する台帳。
7
+ * Git 管理を前提とし、Drift 検出と Plan の衝突判定の基礎データとなる。
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.SWALLOWKIT_ARTIFACTS_VERSION = exports.SWALLOWKIT_ARTIFACTS_PATH = void 0;
44
+ exports.loadArtifactLedger = loadArtifactLedger;
45
+ exports.saveArtifactLedger = saveArtifactLedger;
46
+ exports.findArtifactRecord = findArtifactRecord;
47
+ exports.recordSessionOperations = recordSessionOperations;
48
+ exports.inspectArtifacts = inspectArtifacts;
49
+ const fs = __importStar(require("fs"));
50
+ const path = __importStar(require("path"));
51
+ const version_1 = require("../../version");
52
+ const file_session_1 = require("../operations/file-session");
53
+ exports.SWALLOWKIT_ARTIFACTS_PATH = path.join(".swallowkit", "artifacts.json");
54
+ exports.SWALLOWKIT_ARTIFACTS_VERSION = 1;
55
+ function loadArtifactLedger(projectRoot = process.cwd()) {
56
+ const ledgerPath = path.join(projectRoot, exports.SWALLOWKIT_ARTIFACTS_PATH);
57
+ if (!fs.existsSync(ledgerPath)) {
58
+ return null;
59
+ }
60
+ try {
61
+ return JSON.parse(fs.readFileSync(ledgerPath, "utf-8"));
62
+ }
63
+ catch {
64
+ return null;
65
+ }
66
+ }
67
+ function saveArtifactLedger(ledger, projectRoot = process.cwd()) {
68
+ const ledgerPath = path.join(projectRoot, exports.SWALLOWKIT_ARTIFACTS_PATH);
69
+ fs.mkdirSync(path.dirname(ledgerPath), { recursive: true });
70
+ const sorted = {
71
+ ...ledger,
72
+ swallowkitVersion: (0, version_1.getSwallowKitVersion)(),
73
+ artifacts: [...ledger.artifacts].sort((a, b) => a.path.localeCompare(b.path)),
74
+ };
75
+ fs.writeFileSync(ledgerPath, JSON.stringify(sorted, null, 2) + "\n", "utf-8");
76
+ }
77
+ function findArtifactRecord(ledger, relativePath) {
78
+ return ledger?.artifacts.find((record) => record.path === relativePath);
79
+ }
80
+ function toLastOperation(action) {
81
+ switch (action) {
82
+ case "create":
83
+ return "create";
84
+ case "modify":
85
+ return "update";
86
+ case "append":
87
+ return "append";
88
+ case "delete":
89
+ return "delete";
90
+ default:
91
+ return null;
92
+ }
93
+ }
94
+ /**
95
+ * セッションで記録された操作を台帳へ反映する。
96
+ * - skip は台帳更新しない(既存記録があれば schemaHash のみ更新)
97
+ * - delete は台帳からレコードを削除する
98
+ */
99
+ function recordSessionOperations(operations, context = {}, projectRoot = process.cwd()) {
100
+ const ledger = loadArtifactLedger(projectRoot) ?? {
101
+ version: exports.SWALLOWKIT_ARTIFACTS_VERSION,
102
+ swallowkitVersion: (0, version_1.getSwallowKitVersion)(),
103
+ artifacts: [],
104
+ };
105
+ const byPath = new Map(ledger.artifacts.map((record) => [record.path, record]));
106
+ const now = new Date().toISOString();
107
+ const generatorVersion = (0, version_1.getSwallowKitVersion)();
108
+ for (const operation of operations) {
109
+ if (operation.action === "delete") {
110
+ byPath.delete(operation.path);
111
+ continue;
112
+ }
113
+ if (operation.action === "skip") {
114
+ const existing = byPath.get(operation.path);
115
+ if (existing && context.schemaHash) {
116
+ existing.schemaHash = context.schemaHash;
117
+ existing.generatorVersion = generatorVersion;
118
+ }
119
+ else if (!existing && operation.newHash) {
120
+ // 内容一致でも台帳未登録なら記録し、以後の Drift 検出を可能にする
121
+ byPath.set(operation.path, {
122
+ path: operation.path,
123
+ ownership: operation.ownership,
124
+ generator: operation.generator,
125
+ generatorVersion,
126
+ sourceModel: operation.sourceModel ?? context.sourceModel,
127
+ schemaHash: context.schemaHash,
128
+ contentHash: operation.newHash,
129
+ generatedAt: now,
130
+ lastOperation: "update",
131
+ });
132
+ }
133
+ continue;
134
+ }
135
+ const lastOperation = toLastOperation(operation.action);
136
+ if (!lastOperation || !operation.newHash) {
137
+ continue;
138
+ }
139
+ byPath.set(operation.path, {
140
+ path: operation.path,
141
+ ownership: operation.ownership,
142
+ generator: operation.generator,
143
+ generatorVersion,
144
+ sourceModel: operation.sourceModel ?? context.sourceModel,
145
+ schemaHash: context.schemaHash,
146
+ contentHash: operation.newHash,
147
+ generatedAt: now,
148
+ lastOperation,
149
+ });
150
+ }
151
+ const updated = {
152
+ version: exports.SWALLOWKIT_ARTIFACTS_VERSION,
153
+ swallowkitVersion: generatorVersion,
154
+ artifacts: Array.from(byPath.values()),
155
+ };
156
+ saveArtifactLedger(updated, projectRoot);
157
+ return updated;
158
+ }
159
+ function inspectArtifacts(projectRoot = process.cwd()) {
160
+ const ledger = loadArtifactLedger(projectRoot);
161
+ if (!ledger) {
162
+ return { ledgerFound: false, swallowkitVersion: null, artifacts: [] };
163
+ }
164
+ const artifacts = ledger.artifacts.map((record) => {
165
+ const absolutePath = path.join(projectRoot, record.path);
166
+ const currentHash = (0, file_session_1.hashFileIfExists)(absolutePath);
167
+ return {
168
+ ...record,
169
+ exists: currentHash !== null,
170
+ modified: currentHash !== null && currentHash !== record.contentHash,
171
+ };
172
+ });
173
+ return {
174
+ ledgerFound: true,
175
+ swallowkitVersion: ledger.swallowkitVersion,
176
+ artifacts: artifacts.sort((a, b) => a.path.localeCompare(b.path)),
177
+ };
178
+ }
179
+ //# sourceMappingURL=artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../../src/core/project/artifacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Responsibility Boundaries — AI の自由生成と SwallowKit の決定論的処理の責任分界点。
3
+ *
4
+ * Coding Agent / 自律ループが「どこを自由に書いてよいか」「どこは SwallowKit の
5
+ * plan/apply に委ねるべきか」を機械可読な契約として取得できるようにする。
6
+ *
7
+ * zone:
8
+ * - deterministic: SwallowKit が決定論的に生成・再生成する領域。手編集しない。
9
+ * - ai-authored: AI / 開発者が自由に記述する領域。SwallowKit は上書きしない。
10
+ * - shared: マーカー区切りの共有領域。マーカー内は SwallowKit、外は自由。
11
+ */
12
+ import { ArtifactOwnership } from "../operations/file-session";
13
+ export type BoundaryZone = "deterministic" | "ai-authored" | "shared";
14
+ export type BoundaryEditPolicy = "never-hand-edit" | "regenerate-via-plan-apply" | "free-edit" | "edit-outside-markers";
15
+ export interface OwnershipPolicy {
16
+ ownership: ArtifactOwnership;
17
+ zone: BoundaryZone;
18
+ editPolicy: BoundaryEditPolicy;
19
+ howToChange: string;
20
+ }
21
+ export interface BoundaryPathRule {
22
+ /** Path prefix or glob-like pattern (documentation purpose; matching is prefix-based) */
23
+ pattern: string;
24
+ zone: BoundaryZone;
25
+ editPolicy: BoundaryEditPolicy;
26
+ description: string;
27
+ }
28
+ export interface BoundaryArtifact {
29
+ path: string;
30
+ ownership: ArtifactOwnership;
31
+ zone: BoundaryZone;
32
+ editPolicy: BoundaryEditPolicy;
33
+ generator: string;
34
+ sourceModel?: string;
35
+ }
36
+ export interface BoundariesContract {
37
+ contractVersion: number;
38
+ summary: string;
39
+ ownershipPolicies: OwnershipPolicy[];
40
+ /** 台帳に載っていないパスの既定規約 */
41
+ conventionRules: BoundaryPathRule[];
42
+ /** 台帳に記録された生成物ごとの解決結果 */
43
+ artifacts: BoundaryArtifact[];
44
+ guidance: string[];
45
+ }
46
+ export declare const OWNERSHIP_POLICIES: OwnershipPolicy[];
47
+ export declare const CONVENTION_RULES: BoundaryPathRule[];
48
+ export declare const BOUNDARY_GUIDANCE: string[];
49
+ export declare function inspectBoundaries(projectRoot?: string): BoundariesContract;
50
+ //# sourceMappingURL=boundaries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boundaries.d.ts","sourceRoot":"","sources":["../../../src/core/project/boundaries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAG/D,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,aAAa,GAAG,QAAQ,CAAC;AAEtE,MAAM,MAAM,kBAAkB,GAC1B,iBAAiB,GACjB,2BAA2B,GAC3B,WAAW,GACX,sBAAsB,CAAC;AAE3B,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,yFAAyF;IACzF,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,iBAAiB,CAAC;IAC7B,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,eAAe,EAAE,CAAC;IACrC,uBAAuB;IACvB,eAAe,EAAE,gBAAgB,EAAE,CAAC;IACpC,yBAAyB;IACzB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,eAAO,MAAM,kBAAkB,EAAE,eAAe,EAkC/C,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,gBAAgB,EAuC9C,CAAC;AAIF,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAMrC,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,WAAW,GAAE,MAAsB,GAAG,kBAAkB,CAwBzF"}
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ /**
3
+ * Responsibility Boundaries — AI の自由生成と SwallowKit の決定論的処理の責任分界点。
4
+ *
5
+ * Coding Agent / 自律ループが「どこを自由に書いてよいか」「どこは SwallowKit の
6
+ * plan/apply に委ねるべきか」を機械可読な契約として取得できるようにする。
7
+ *
8
+ * zone:
9
+ * - deterministic: SwallowKit が決定論的に生成・再生成する領域。手編集しない。
10
+ * - ai-authored: AI / 開発者が自由に記述する領域。SwallowKit は上書きしない。
11
+ * - shared: マーカー区切りの共有領域。マーカー内は SwallowKit、外は自由。
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.BOUNDARY_GUIDANCE = exports.CONVENTION_RULES = exports.OWNERSHIP_POLICIES = void 0;
15
+ exports.inspectBoundaries = inspectBoundaries;
16
+ const artifacts_1 = require("./artifacts");
17
+ exports.OWNERSHIP_POLICIES = [
18
+ {
19
+ ownership: "managed",
20
+ zone: "deterministic",
21
+ editPolicy: "regenerate-via-plan-apply",
22
+ howToChange: "Edit the source model (shared/models/*.ts) or configuration, then run `swallowkit machine plan scaffold <model>` and `apply scaffold`. Hand-edits are detected as drift and require --approve to overwrite.",
23
+ },
24
+ {
25
+ ownership: "generated-once",
26
+ zone: "ai-authored",
27
+ editPolicy: "free-edit",
28
+ howToChange: "Generated once as a starting point. Edit freely; SwallowKit never regenerates it.",
29
+ },
30
+ {
31
+ ownership: "user-owned",
32
+ zone: "ai-authored",
33
+ editPolicy: "free-edit",
34
+ howToChange: "Owned by the developer/AI. SwallowKit only creates the initial version (e.g. model files). Edit freely; managed artifacts are regenerated from it.",
35
+ },
36
+ {
37
+ ownership: "extension-point",
38
+ zone: "shared",
39
+ editPolicy: "edit-outside-markers",
40
+ howToChange: "SwallowKit appends only inside marked sections (e.g. `# SwallowKit scaffold registrations`). Edit anywhere outside the markers freely; do not remove the markers.",
41
+ },
42
+ {
43
+ ownership: "metadata",
44
+ zone: "deterministic",
45
+ editPolicy: "never-hand-edit",
46
+ howToChange: "Managed entirely by SwallowKit tooling (.swallowkit/). Never hand-edit.",
47
+ },
48
+ ];
49
+ exports.CONVENTION_RULES = [
50
+ {
51
+ pattern: ".swallowkit/",
52
+ zone: "deterministic",
53
+ editPolicy: "never-hand-edit",
54
+ description: "SwallowKit metadata (manifest, artifact ledger, plan state). Managed by tooling only.",
55
+ },
56
+ {
57
+ pattern: "shared/models/",
58
+ zone: "ai-authored",
59
+ editPolicy: "free-edit",
60
+ description: "Zod model schemas — the single source of truth. AI/developers author these freely; deterministic generation derives everything else from them.",
61
+ },
62
+ {
63
+ pattern: "infra/main.bicep",
64
+ zone: "shared",
65
+ editPolicy: "edit-outside-markers",
66
+ description: "SwallowKit inserts container modules; other infrastructure edits are free.",
67
+ },
68
+ {
69
+ pattern: "functions/function_app.py",
70
+ zone: "shared",
71
+ editPolicy: "edit-outside-markers",
72
+ description: "SwallowKit appends blueprint registrations under its marker; other edits are free.",
73
+ },
74
+ {
75
+ pattern: "shared/index.ts",
76
+ zone: "shared",
77
+ editPolicy: "edit-outside-markers",
78
+ description: "SwallowKit appends model exports; other exports may be added freely.",
79
+ },
80
+ {
81
+ pattern: "*",
82
+ zone: "ai-authored",
83
+ editPolicy: "free-edit",
84
+ description: "Any path not recorded in the artifact ledger is AI/developer-authored. Business logic, custom pages, custom Functions, and tests belong here.",
85
+ },
86
+ ];
87
+ const POLICY_BY_OWNERSHIP = new Map(exports.OWNERSHIP_POLICIES.map((policy) => [policy.ownership, policy]));
88
+ exports.BOUNDARY_GUIDANCE = [
89
+ "Author models and business logic freely (ai-authored zone), then let SwallowKit derive CRUD/BFF/UI/infra deterministically via plan/apply.",
90
+ "Never hand-edit deterministic-zone files; change the model or configuration and regenerate instead.",
91
+ "Use `swallowkit machine plan scaffold <model>` before applying; a plan with requiresApproval=true means a human (or explicit --approve) must confirm overwriting hand-edited files.",
92
+ "In shared-zone files, keep SwallowKit markers intact and edit outside them.",
93
+ "Run `swallowkit machine verify project` after applying changes; use `explain failure` to get repair evidence.",
94
+ ];
95
+ function inspectBoundaries(projectRoot = process.cwd()) {
96
+ const inspected = (0, artifacts_1.inspectArtifacts)(projectRoot);
97
+ const artifacts = inspected.artifacts.map((artifact) => {
98
+ const policy = POLICY_BY_OWNERSHIP.get(artifact.ownership);
99
+ return {
100
+ path: artifact.path,
101
+ ownership: artifact.ownership,
102
+ zone: policy?.zone ?? "ai-authored",
103
+ editPolicy: policy?.editPolicy ?? "free-edit",
104
+ generator: artifact.generator,
105
+ ...(artifact.sourceModel ? { sourceModel: artifact.sourceModel } : {}),
106
+ };
107
+ });
108
+ return {
109
+ contractVersion: 1,
110
+ summary: "SwallowKit separates deterministic generation (models → CRUD/BFF/UI/infra via plan/apply) from AI free-form authoring (models, business logic, custom code). This contract tells agents which files belong to which side.",
111
+ ownershipPolicies: exports.OWNERSHIP_POLICIES,
112
+ conventionRules: exports.CONVENTION_RULES,
113
+ artifacts,
114
+ guidance: exports.BOUNDARY_GUIDANCE,
115
+ };
116
+ }
117
+ //# sourceMappingURL=boundaries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boundaries.js","sourceRoot":"","sources":["../../../src/core/project/boundaries.ts"],"names":[],"mappings":"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"}