swallowkit 1.0.0-beta.55 → 1.0.0-beta.57

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 (141) 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 +113 -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 +56 -0
  27. package/dist/core/operations/file-session.d.ts.map +1 -0
  28. package/dist/core/operations/file-session.js +203 -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 +187 -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.map +1 -1
  74. package/dist/core/scaffold/auth-generator.js +24 -27
  75. package/dist/core/scaffold/auth-generator.js.map +1 -1
  76. package/dist/core/scaffold/functions-generator.js +9 -9
  77. package/dist/core/scaffold/native-schema-generator.d.ts +7 -1
  78. package/dist/core/scaffold/native-schema-generator.d.ts.map +1 -1
  79. package/dist/core/scaffold/native-schema-generator.js +104 -47
  80. package/dist/core/scaffold/native-schema-generator.js.map +1 -1
  81. package/dist/core/scaffold/nextjs-generator.js +6 -6
  82. package/dist/core/scaffold/ui-generator.js +19 -19
  83. package/dist/core/scaffold/ui-generator.js.map +1 -1
  84. package/dist/core/verify/index.d.ts +62 -0
  85. package/dist/core/verify/index.d.ts.map +1 -0
  86. package/dist/core/verify/index.js +343 -0
  87. package/dist/core/verify/index.js.map +1 -0
  88. package/dist/machine/contracts.d.ts +8 -0
  89. package/dist/machine/contracts.d.ts.map +1 -1
  90. package/dist/machine/errors.d.ts +4 -1
  91. package/dist/machine/errors.d.ts.map +1 -1
  92. package/dist/machine/errors.js +9 -1
  93. package/dist/machine/errors.js.map +1 -1
  94. package/dist/machine/index.d.ts.map +1 -1
  95. package/dist/machine/index.js +350 -16
  96. package/dist/machine/index.js.map +1 -1
  97. package/dist/mcp/index.d.ts.map +1 -1
  98. package/dist/mcp/index.js +202 -1
  99. package/dist/mcp/index.js.map +1 -1
  100. package/dist/types/index.d.ts +14 -0
  101. package/dist/types/index.d.ts.map +1 -1
  102. package/package.json +1 -1
  103. package/src/__tests__/__snapshots__/functions-generator.test.ts.snap +17 -17
  104. package/src/__tests__/__snapshots__/nextjs-generator.test.ts.snap +6 -6
  105. package/src/__tests__/__snapshots__/ui-generator.test.ts.snap +11 -11
  106. package/src/__tests__/agent-loop-phase34.test.ts +449 -0
  107. package/src/__tests__/file-session.test.ts +98 -0
  108. package/src/__tests__/init.test.ts +50 -0
  109. package/src/__tests__/mcp.test.ts +113 -5
  110. package/src/__tests__/plan-apply.test.ts +461 -0
  111. package/src/__tests__/scaffold.test.ts +2 -2
  112. package/src/cli/commands/add-auth.ts +164 -164
  113. package/src/cli/commands/init.ts +186 -24
  114. package/src/cli/commands/scaffold.ts +136 -130
  115. package/src/cli/index.ts +148 -2
  116. package/src/core/config.ts +5 -4
  117. package/src/core/operations/auth-operations.ts +353 -0
  118. package/src/core/operations/create-model.ts +25 -13
  119. package/src/core/operations/file-session.ts +222 -0
  120. package/src/core/operations/provision-operations.ts +297 -0
  121. package/src/core/operations/runtime.ts +23 -0
  122. package/src/core/operations/scaffold-apply.ts +106 -0
  123. package/src/core/operations/scaffold-machine.ts +2 -16
  124. package/src/core/operations/scaffold-plan.ts +215 -0
  125. package/src/core/project/artifacts.ts +205 -0
  126. package/src/core/project/boundaries.ts +170 -0
  127. package/src/core/project/drift.ts +202 -0
  128. package/src/core/project/infra.ts +196 -0
  129. package/src/core/project/state.ts +77 -0
  130. package/src/core/project/workflows.ts +249 -0
  131. package/src/core/scaffold/auth-generator.ts +24 -27
  132. package/src/core/scaffold/functions-generator.ts +9 -9
  133. package/src/core/scaffold/native-schema-generator.ts +152 -70
  134. package/src/core/scaffold/nextjs-generator.ts +6 -6
  135. package/src/core/scaffold/ui-generator.ts +19 -19
  136. package/src/core/verify/index.ts +392 -0
  137. package/src/machine/contracts.ts +16 -0
  138. package/src/machine/errors.ts +12 -1
  139. package/src/machine/index.ts +444 -15
  140. package/src/mcp/index.ts +198 -2
  141. package/src/types/index.ts +17 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../../../src/core/project/drift.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,MAAM,MAAM,SAAS,GACjB,cAAc,GACd,iBAAiB,GACjB,mBAAmB,GACnB,kBAAkB,GAClB,gBAAgB,CAAC;AAErB,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEzD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAsID,wBAAsB,WAAW,CAAC,WAAW,GAAE,MAAsB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA0BpG"}
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ /**
3
+ * Drift Detection — 生成物と現在のプロジェクト状態の乖離を検出する。
4
+ *
5
+ * 検出対象:
6
+ * - schema-drift: スキーマ変更後に生成物が再生成されていない
7
+ * - generator-drift: Generator (SwallowKit) のバージョンが生成時から変わっている
8
+ * - artifact-modified: 生成後にファイルが手動変更されている(再生成で失われる可能性)
9
+ * - artifact-missing: 台帳に記録された生成物が存在しない
10
+ * - manifest-drift: Manifest と実際のプロジェクト構造が一致していない
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.detectDrift = detectDrift;
47
+ const path = __importStar(require("path"));
48
+ const version_1 = require("../../version");
49
+ const file_session_1 = require("../operations/file-session");
50
+ const artifacts_1 = require("./artifacts");
51
+ const manifest_1 = require("./manifest");
52
+ function detectArtifactDrift(record, projectRoot, findings) {
53
+ const absolutePath = path.join(projectRoot, record.path);
54
+ const currentHash = (0, file_session_1.hashFileIfExists)(absolutePath);
55
+ if (currentHash === null) {
56
+ findings.push({
57
+ kind: "artifact-missing",
58
+ severity: "warning",
59
+ message: `Generated artifact is missing: ${record.path}`,
60
+ path: record.path,
61
+ entity: record.sourceModel,
62
+ expected: record.contentHash,
63
+ actual: "missing",
64
+ repairAction: record.sourceModel
65
+ ? `Run "swallowkit machine apply scaffold ${record.sourceModel}" to regenerate the artifact.`
66
+ : "Re-run the SwallowKit generator that produced this artifact.",
67
+ });
68
+ return;
69
+ }
70
+ if (currentHash !== record.contentHash) {
71
+ const isUserEditable = record.ownership === "user-owned" || record.ownership === "generated-once";
72
+ findings.push({
73
+ kind: "artifact-modified",
74
+ severity: isUserEditable ? "info" : "warning",
75
+ message: isUserEditable
76
+ ? `${record.ownership} artifact has been edited after generation (expected): ${record.path}`
77
+ : `${record.ownership} artifact has been modified after generation; regenerating will require approval: ${record.path}`,
78
+ path: record.path,
79
+ entity: record.sourceModel,
80
+ expected: record.contentHash,
81
+ actual: currentHash,
82
+ repairAction: isUserEditable
83
+ ? "No action required. Edits to this ownership class are expected."
84
+ : "Keep the customization (plan/apply will flag a conflict) or revert the file to the generated content.",
85
+ });
86
+ }
87
+ }
88
+ function detectSchemaDrift(records, projectRoot, findings) {
89
+ const bySchema = new Map();
90
+ for (const record of records) {
91
+ if (!record.schemaHash || !record.sourceModel)
92
+ continue;
93
+ const key = record.sourceModel;
94
+ const entry = bySchema.get(key) ?? { schemaHash: record.schemaHash, sourceModel: record.sourceModel, paths: [] };
95
+ entry.schemaHash = record.schemaHash;
96
+ entry.paths.push(record.path);
97
+ bySchema.set(key, entry);
98
+ }
99
+ for (const [modelName, entry] of bySchema) {
100
+ // モデルファイルは shared/models/<kebab>.ts 規約
101
+ const kebab = modelName
102
+ .replace(/([a-z0-9])([A-Z])/g, "$1-$2")
103
+ .replace(/([A-Z])([A-Z][a-z])/g, "$1-$2")
104
+ .toLowerCase();
105
+ const modelPath = path.join(projectRoot, "shared", "models", `${kebab}.ts`);
106
+ const currentSchemaHash = (0, file_session_1.hashFileIfExists)(modelPath);
107
+ if (currentSchemaHash === null) {
108
+ continue; // モデルファイルが見つからない場合は manifest-drift 側で検出される
109
+ }
110
+ if (currentSchemaHash !== entry.schemaHash) {
111
+ findings.push({
112
+ kind: "schema-drift",
113
+ severity: "warning",
114
+ message: `Model "${modelName}" changed after its artifacts were generated (${entry.paths.length} artifact(s) are stale).`,
115
+ path: `shared/models/${kebab}.ts`,
116
+ entity: modelName,
117
+ expected: entry.schemaHash,
118
+ actual: currentSchemaHash,
119
+ repairAction: `Run "swallowkit machine plan scaffold ${kebab}" then apply to regenerate artifacts for ${modelName}.`,
120
+ });
121
+ }
122
+ }
123
+ }
124
+ function detectGeneratorDrift(records, findings) {
125
+ const currentVersion = (0, version_1.getSwallowKitVersion)();
126
+ const staleVersions = new Map();
127
+ for (const record of records) {
128
+ if (record.generatorVersion !== currentVersion) {
129
+ staleVersions.set(record.generatorVersion, (staleVersions.get(record.generatorVersion) ?? 0) + 1);
130
+ }
131
+ }
132
+ for (const [version, count] of staleVersions) {
133
+ findings.push({
134
+ kind: "generator-drift",
135
+ severity: "info",
136
+ message: `${count} artifact(s) were generated with SwallowKit ${version}; current version is ${currentVersion}.`,
137
+ expected: currentVersion,
138
+ actual: version,
139
+ repairAction: "Re-run scaffold for affected models to regenerate artifacts with the current generator version.",
140
+ });
141
+ }
142
+ }
143
+ async function detectManifestDrift(projectRoot, findings) {
144
+ const stored = (0, manifest_1.readProjectManifest)(projectRoot);
145
+ if (!stored) {
146
+ return;
147
+ }
148
+ const { manifest: rebuilt } = await (0, manifest_1.buildProjectManifest)(projectRoot);
149
+ const sameEntitySet = JSON.stringify(stored.entities.map((entity) => entity.name).sort()) ===
150
+ JSON.stringify(rebuilt.entities.map((entity) => entity.name).sort());
151
+ const sameRouteSet = JSON.stringify(stored.routes.map((route) => route.name).sort()) ===
152
+ JSON.stringify(rebuilt.routes.map((route) => route.name).sort());
153
+ if (!sameEntitySet || !sameRouteSet) {
154
+ findings.push({
155
+ kind: "manifest-drift",
156
+ severity: "warning",
157
+ message: `${manifest_1.SWALLOWKIT_MANIFEST_PATH} does not match the current project structure.`,
158
+ path: manifest_1.SWALLOWKIT_MANIFEST_PATH.replace(/\\/g, "/"),
159
+ repairAction: "Run any SwallowKit generator command (or scaffold) to refresh the project manifest.",
160
+ });
161
+ }
162
+ }
163
+ async function detectDrift(projectRoot = process.cwd()) {
164
+ const findings = [];
165
+ const ledger = (0, artifacts_1.loadArtifactLedger)(projectRoot);
166
+ if (ledger) {
167
+ for (const record of ledger.artifacts) {
168
+ detectArtifactDrift(record, projectRoot, findings);
169
+ }
170
+ detectSchemaDrift(ledger.artifacts, projectRoot, findings);
171
+ detectGeneratorDrift(ledger.artifacts, findings);
172
+ }
173
+ else {
174
+ findings.push({
175
+ kind: "artifact-modified",
176
+ severity: "info",
177
+ message: "No artifact ledger (.swallowkit/artifacts.json) found. Artifact-level drift is unknown for this project.",
178
+ repairAction: "Run scaffold (or apply) once with the current SwallowKit version to initialize the artifact ledger.",
179
+ });
180
+ }
181
+ await detectManifestDrift(projectRoot, findings);
182
+ return {
183
+ ledgerFound: ledger !== null,
184
+ findings: findings.sort((a, b) => a.kind.localeCompare(b.kind) || (a.path ?? "").localeCompare(b.path ?? "")),
185
+ checkedArtifacts: ledger?.artifacts.length ?? 0,
186
+ };
187
+ }
188
+ //# sourceMappingURL=drift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.js","sourceRoot":"","sources":["../../../src/core/project/drift.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Infra Inspection — infra/ 配下の Bicep 資産を決定論的に解析する。
3
+ * az CLI やネットワークアクセスは一切使わない(純粋なテキスト解析)。
4
+ */
5
+ export interface InfraParam {
6
+ name: string;
7
+ type: string;
8
+ defaultValue?: string;
9
+ description?: string;
10
+ allowed?: string[];
11
+ }
12
+ export interface InfraModule {
13
+ symbolicName: string;
14
+ source: string;
15
+ deploymentName?: string;
16
+ condition?: string;
17
+ }
18
+ export interface InfraOutput {
19
+ name: string;
20
+ type: string;
21
+ }
22
+ export interface InfraContainer {
23
+ file: string;
24
+ /** main.bicep に module として配線済みか */
25
+ wired: boolean;
26
+ }
27
+ export interface InfraInspection {
28
+ hasInfraDirectory: boolean;
29
+ mainBicep: {
30
+ exists: boolean;
31
+ path: string;
32
+ params: InfraParam[];
33
+ modules: InfraModule[];
34
+ outputs: InfraOutput[];
35
+ };
36
+ parametersFile: {
37
+ exists: boolean;
38
+ path: string;
39
+ };
40
+ moduleFiles: string[];
41
+ containers: InfraContainer[];
42
+ boundary: {
43
+ zone: "shared";
44
+ note: string;
45
+ };
46
+ warnings: string[];
47
+ }
48
+ export declare function inspectInfra(projectRoot?: string): InfraInspection;
49
+ //# sourceMappingURL=infra.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infra.d.ts","sourceRoot":"","sources":["../../../src/core/project/infra.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,EAAE;QACT,MAAM,EAAE,OAAO,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,UAAU,EAAE,CAAC;QACrB,OAAO,EAAE,WAAW,EAAE,CAAC;QACvB,OAAO,EAAE,WAAW,EAAE,CAAC;KACxB,CAAC;IACF,cAAc,EAAE;QACd,MAAM,EAAE,OAAO,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,QAAQ,EAAE;QACR,IAAI,EAAE,QAAQ,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAqFD,wBAAgB,YAAY,CAAC,WAAW,GAAE,MAAsB,GAAG,eAAe,CAwDjF"}
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ /**
3
+ * Infra Inspection — infra/ 配下の Bicep 資産を決定論的に解析する。
4
+ * az CLI やネットワークアクセスは一切使わない(純粋なテキスト解析)。
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.inspectInfra = inspectInfra;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ function parseParams(content) {
44
+ const params = [];
45
+ const lines = content.split(/\r?\n/);
46
+ let pendingDescription;
47
+ let pendingAllowed;
48
+ for (let i = 0; i < lines.length; i++) {
49
+ const line = lines[i].trim();
50
+ const descMatch = /^@description\('([^']*)'\)/.exec(line);
51
+ if (descMatch) {
52
+ pendingDescription = descMatch[1];
53
+ continue;
54
+ }
55
+ if (/^@allowed\(/.test(line)) {
56
+ // 単一行 @allowed(['a', 'b']) と複数行の両方に対応
57
+ let block = line;
58
+ let j = i;
59
+ while (!block.includes(")") && j + 1 < lines.length) {
60
+ j++;
61
+ block += "\n" + lines[j].trim();
62
+ }
63
+ i = j;
64
+ pendingAllowed = Array.from(block.matchAll(/'([^']*)'/g)).map((m) => m[1]);
65
+ continue;
66
+ }
67
+ const paramMatch = /^param\s+(\w+)\s+(\w+)(?:\s*=\s*(.+))?$/.exec(line);
68
+ if (paramMatch) {
69
+ params.push({
70
+ name: paramMatch[1],
71
+ type: paramMatch[2],
72
+ ...(paramMatch[3] ? { defaultValue: paramMatch[3].trim() } : {}),
73
+ ...(pendingDescription ? { description: pendingDescription } : {}),
74
+ ...(pendingAllowed ? { allowed: pendingAllowed } : {}),
75
+ });
76
+ pendingDescription = undefined;
77
+ pendingAllowed = undefined;
78
+ continue;
79
+ }
80
+ if (line !== "" && !line.startsWith("@") && !line.startsWith("//")) {
81
+ pendingDescription = undefined;
82
+ pendingAllowed = undefined;
83
+ }
84
+ }
85
+ return params;
86
+ }
87
+ function parseModules(content) {
88
+ const modules = [];
89
+ const moduleRegex = /module\s+(\w+)\s+'([^']+)'\s*=\s*(?:if\s*\(([^)]*)\)\s*)?\{/g;
90
+ for (const match of content.matchAll(moduleRegex)) {
91
+ const rest = content.slice((match.index ?? 0) + match[0].length);
92
+ const nameMatch = /name:\s*'([^']*)'/.exec(rest.slice(0, 200));
93
+ modules.push({
94
+ symbolicName: match[1],
95
+ source: match[2],
96
+ ...(nameMatch ? { deploymentName: nameMatch[1] } : {}),
97
+ ...(match[3] ? { condition: match[3].trim() } : {}),
98
+ });
99
+ }
100
+ return modules;
101
+ }
102
+ function parseOutputs(content) {
103
+ const outputs = [];
104
+ for (const match of content.matchAll(/^output\s+(\w+)\s+(\w+)\s*=/gm)) {
105
+ outputs.push({ name: match[1], type: match[2] });
106
+ }
107
+ return outputs;
108
+ }
109
+ function listBicepFiles(dir) {
110
+ if (!fs.existsSync(dir))
111
+ return [];
112
+ return fs
113
+ .readdirSync(dir)
114
+ .filter((f) => f.endsWith(".bicep"))
115
+ .sort();
116
+ }
117
+ function inspectInfra(projectRoot = process.cwd()) {
118
+ const infraDir = path.join(projectRoot, "infra");
119
+ const mainBicepPath = path.join(infraDir, "main.bicep");
120
+ const parametersPath = path.join(infraDir, "main.parameters.json");
121
+ const warnings = [];
122
+ const hasInfraDirectory = fs.existsSync(infraDir);
123
+ const mainExists = fs.existsSync(mainBicepPath);
124
+ let params = [];
125
+ let modules = [];
126
+ let outputs = [];
127
+ let mainContent = "";
128
+ if (mainExists) {
129
+ mainContent = fs.readFileSync(mainBicepPath, "utf-8");
130
+ params = parseParams(mainContent);
131
+ modules = parseModules(mainContent);
132
+ outputs = parseOutputs(mainContent);
133
+ }
134
+ else if (hasInfraDirectory) {
135
+ warnings.push("infra/main.bicep not found; provisioning is not possible until it is restored.");
136
+ }
137
+ const moduleFiles = listBicepFiles(path.join(infraDir, "modules")).map((f) => `infra/modules/${f}`);
138
+ const containers = listBicepFiles(path.join(infraDir, "containers")).map((f) => {
139
+ const wired = mainContent.includes(`containers/${f}`);
140
+ if (!wired) {
141
+ warnings.push(`container-not-wired: infra/containers/${f} is not referenced from infra/main.bicep; run scaffold again or wire it manually.`);
142
+ }
143
+ return { file: `infra/containers/${f}`, wired };
144
+ });
145
+ return {
146
+ hasInfraDirectory,
147
+ mainBicep: {
148
+ exists: mainExists,
149
+ path: "infra/main.bicep",
150
+ params,
151
+ modules,
152
+ outputs,
153
+ },
154
+ parametersFile: {
155
+ exists: fs.existsSync(parametersPath),
156
+ path: "infra/main.parameters.json",
157
+ },
158
+ moduleFiles,
159
+ containers,
160
+ boundary: {
161
+ zone: "shared",
162
+ note: "infra/main.bicep is an extension point: scaffold appends container modules deterministically; humans may edit other sections. infra/containers/*.bicep are managed (regenerated by scaffold).",
163
+ },
164
+ warnings,
165
+ };
166
+ }
167
+ //# sourceMappingURL=infra.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infra.js","sourceRoot":"","sources":["../../../src/core/project/infra.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * ローカル状態管理 — `.swallowkit/state/`
3
+ *
4
+ * Pending plan と最新の Verify 結果を保存する。Git 管理対象外
5
+ * (ディレクトリ内に自己 ignore する .gitignore を生成する)。
6
+ */
7
+ export declare const SWALLOWKIT_STATE_DIR: string;
8
+ export declare function savePlanState<TPlan extends {
9
+ planId: string;
10
+ }>(plan: TPlan, projectRoot?: string): void;
11
+ export declare function loadPlanState<TPlan>(planId: string, projectRoot?: string): TPlan | null;
12
+ export declare function deletePlanState(planId: string, projectRoot?: string): void;
13
+ export declare function saveLastVerifyState(result: unknown, projectRoot?: string): void;
14
+ export declare function loadLastVerifyState<TResult>(projectRoot?: string): TResult | null;
15
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/core/project/state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,eAAO,MAAM,oBAAoB,QAAoC,CAAC;AAqBtE,wBAAgB,aAAa,CAAC,KAAK,SAAS;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,EAC5D,IAAI,EAAE,KAAK,EACX,WAAW,GAAE,MAAsB,GAClC,IAAI,CAGN;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAE,MAAsB,GAAG,KAAK,GAAG,IAAI,CAWtG;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,GAAE,MAAsB,GAAG,IAAI,CAKzF;AAID,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,GAAE,MAAsB,GAAG,IAAI,CAG9F;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAE,MAAsB,GAAG,OAAO,GAAG,IAAI,CAUhG"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ /**
3
+ * ローカル状態管理 — `.swallowkit/state/`
4
+ *
5
+ * Pending plan と最新の Verify 結果を保存する。Git 管理対象外
6
+ * (ディレクトリ内に自己 ignore する .gitignore を生成する)。
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.SWALLOWKIT_STATE_DIR = void 0;
43
+ exports.savePlanState = savePlanState;
44
+ exports.loadPlanState = loadPlanState;
45
+ exports.deletePlanState = deletePlanState;
46
+ exports.saveLastVerifyState = saveLastVerifyState;
47
+ exports.loadLastVerifyState = loadLastVerifyState;
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ exports.SWALLOWKIT_STATE_DIR = path.join(".swallowkit", "state");
51
+ function ensureStateDir(projectRoot) {
52
+ const stateDir = path.join(projectRoot, exports.SWALLOWKIT_STATE_DIR);
53
+ fs.mkdirSync(path.join(stateDir, "plans"), { recursive: true });
54
+ const gitignorePath = path.join(stateDir, ".gitignore");
55
+ if (!fs.existsSync(gitignorePath)) {
56
+ fs.writeFileSync(gitignorePath, "*\n", "utf-8");
57
+ }
58
+ return stateDir;
59
+ }
60
+ function planPath(projectRoot, planId) {
61
+ if (!/^[A-Za-z0-9-]+$/.test(planId)) {
62
+ throw new Error(`Invalid plan id: ${planId}`);
63
+ }
64
+ return path.join(projectRoot, exports.SWALLOWKIT_STATE_DIR, "plans", `${planId}.json`);
65
+ }
66
+ function savePlanState(plan, projectRoot = process.cwd()) {
67
+ ensureStateDir(projectRoot);
68
+ fs.writeFileSync(planPath(projectRoot, plan.planId), JSON.stringify(plan, null, 2) + "\n", "utf-8");
69
+ }
70
+ function loadPlanState(planId, projectRoot = process.cwd()) {
71
+ const filePath = planPath(projectRoot, planId);
72
+ if (!fs.existsSync(filePath)) {
73
+ return null;
74
+ }
75
+ try {
76
+ return JSON.parse(fs.readFileSync(filePath, "utf-8"));
77
+ }
78
+ catch {
79
+ // 破損した plan は「存在しない」扱いに退化させ、呼び出し側の plan-not-found で再計画を促す
80
+ return null;
81
+ }
82
+ }
83
+ function deletePlanState(planId, projectRoot = process.cwd()) {
84
+ const filePath = planPath(projectRoot, planId);
85
+ if (fs.existsSync(filePath)) {
86
+ fs.unlinkSync(filePath);
87
+ }
88
+ }
89
+ const LAST_VERIFY_FILE = "last-verify.json";
90
+ function saveLastVerifyState(result, projectRoot = process.cwd()) {
91
+ const stateDir = ensureStateDir(projectRoot);
92
+ fs.writeFileSync(path.join(stateDir, LAST_VERIFY_FILE), JSON.stringify(result, null, 2) + "\n", "utf-8");
93
+ }
94
+ function loadLastVerifyState(projectRoot = process.cwd()) {
95
+ const filePath = path.join(projectRoot, exports.SWALLOWKIT_STATE_DIR, LAST_VERIFY_FILE);
96
+ if (!fs.existsSync(filePath)) {
97
+ return null;
98
+ }
99
+ try {
100
+ return JSON.parse(fs.readFileSync(filePath, "utf-8"));
101
+ }
102
+ catch {
103
+ return null;
104
+ }
105
+ }
106
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/core/project/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Workflow Docs & Agent Skills
3
+ *
4
+ * 同一のランブック コンテンツから 2 つの表面を生成する:
5
+ * - `.swallowkit/workflows/*.md` — Coding Agent 非依存の Markdown ランブック
6
+ * (AGENTS.md / CLAUDE.md / copilot-instructions.md から参照される)
7
+ * - `.github/skills/<name>/SKILL.md` — Agent Skills (agentskills.io open standard)。
8
+ * GitHub Copilot (VS Code / CLI / cloud agent) 等が name/description で自動発見し、
9
+ * タスクに関連するときだけ本文をロードする (progressive disclosure)。
10
+ */
11
+ export interface WorkflowDoc {
12
+ /** `.swallowkit/workflows/` 配下のファイル名 */
13
+ fileName: string;
14
+ title: string;
15
+ content: string;
16
+ /**
17
+ * Agent Skills のスキル名 (ディレクトリ名と一致必須)。
18
+ * agentskills.io 仕様: 小文字英数字とハイフンのみ・64 文字以内。
19
+ * undefined の場合はスキルとして出力しない (README など)。
20
+ */
21
+ skillName?: string;
22
+ /**
23
+ * Agent Skills の description (最大 1024 文字)。
24
+ * 「何をするか」と「いつ使うか」の両方を書く。
25
+ */
26
+ skillDescription?: string;
27
+ }
28
+ export declare function buildWorkflowDocs(runCmd: string): WorkflowDoc[];
29
+ export declare const WORKFLOWS_DIR: string;
30
+ export declare const SKILLS_DIR: string;
31
+ /** `.swallowkit/workflows/*.md` を書き出し、書き込んだ相対パスを返す。 */
32
+ export declare function writeWorkflowDocs(projectDir: string, runCmd: string): string[];
33
+ /** Agent Skills (agentskills.io) の SKILL.md コンテンツを組み立てる。 */
34
+ export declare function buildAgentSkills(runCmd: string): Array<{
35
+ skillName: string;
36
+ content: string;
37
+ }>;
38
+ /**
39
+ * `.github/skills/<name>/SKILL.md` を書き出し、書き込んだ相対パスを返す。
40
+ * agentskills.io 仕様: ディレクトリ名は frontmatter の name と一致必須。
41
+ */
42
+ export declare function writeAgentSkills(projectDir: string, runCmd: string): string[];
43
+ //# sourceMappingURL=workflows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../../src/core/project/workflows.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,MAAM,WAAW,WAAW;IAC1B,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE,CA8K/D;AAED,eAAO,MAAM,aAAa,QAAwC,CAAC;AACnE,eAAO,MAAM,UAAU,QAAiC,CAAC;AAEzD,uDAAuD;AACvD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAS9E;AAED,4DAA4D;AAC5D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAS9F;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAS7E"}