diff --git a/.agents/skills/ln-build/SKILL.md b/.agents/skills/ln-build/SKILL.md index 40f166d1..df012268 100644 --- a/.agents/skills/ln-build/SKILL.md +++ b/.agents/skills/ln-build/SKILL.md @@ -150,12 +150,19 @@ Before finishing reconciliation, perform a quick cross-skill check: if a later a ### Retire derivative artifacts -After reconciliation, garbage-collect exhausted temporary files instead of leaving breadcrumbs or tombstones: +After reconciliation, garbage-collect exhausted temporary files instead of leaving breadcrumbs or tombstones, but deletion is narrowly scoped. -- `HANDOFF.md` — keep only if unfinished volatile transfer state still exists; otherwise delete it -- `memory/CARDS.md` — keep only while queued scope cards still remain; otherwise delete it -- `memory/REFACTOR.md` — keep only while unfinished refactor steps still depend on it; otherwise delete it -- Do not create archive copies, numbered handoffs, or completion-pointer files +Default deletion target: + +- `memory/CARDS.md` — delete only when the execution queue is fully exhausted, superseded, or empty after reconciliation. + +Other volatile artifacts are **review-before-delete**, not automatic cleanup: + +- `HANDOFF.md` — delete only when it contains no unfinished transfer state and no future-context inventory that is not already captured in `memory/SPEC.md`, `memory/PLAN.md`, an active scope card, or a stable design memo. +- `memory/REFACTOR.md` — delete only when every listed refactor step is done/dropped and no future sequence depends on it. +- Provisional docs outside `memory/` (for example `docs/**/provisional*.md`, handoff plans, spike plans, or exploration inventories) — do **not** delete during `ln-build` cleanup unless the user explicitly asks or you first prove that all remaining future-facing inventory has been absorbed elsewhere. If only the current card is done but the artifact still contains later affordances, open questions, or scoping input, update it instead of deleting it. + +Before deleting anything other than `memory/CARDS.md`, name the file, state why no future agent would need it, and prefer asking the user when uncertain. Do not create archive copies, numbered handoffs, or completion-pointer files. ## Routing diff --git a/.pi/components/.gitkeep b/.pi/components/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/.pi/extensions/.gitkeep b/.pi/extensions/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/@types/oxfmt_configuration_schema.json b/@types/oxfmt_configuration_schema.json new file mode 100644 index 00000000..ee3ded8a --- /dev/null +++ b/@types/oxfmt_configuration_schema.json @@ -0,0 +1,648 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Oxfmtrc", + "description": "Configuration options for the Oxfmt.\n\nMost options are the same as Prettier's options, but not all of them.\nIn addition, some options are our own extensions.", + "type": "object", + "properties": { + "arrowParens": { + "description": "Include parentheses around a sole arrow function parameter.\n\n- Default: `\"always\"`", + "allOf": [ + { + "$ref": "#/definitions/ArrowParensConfig" + } + ], + "markdownDescription": "Include parentheses around a sole arrow function parameter.\n\n- Default: `\"always\"`" + }, + "bracketSameLine": { + "description": "Put the `>` of a multi-line HTML (HTML, JSX, Vue, Angular) element at the end of the last line,\ninstead of being alone on the next line (does not apply to self closing elements).\n\n- Default: `false`", + "type": "boolean", + "markdownDescription": "Put the `>` of a multi-line HTML (HTML, JSX, Vue, Angular) element at the end of the last line,\ninstead of being alone on the next line (does not apply to self closing elements).\n\n- Default: `false`" + }, + "bracketSpacing": { + "description": "Print spaces between brackets in object literals.\n\n- Default: `true`", + "type": "boolean", + "markdownDescription": "Print spaces between brackets in object literals.\n\n- Default: `true`" + }, + "embeddedLanguageFormatting": { + "description": "Control whether to format embedded parts (For example, CSS-in-JS, or JS-in-Vue, etc.) in the file.\n\nNOTE: XXX-in-JS support is incomplete.\n\n- Default: `\"auto\"`", + "allOf": [ + { + "$ref": "#/definitions/EmbeddedLanguageFormattingConfig" + } + ], + "markdownDescription": "Control whether to format embedded parts (For example, CSS-in-JS, or JS-in-Vue, etc.) in the file.\n\nNOTE: XXX-in-JS support is incomplete.\n\n- Default: `\"auto\"`" + }, + "endOfLine": { + "description": "Which end of line characters to apply.\n\nNOTE: `\"auto\"` is not supported.\n\n- Default: `\"lf\"`\n- Overrides `.editorconfig.end_of_line`", + "allOf": [ + { + "$ref": "#/definitions/EndOfLineConfig" + } + ], + "markdownDescription": "Which end of line characters to apply.\n\nNOTE: `\"auto\"` is not supported.\n\n- Default: `\"lf\"`\n- Overrides `.editorconfig.end_of_line`" + }, + "htmlWhitespaceSensitivity": { + "description": "Specify the global whitespace sensitivity for HTML, Vue, Angular, and Handlebars.\n\n- Default: `\"css\"`", + "allOf": [ + { + "$ref": "#/definitions/HtmlWhitespaceSensitivityConfig" + } + ], + "markdownDescription": "Specify the global whitespace sensitivity for HTML, Vue, Angular, and Handlebars.\n\n- Default: `\"css\"`" + }, + "ignorePatterns": { + "description": "Ignore files matching these glob patterns.\nPatterns are based on the location of the Oxfmt configuration file.\n\n- Default: `[]`", + "type": "array", + "items": { + "type": "string" + }, + "markdownDescription": "Ignore files matching these glob patterns.\nPatterns are based on the location of the Oxfmt configuration file.\n\n- Default: `[]`" + }, + "insertFinalNewline": { + "description": "Whether to insert a final newline at the end of the file.\n\n- Default: `true`\n- Overrides `.editorconfig.insert_final_newline`", + "type": "boolean", + "markdownDescription": "Whether to insert a final newline at the end of the file.\n\n- Default: `true`\n- Overrides `.editorconfig.insert_final_newline`" + }, + "jsxSingleQuote": { + "description": "Use single quotes instead of double quotes in JSX.\n\n- Default: `false`", + "type": "boolean", + "markdownDescription": "Use single quotes instead of double quotes in JSX.\n\n- Default: `false`" + }, + "objectWrap": { + "description": "How to wrap object literals when they could fit on one line or span multiple lines.\n\nBy default, formats objects as multi-line if there is a newline prior to the first property.\nAuthors can use this heuristic to contextually improve readability, though it has some downsides.\n\n- Default: `\"preserve\"`", + "allOf": [ + { + "$ref": "#/definitions/ObjectWrapConfig" + } + ], + "markdownDescription": "How to wrap object literals when they could fit on one line or span multiple lines.\n\nBy default, formats objects as multi-line if there is a newline prior to the first property.\nAuthors can use this heuristic to contextually improve readability, though it has some downsides.\n\n- Default: `\"preserve\"`" + }, + "overrides": { + "description": "File-specific overrides.\nWhen a file matches multiple overrides, the later override takes precedence (array order matters).\n\n- Default: `[]`", + "type": "array", + "items": { + "$ref": "#/definitions/OxfmtOverrideConfig" + }, + "markdownDescription": "File-specific overrides.\nWhen a file matches multiple overrides, the later override takes precedence (array order matters).\n\n- Default: `[]`" + }, + "printWidth": { + "description": "Specify the line length that the printer will wrap on.\n\nIf you don't want line wrapping when formatting Markdown, you can set the `proseWrap` option to disable it.\n\n- Default: `100`\n- Overrides `.editorconfig.max_line_length`", + "type": "integer", + "format": "uint16", + "minimum": 0.0, + "markdownDescription": "Specify the line length that the printer will wrap on.\n\nIf you don't want line wrapping when formatting Markdown, you can set the `proseWrap` option to disable it.\n\n- Default: `100`\n- Overrides `.editorconfig.max_line_length`" + }, + "proseWrap": { + "description": "How to wrap prose.\n\nBy default, formatter will not change wrapping in markdown text since some services use a linebreak-sensitive renderer, e.g. GitHub comments and BitBucket.\nTo wrap prose to the print width, change this option to \"always\".\nIf you want to force all prose blocks to be on a single line and rely on editor/viewer soft wrapping instead, you can use \"never\".\n\n- Default: `\"preserve\"`", + "allOf": [ + { + "$ref": "#/definitions/ProseWrapConfig" + } + ], + "markdownDescription": "How to wrap prose.\n\nBy default, formatter will not change wrapping in markdown text since some services use a linebreak-sensitive renderer, e.g. GitHub comments and BitBucket.\nTo wrap prose to the print width, change this option to \"always\".\nIf you want to force all prose blocks to be on a single line and rely on editor/viewer soft wrapping instead, you can use \"never\".\n\n- Default: `\"preserve\"`" + }, + "quoteProps": { + "description": "Change when properties in objects are quoted.\n\n- Default: `\"as-needed\"`", + "allOf": [ + { + "$ref": "#/definitions/QuotePropsConfig" + } + ], + "markdownDescription": "Change when properties in objects are quoted.\n\n- Default: `\"as-needed\"`" + }, + "semi": { + "description": "Print semicolons at the ends of statements.\n\n- Default: `true`", + "type": "boolean", + "markdownDescription": "Print semicolons at the ends of statements.\n\n- Default: `true`" + }, + "singleAttributePerLine": { + "description": "Enforce single attribute per line in HTML, Vue, and JSX.\n\n- Default: `false`", + "type": "boolean", + "markdownDescription": "Enforce single attribute per line in HTML, Vue, and JSX.\n\n- Default: `false`" + }, + "singleQuote": { + "description": "Use single quotes instead of double quotes.\n\nFor JSX, you can set the `jsxSingleQuote` option.\n\n- Default: `false`", + "type": "boolean", + "markdownDescription": "Use single quotes instead of double quotes.\n\nFor JSX, you can set the `jsxSingleQuote` option.\n\n- Default: `false`" + }, + "sortImports": { + "description": "Sort import statements.\n\nUsing the similar algorithm as [eslint-plugin-perfectionist/sort-imports](https://perfectionist.dev/rules/sort-imports).\nFor details, see each field's documentation.\n\n- Default: Disabled", + "allOf": [ + { + "$ref": "#/definitions/SortImportsConfig" + } + ], + "markdownDescription": "Sort import statements.\n\nUsing the similar algorithm as [eslint-plugin-perfectionist/sort-imports](https://perfectionist.dev/rules/sort-imports).\nFor details, see each field's documentation.\n\n- Default: Disabled" + }, + "sortPackageJson": { + "description": "Sort `package.json` keys.\n\nThe algorithm is NOT compatible with [prettier-plugin-sort-packagejson](https://github.com/matzkoh/prettier-plugin-packagejson).\nBut we believe it is clearer and easier to navigate.\nFor details, see each field's documentation.\n\n- Default: `true`", + "allOf": [ + { + "$ref": "#/definitions/SortPackageJsonUserConfig" + } + ], + "markdownDescription": "Sort `package.json` keys.\n\nThe algorithm is NOT compatible with [prettier-plugin-sort-packagejson](https://github.com/matzkoh/prettier-plugin-packagejson).\nBut we believe it is clearer and easier to navigate.\nFor details, see each field's documentation.\n\n- Default: `true`" + }, + "sortTailwindcss": { + "description": "Sort Tailwind CSS classes.\n\nUsing the same algorithm as [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss).\nOption names omit the `tailwind` prefix used in the original plugin (e.g., `config` instead of `tailwindConfig`).\nFor details, see each field's documentation.\n\n- Default: Disabled", + "allOf": [ + { + "$ref": "#/definitions/SortTailwindcssConfig" + } + ], + "markdownDescription": "Sort Tailwind CSS classes.\n\nUsing the same algorithm as [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss).\nOption names omit the `tailwind` prefix used in the original plugin (e.g., `config` instead of `tailwindConfig`).\nFor details, see each field's documentation.\n\n- Default: Disabled" + }, + "tabWidth": { + "description": "Specify the number of spaces per indentation-level.\n\n- Default: `2`\n- Overrides `.editorconfig.indent_size`", + "type": "integer", + "format": "uint8", + "minimum": 0.0, + "markdownDescription": "Specify the number of spaces per indentation-level.\n\n- Default: `2`\n- Overrides `.editorconfig.indent_size`" + }, + "trailingComma": { + "description": "Print trailing commas wherever possible in multi-line comma-separated syntactic structures.\n\nA single-line array, for example, never gets trailing commas.\n\n- Default: `\"all\"`", + "allOf": [ + { + "$ref": "#/definitions/TrailingCommaConfig" + } + ], + "markdownDescription": "Print trailing commas wherever possible in multi-line comma-separated syntactic structures.\n\nA single-line array, for example, never gets trailing commas.\n\n- Default: `\"all\"`" + }, + "useTabs": { + "description": "Indent lines with tabs instead of spaces.\n\n- Default: `false`\n- Overrides `.editorconfig.indent_style`", + "type": "boolean", + "markdownDescription": "Indent lines with tabs instead of spaces.\n\n- Default: `false`\n- Overrides `.editorconfig.indent_style`" + }, + "vueIndentScriptAndStyle": { + "description": "Whether or not to indent the code inside `