mustflow 2.22.5 → 2.22.12
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.
- package/README.md +8 -0
- package/dist/cli/commands/check.js +2 -2
- package/dist/cli/commands/classify.js +2 -0
- package/dist/cli/commands/dashboard.js +9 -69
- package/dist/cli/commands/help.js +1 -3
- package/dist/cli/commands/run/receipt.js +1 -0
- package/dist/cli/commands/run.js +14 -1
- package/dist/cli/commands/verify/evidence-input.js +269 -0
- package/dist/cli/commands/verify/input.js +212 -0
- package/dist/cli/commands/verify/state-paths.js +33 -0
- package/dist/cli/commands/verify.js +29 -511
- package/dist/cli/i18n/en.js +3 -0
- package/dist/cli/i18n/es.js +3 -0
- package/dist/cli/i18n/fr.js +3 -0
- package/dist/cli/i18n/hi.js +3 -0
- package/dist/cli/i18n/ko.js +3 -0
- package/dist/cli/i18n/zh.js +3 -0
- package/dist/cli/lib/dashboard-export.js +2 -0
- package/dist/cli/lib/dashboard-mutations.js +79 -0
- package/dist/cli/lib/doc-review-ledger.js +1 -3
- package/dist/cli/lib/local-index/command-effect-index.js +25 -0
- package/dist/cli/lib/local-index/hashing.js +7 -0
- package/dist/cli/lib/local-index/index.js +127 -826
- package/dist/cli/lib/local-index/source-index.js +137 -0
- package/dist/cli/lib/local-index/verification-evidence.js +451 -0
- package/dist/cli/lib/local-index/workflow-documents.js +204 -0
- package/dist/cli/lib/manifest-lock.js +1 -3
- package/dist/cli/lib/repo-map-frontmatter.js +53 -0
- package/dist/cli/lib/repo-map.js +10 -57
- package/dist/cli/lib/run-root-trust.js +27 -0
- package/dist/cli/lib/validation/index.js +6 -2
- package/dist/core/change-classification-policy.js +47 -0
- package/dist/core/change-classification.js +10 -43
- package/dist/core/check-issues.js +11 -7
- package/dist/core/command-contract-validation.js +22 -20
- package/dist/core/contract-lint.js +6 -2
- package/dist/core/correlation-id.js +16 -0
- package/dist/core/run-receipt.js +1 -0
- package/package.json +4 -1
- package/schemas/README.md +4 -0
- package/schemas/change-verification-report.schema.json +4 -0
- package/schemas/classify-report.schema.json +4 -0
- package/schemas/dashboard-export.schema.json +4 -0
- package/schemas/latest-run-pointer.schema.json +4 -0
- package/schemas/run-receipt.schema.json +4 -0
- package/schemas/verify-report.schema.json +4 -0
- package/schemas/verify-run-manifest.schema.json +4 -0
- package/templates/default/i18n.toml +3 -3
- package/templates/default/locales/en/.mustflow/skills/architecture-deepening-review/SKILL.md +25 -2
- package/templates/default/locales/en/.mustflow/skills/security-privacy-review/SKILL.md +9 -1
- package/templates/default/locales/en/.mustflow/skills/test-design-guard/SKILL.md +9 -1
- package/templates/default/locales/ko/.mustflow/context/INDEX.md +12 -12
- package/templates/default/locales/ko/.mustflow/context/PROJECT.md +6 -6
- package/templates/default/locales/ko/.mustflow/docs/agent-workflow.md +70 -70
- package/templates/default/locales/ko/AGENTS.md +14 -14
- package/templates/default/manifest.toml +1 -1
|
@@ -6,11 +6,11 @@ import { COMMAND_EFFECT_CONCURRENCY, COMMAND_EFFECT_MODES, COMMAND_EFFECT_TYPES,
|
|
|
6
6
|
import { commandIntentBlockedCommandPattern, commandIntentHasCommandSource, commandIntentNameIsSafe, } from './command-contract-rules.js';
|
|
7
7
|
import { MAX_COMMAND_OUTPUT_BYTES, commandMaxOutputBytesLimitMessage } from './command-output-limits.js';
|
|
8
8
|
import { SUCCESS_EXIT_CODES_CONTRACT_DESCRIPTION, successExitCodesAreValid } from './success-exit-codes.js';
|
|
9
|
-
function commandContractIssue(message) {
|
|
10
|
-
return { message };
|
|
9
|
+
function commandContractIssue(message, id) {
|
|
10
|
+
return id ? { id, message } : { message };
|
|
11
11
|
}
|
|
12
|
-
function commandContractWarning(message) {
|
|
13
|
-
return { message, severity: 'warning' };
|
|
12
|
+
function commandContractWarning(message, id) {
|
|
13
|
+
return id ? { id, message, severity: 'warning' } : { message, severity: 'warning' };
|
|
14
14
|
}
|
|
15
15
|
function hasOwn(table, key) {
|
|
16
16
|
return Object.prototype.hasOwnProperty.call(table, key);
|
|
@@ -56,7 +56,7 @@ function validatePositiveIntegerField(table, key, label, issues) {
|
|
|
56
56
|
function validateMaxOutputBytesField(table, key, label, issues) {
|
|
57
57
|
validatePositiveIntegerField(table, key, label, issues);
|
|
58
58
|
if (isPositiveInteger(table[key]) && Number(table[key]) > MAX_COMMAND_OUTPUT_BYTES) {
|
|
59
|
-
issues.push(commandContractIssue(commandMaxOutputBytesLimitMessage(label)));
|
|
59
|
+
issues.push(commandContractIssue(commandMaxOutputBytesLimitMessage(label), 'mustflow.command_contract.max_output_bytes_exceeds_limit'));
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
function validateAllowedStringField(table, key, label, allowedValues, issues) {
|
|
@@ -115,7 +115,7 @@ function validateCommandIntentEffects(intentName, intent, issues) {
|
|
|
115
115
|
return;
|
|
116
116
|
}
|
|
117
117
|
if (!Array.isArray(intent.effects) || intent.effects.some((entry) => !isRecord(entry))) {
|
|
118
|
-
issues.push(commandContractIssue(`[commands.intents.${intentName}].effects must be an array of tables
|
|
118
|
+
issues.push(commandContractIssue(`[commands.intents.${intentName}].effects must be an array of tables`, 'mustflow.command_contract.effects_invalid'));
|
|
119
119
|
return;
|
|
120
120
|
}
|
|
121
121
|
for (const effect of intent.effects) {
|
|
@@ -171,39 +171,39 @@ function validateCommandIntent(intentName, intent, issues) {
|
|
|
171
171
|
const lifecycle = typeof intent.lifecycle === 'string' ? intent.lifecycle : undefined;
|
|
172
172
|
const runPolicy = typeof intent.run_policy === 'string' ? intent.run_policy : undefined;
|
|
173
173
|
if (!lifecycle) {
|
|
174
|
-
issues.push(commandContractIssue(`Configured intent ${intentName} must define lifecycle
|
|
174
|
+
issues.push(commandContractIssue(`Configured intent ${intentName} must define lifecycle`, 'mustflow.command_contract.configured_missing_lifecycle'));
|
|
175
175
|
}
|
|
176
176
|
if (!runPolicy) {
|
|
177
|
-
issues.push(commandContractIssue(`Configured intent ${intentName} must define run_policy
|
|
177
|
+
issues.push(commandContractIssue(`Configured intent ${intentName} must define run_policy`, 'mustflow.command_contract.configured_missing_run_policy'));
|
|
178
178
|
}
|
|
179
179
|
if (lifecycle === 'oneshot') {
|
|
180
180
|
validatePositiveIntegerField(intent, 'timeout_seconds', `[commands.intents.${intentName}].timeout_seconds`, issues);
|
|
181
181
|
if (!hasOwn(intent, 'timeout_seconds')) {
|
|
182
|
-
issues.push(commandContractIssue(`Oneshot intent ${intentName} must define timeout_seconds
|
|
182
|
+
issues.push(commandContractIssue(`Oneshot intent ${intentName} must define timeout_seconds`, 'mustflow.command_contract.oneshot_missing_timeout'));
|
|
183
183
|
}
|
|
184
184
|
if (intent.stdin !== 'closed') {
|
|
185
|
-
issues.push(commandContractIssue(`Oneshot intent ${intentName} must set stdin = "closed"
|
|
185
|
+
issues.push(commandContractIssue(`Oneshot intent ${intentName} must set stdin = "closed"`, 'mustflow.command_contract.oneshot_stdin_not_closed'));
|
|
186
186
|
}
|
|
187
187
|
}
|
|
188
188
|
if (lifecycle && LONG_RUNNING_LIFECYCLES.has(lifecycle) && runPolicy === 'agent_allowed') {
|
|
189
|
-
issues.push(commandContractIssue(`Long-running intent ${intentName} must not use run_policy = "agent_allowed"
|
|
189
|
+
issues.push(commandContractIssue(`Long-running intent ${intentName} must not use run_policy = "agent_allowed"`, 'mustflow.command_contract.long_running_agent_allowed'));
|
|
190
190
|
}
|
|
191
191
|
if (intent.mode === 'shell' && runPolicy === 'agent_allowed' && intent.allow_shell !== true) {
|
|
192
|
-
issues.push(commandContractIssue(`Agent-runnable shell intent ${intentName} must set allow_shell = true
|
|
192
|
+
issues.push(commandContractIssue(`Agent-runnable shell intent ${intentName} must set allow_shell = true`, 'mustflow.command_contract.agent_shell_requires_allow'));
|
|
193
193
|
}
|
|
194
194
|
if (!commandIntentHasCommandSource(intent)) {
|
|
195
|
-
issues.push(commandContractIssue(`Configured intent ${intentName} must define argv or mode = "shell" with cmd
|
|
195
|
+
issues.push(commandContractIssue(`Configured intent ${intentName} must define argv or mode = "shell" with cmd`, 'mustflow.command_contract.executable_source_missing'));
|
|
196
196
|
}
|
|
197
197
|
const blockedCommandPattern = commandIntentBlockedCommandPattern(intent);
|
|
198
198
|
if (blockedCommandPattern?.code === 'shell_background_pattern') {
|
|
199
|
-
issues.push(commandContractIssue(`Shell intent ${intentName} contains a blocked long-running or background pattern
|
|
199
|
+
issues.push(commandContractIssue(`Shell intent ${intentName} contains a blocked long-running or background pattern`, 'mustflow.command_contract.shell_background_pattern'));
|
|
200
200
|
}
|
|
201
201
|
if (blockedCommandPattern?.code === 'long_running_command_pattern') {
|
|
202
|
-
issues.push(commandContractIssue(`Intent ${intentName} contains a blocked long-running or background command pattern
|
|
202
|
+
issues.push(commandContractIssue(`Intent ${intentName} contains a blocked long-running or background command pattern`, 'mustflow.command_contract.long_running_command_pattern'));
|
|
203
203
|
}
|
|
204
204
|
if (hasOwn(intent, 'success_exit_codes')) {
|
|
205
205
|
if (!successExitCodesAreValid(intent.success_exit_codes)) {
|
|
206
|
-
issues.push(commandContractIssue(`[commands.intents.${intentName}].success_exit_codes must be ${SUCCESS_EXIT_CODES_CONTRACT_DESCRIPTION}
|
|
206
|
+
issues.push(commandContractIssue(`[commands.intents.${intentName}].success_exit_codes must be ${SUCCESS_EXIT_CODES_CONTRACT_DESCRIPTION}`, 'mustflow.command_contract.success_exit_codes_invalid'));
|
|
207
207
|
}
|
|
208
208
|
}
|
|
209
209
|
validateCommandIntentEffects(intentName, intent, issues);
|
|
@@ -281,7 +281,9 @@ function validateCommandEnvInheritanceWarnings(commandsToml) {
|
|
|
281
281
|
const issues = [];
|
|
282
282
|
for (const warning of findCommandEnvInheritanceWarnings(commandsToml)) {
|
|
283
283
|
const message = formatCommandEnvInheritanceWarning(warning);
|
|
284
|
-
issues.push(warning.severity === 'warning'
|
|
284
|
+
issues.push(warning.severity === 'warning'
|
|
285
|
+
? commandContractWarning(message, 'mustflow.command_contract.broad_env_inheritance')
|
|
286
|
+
: commandContractIssue(message, 'mustflow.command_contract.broad_env_inheritance'));
|
|
285
287
|
}
|
|
286
288
|
return issues;
|
|
287
289
|
}
|
|
@@ -316,7 +318,7 @@ function validateProjectLocalBinWarnings(projectRoot, commandsToml) {
|
|
|
316
318
|
if (!projectLocalBinExecutableExists(projectRoot, executable)) {
|
|
317
319
|
continue;
|
|
318
320
|
}
|
|
319
|
-
issues.push(commandContractWarning(`configured agent-runnable intent ${intentName} uses bare executable "${executable}" that matches project-local node_modules/.bin; use a package-manager mediated command such as npm exec, pnpm exec, bun x, or yarn exec
|
|
321
|
+
issues.push(commandContractWarning(`configured agent-runnable intent ${intentName} uses bare executable "${executable}" that matches project-local node_modules/.bin; use a package-manager mediated command such as npm exec, pnpm exec, bun x, or yarn exec`, 'mustflow.command_contract.project_local_bin_bare_executable'));
|
|
320
322
|
}
|
|
321
323
|
return issues;
|
|
322
324
|
}
|
|
@@ -336,12 +338,12 @@ export function validateCommandContractConfig(commandsToml) {
|
|
|
336
338
|
validateCommandDefaults(commandsToml, issues);
|
|
337
339
|
validateCommandResources(commandsToml, issues);
|
|
338
340
|
if (!isRecord(commandsToml.intents)) {
|
|
339
|
-
issues.push(commandContractIssue('Missing [intents] table in .mustflow/config/commands.toml'));
|
|
341
|
+
issues.push(commandContractIssue('Missing [intents] table in .mustflow/config/commands.toml', 'mustflow.command_contract.intent_table_missing'));
|
|
340
342
|
return issues;
|
|
341
343
|
}
|
|
342
344
|
for (const [intentName, intent] of Object.entries(commandsToml.intents)) {
|
|
343
345
|
if (!isRecord(intent)) {
|
|
344
|
-
issues.push(commandContractIssue(`Intent ${intentName} must be a TOML table
|
|
346
|
+
issues.push(commandContractIssue(`Intent ${intentName} must be a TOML table`, 'mustflow.command_contract.intent_not_table'));
|
|
345
347
|
continue;
|
|
346
348
|
}
|
|
347
349
|
validateCommandIntent(intentName, intent, issues);
|
|
@@ -14,6 +14,7 @@ const CONTRACT_LINT_SOURCE_FILES = [
|
|
|
14
14
|
'.mustflow/docs/agent-workflow.md',
|
|
15
15
|
'AGENTS.md',
|
|
16
16
|
'src/core/change-classification.ts',
|
|
17
|
+
'src/core/change-classification-policy.ts',
|
|
17
18
|
];
|
|
18
19
|
export const DOCUMENTED_VERIFICATION_REASONS = [
|
|
19
20
|
'before_publish',
|
|
@@ -49,7 +50,10 @@ const RELEASE_SENSITIVE_REASONS = new Set([
|
|
|
49
50
|
]);
|
|
50
51
|
const COMMANDS_CONFIG_PATH = '.mustflow/config/commands.toml';
|
|
51
52
|
const SKILL_INDEX_PATH = '.mustflow/skills/INDEX.md';
|
|
52
|
-
const
|
|
53
|
+
const CHANGE_CLASSIFICATION_SOURCE_PATHS = [
|
|
54
|
+
'src/core/change-classification.ts',
|
|
55
|
+
'src/core/change-classification-policy.ts',
|
|
56
|
+
];
|
|
53
57
|
const AGENT_WORKFLOW_PATH = '.mustflow/docs/agent-workflow.md';
|
|
54
58
|
const PACKAGE_SCRIPT_RUNNERS = new Set(['bun', 'npm', 'pnpm', 'yarn']);
|
|
55
59
|
const MAKEFILE_CANDIDATES = ['Makefile', 'makefile'];
|
|
@@ -413,7 +417,7 @@ function classifyReasonSource(reason, knownClassificationReasons, documentedVeri
|
|
|
413
417
|
function buildRelatedDocs(source, relatedSkills) {
|
|
414
418
|
const docs = [COMMANDS_CONFIG_PATH];
|
|
415
419
|
if (source === 'classification') {
|
|
416
|
-
docs.push(
|
|
420
|
+
docs.push(...CHANGE_CLASSIFICATION_SOURCE_PATHS);
|
|
417
421
|
}
|
|
418
422
|
if (source === 'documented') {
|
|
419
423
|
docs.push(AGENT_WORKFLOW_PATH);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { randomBytes } from 'node:crypto';
|
|
2
|
+
export const CORRELATION_ID_PATTERN = '^mf-[a-z][a-z0-9_-]*-[0-9a-f]{16}$';
|
|
3
|
+
const CORRELATION_ID_REGEX = new RegExp(CORRELATION_ID_PATTERN);
|
|
4
|
+
function normalizeCorrelationScope(scope) {
|
|
5
|
+
const normalized = scope
|
|
6
|
+
.toLowerCase()
|
|
7
|
+
.replace(/[^a-z0-9_-]+/g, '_')
|
|
8
|
+
.replace(/^_+|_+$/g, '');
|
|
9
|
+
return /^[a-z][a-z0-9_-]*$/.test(normalized) ? normalized : 'event';
|
|
10
|
+
}
|
|
11
|
+
export function createCorrelationId(scope) {
|
|
12
|
+
return `mf-${normalizeCorrelationScope(scope)}-${randomBytes(8).toString('hex')}`;
|
|
13
|
+
}
|
|
14
|
+
export function isCorrelationId(value) {
|
|
15
|
+
return typeof value === 'string' && CORRELATION_ID_REGEX.test(value);
|
|
16
|
+
}
|
package/dist/core/run-receipt.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mustflow",
|
|
3
|
-
"version": "2.22.
|
|
3
|
+
"version": "2.22.12",
|
|
4
4
|
"description": "Agent workflow documents and CLI for mustflow repository roots.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT-0",
|
|
@@ -36,10 +36,13 @@
|
|
|
36
36
|
"test:coverage": "bun run build && node scripts/run-cli-tests.mjs coverage",
|
|
37
37
|
"test:audit": "node scripts/audit-tests.mjs --json",
|
|
38
38
|
"test:release": "bun run build && node scripts/run-cli-tests.mjs release",
|
|
39
|
+
"test:fast:node": "npm run build && node scripts/run-cli-tests.mjs fast",
|
|
40
|
+
"test:release:node": "npm run build && node scripts/run-cli-tests.mjs release",
|
|
39
41
|
"test:full": "bun run build && node scripts/run-cli-tests.mjs full-auto",
|
|
40
42
|
"test:full:auto": "bun run build && node scripts/run-cli-tests.mjs full-auto",
|
|
41
43
|
"test:full:serial": "bun run build && node scripts/run-cli-tests.mjs full",
|
|
42
44
|
"check": "bun run check:package && bun run test:full",
|
|
45
|
+
"check:core:node": "node scripts/run-node-core-check.mjs",
|
|
43
46
|
"check:package": "node -e \"const fs=require('fs'); JSON.parse(fs.readFileSync('package.json','utf8')); console.log('package.json ok')\"",
|
|
44
47
|
"check:typecheck": "tsc -p tsconfig.json --noEmit",
|
|
45
48
|
"prepack": "npm run build",
|
package/schemas/README.md
CHANGED
|
@@ -48,6 +48,10 @@ Current schemas:
|
|
|
48
48
|
These schemas define stable, automation-facing fields. Human-readable command
|
|
49
49
|
output is intentionally excluded.
|
|
50
50
|
|
|
51
|
+
Current `classify`, `verify`, `run`, dashboard export, and verify state outputs may include
|
|
52
|
+
`correlation_id` so local artifacts from one work incident can be connected without storing raw
|
|
53
|
+
transcripts, environment values, or hidden reasoning.
|
|
54
|
+
|
|
51
55
|
The published schema surface is tracked in `src/core/public-json-contracts.ts`.
|
|
52
56
|
Release tests verify consistency between this manifest, `schemas/*.schema.json`,
|
|
53
57
|
`npm pack --dry-run --json`, and the installed package’s JSON command output.
|
|
@@ -29,6 +29,10 @@
|
|
|
29
29
|
"classification_summary": {
|
|
30
30
|
"$ref": "#/$defs/classificationSummary"
|
|
31
31
|
},
|
|
32
|
+
"correlation_id": {
|
|
33
|
+
"type": "string",
|
|
34
|
+
"pattern": "^mf-[a-z][a-z0-9_-]*-[0-9a-f]{16}$"
|
|
35
|
+
},
|
|
32
36
|
"verification_plan_id": {
|
|
33
37
|
"type": "string",
|
|
34
38
|
"pattern": "^sha256:[0-9a-f]{64}$"
|
|
@@ -16,6 +16,10 @@
|
|
|
16
16
|
"properties": {
|
|
17
17
|
"schema_version": { "const": "1" },
|
|
18
18
|
"command": { "const": "classify" },
|
|
19
|
+
"correlation_id": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"pattern": "^mf-[a-z][a-z0-9_-]*-[0-9a-f]{16}$"
|
|
22
|
+
},
|
|
19
23
|
"mustflow_root": { "type": "string" },
|
|
20
24
|
"source": { "enum": ["changed", "paths"] },
|
|
21
25
|
"files": {
|
|
@@ -20,6 +20,10 @@
|
|
|
20
20
|
"properties": {
|
|
21
21
|
"schema_version": { "const": "1" },
|
|
22
22
|
"command": { "const": "dashboard export" },
|
|
23
|
+
"correlation_id": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"pattern": "^mf-[a-z][a-z0-9_-]*-[0-9a-f]{16}$"
|
|
26
|
+
},
|
|
23
27
|
"format": { "enum": ["html", "json"] },
|
|
24
28
|
"generated_at": { "type": "string" },
|
|
25
29
|
"mustflow_root": { "type": "string" },
|
|
@@ -23,6 +23,10 @@
|
|
|
23
23
|
"schema_version": { "const": "1" },
|
|
24
24
|
"command": { "const": "verify" },
|
|
25
25
|
"kind": { "const": "verify_run_summary" },
|
|
26
|
+
"correlation_id": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"pattern": "^mf-[a-z][a-z0-9_-]*-[0-9a-f]{16}$"
|
|
29
|
+
},
|
|
26
30
|
"reason": { "type": "string" },
|
|
27
31
|
"reasons": {
|
|
28
32
|
"type": "array",
|
|
@@ -34,6 +34,10 @@
|
|
|
34
34
|
"properties": {
|
|
35
35
|
"schema_version": { "const": "1" },
|
|
36
36
|
"command": { "const": "run" },
|
|
37
|
+
"correlation_id": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"pattern": "^mf-[a-z][a-z0-9_-]*-[0-9a-f]{16}$"
|
|
40
|
+
},
|
|
37
41
|
"intent": { "type": "string" },
|
|
38
42
|
"status": { "enum": ["passed", "failed", "timed_out", "start_failed", "output_limit_exceeded"] },
|
|
39
43
|
"timed_out": { "type": "boolean" },
|
|
@@ -23,6 +23,10 @@
|
|
|
23
23
|
"properties": {
|
|
24
24
|
"schema_version": { "const": "1" },
|
|
25
25
|
"command": { "const": "verify" },
|
|
26
|
+
"correlation_id": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"pattern": "^mf-[a-z][a-z0-9_-]*-[0-9a-f]{16}$"
|
|
29
|
+
},
|
|
26
30
|
"mustflow_root": { "type": "string" },
|
|
27
31
|
"reason": { "type": "string" },
|
|
28
32
|
"reasons": {
|
|
@@ -20,6 +20,10 @@
|
|
|
20
20
|
"properties": {
|
|
21
21
|
"schema_version": { "const": "1" },
|
|
22
22
|
"command": { "const": "verify" },
|
|
23
|
+
"correlation_id": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"pattern": "^mf-[a-z][a-z0-9_-]*-[0-9a-f]{16}$"
|
|
26
|
+
},
|
|
23
27
|
"reason": { "type": "string" },
|
|
24
28
|
"reasons": {
|
|
25
29
|
"type": "array",
|
|
@@ -74,7 +74,7 @@ translations = {}
|
|
|
74
74
|
[documents."skill.architecture-deepening-review"]
|
|
75
75
|
source = "locales/en/.mustflow/skills/architecture-deepening-review/SKILL.md"
|
|
76
76
|
source_locale = "en"
|
|
77
|
-
revision =
|
|
77
|
+
revision = 2
|
|
78
78
|
translations = {}
|
|
79
79
|
|
|
80
80
|
[documents."skill.behavior-preserving-refactor"]
|
|
@@ -325,7 +325,7 @@ translations = {}
|
|
|
325
325
|
[documents."skill.security-privacy-review"]
|
|
326
326
|
source = "locales/en/.mustflow/skills/security-privacy-review/SKILL.md"
|
|
327
327
|
source_locale = "en"
|
|
328
|
-
revision =
|
|
328
|
+
revision = 17
|
|
329
329
|
translations = {}
|
|
330
330
|
|
|
331
331
|
[documents."skill.security-regression-tests"]
|
|
@@ -349,7 +349,7 @@ translations = {}
|
|
|
349
349
|
[documents."skill.test-design-guard"]
|
|
350
350
|
source = "locales/en/.mustflow/skills/test-design-guard/SKILL.md"
|
|
351
351
|
source_locale = "en"
|
|
352
|
-
revision =
|
|
352
|
+
revision = 2
|
|
353
353
|
translations = {}
|
|
354
354
|
|
|
355
355
|
[documents."skill.test-maintenance"]
|
package/templates/default/locales/en/.mustflow/skills/architecture-deepening-review/SKILL.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
mustflow_doc: skill.architecture-deepening-review
|
|
3
3
|
locale: en
|
|
4
4
|
canonical: true
|
|
5
|
-
revision:
|
|
5
|
+
revision: 2
|
|
6
6
|
lifecycle: mustflow-owned
|
|
7
7
|
authority: procedure
|
|
8
8
|
name: architecture-deepening-review
|
|
@@ -37,6 +37,7 @@ This is a review-first skill. It helps decide whether code needs a deeper module
|
|
|
37
37
|
## Use When
|
|
38
38
|
|
|
39
39
|
- The user asks for architecture review, module boundaries, structural improvement, codebase deepening, maintainability review, or testability improvement.
|
|
40
|
+
- The user asks where a design will break first as it grows, which responsibility boundary is most likely to blur, or whether a module, service, database owner, permission model, deployment unit, or failure boundary is still clear enough.
|
|
40
41
|
- A file, module, service, handler, command, controller, or test suite looks broad enough that the next edit may add another responsibility.
|
|
41
42
|
- Code exposes internal steps to many callers, repeats orchestration, or makes tests hard because policy, I/O, formatting, and dispatch are mixed.
|
|
42
43
|
- A shallow wrapper adds naming without hiding complexity, or a helper has become a pass-through layer around many unrelated concerns.
|
|
@@ -57,6 +58,7 @@ This is a review-first skill. It helps decide whether code needs a deeper module
|
|
|
57
58
|
- Target area, current pain, and the user-facing or maintainer-facing reason to inspect architecture.
|
|
58
59
|
- Relevant source files, call sites, exports, tests, fixtures, schemas, templates, or documentation that show current behavior and ownership.
|
|
59
60
|
- Local patterns for modules, boundaries, naming, errors, dependency direction, and tests.
|
|
61
|
+
- The data owner, write path, failure mode, and expected 3x, 10x, or 100x growth pressure when the review is about a design rather than only a file split.
|
|
60
62
|
- Current changed-file list when the worktree is already dirty.
|
|
61
63
|
- Relevant command-intent contract entries for verification.
|
|
62
64
|
|
|
@@ -88,7 +90,22 @@ This is a review-first skill. It helps decide whether code needs a deeper module
|
|
|
88
90
|
3. Identify one to three candidate boundaries.
|
|
89
91
|
- Each candidate must name the responsibility it would hide or clarify.
|
|
90
92
|
- Reject candidates that only rename, wrap, or move code without lowering caller complexity or test cost.
|
|
91
|
-
4.
|
|
93
|
+
4. Force the design through the ownership and failure questions before scoring.
|
|
94
|
+
- Name the first likely mixed-responsibility boundary. Common early failures are business rules leaking into controllers, repositories, external adapters, UI components, or framework-specific handlers.
|
|
95
|
+
- Name the final owner for important data. The owner is the module that protects the invariant, not necessarily the module that reads the value most often.
|
|
96
|
+
- Separate original state from cache, search index, analytics, summary, AI output, provider response, or other derived state.
|
|
97
|
+
- Identify every direct write path for high-impact fields such as status, role, permission, balance, quota, plan, entitlement, deleted state, payment state, or ownership.
|
|
98
|
+
- Ask whether a failure creates a visible failure state or silently creates false success. High-impact paths such as authorization, payment, entitlement, deletion, and destructive administration should fail closed.
|
|
99
|
+
- Ask whether duplicate requests, retries, webhook redelivery, queue replay, or worker restart can repeat a harmful effect. If yes, require an idempotency, ledger, outbox, or reconciliation boundary before calling the design safe.
|
|
100
|
+
5. Check growth pressure in concrete stages.
|
|
101
|
+
- At 3x scale, look first for implementation-quality failures: missing indexes, N+1 reads, large responses, synchronous file or image work, repeated external calls, and insufficient connection pools.
|
|
102
|
+
- At 10x scale, look first for ownership and state failures: write hot spots, queue delay, cache invalidation, server-local files, scattered permission rules, external API rate limits, and deployment units that change for unrelated reasons.
|
|
103
|
+
- At 100x scale, look first for partitioning and operational failures: data split boundaries, tenant or region hot spots, retry storms, external dependency isolation, long deploy recovery, missing observability, and manual-only recovery paths.
|
|
104
|
+
6. Check scaling direction without forcing premature distribution.
|
|
105
|
+
- A small team may start with one larger server or a simple server set, but request handlers should not depend on process memory, local uploads, duplicate cron execution, in-transaction external calls, or server-specific job state.
|
|
106
|
+
- Application servers should be able to become stateless. Databases may start with vertical scaling, but the design should not block read replicas, read models, queue-backed work, or future data partitioning.
|
|
107
|
+
- Horizontal scaling is only real if any server can handle the same request, workers can safely duplicate or retry work, and database writes do not all converge on an uncontrolled hot spot.
|
|
108
|
+
7. Score each candidate from 1 to 9.
|
|
92
109
|
- User value: whether the structure protects a user-visible or public contract.
|
|
93
110
|
- Maintenance value: whether future changes become smaller or less error-prone.
|
|
94
111
|
- Blast radius: how many callers, files, schemas, templates, or docs would change.
|
|
@@ -111,6 +128,8 @@ This is a review-first skill. It helps decide whether code needs a deeper module
|
|
|
111
128
|
|
|
112
129
|
- The output contains a ranked architecture candidate list or one scoped structural change.
|
|
113
130
|
- Any chosen change has a named reason tied to lower change cost, lower defect risk, or better testability.
|
|
131
|
+
- Important data has a named owner, write path, original-or-derived classification, and failure behavior when the reviewed design touches durable state.
|
|
132
|
+
- Growth pressure is either checked at 3x, 10x, and 100x or explicitly marked not relevant to the current architecture decision.
|
|
114
133
|
- Behavior changes are excluded or explicitly moved to a separate follow-up.
|
|
115
134
|
- Verification evidence or verification gaps are reported without claiming unrun checks passed.
|
|
116
135
|
|
|
@@ -145,6 +164,10 @@ Use documentation and release checks only when the review or chosen change touch
|
|
|
145
164
|
|
|
146
165
|
- Review target and current pain
|
|
147
166
|
- Evidence inspected
|
|
167
|
+
- Data owner, write path, and original-versus-derived state when relevant
|
|
168
|
+
- Failure mode, idempotency, and recovery boundary when relevant
|
|
169
|
+
- 3x, 10x, and 100x growth pressure when relevant
|
|
170
|
+
- Vertical versus horizontal scaling direction when relevant
|
|
148
171
|
- Candidate boundaries and scores
|
|
149
172
|
- Selected next action
|
|
150
173
|
- Narrower skill used or intentionally avoided
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
mustflow_doc: skill.security-privacy-review
|
|
3
3
|
locale: en
|
|
4
4
|
canonical: true
|
|
5
|
-
revision:
|
|
5
|
+
revision: 17
|
|
6
6
|
lifecycle: mustflow-owned
|
|
7
7
|
authority: procedure
|
|
8
8
|
name: security-privacy-review
|
|
@@ -31,6 +31,7 @@ Catch security, privacy, and disclosure risks introduced by ordinary code, docum
|
|
|
31
31
|
## Use When
|
|
32
32
|
|
|
33
33
|
- A change touches authentication, authorization, sessions, admin behavior, tenant boundaries, personal data, secrets, tokens, credentials, API keys, or private files.
|
|
34
|
+
- A feature adds role, permission, administrator, internal-tool, feature-flag, emergency-access, support, or back-office exceptions that could make the authorization model less explicit over time.
|
|
34
35
|
- A change comes from AI-generated code, vibe-coded output, copied examples, or a broad assistant patch that may have optimized for the happy path without proving abuse boundaries.
|
|
35
36
|
- A change adds or modifies logging, telemetry, diagnostics, receipts, reports, caches, generated state, retention, redaction, export, or external transmission.
|
|
36
37
|
- A change adds or modifies behavior analytics events, event schemas, page views, clicks, searches, impressions, scroll data, experiments, attribution, request traces, or observability data that may include personal data or sensitive context.
|
|
@@ -76,6 +77,7 @@ Catch security, privacy, and disclosure risks introduced by ordinary code, docum
|
|
|
76
77
|
- Changed files, diff summary, and the user goal.
|
|
77
78
|
- Sensitive data, actor, trust boundary, storage, logging, retention, export, or external disclosure surfaces involved.
|
|
78
79
|
- Actor, resource owner, tenant boundary, server-side authorization rule, state-changing route, external network target, dependency source, and agent/tool permission surface involved.
|
|
80
|
+
- Permission model shape when authorization is involved: actor, resource, action, scope, condition, default decision, exception path, emergency-access path, and audit expectation.
|
|
79
81
|
- Read, list, search, update, delete, upload, attach, download, invite, billing, and admin actions affected, including whether the server scopes each action by actor, owner, workspace, organization, team, role, or capability.
|
|
80
82
|
- Cookie, JWT, OAuth, file upload, file download, business-value, database mutation, ORM bulk operation, CI/CD permission, deployment setting, or secret-source surface involved.
|
|
81
83
|
- Cryptographic primitive, password hashing, random-token, secure transport, certificate validation, scanner gate, or security invariant involved.
|
|
@@ -126,6 +128,9 @@ Catch security, privacy, and disclosure risks introduced by ordinary code, docum
|
|
|
126
128
|
- Treat client-provided actor ids, role names, workspace ids, plan names, prices, discounts, entitlement flags, and status values as untrusted input. Derive trusted actor and tenant context from server-side authentication and membership checks.
|
|
127
129
|
- Check list, search, detail, attachment, export, and download paths as carefully as mutation paths. Read access is still data access.
|
|
128
130
|
- Reject mass assignment. Server code should allowlist mutable fields instead of passing raw request bodies into database updates where privileged fields could be set by the client.
|
|
131
|
+
- Review permission rules as actor, resource, action, scope, and condition rather than role name alone. "Admin can do it" is not enough; the rule should say which administrator can perform which action on which resource and under which tenant or system scope.
|
|
132
|
+
- Treat growing exceptions such as `isAdmin`, hardcoded user ids, company-email suffixes, internal-tool bypasses, feature-flag bypasses, or support-only shortcuts as authorization-model decay. Replace them with explicit capabilities, scoped roles, or time-limited emergency access.
|
|
133
|
+
- Emergency access should have a reason, time limit, notification or approval path, and audit log. It should not become a permanent silent superuser branch.
|
|
129
134
|
7. For high-impact admin operations, require a server-side capability or role check, actor attribution, target identity, reason or change note where useful, before/after evidence, and a rollback, preview, or recovery path proportionate to the impact.
|
|
130
135
|
High-impact examples include publish/unpublish, slug change, redirect change, canonical change, robots or sitemap change, filter definition change, advertisement slot or policy change, cache purge, search reindex, ranking refresh, bulk edit, and role or permission change.
|
|
131
136
|
8. For high-risk content claims, require source attribution, jurisdiction or market, effective date, verification date, risk tier, review owner, affected-content lookup, and human approval before publication when the domain is legal, privacy, finance, health, safety, eligibility, pricing, ranking, comparison, or compliance.
|
|
@@ -194,6 +199,8 @@ Catch security, privacy, and disclosure risks introduced by ordinary code, docum
|
|
|
194
199
|
- Public and packaged surfaces do not include unnecessary secrets, personal data, or misleading privacy guarantees.
|
|
195
200
|
- Admin operations, shared-cache behavior, generated-state rebuilds, and audit logs are treated as security-sensitive when they affect private data, permissions, public indexing, traffic, or monetization.
|
|
196
201
|
- Client-side permission displays, file upload or download flows, private asset URLs, and API response fields are treated as disclosure and access-control surfaces.
|
|
202
|
+
- Permission models define actor, resource, action, scope, condition, and default-deny behavior when authorization is involved, or the missing model is reported as a risk.
|
|
203
|
+
- Administrator, support, internal-tool, feature-flag, and emergency-access exceptions are audited, time-bounded, or reported as authorization-model drift.
|
|
197
204
|
- Behavior analytics, observability, and audit logs are separated by durability, retention, attribution, personal-data, and loss-tolerance expectations.
|
|
198
205
|
- Core security, privacy, billing, entitlement, file, search, job, webhook, and administrator events are internally owned or explicitly reported as SaaS-only with the resulting export, retention, and incident-reconstruction risk.
|
|
199
206
|
- Trace context, baggage, request ids, user ids, tenant ids, job ids, and webhook ids are reviewed for sensitive data, external propagation, retention, and backend portability when those surfaces exist.
|
|
@@ -240,6 +247,7 @@ Use a narrower configured test, build, or documentation intent when it better pr
|
|
|
240
247
|
- Data residency, data classification, AI processing location, runtime patch, and hard-limit policy checked when relevant
|
|
241
248
|
- Claim, comparison, affiliate, user-generated content, data-ownership, deletion, anonymization, export, and retention boundaries checked when relevant
|
|
242
249
|
- Authorization, session, token, input, file, network, business-logic, dependency, cryptography, transport, deployment, scanner, and agent-tool boundaries checked
|
|
250
|
+
- Permission exception and emergency-access boundaries checked when relevant
|
|
243
251
|
- Redaction, omission, or wording changes made
|
|
244
252
|
- Related security-regression test need
|
|
245
253
|
- Command intents run
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
mustflow_doc: skill.test-design-guard
|
|
3
3
|
locale: en
|
|
4
4
|
canonical: true
|
|
5
|
-
revision:
|
|
5
|
+
revision: 2
|
|
6
6
|
lifecycle: mustflow-owned
|
|
7
7
|
authority: procedure
|
|
8
8
|
name: test-design-guard
|
|
@@ -31,6 +31,8 @@ Guard the design quality of new tests and new test cases. This skill prevents in
|
|
|
31
31
|
|
|
32
32
|
This skill does not force TDD order. It requires evidence that each new or changed test proves an observable behavior contract.
|
|
33
33
|
|
|
34
|
+
Good tests prove that important assumptions fail loudly. They should protect the risky behavior, boundary, state, permission, cost, or integration condition that would matter in production rather than only proving that the happy path can be demonstrated once.
|
|
35
|
+
|
|
34
36
|
<!-- mustflow-section: use-when -->
|
|
35
37
|
## Use When
|
|
36
38
|
|
|
@@ -54,6 +56,7 @@ This skill does not force TDD order. It requires evidence that each new or chang
|
|
|
54
56
|
- Behavior contract source: user request, issue, bug report, schema, command contract, public docs, fixture, template, or current behavior.
|
|
55
57
|
- Existing tests, fixtures, and helpers near the behavior.
|
|
56
58
|
- Intended test objective and changed files.
|
|
59
|
+
- Risk list for the changed behavior, including money, permissions, deletion, external calls, AI cost, queues, files, data ownership, retries, timeouts, partial failure, or concurrency when those risks exist.
|
|
57
60
|
- Baseline status when using a failing test as evidence.
|
|
58
61
|
- Relevant command-intent contract entries.
|
|
59
62
|
|
|
@@ -78,6 +81,7 @@ This skill does not force TDD order. It requires evidence that each new or chang
|
|
|
78
81
|
|
|
79
82
|
1. Confirm the contract and coverage.
|
|
80
83
|
- Name the observable behavior being protected.
|
|
84
|
+
- Name the production risk the test is supposed to catch. If no risk can be named, prefer reusing existing coverage or reporting the idea as speculative.
|
|
81
85
|
- Reuse or strengthen existing tests when they already cover the behavior.
|
|
82
86
|
- Treat uncovered ideas without a contract source as suggestions, not tests.
|
|
83
87
|
2. Select the smallest useful test shape.
|
|
@@ -98,6 +102,8 @@ This skill does not force TDD order. It requires evidence that each new or chang
|
|
|
98
102
|
5. Check assertion quality.
|
|
99
103
|
- Assert at least one observable result: return value, exit code, stdout or stderr, state change, file output, emitted effect, schema result, error shape, or user-visible contract.
|
|
100
104
|
- Mock interaction assertions may support a test, but they must not be the only evidence of behavior unless the mock interaction itself is the public contract.
|
|
105
|
+
- For high-risk boundaries, prefer assertions over final state, stored records, rejected access, idempotency outcome, usage record, emitted event, or durable failure status rather than only asserting that a mocked collaborator was called.
|
|
106
|
+
- Treat tests that mock every database, transaction, authorization, serialization, queue, provider, or filesystem boundary as unit evidence only. Require a nearby integration, contract, fixture, or schema check when the real boundary is the risk.
|
|
101
107
|
6. Choose verification by objective.
|
|
102
108
|
- Use a semantic objective such as `new_behavior`, `bug_regression`, `security_negative`, `stale_test_cleanup`, `contract_sync`, `release_surface`, or `docs_or_template_contract`.
|
|
103
109
|
- Start with the narrowest configured intent that proves the objective.
|
|
@@ -110,6 +116,7 @@ This skill does not force TDD order. It requires evidence that each new or chang
|
|
|
110
116
|
## Postconditions
|
|
111
117
|
|
|
112
118
|
- Each new or changed test has a contract source, selected test shape, and observable assertion.
|
|
119
|
+
- Each new or changed test has a named risk, or the final report explains why the change is low-risk or already covered.
|
|
113
120
|
- RED evidence is classified as `behavior_red`, `api_scaffold_red`, `invalid_red`, or `not_applicable`.
|
|
114
121
|
- Speculative edge cases and duplicate coverage are reported instead of silently added.
|
|
115
122
|
- Verification uses configured command intents and reports any missing or skipped coverage.
|
|
@@ -142,6 +149,7 @@ Prefer the narrowest configured intent that proves the selected objective. `test
|
|
|
142
149
|
## Output Format
|
|
143
150
|
|
|
144
151
|
- Contract source
|
|
152
|
+
- Production risk being protected
|
|
145
153
|
- Verification objective
|
|
146
154
|
- Selected test shape: `example`, `boundary`, `property`, `mixed`, or `not_applicable`
|
|
147
155
|
- Cases reused
|
|
@@ -3,7 +3,7 @@ mustflow_doc: context.index
|
|
|
3
3
|
kind: mustflow-context
|
|
4
4
|
locale: ko
|
|
5
5
|
canonical: false
|
|
6
|
-
revision:
|
|
6
|
+
revision: 2
|
|
7
7
|
name: context-index
|
|
8
8
|
authority: router
|
|
9
9
|
lifecycle: mustflow-owned
|
|
@@ -11,14 +11,14 @@ stability: medium
|
|
|
11
11
|
review_status: needs_human_review
|
|
12
12
|
---
|
|
13
13
|
|
|
14
|
-
#
|
|
14
|
+
# 컨텍스트 색인
|
|
15
15
|
|
|
16
|
-
이 파일은 현재 작업에 필요한 프로젝트
|
|
17
|
-
불필요한 정보 유입을 방지하기 위해 기본적으로 모든
|
|
16
|
+
이 파일은 현재 작업에 필요한 프로젝트 컨텍스트 파일을 결정하고 참조하는 안내서입니다.
|
|
17
|
+
불필요한 정보 유입을 방지하기 위해 기본적으로 모든 컨텍스트 파일을 읽지 않습니다.
|
|
18
18
|
|
|
19
|
-
## 사용 가능한
|
|
19
|
+
## 사용 가능한 컨텍스트
|
|
20
20
|
|
|
21
|
-
|
|
|
21
|
+
| 컨텍스트 | 적용 시나리오 | 경로 |
|
|
22
22
|
| --- | --- | --- |
|
|
23
23
|
| project | 작업이 프로젝트 방향, 범위, 공개 동작, 비목표, 저장소 전반의 규칙에 잠재적으로 영향을 미치는 경우 | `.mustflow/context/PROJECT.md` |
|
|
24
24
|
|
|
@@ -26,14 +26,14 @@ review_status: needs_human_review
|
|
|
26
26
|
|
|
27
27
|
| 앵커 | 적용 시나리오 | 경로 |
|
|
28
28
|
| --- | --- | --- |
|
|
29
|
-
| 사용자용 개요 | 공개 프로젝트 개요나 설치 안내가 필요한 경우입니다. 강제 정책이 아닌 일반
|
|
30
|
-
| 로드맵 | 프로젝트 계획, 우선순위, 마일스톤 또는 비목표
|
|
29
|
+
| 사용자용 개요 | 공개 프로젝트 개요나 설치 안내가 필요한 경우입니다. 강제 정책이 아닌 일반 컨텍스트로 참조하십시오. | `README.md` |
|
|
30
|
+
| 로드맵 | 프로젝트 계획, 우선순위, 마일스톤 또는 비목표 컨텍스트가 필요한 경우입니다. 설치된 mustflow 정책이 아닌 계획 컨텍스트로 참조하십시오. | `ROADMAP.md` |
|
|
31
31
|
| 시각 디자인 | UI, 시각적 정체성, 디자인 토큰, 레이아웃 또는 접근성을 변경하는 경우 | `DESIGN.md` |
|
|
32
32
|
|
|
33
33
|
## 읽기 규칙
|
|
34
34
|
|
|
35
|
-
- 현재 작업에 해당하는
|
|
36
|
-
-
|
|
37
|
-
-
|
|
35
|
+
- 현재 작업에 해당하는 컨텍스트 파일만 참조하십시오.
|
|
36
|
+
- 컨텍스트 파일은 더 높은 권한의 출처에 기반한다고 명시되지 않은 경우 참고용 지침으로 간주합니다.
|
|
37
|
+
- 컨텍스트가 코드, 테스트, 명령 계약, 명시적 사용자 지시와 충돌하는 경우 이를 보고하고 더 높은 권한의 출처를 우선 적용하십시오.
|
|
38
38
|
- 누락된 프로젝트 목표, 비목표, 디자인 토큰, API 계약, 데이터 규칙을 임의로 추측하거나 생성하지 마십시오.
|
|
39
|
-
- `DESIGN.md`의 디자인 토큰을 `.mustflow/context/` 내에 중복 기록하지 마십시오.
|
|
39
|
+
- `DESIGN.md`의 디자인 토큰을 `.mustflow/context/` 내에 중복 기록하지 마십시오.
|
|
@@ -3,7 +3,7 @@ mustflow_doc: context.project
|
|
|
3
3
|
kind: mustflow-context
|
|
4
4
|
locale: ko
|
|
5
5
|
canonical: false
|
|
6
|
-
revision:
|
|
6
|
+
revision: 2
|
|
7
7
|
name: project
|
|
8
8
|
authority: contextual
|
|
9
9
|
lifecycle: user-editable
|
|
@@ -15,14 +15,14 @@ source_refs:
|
|
|
15
15
|
- .mustflow/config/commands.toml
|
|
16
16
|
---
|
|
17
17
|
|
|
18
|
-
# 프로젝트
|
|
18
|
+
# 프로젝트 컨텍스트
|
|
19
19
|
|
|
20
|
-
이 파일은 코딩 에이전트를 위한 프로젝트별
|
|
20
|
+
이 파일은 코딩 에이전트를 위한 프로젝트별 컨텍스트를 정의합니다.
|
|
21
21
|
알 수 없는 항목은 비워 두시고, 내용을 임의로 추측하여 작성하지 마십시오.
|
|
22
22
|
|
|
23
23
|
## 권한 경계
|
|
24
24
|
|
|
25
|
-
- 이 파일에는 근거가 있는
|
|
25
|
+
- 이 파일에는 근거가 있는 컨텍스트, 알 수 없는 사항, 충돌 내용을 기록할 수 있습니다.
|
|
26
26
|
- 이 파일은 명령 실행 권한을 부여하거나, 파일 수정 금지 규칙을 정의하거나,
|
|
27
27
|
`AGENTS.md` 또는 `.mustflow/config/*.toml`을 재정의하거나, 현재 근거가 없는
|
|
28
28
|
기능을 약속해서는 안 됩니다.
|
|
@@ -62,5 +62,5 @@ source_refs:
|
|
|
62
62
|
|
|
63
63
|
## 오래된 내용 확인
|
|
64
64
|
|
|
65
|
-
- 이 파일이 현재 코드, 테스트, 명령 계약, 명시적 사용자 지시와 충돌하는 경우, 이를 오래된
|
|
66
|
-
- 프로젝트 방향, 비목표, 저장소 전반의 규칙이 실제로 변경된 경우에만 이 파일을 수정해 주십시오.
|
|
65
|
+
- 이 파일이 현재 코드, 테스트, 명령 계약, 명시적 사용자 지시와 충돌하는 경우, 이를 오래된 컨텍스트로 간주하고 충돌 내용을 보고해 주십시오.
|
|
66
|
+
- 프로젝트 방향, 비목표, 저장소 전반의 규칙이 실제로 변경된 경우에만 이 파일을 수정해 주십시오.
|