karajan-code 3.4.1 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/node_modules/@karajan/core/package.json +12 -1
- package/package.json +4 -2
- package/scripts/verify-pack.mjs +108 -0
- package/src/cli/register-meta.js +37 -0
- package/src/cli/register-pipeline.js +1 -0
- package/src/commands/check.js +22 -0
- package/src/commands/harden.js +107 -0
- package/src/commands/init.js +15 -0
- package/src/harden/check.js +70 -0
- package/src/harden/config-engine.js +75 -0
- package/src/harden/config-templates.js +112 -0
- package/src/harden/guidelines-engine.js +48 -0
- package/src/harden/guidelines-templates.js +36 -0
- package/src/harden/harden-engine.js +66 -0
- package/src/harden/hook-commands.js +20 -0
- package/src/harden/hook-templates.js +69 -0
- package/src/harden/stack-roots.js +74 -0
- package/src/harden/workflow-engine.js +64 -0
- package/src/harden/workflow-templates.js +152 -0
- package/src/utils/managed-markers.js +93 -0
- package/node_modules/@sec-ant/readable-stream/LICENSE +0 -21
- package/node_modules/@sec-ant/readable-stream/README.md +0 -230
- package/node_modules/@sec-ant/readable-stream/dist/core/asyncIterablePrototype.d.ts +0 -1
- package/node_modules/@sec-ant/readable-stream/dist/core/asyncIterator.d.ts +0 -27
- package/node_modules/@sec-ant/readable-stream/dist/core/fromAnyIterable.d.ts +0 -6
- package/node_modules/@sec-ant/readable-stream/dist/index/asyncIterator.d.ts +0 -2
- package/node_modules/@sec-ant/readable-stream/dist/index/asyncIterator.js +0 -5
- package/node_modules/@sec-ant/readable-stream/dist/index/fromAnyIterable.d.ts +0 -2
- package/node_modules/@sec-ant/readable-stream/dist/index/fromAnyIterable.js +0 -5
- package/node_modules/@sec-ant/readable-stream/dist/index/index.d.ts +0 -2
- package/node_modules/@sec-ant/readable-stream/dist/index/index.js +0 -8
- package/node_modules/@sec-ant/readable-stream/dist/polyfill/asyncIterator.d.ts +0 -1
- package/node_modules/@sec-ant/readable-stream/dist/polyfill/asyncIterator.js +0 -3
- package/node_modules/@sec-ant/readable-stream/dist/polyfill/fromAnyIterable.d.ts +0 -1
- package/node_modules/@sec-ant/readable-stream/dist/polyfill/fromAnyIterable.js +0 -2
- package/node_modules/@sec-ant/readable-stream/dist/polyfill/index.d.ts +0 -2
- package/node_modules/@sec-ant/readable-stream/dist/polyfill/index.js +0 -4
- package/node_modules/@sec-ant/readable-stream/dist/ponyfill/asyncIterator.d.ts +0 -1
- package/node_modules/@sec-ant/readable-stream/dist/ponyfill/asyncIterator.js +0 -89
- package/node_modules/@sec-ant/readable-stream/dist/ponyfill/fromAnyIterable.d.ts +0 -1
- package/node_modules/@sec-ant/readable-stream/dist/ponyfill/fromAnyIterable.js +0 -34
- package/node_modules/@sec-ant/readable-stream/dist/ponyfill/index.d.ts +0 -2
- package/node_modules/@sec-ant/readable-stream/dist/ponyfill/index.js +0 -6
- package/node_modules/@sec-ant/readable-stream/dist/types/async-iterator.d.ts +0 -11
- package/node_modules/@sec-ant/readable-stream/package.json +0 -96
- package/node_modules/@sindresorhus/merge-streams/index.d.ts +0 -44
- package/node_modules/@sindresorhus/merge-streams/index.js +0 -265
- package/node_modules/@sindresorhus/merge-streams/license +0 -9
- package/node_modules/@sindresorhus/merge-streams/package.json +0 -49
- package/node_modules/@sindresorhus/merge-streams/readme.md +0 -53
- package/node_modules/base64-js/LICENSE +0 -21
- package/node_modules/base64-js/README.md +0 -34
- package/node_modules/base64-js/base64js.min.js +0 -1
- package/node_modules/base64-js/index.d.ts +0 -3
- package/node_modules/base64-js/index.js +0 -150
- package/node_modules/base64-js/package.json +0 -47
- package/node_modules/better-sqlite3/LICENSE +0 -21
- package/node_modules/better-sqlite3/README.md +0 -99
- package/node_modules/better-sqlite3/binding.gyp +0 -38
- package/node_modules/better-sqlite3/deps/common.gypi +0 -68
- package/node_modules/better-sqlite3/deps/copy.js +0 -31
- package/node_modules/better-sqlite3/deps/defines.gypi +0 -42
- package/node_modules/better-sqlite3/deps/download.sh +0 -123
- package/node_modules/better-sqlite3/deps/patches/1208.patch +0 -15
- package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.c +0 -268879
- package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.h +0 -14335
- package/node_modules/better-sqlite3/deps/sqlite3/sqlite3ext.h +0 -739
- package/node_modules/better-sqlite3/deps/sqlite3.gyp +0 -80
- package/node_modules/better-sqlite3/deps/test_extension.c +0 -21
- package/node_modules/better-sqlite3/lib/database.js +0 -90
- package/node_modules/better-sqlite3/lib/index.js +0 -3
- package/node_modules/better-sqlite3/lib/methods/aggregate.js +0 -43
- package/node_modules/better-sqlite3/lib/methods/backup.js +0 -67
- package/node_modules/better-sqlite3/lib/methods/function.js +0 -31
- package/node_modules/better-sqlite3/lib/methods/inspect.js +0 -7
- package/node_modules/better-sqlite3/lib/methods/pragma.js +0 -12
- package/node_modules/better-sqlite3/lib/methods/serialize.js +0 -16
- package/node_modules/better-sqlite3/lib/methods/table.js +0 -189
- package/node_modules/better-sqlite3/lib/methods/transaction.js +0 -78
- package/node_modules/better-sqlite3/lib/methods/wrappers.js +0 -54
- package/node_modules/better-sqlite3/lib/sqlite-error.js +0 -20
- package/node_modules/better-sqlite3/lib/util.js +0 -12
- package/node_modules/better-sqlite3/package.json +0 -59
- package/node_modules/better-sqlite3/src/addon.cpp +0 -47
- package/node_modules/better-sqlite3/src/better_sqlite3.cpp +0 -74
- package/node_modules/better-sqlite3/src/objects/backup.cpp +0 -120
- package/node_modules/better-sqlite3/src/objects/backup.hpp +0 -36
- package/node_modules/better-sqlite3/src/objects/database.cpp +0 -417
- package/node_modules/better-sqlite3/src/objects/database.hpp +0 -103
- package/node_modules/better-sqlite3/src/objects/statement-iterator.cpp +0 -113
- package/node_modules/better-sqlite3/src/objects/statement-iterator.hpp +0 -50
- package/node_modules/better-sqlite3/src/objects/statement.cpp +0 -383
- package/node_modules/better-sqlite3/src/objects/statement.hpp +0 -58
- package/node_modules/better-sqlite3/src/util/bind-map.cpp +0 -73
- package/node_modules/better-sqlite3/src/util/binder.cpp +0 -193
- package/node_modules/better-sqlite3/src/util/constants.cpp +0 -172
- package/node_modules/better-sqlite3/src/util/custom-aggregate.cpp +0 -121
- package/node_modules/better-sqlite3/src/util/custom-function.cpp +0 -59
- package/node_modules/better-sqlite3/src/util/custom-table.cpp +0 -409
- package/node_modules/better-sqlite3/src/util/data-converter.cpp +0 -17
- package/node_modules/better-sqlite3/src/util/data.cpp +0 -194
- package/node_modules/better-sqlite3/src/util/helpers.cpp +0 -109
- package/node_modules/better-sqlite3/src/util/macros.cpp +0 -83
- package/node_modules/better-sqlite3/src/util/query-macros.cpp +0 -71
- package/node_modules/better-sqlite3/src/util/row-builder.cpp +0 -49
- package/node_modules/bindings/LICENSE.md +0 -22
- package/node_modules/bindings/README.md +0 -98
- package/node_modules/bindings/bindings.js +0 -221
- package/node_modules/bindings/package.json +0 -28
- package/node_modules/bl/.travis.yml +0 -17
- package/node_modules/bl/BufferList.js +0 -396
- package/node_modules/bl/LICENSE.md +0 -13
- package/node_modules/bl/README.md +0 -247
- package/node_modules/bl/bl.js +0 -84
- package/node_modules/bl/package.json +0 -37
- package/node_modules/bl/test/convert.js +0 -21
- package/node_modules/bl/test/indexOf.js +0 -492
- package/node_modules/bl/test/isBufferList.js +0 -32
- package/node_modules/bl/test/test.js +0 -869
- package/node_modules/buffer/AUTHORS.md +0 -70
- package/node_modules/buffer/LICENSE +0 -21
- package/node_modules/buffer/README.md +0 -410
- package/node_modules/buffer/index.d.ts +0 -186
- package/node_modules/buffer/index.js +0 -1817
- package/node_modules/buffer/package.json +0 -96
- package/node_modules/chownr/LICENSE +0 -15
- package/node_modules/chownr/README.md +0 -3
- package/node_modules/chownr/chownr.js +0 -167
- package/node_modules/chownr/package.json +0 -29
- package/node_modules/cross-spawn/LICENSE +0 -21
- package/node_modules/cross-spawn/README.md +0 -89
- package/node_modules/cross-spawn/index.js +0 -39
- package/node_modules/cross-spawn/lib/enoent.js +0 -59
- package/node_modules/cross-spawn/lib/parse.js +0 -91
- package/node_modules/cross-spawn/lib/util/escape.js +0 -47
- package/node_modules/cross-spawn/lib/util/readShebang.js +0 -23
- package/node_modules/cross-spawn/lib/util/resolveCommand.js +0 -52
- package/node_modules/cross-spawn/package.json +0 -73
- package/node_modules/decompress-response/index.d.ts +0 -22
- package/node_modules/decompress-response/index.js +0 -58
- package/node_modules/decompress-response/license +0 -9
- package/node_modules/decompress-response/package.json +0 -56
- package/node_modules/decompress-response/readme.md +0 -48
- package/node_modules/deep-extend/LICENSE +0 -20
- package/node_modules/deep-extend/README.md +0 -91
- package/node_modules/deep-extend/index.js +0 -1
- package/node_modules/deep-extend/lib/deep-extend.js +0 -150
- package/node_modules/deep-extend/package.json +0 -62
- package/node_modules/detect-libc/LICENSE +0 -201
- package/node_modules/detect-libc/README.md +0 -163
- package/node_modules/detect-libc/index.d.ts +0 -14
- package/node_modules/detect-libc/lib/detect-libc.js +0 -313
- package/node_modules/detect-libc/lib/elf.js +0 -39
- package/node_modules/detect-libc/lib/filesystem.js +0 -51
- package/node_modules/detect-libc/lib/process.js +0 -24
- package/node_modules/detect-libc/package.json +0 -44
- package/node_modules/end-of-stream/LICENSE +0 -21
- package/node_modules/end-of-stream/README.md +0 -54
- package/node_modules/end-of-stream/index.js +0 -96
- package/node_modules/end-of-stream/package.json +0 -37
- package/node_modules/execa/index.d.ts +0 -27
- package/node_modules/execa/index.js +0 -28
- package/node_modules/execa/lib/arguments/command.js +0 -20
- package/node_modules/execa/lib/arguments/cwd.js +0 -39
- package/node_modules/execa/lib/arguments/encoding-option.js +0 -50
- package/node_modules/execa/lib/arguments/escape.js +0 -88
- package/node_modules/execa/lib/arguments/fd-options.js +0 -108
- package/node_modules/execa/lib/arguments/file-url.js +0 -25
- package/node_modules/execa/lib/arguments/options.js +0 -96
- package/node_modules/execa/lib/arguments/shell.js +0 -11
- package/node_modules/execa/lib/arguments/specific.js +0 -111
- package/node_modules/execa/lib/convert/add.js +0 -15
- package/node_modules/execa/lib/convert/concurrent.js +0 -33
- package/node_modules/execa/lib/convert/duplex.js +0 -69
- package/node_modules/execa/lib/convert/iterable.js +0 -34
- package/node_modules/execa/lib/convert/readable.js +0 -113
- package/node_modules/execa/lib/convert/shared.js +0 -46
- package/node_modules/execa/lib/convert/writable.js +0 -90
- package/node_modules/execa/lib/io/contents.js +0 -116
- package/node_modules/execa/lib/io/input-sync.js +0 -44
- package/node_modules/execa/lib/io/iterate.js +0 -110
- package/node_modules/execa/lib/io/max-buffer.js +0 -89
- package/node_modules/execa/lib/io/output-async.js +0 -80
- package/node_modules/execa/lib/io/output-sync.js +0 -135
- package/node_modules/execa/lib/io/pipeline.js +0 -48
- package/node_modules/execa/lib/io/strip-newline.js +0 -12
- package/node_modules/execa/lib/ipc/array.js +0 -4
- package/node_modules/execa/lib/ipc/buffer-messages.js +0 -47
- package/node_modules/execa/lib/ipc/forward.js +0 -56
- package/node_modules/execa/lib/ipc/get-each.js +0 -89
- package/node_modules/execa/lib/ipc/get-one.js +0 -69
- package/node_modules/execa/lib/ipc/graceful.js +0 -72
- package/node_modules/execa/lib/ipc/incoming.js +0 -79
- package/node_modules/execa/lib/ipc/ipc-input.js +0 -44
- package/node_modules/execa/lib/ipc/methods.js +0 -49
- package/node_modules/execa/lib/ipc/outgoing.js +0 -47
- package/node_modules/execa/lib/ipc/reference.js +0 -44
- package/node_modules/execa/lib/ipc/send.js +0 -91
- package/node_modules/execa/lib/ipc/strict.js +0 -113
- package/node_modules/execa/lib/ipc/validation.js +0 -111
- package/node_modules/execa/lib/methods/bind.js +0 -23
- package/node_modules/execa/lib/methods/command.js +0 -43
- package/node_modules/execa/lib/methods/create.js +0 -65
- package/node_modules/execa/lib/methods/main-async.js +0 -194
- package/node_modules/execa/lib/methods/main-sync.js +0 -163
- package/node_modules/execa/lib/methods/node.js +0 -51
- package/node_modules/execa/lib/methods/parameters.js +0 -31
- package/node_modules/execa/lib/methods/promise.js +0 -15
- package/node_modules/execa/lib/methods/script.js +0 -22
- package/node_modules/execa/lib/methods/template.js +0 -153
- package/node_modules/execa/lib/pipe/abort.js +0 -20
- package/node_modules/execa/lib/pipe/pipe-arguments.js +0 -91
- package/node_modules/execa/lib/pipe/sequence.js +0 -24
- package/node_modules/execa/lib/pipe/setup.js +0 -72
- package/node_modules/execa/lib/pipe/streaming.js +0 -51
- package/node_modules/execa/lib/pipe/throw.js +0 -58
- package/node_modules/execa/lib/resolve/all-async.js +0 -46
- package/node_modules/execa/lib/resolve/all-sync.js +0 -33
- package/node_modules/execa/lib/resolve/exit-async.js +0 -54
- package/node_modules/execa/lib/resolve/exit-sync.js +0 -25
- package/node_modules/execa/lib/resolve/stdio.js +0 -47
- package/node_modules/execa/lib/resolve/wait-stream.js +0 -96
- package/node_modules/execa/lib/resolve/wait-subprocess.js +0 -146
- package/node_modules/execa/lib/return/duration.js +0 -8
- package/node_modules/execa/lib/return/early-error.js +0 -60
- package/node_modules/execa/lib/return/final-error.js +0 -40
- package/node_modules/execa/lib/return/message.js +0 -157
- package/node_modules/execa/lib/return/reject.js +0 -13
- package/node_modules/execa/lib/return/result.js +0 -186
- package/node_modules/execa/lib/stdio/direction.js +0 -76
- package/node_modules/execa/lib/stdio/duplicate.js +0 -116
- package/node_modules/execa/lib/stdio/handle-async.js +0 -52
- package/node_modules/execa/lib/stdio/handle-sync.js +0 -57
- package/node_modules/execa/lib/stdio/handle.js +0 -214
- package/node_modules/execa/lib/stdio/input-option.js +0 -50
- package/node_modules/execa/lib/stdio/native.js +0 -106
- package/node_modules/execa/lib/stdio/stdio-option.js +0 -60
- package/node_modules/execa/lib/stdio/type.js +0 -173
- package/node_modules/execa/lib/terminate/cancel.js +0 -20
- package/node_modules/execa/lib/terminate/cleanup.js +0 -16
- package/node_modules/execa/lib/terminate/graceful.js +0 -71
- package/node_modules/execa/lib/terminate/kill.js +0 -93
- package/node_modules/execa/lib/terminate/signal.js +0 -70
- package/node_modules/execa/lib/terminate/timeout.js +0 -21
- package/node_modules/execa/lib/transform/encoding-transform.js +0 -51
- package/node_modules/execa/lib/transform/generator.js +0 -107
- package/node_modules/execa/lib/transform/normalize.js +0 -111
- package/node_modules/execa/lib/transform/object-mode.js +0 -41
- package/node_modules/execa/lib/transform/run-async.js +0 -60
- package/node_modules/execa/lib/transform/run-sync.js +0 -50
- package/node_modules/execa/lib/transform/split.js +0 -110
- package/node_modules/execa/lib/transform/validate.js +0 -43
- package/node_modules/execa/lib/utils/abort-signal.js +0 -8
- package/node_modules/execa/lib/utils/deferred.js +0 -7
- package/node_modules/execa/lib/utils/max-listeners.js +0 -14
- package/node_modules/execa/lib/utils/standard-stream.js +0 -6
- package/node_modules/execa/lib/utils/uint-array.js +0 -69
- package/node_modules/execa/lib/verbose/complete.js +0 -24
- package/node_modules/execa/lib/verbose/custom.js +0 -26
- package/node_modules/execa/lib/verbose/default.js +0 -54
- package/node_modules/execa/lib/verbose/error.js +0 -13
- package/node_modules/execa/lib/verbose/info.js +0 -39
- package/node_modules/execa/lib/verbose/ipc.js +0 -15
- package/node_modules/execa/lib/verbose/log.js +0 -54
- package/node_modules/execa/lib/verbose/output.js +0 -60
- package/node_modules/execa/lib/verbose/start.js +0 -15
- package/node_modules/execa/lib/verbose/values.js +0 -33
- package/node_modules/execa/license +0 -9
- package/node_modules/execa/package.json +0 -105
- package/node_modules/execa/readme.md +0 -461
- package/node_modules/execa/types/arguments/encoding-option.d.ts +0 -19
- package/node_modules/execa/types/arguments/fd-options.d.ts +0 -8
- package/node_modules/execa/types/arguments/options.d.ts +0 -400
- package/node_modules/execa/types/arguments/specific.d.ts +0 -52
- package/node_modules/execa/types/convert.d.ts +0 -58
- package/node_modules/execa/types/ipc.d.ts +0 -156
- package/node_modules/execa/types/methods/command.d.ts +0 -114
- package/node_modules/execa/types/methods/main-async.d.ts +0 -379
- package/node_modules/execa/types/methods/main-sync.d.ts +0 -59
- package/node_modules/execa/types/methods/node.d.ts +0 -62
- package/node_modules/execa/types/methods/script.d.ts +0 -115
- package/node_modules/execa/types/methods/template.d.ts +0 -18
- package/node_modules/execa/types/pipe.d.ts +0 -58
- package/node_modules/execa/types/return/final-error.d.ts +0 -51
- package/node_modules/execa/types/return/ignore.d.ts +0 -26
- package/node_modules/execa/types/return/result-all.d.ts +0 -30
- package/node_modules/execa/types/return/result-ipc.d.ts +0 -27
- package/node_modules/execa/types/return/result-stdio.d.ts +0 -17
- package/node_modules/execa/types/return/result-stdout.d.ts +0 -50
- package/node_modules/execa/types/return/result.d.ts +0 -203
- package/node_modules/execa/types/stdio/array.d.ts +0 -16
- package/node_modules/execa/types/stdio/direction.d.ts +0 -12
- package/node_modules/execa/types/stdio/option.d.ts +0 -40
- package/node_modules/execa/types/stdio/type.d.ts +0 -170
- package/node_modules/execa/types/subprocess/all.d.ts +0 -17
- package/node_modules/execa/types/subprocess/stdio.d.ts +0 -18
- package/node_modules/execa/types/subprocess/stdout.d.ts +0 -22
- package/node_modules/execa/types/subprocess/subprocess.d.ts +0 -117
- package/node_modules/execa/types/transform/normalize.d.ts +0 -57
- package/node_modules/execa/types/transform/object-mode.d.ts +0 -21
- package/node_modules/execa/types/utils.d.ts +0 -13
- package/node_modules/execa/types/verbose.d.ts +0 -98
- package/node_modules/expand-template/.travis.yml +0 -6
- package/node_modules/expand-template/LICENSE +0 -21
- package/node_modules/expand-template/README.md +0 -43
- package/node_modules/expand-template/index.js +0 -26
- package/node_modules/expand-template/package.json +0 -29
- package/node_modules/expand-template/test.js +0 -67
- package/node_modules/figures/index.d.ts +0 -279
- package/node_modules/figures/index.js +0 -292
- package/node_modules/figures/license +0 -9
- package/node_modules/figures/package.json +0 -49
- package/node_modules/figures/readme.md +0 -337
- package/node_modules/file-uri-to-path/.npmignore +0 -1
- package/node_modules/file-uri-to-path/.travis.yml +0 -30
- package/node_modules/file-uri-to-path/History.md +0 -21
- package/node_modules/file-uri-to-path/LICENSE +0 -20
- package/node_modules/file-uri-to-path/README.md +0 -74
- package/node_modules/file-uri-to-path/index.d.ts +0 -2
- package/node_modules/file-uri-to-path/index.js +0 -66
- package/node_modules/file-uri-to-path/package.json +0 -32
- package/node_modules/file-uri-to-path/test/test.js +0 -24
- package/node_modules/file-uri-to-path/test/tests.json +0 -13
- package/node_modules/fs-constants/LICENSE +0 -21
- package/node_modules/fs-constants/README.md +0 -26
- package/node_modules/fs-constants/browser.js +0 -1
- package/node_modules/fs-constants/index.js +0 -1
- package/node_modules/fs-constants/package.json +0 -19
- package/node_modules/get-stream/license +0 -9
- package/node_modules/get-stream/package.json +0 -60
- package/node_modules/get-stream/readme.md +0 -303
- package/node_modules/get-stream/source/array-buffer.js +0 -84
- package/node_modules/get-stream/source/array.js +0 -32
- package/node_modules/get-stream/source/buffer.js +0 -19
- package/node_modules/get-stream/source/contents.js +0 -121
- package/node_modules/get-stream/source/exports.js +0 -5
- package/node_modules/get-stream/source/index.d.ts +0 -121
- package/node_modules/get-stream/source/index.js +0 -13
- package/node_modules/get-stream/source/stream.js +0 -65
- package/node_modules/get-stream/source/string.js +0 -41
- package/node_modules/get-stream/source/utils.js +0 -11
- package/node_modules/github-from-package/.travis.yml +0 -4
- package/node_modules/github-from-package/LICENSE +0 -18
- package/node_modules/github-from-package/example/package.json +0 -8
- package/node_modules/github-from-package/example/url.js +0 -3
- package/node_modules/github-from-package/index.js +0 -17
- package/node_modules/github-from-package/package.json +0 -30
- package/node_modules/github-from-package/readme.markdown +0 -53
- package/node_modules/github-from-package/test/a.json +0 -8
- package/node_modules/github-from-package/test/b.json +0 -5
- package/node_modules/github-from-package/test/c.json +0 -5
- package/node_modules/github-from-package/test/d.json +0 -7
- package/node_modules/github-from-package/test/e.json +0 -5
- package/node_modules/github-from-package/test/url.js +0 -19
- package/node_modules/human-signals/LICENSE +0 -201
- package/node_modules/human-signals/README.md +0 -171
- package/node_modules/human-signals/build/src/core.js +0 -273
- package/node_modules/human-signals/build/src/main.d.ts +0 -206
- package/node_modules/human-signals/build/src/main.js +0 -70
- package/node_modules/human-signals/build/src/realtime.js +0 -16
- package/node_modules/human-signals/build/src/signals.js +0 -34
- package/node_modules/human-signals/package.json +0 -66
- package/node_modules/ieee754/LICENSE +0 -11
- package/node_modules/ieee754/README.md +0 -51
- package/node_modules/ieee754/index.d.ts +0 -10
- package/node_modules/ieee754/index.js +0 -85
- package/node_modules/ieee754/package.json +0 -52
- package/node_modules/inherits/LICENSE +0 -16
- package/node_modules/inherits/README.md +0 -42
- package/node_modules/inherits/inherits.js +0 -9
- package/node_modules/inherits/inherits_browser.js +0 -27
- package/node_modules/inherits/package.json +0 -29
- package/node_modules/ini/LICENSE +0 -15
- package/node_modules/ini/README.md +0 -102
- package/node_modules/ini/ini.js +0 -206
- package/node_modules/ini/package.json +0 -33
- package/node_modules/is-plain-obj/index.d.ts +0 -35
- package/node_modules/is-plain-obj/index.js +0 -8
- package/node_modules/is-plain-obj/license +0 -9
- package/node_modules/is-plain-obj/package.json +0 -41
- package/node_modules/is-plain-obj/readme.md +0 -58
- package/node_modules/is-stream/index.d.ts +0 -90
- package/node_modules/is-stream/index.js +0 -37
- package/node_modules/is-stream/license +0 -9
- package/node_modules/is-stream/package.json +0 -48
- package/node_modules/is-stream/readme.md +0 -57
- package/node_modules/is-unicode-supported/index.d.ts +0 -12
- package/node_modules/is-unicode-supported/index.js +0 -21
- package/node_modules/is-unicode-supported/license +0 -9
- package/node_modules/is-unicode-supported/package.json +0 -47
- package/node_modules/is-unicode-supported/readme.md +0 -35
- package/node_modules/isexe/.npmignore +0 -2
- package/node_modules/isexe/LICENSE +0 -15
- package/node_modules/isexe/README.md +0 -51
- package/node_modules/isexe/index.js +0 -57
- package/node_modules/isexe/mode.js +0 -41
- package/node_modules/isexe/package.json +0 -31
- package/node_modules/isexe/test/basic.js +0 -221
- package/node_modules/isexe/windows.js +0 -42
- package/node_modules/mimic-response/index.d.ts +0 -17
- package/node_modules/mimic-response/index.js +0 -77
- package/node_modules/mimic-response/license +0 -9
- package/node_modules/mimic-response/package.json +0 -42
- package/node_modules/mimic-response/readme.md +0 -78
- package/node_modules/minimist/.eslintrc +0 -29
- package/node_modules/minimist/.github/FUNDING.yml +0 -12
- package/node_modules/minimist/.nycrc +0 -14
- package/node_modules/minimist/CHANGELOG.md +0 -298
- package/node_modules/minimist/LICENSE +0 -18
- package/node_modules/minimist/README.md +0 -121
- package/node_modules/minimist/example/parse.js +0 -4
- package/node_modules/minimist/index.js +0 -263
- package/node_modules/minimist/package.json +0 -75
- package/node_modules/minimist/test/all_bool.js +0 -34
- package/node_modules/minimist/test/bool.js +0 -177
- package/node_modules/minimist/test/dash.js +0 -43
- package/node_modules/minimist/test/default_bool.js +0 -37
- package/node_modules/minimist/test/dotted.js +0 -24
- package/node_modules/minimist/test/kv_short.js +0 -32
- package/node_modules/minimist/test/long.js +0 -33
- package/node_modules/minimist/test/num.js +0 -38
- package/node_modules/minimist/test/parse.js +0 -209
- package/node_modules/minimist/test/parse_modified.js +0 -11
- package/node_modules/minimist/test/proto.js +0 -64
- package/node_modules/minimist/test/short.js +0 -69
- package/node_modules/minimist/test/stop_early.js +0 -17
- package/node_modules/minimist/test/unknown.js +0 -104
- package/node_modules/minimist/test/whitespace.js +0 -10
- package/node_modules/mkdirp-classic/LICENSE +0 -21
- package/node_modules/mkdirp-classic/README.md +0 -18
- package/node_modules/mkdirp-classic/index.js +0 -98
- package/node_modules/mkdirp-classic/package.json +0 -18
- package/node_modules/napi-build-utils/.github/workflows/run-npm-tests.yml +0 -31
- package/node_modules/napi-build-utils/LICENSE +0 -21
- package/node_modules/napi-build-utils/README.md +0 -52
- package/node_modules/napi-build-utils/index.js +0 -214
- package/node_modules/napi-build-utils/index.md +0 -0
- package/node_modules/napi-build-utils/package.json +0 -42
- package/node_modules/node-abi/LICENSE +0 -21
- package/node_modules/node-abi/README.md +0 -54
- package/node_modules/node-abi/abi_registry.json +0 -446
- package/node_modules/node-abi/index.js +0 -179
- package/node_modules/node-abi/package.json +0 -45
- package/node_modules/npm-run-path/index.d.ts +0 -90
- package/node_modules/npm-run-path/index.js +0 -55
- package/node_modules/npm-run-path/license +0 -9
- package/node_modules/npm-run-path/node_modules/path-key/index.d.ts +0 -31
- package/node_modules/npm-run-path/node_modules/path-key/index.js +0 -12
- package/node_modules/npm-run-path/node_modules/path-key/license +0 -9
- package/node_modules/npm-run-path/node_modules/path-key/package.json +0 -41
- package/node_modules/npm-run-path/node_modules/path-key/readme.md +0 -57
- package/node_modules/npm-run-path/package.json +0 -52
- package/node_modules/npm-run-path/readme.md +0 -104
- package/node_modules/once/LICENSE +0 -15
- package/node_modules/once/README.md +0 -79
- package/node_modules/once/once.js +0 -42
- package/node_modules/once/package.json +0 -33
- package/node_modules/parse-ms/index.d.ts +0 -30
- package/node_modules/parse-ms/index.js +0 -45
- package/node_modules/parse-ms/license +0 -9
- package/node_modules/parse-ms/package.json +0 -47
- package/node_modules/parse-ms/readme.md +0 -46
- package/node_modules/path-key/index.d.ts +0 -40
- package/node_modules/path-key/index.js +0 -16
- package/node_modules/path-key/license +0 -9
- package/node_modules/path-key/package.json +0 -39
- package/node_modules/path-key/readme.md +0 -61
- package/node_modules/prebuild-install/CHANGELOG.md +0 -131
- package/node_modules/prebuild-install/CONTRIBUTING.md +0 -6
- package/node_modules/prebuild-install/LICENSE +0 -21
- package/node_modules/prebuild-install/README.md +0 -163
- package/node_modules/prebuild-install/asset.js +0 -44
- package/node_modules/prebuild-install/bin.js +0 -78
- package/node_modules/prebuild-install/download.js +0 -142
- package/node_modules/prebuild-install/error.js +0 -14
- package/node_modules/prebuild-install/help.txt +0 -16
- package/node_modules/prebuild-install/index.js +0 -1
- package/node_modules/prebuild-install/log.js +0 -33
- package/node_modules/prebuild-install/package.json +0 -67
- package/node_modules/prebuild-install/proxy.js +0 -35
- package/node_modules/prebuild-install/rc.js +0 -64
- package/node_modules/prebuild-install/util.js +0 -143
- package/node_modules/pretty-ms/index.d.ts +0 -157
- package/node_modules/pretty-ms/index.js +0 -149
- package/node_modules/pretty-ms/license +0 -9
- package/node_modules/pretty-ms/package.json +0 -55
- package/node_modules/pretty-ms/readme.md +0 -179
- package/node_modules/pump/.github/FUNDING.yml +0 -2
- package/node_modules/pump/.travis.yml +0 -5
- package/node_modules/pump/LICENSE +0 -21
- package/node_modules/pump/README.md +0 -74
- package/node_modules/pump/SECURITY.md +0 -5
- package/node_modules/pump/empty.js +0 -1
- package/node_modules/pump/index.js +0 -86
- package/node_modules/pump/package.json +0 -30
- package/node_modules/pump/test-browser.js +0 -66
- package/node_modules/pump/test-node.js +0 -53
- package/node_modules/rc/LICENSE.APACHE2 +0 -15
- package/node_modules/rc/LICENSE.BSD +0 -26
- package/node_modules/rc/LICENSE.MIT +0 -24
- package/node_modules/rc/README.md +0 -227
- package/node_modules/rc/browser.js +0 -7
- package/node_modules/rc/cli.js +0 -4
- package/node_modules/rc/index.js +0 -53
- package/node_modules/rc/lib/utils.js +0 -104
- package/node_modules/rc/package.json +0 -29
- package/node_modules/rc/test/ini.js +0 -16
- package/node_modules/rc/test/nested-env-vars.js +0 -50
- package/node_modules/rc/test/test.js +0 -59
- package/node_modules/readable-stream/CONTRIBUTING.md +0 -38
- package/node_modules/readable-stream/GOVERNANCE.md +0 -136
- package/node_modules/readable-stream/LICENSE +0 -47
- package/node_modules/readable-stream/README.md +0 -106
- package/node_modules/readable-stream/errors-browser.js +0 -127
- package/node_modules/readable-stream/errors.js +0 -116
- package/node_modules/readable-stream/experimentalWarning.js +0 -17
- package/node_modules/readable-stream/lib/_stream_duplex.js +0 -126
- package/node_modules/readable-stream/lib/_stream_passthrough.js +0 -37
- package/node_modules/readable-stream/lib/_stream_readable.js +0 -1027
- package/node_modules/readable-stream/lib/_stream_transform.js +0 -190
- package/node_modules/readable-stream/lib/_stream_writable.js +0 -641
- package/node_modules/readable-stream/lib/internal/streams/async_iterator.js +0 -180
- package/node_modules/readable-stream/lib/internal/streams/buffer_list.js +0 -183
- package/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -96
- package/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +0 -86
- package/node_modules/readable-stream/lib/internal/streams/from-browser.js +0 -3
- package/node_modules/readable-stream/lib/internal/streams/from.js +0 -52
- package/node_modules/readable-stream/lib/internal/streams/pipeline.js +0 -86
- package/node_modules/readable-stream/lib/internal/streams/state.js +0 -22
- package/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
- package/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
- package/node_modules/readable-stream/package.json +0 -68
- package/node_modules/readable-stream/readable-browser.js +0 -9
- package/node_modules/readable-stream/readable.js +0 -16
- package/node_modules/safe-buffer/LICENSE +0 -21
- package/node_modules/safe-buffer/README.md +0 -584
- package/node_modules/safe-buffer/index.d.ts +0 -187
- package/node_modules/safe-buffer/index.js +0 -65
- package/node_modules/safe-buffer/package.json +0 -51
- package/node_modules/semver/LICENSE +0 -15
- package/node_modules/semver/README.md +0 -665
- package/node_modules/semver/bin/semver.js +0 -191
- package/node_modules/semver/classes/comparator.js +0 -143
- package/node_modules/semver/classes/index.js +0 -7
- package/node_modules/semver/classes/range.js +0 -557
- package/node_modules/semver/classes/semver.js +0 -333
- package/node_modules/semver/functions/clean.js +0 -8
- package/node_modules/semver/functions/cmp.js +0 -54
- package/node_modules/semver/functions/coerce.js +0 -62
- package/node_modules/semver/functions/compare-build.js +0 -9
- package/node_modules/semver/functions/compare-loose.js +0 -5
- package/node_modules/semver/functions/compare.js +0 -7
- package/node_modules/semver/functions/diff.js +0 -60
- package/node_modules/semver/functions/eq.js +0 -5
- package/node_modules/semver/functions/gt.js +0 -5
- package/node_modules/semver/functions/gte.js +0 -5
- package/node_modules/semver/functions/inc.js +0 -21
- package/node_modules/semver/functions/lt.js +0 -5
- package/node_modules/semver/functions/lte.js +0 -5
- package/node_modules/semver/functions/major.js +0 -5
- package/node_modules/semver/functions/minor.js +0 -5
- package/node_modules/semver/functions/neq.js +0 -5
- package/node_modules/semver/functions/parse.js +0 -18
- package/node_modules/semver/functions/patch.js +0 -5
- package/node_modules/semver/functions/prerelease.js +0 -8
- package/node_modules/semver/functions/rcompare.js +0 -5
- package/node_modules/semver/functions/rsort.js +0 -5
- package/node_modules/semver/functions/satisfies.js +0 -12
- package/node_modules/semver/functions/sort.js +0 -5
- package/node_modules/semver/functions/valid.js +0 -8
- package/node_modules/semver/index.js +0 -91
- package/node_modules/semver/internal/constants.js +0 -37
- package/node_modules/semver/internal/debug.js +0 -11
- package/node_modules/semver/internal/identifiers.js +0 -29
- package/node_modules/semver/internal/lrucache.js +0 -42
- package/node_modules/semver/internal/parse-options.js +0 -17
- package/node_modules/semver/internal/re.js +0 -223
- package/node_modules/semver/package.json +0 -78
- package/node_modules/semver/preload.js +0 -4
- package/node_modules/semver/range.bnf +0 -16
- package/node_modules/semver/ranges/gtr.js +0 -6
- package/node_modules/semver/ranges/intersects.js +0 -9
- package/node_modules/semver/ranges/ltr.js +0 -6
- package/node_modules/semver/ranges/max-satisfying.js +0 -27
- package/node_modules/semver/ranges/min-satisfying.js +0 -26
- package/node_modules/semver/ranges/min-version.js +0 -63
- package/node_modules/semver/ranges/outside.js +0 -82
- package/node_modules/semver/ranges/simplify.js +0 -49
- package/node_modules/semver/ranges/subset.js +0 -249
- package/node_modules/semver/ranges/to-comparators.js +0 -10
- package/node_modules/semver/ranges/valid.js +0 -13
- package/node_modules/shebang-command/index.js +0 -19
- package/node_modules/shebang-command/license +0 -9
- package/node_modules/shebang-command/package.json +0 -34
- package/node_modules/shebang-command/readme.md +0 -34
- package/node_modules/shebang-regex/index.d.ts +0 -22
- package/node_modules/shebang-regex/index.js +0 -2
- package/node_modules/shebang-regex/license +0 -9
- package/node_modules/shebang-regex/package.json +0 -35
- package/node_modules/shebang-regex/readme.md +0 -33
- package/node_modules/signal-exit/LICENSE.txt +0 -16
- package/node_modules/signal-exit/README.md +0 -74
- package/node_modules/signal-exit/dist/cjs/browser.d.ts +0 -12
- package/node_modules/signal-exit/dist/cjs/browser.d.ts.map +0 -1
- package/node_modules/signal-exit/dist/cjs/browser.js +0 -10
- package/node_modules/signal-exit/dist/cjs/browser.js.map +0 -1
- package/node_modules/signal-exit/dist/cjs/index.d.ts +0 -48
- package/node_modules/signal-exit/dist/cjs/index.d.ts.map +0 -1
- package/node_modules/signal-exit/dist/cjs/index.js +0 -279
- package/node_modules/signal-exit/dist/cjs/index.js.map +0 -1
- package/node_modules/signal-exit/dist/cjs/package.json +0 -3
- package/node_modules/signal-exit/dist/cjs/signals.d.ts +0 -29
- package/node_modules/signal-exit/dist/cjs/signals.d.ts.map +0 -1
- package/node_modules/signal-exit/dist/cjs/signals.js +0 -42
- package/node_modules/signal-exit/dist/cjs/signals.js.map +0 -1
- package/node_modules/signal-exit/dist/mjs/browser.d.ts +0 -12
- package/node_modules/signal-exit/dist/mjs/browser.d.ts.map +0 -1
- package/node_modules/signal-exit/dist/mjs/browser.js +0 -4
- package/node_modules/signal-exit/dist/mjs/browser.js.map +0 -1
- package/node_modules/signal-exit/dist/mjs/index.d.ts +0 -48
- package/node_modules/signal-exit/dist/mjs/index.d.ts.map +0 -1
- package/node_modules/signal-exit/dist/mjs/index.js +0 -275
- package/node_modules/signal-exit/dist/mjs/index.js.map +0 -1
- package/node_modules/signal-exit/dist/mjs/package.json +0 -3
- package/node_modules/signal-exit/dist/mjs/signals.d.ts +0 -29
- package/node_modules/signal-exit/dist/mjs/signals.d.ts.map +0 -1
- package/node_modules/signal-exit/dist/mjs/signals.js +0 -39
- package/node_modules/signal-exit/dist/mjs/signals.js.map +0 -1
- package/node_modules/signal-exit/package.json +0 -106
- package/node_modules/simple-concat/.travis.yml +0 -3
- package/node_modules/simple-concat/LICENSE +0 -20
- package/node_modules/simple-concat/README.md +0 -44
- package/node_modules/simple-concat/index.js +0 -15
- package/node_modules/simple-concat/package.json +0 -47
- package/node_modules/simple-concat/test/basic.js +0 -41
- package/node_modules/simple-get/.github/dependabot.yml +0 -15
- package/node_modules/simple-get/.github/workflows/ci.yml +0 -23
- package/node_modules/simple-get/LICENSE +0 -20
- package/node_modules/simple-get/README.md +0 -333
- package/node_modules/simple-get/index.js +0 -108
- package/node_modules/simple-get/package.json +0 -67
- package/node_modules/sqlite-vec/README.md +0 -1
- package/node_modules/sqlite-vec/package.json +0 -1
- package/node_modules/sqlite-vec-linux-x64/README.md +0 -1
- package/node_modules/sqlite-vec-linux-x64/package.json +0 -1
- package/node_modules/string_decoder/LICENSE +0 -48
- package/node_modules/string_decoder/README.md +0 -47
- package/node_modules/string_decoder/lib/string_decoder.js +0 -296
- package/node_modules/string_decoder/package.json +0 -34
- package/node_modules/strip-final-newline/index.d.ts +0 -18
- package/node_modules/strip-final-newline/index.js +0 -26
- package/node_modules/strip-final-newline/license +0 -9
- package/node_modules/strip-final-newline/package.json +0 -49
- package/node_modules/strip-final-newline/readme.md +0 -34
- package/node_modules/strip-json-comments/index.js +0 -70
- package/node_modules/strip-json-comments/license +0 -21
- package/node_modules/strip-json-comments/package.json +0 -42
- package/node_modules/strip-json-comments/readme.md +0 -64
- package/node_modules/tar-fs/.travis.yml +0 -6
- package/node_modules/tar-fs/LICENSE +0 -21
- package/node_modules/tar-fs/README.md +0 -165
- package/node_modules/tar-fs/index.js +0 -363
- package/node_modules/tar-fs/package.json +0 -41
- package/node_modules/tar-fs/test/fixtures/a/hello.txt +0 -1
- package/node_modules/tar-fs/test/fixtures/b/a/test.txt +0 -1
- package/node_modules/tar-fs/test/fixtures/d/file1 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/file2 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/sub-dir/file5 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/sub-files/file3 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/sub-files/file4 +0 -0
- package/node_modules/tar-fs/test/fixtures/e/directory/.ignore +0 -0
- package/node_modules/tar-fs/test/fixtures/e/file +0 -0
- package/node_modules/tar-fs/test/fixtures/invalid.tar +0 -0
- package/node_modules/tar-fs/test/index.js +0 -346
- package/node_modules/tar-stream/LICENSE +0 -21
- package/node_modules/tar-stream/README.md +0 -168
- package/node_modules/tar-stream/extract.js +0 -257
- package/node_modules/tar-stream/headers.js +0 -295
- package/node_modules/tar-stream/index.js +0 -2
- package/node_modules/tar-stream/pack.js +0 -255
- package/node_modules/tar-stream/package.json +0 -58
- package/node_modules/tar-stream/sandbox.js +0 -11
- package/node_modules/tunnel-agent/LICENSE +0 -55
- package/node_modules/tunnel-agent/README.md +0 -4
- package/node_modules/tunnel-agent/index.js +0 -244
- package/node_modules/tunnel-agent/package.json +0 -22
- package/node_modules/unicorn-magic/default.d.ts +0 -13
- package/node_modules/unicorn-magic/default.js +0 -14
- package/node_modules/unicorn-magic/license +0 -9
- package/node_modules/unicorn-magic/node.d.ts +0 -125
- package/node_modules/unicorn-magic/node.js +0 -49
- package/node_modules/unicorn-magic/package.json +0 -62
- package/node_modules/unicorn-magic/readme.md +0 -25
- package/node_modules/util-deprecate/History.md +0 -16
- package/node_modules/util-deprecate/LICENSE +0 -24
- package/node_modules/util-deprecate/README.md +0 -53
- package/node_modules/util-deprecate/browser.js +0 -67
- package/node_modules/util-deprecate/node.js +0 -6
- package/node_modules/util-deprecate/package.json +0 -27
- package/node_modules/which/LICENSE +0 -15
- package/node_modules/which/README.md +0 -54
- package/node_modules/which/bin/node-which +0 -52
- package/node_modules/which/package.json +0 -43
- package/node_modules/which/which.js +0 -125
- package/node_modules/wrappy/LICENSE +0 -15
- package/node_modules/wrappy/README.md +0 -36
- package/node_modules/wrappy/package.json +0 -29
- package/node_modules/wrappy/wrappy.js +0 -33
- package/node_modules/yoctocolors/base.d.ts +0 -47
- package/node_modules/yoctocolors/base.js +0 -94
- package/node_modules/yoctocolors/index.d.ts +0 -2
- package/node_modules/yoctocolors/index.js +0 -2
- package/node_modules/yoctocolors/license +0 -9
- package/node_modules/yoctocolors/package.json +0 -69
- package/node_modules/yoctocolors/readme.md +0 -138
package/README.md
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
|
|
24
24
|
---
|
|
25
25
|
|
|
26
|
-
> **v3.
|
|
26
|
+
> **v3.5.0 released** — Quality harness: `kj harden` brings the guardrails Karajan was built with to any repo in one command — idempotent git hooks, lint/format/commit config, CI quality gates and agent guidelines, all stack-aware and behind `kj:managed` markers that never overwrite your content. Native per-language hook commands mean hardening a Go/Python/Java repo never makes Node a commit-time dependency. `kj check` verifies the harness as a CI drift gate, and `kj init` installs it out of the box. Full notes in [CHANGELOG.md](CHANGELOG.md).
|
|
27
27
|
|
|
28
28
|
You describe what you want to build. Karajan orchestrates multiple AI agents to plan it, implement it, test it, review it with SonarQube, and iterate. No babysitting required.
|
|
29
29
|
|
|
@@ -27,11 +27,22 @@
|
|
|
27
27
|
"scripts": {
|
|
28
28
|
"test": "vitest run"
|
|
29
29
|
},
|
|
30
|
-
"
|
|
30
|
+
"peerDependencies": {
|
|
31
31
|
"better-sqlite3": "^12.10.0",
|
|
32
32
|
"execa": "^9.6.0",
|
|
33
33
|
"sqlite-vec": "^0.1.9"
|
|
34
34
|
},
|
|
35
|
+
"peerDependenciesMeta": {
|
|
36
|
+
"better-sqlite3": {
|
|
37
|
+
"optional": true
|
|
38
|
+
},
|
|
39
|
+
"execa": {
|
|
40
|
+
"optional": true
|
|
41
|
+
},
|
|
42
|
+
"sqlite-vec": {
|
|
43
|
+
"optional": true
|
|
44
|
+
}
|
|
45
|
+
},
|
|
35
46
|
"devDependencies": {
|
|
36
47
|
"vitest": "^4.0.0"
|
|
37
48
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "karajan-code",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.5.0",
|
|
4
4
|
"description": "Local multi-agent coding orchestrator with TDD, SonarQube, and code review pipeline",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "AGPL-3.0",
|
|
@@ -71,7 +71,9 @@
|
|
|
71
71
|
"typecheck": "npx -p typescript@5 tsc --noEmit -p tsconfig.json",
|
|
72
72
|
"validate": "npm run lint && npm run lint:syntax && npm test",
|
|
73
73
|
"mcp": "node src/mcp/server.js",
|
|
74
|
-
"audit:test-diet": "node scripts/audit-test-diet.mjs"
|
|
74
|
+
"audit:test-diet": "node scripts/audit-test-diet.mjs",
|
|
75
|
+
"verify-pack": "node scripts/verify-pack.mjs",
|
|
76
|
+
"prepublishOnly": "node scripts/verify-pack.mjs"
|
|
75
77
|
},
|
|
76
78
|
"simple-git-hooks": {
|
|
77
79
|
"pre-commit": "npx lint-staged"
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Pre-publish tarball smoke gate (KJC-TSK-0553).
|
|
4
|
+
*
|
|
5
|
+
* WHY: the test suite runs against the linked workspace, where
|
|
6
|
+
* `@karajan/core` and its deps resolve via symlink — so a broken
|
|
7
|
+
* PUBLISHED artifact (bundleDependencies dragging in sqlite-vec without
|
|
8
|
+
* its entry point, KJC-BUG-0082 / 0086) passed CI yet failed on every
|
|
9
|
+
* clean `npm install`. v3.2.0, v3.3.0 and v3.4.1 all shipped unable to
|
|
10
|
+
* run even `kj --version`.
|
|
11
|
+
*
|
|
12
|
+
* WHAT: pack the real tarball, install it into an isolated tmpdir
|
|
13
|
+
* (outside the repo, with CLAUDECODE stripped), and assert the binary
|
|
14
|
+
* actually starts and its native-ish deps resolve. Exit non-zero on any
|
|
15
|
+
* failure so `prepublishOnly` aborts the publish and CI blocks the PR.
|
|
16
|
+
*
|
|
17
|
+
* `npm pack` fires prepack/postpack, NOT prepublishOnly — so invoking
|
|
18
|
+
* this from prepublishOnly does not recurse.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { execFileSync } from "node:child_process";
|
|
22
|
+
import fs from "node:fs";
|
|
23
|
+
import os from "node:os";
|
|
24
|
+
import path from "node:path";
|
|
25
|
+
import { fileURLToPath } from "node:url";
|
|
26
|
+
|
|
27
|
+
const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
28
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(repoRoot, "package.json"), "utf8"));
|
|
29
|
+
const expectedVersion = pkg.version;
|
|
30
|
+
|
|
31
|
+
// Subprocess env: strip CLAUDECODE (Claude Code blocks nested non-interactive
|
|
32
|
+
// runs otherwise) and force a non-interactive, quiet npm.
|
|
33
|
+
const { CLAUDECODE: _omit, ...cleanEnv } = process.env;
|
|
34
|
+
const childEnv = { ...cleanEnv, npm_config_yes: "true", CI: "1" };
|
|
35
|
+
|
|
36
|
+
function run(cmd, args, opts = {}) {
|
|
37
|
+
return execFileSync(cmd, args, {
|
|
38
|
+
encoding: "utf8",
|
|
39
|
+
env: childEnv,
|
|
40
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
41
|
+
...opts,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function fail(msg, detail) {
|
|
46
|
+
console.error(`\n✗ verify-pack: ${msg}`);
|
|
47
|
+
if (detail) console.error(String(detail).split("\n").slice(0, 20).join("\n"));
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
let tgzPath = null;
|
|
52
|
+
let tmpDir = null;
|
|
53
|
+
try {
|
|
54
|
+
console.log(`verify-pack: packing karajan-code@${expectedVersion}…`);
|
|
55
|
+
// --json gives us the exact filename without parsing human output.
|
|
56
|
+
const packOut = run("npm", ["pack", "--json", "--silent"], { cwd: repoRoot });
|
|
57
|
+
const filename = JSON.parse(packOut)[0]?.filename;
|
|
58
|
+
if (!filename) fail("npm pack did not report a filename", packOut);
|
|
59
|
+
// npm normalizes scoped names in --json but karajan-code is unscoped;
|
|
60
|
+
// the file lands in cwd under the reported name.
|
|
61
|
+
tgzPath = path.join(repoRoot, filename);
|
|
62
|
+
if (!fs.existsSync(tgzPath)) fail(`packed tarball not found at ${tgzPath}`);
|
|
63
|
+
|
|
64
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "kj-verify-pack-"));
|
|
65
|
+
console.log(`verify-pack: installing the tarball into ${tmpDir} (clean, isolated)…`);
|
|
66
|
+
run("npm", ["install", tgzPath, "--no-audit", "--no-fund", "--silent", "--prefix", tmpDir], {
|
|
67
|
+
cwd: tmpDir,
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
const binPath = path.join(tmpDir, "node_modules", ".bin", "kj");
|
|
71
|
+
if (!fs.existsSync(binPath)) fail(`kj binary missing after install: ${binPath}`);
|
|
72
|
+
|
|
73
|
+
// 1. kj --version must start AND report the version we just packed.
|
|
74
|
+
let versionOut;
|
|
75
|
+
try {
|
|
76
|
+
versionOut = run(binPath, ["--version"]).trim();
|
|
77
|
+
} catch (err) {
|
|
78
|
+
fail("`kj --version` crashed on a clean install", err.stderr || err.message);
|
|
79
|
+
}
|
|
80
|
+
if (!versionOut.includes(expectedVersion)) {
|
|
81
|
+
fail(`kj --version returned "${versionOut}", expected ${expectedVersion}`);
|
|
82
|
+
}
|
|
83
|
+
console.log(`verify-pack: kj --version → ${versionOut} ✓`);
|
|
84
|
+
|
|
85
|
+
// 2. kj --help must exit 0 (exercises the command tree wiring).
|
|
86
|
+
try {
|
|
87
|
+
run(binPath, ["--help"]);
|
|
88
|
+
} catch (err) {
|
|
89
|
+
fail("`kj --help` failed on a clean install", err.stderr || err.message);
|
|
90
|
+
}
|
|
91
|
+
console.log("verify-pack: kj --help ✓");
|
|
92
|
+
|
|
93
|
+
// 3. The deps that broke before must resolve in the installed tree.
|
|
94
|
+
const installedRoot = path.join(tmpDir, "node_modules", "karajan-code");
|
|
95
|
+
const checks = [
|
|
96
|
+
path.join(tmpDir, "node_modules", "sqlite-vec", "index.mjs"),
|
|
97
|
+
path.join(installedRoot, "node_modules", "@karajan", "core", "src", "vec-store.js"),
|
|
98
|
+
];
|
|
99
|
+
for (const p of checks) {
|
|
100
|
+
if (!fs.existsSync(p)) fail(`expected resolved path missing in install: ${p}`);
|
|
101
|
+
}
|
|
102
|
+
console.log("verify-pack: sqlite-vec + @karajan/core resolve ✓");
|
|
103
|
+
|
|
104
|
+
console.log(`\n✓ verify-pack: karajan-code@${expectedVersion} installs clean and runs.`);
|
|
105
|
+
} finally {
|
|
106
|
+
if (tgzPath && fs.existsSync(tgzPath)) fs.rmSync(tgzPath, { force: true });
|
|
107
|
+
if (tmpDir && fs.existsSync(tmpDir)) fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
108
|
+
}
|
package/src/cli/register-meta.js
CHANGED
|
@@ -14,6 +14,8 @@ import { webperfCommand } from "../commands/webperf.js";
|
|
|
14
14
|
import { undoCommand } from "../commands/undo.js";
|
|
15
15
|
import { syncCommand } from "../commands/sync.js";
|
|
16
16
|
import { cleanCommand } from "../commands/clean.js";
|
|
17
|
+
import { checkCommand } from "../commands/check.js";
|
|
18
|
+
import { hardenCommand } from "../commands/harden.js";
|
|
17
19
|
import { telemetryPreviewCommand, telemetryStatusCommand } from "../commands/telemetry.js";
|
|
18
20
|
import { withConfig } from "./_shared.js";
|
|
19
21
|
|
|
@@ -396,4 +398,39 @@ export function registerMeta(program, { pkgVersion }) {
|
|
|
396
398
|
huDays: flags.huDays ? Number(flags.huDays) : undefined,
|
|
397
399
|
});
|
|
398
400
|
});
|
|
401
|
+
|
|
402
|
+
program
|
|
403
|
+
.command("harden")
|
|
404
|
+
.description("Install the quality harness (git hooks) into this repo — idempotent")
|
|
405
|
+
.option("--profile <name>", "minimal | standard | strict", "standard")
|
|
406
|
+
.option("--no-config", "Skip lint/format/commit config files (hooks only)")
|
|
407
|
+
.option("--no-ci", "Skip CI quality workflows")
|
|
408
|
+
.option("--no-guidelines", "Skip AI-agent guideline files (AGENTS.md/CLAUDE.md)")
|
|
409
|
+
.option("--dry-run", "Show what would change without writing")
|
|
410
|
+
.option("--json", "Emit machine-readable JSON")
|
|
411
|
+
.action(async (flags) => {
|
|
412
|
+
await withConfig(pkgVersion, "harden", flags, async ({ logger }) => {
|
|
413
|
+
await hardenCommand({
|
|
414
|
+
profile: flags.profile,
|
|
415
|
+
config: flags.config !== false,
|
|
416
|
+
ci: flags.ci !== false,
|
|
417
|
+
guidelines: flags.guidelines !== false,
|
|
418
|
+
dryRun: Boolean(flags.dryRun),
|
|
419
|
+
json: Boolean(flags.json),
|
|
420
|
+
logger,
|
|
421
|
+
});
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
program
|
|
426
|
+
.command("check")
|
|
427
|
+
.description("Verify the quality harness installed by kj harden (drift gate)")
|
|
428
|
+
.option("--profile <name>", "minimal | standard | strict", "standard")
|
|
429
|
+
.option("--json", "Emit machine-readable JSON")
|
|
430
|
+
.action(async (flags) => {
|
|
431
|
+
const code = await withConfig(pkgVersion, "check", flags, async ({ logger }) =>
|
|
432
|
+
checkCommand({ profile: flags.profile, json: Boolean(flags.json), logger })
|
|
433
|
+
);
|
|
434
|
+
if (Number.isInteger(code)) process.exit(code);
|
|
435
|
+
});
|
|
399
436
|
}
|
|
@@ -30,6 +30,7 @@ export function registerPipeline(program, { pkgVersion }) {
|
|
|
30
30
|
.option("--no-rtk", "Skip the RTK auto-install (token savings on Bash outputs). Karajan still runs but burns more tokens")
|
|
31
31
|
.option("--no-squeezr", "Skip the Squeezr auto-install (context compression). Karajan still runs but burns more tokens")
|
|
32
32
|
.option("--no-qmd", "Skip the QMD auto-install + collection registration (semantic wiki over docs/, .reviews/ and plans/)")
|
|
33
|
+
.option("--no-harden", "Skip the quality harness (git hooks, lint/commit config, CI gates, agent guidelines)")
|
|
33
34
|
.action(async (flags) => {
|
|
34
35
|
await withConfig(pkgVersion, "init", flags, async ({ config: _config, logger }) => {
|
|
35
36
|
await initCommand({ logger, flags });
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `kj check` — verify the quality harness installed by `kj harden`
|
|
3
|
+
* (KJC-TSK-0558). Prints a per-category table and returns an exit code so it
|
|
4
|
+
* works both locally and as a CI drift gate. `--json` for machine output.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { checkHarden } from "../harden/check.js";
|
|
8
|
+
|
|
9
|
+
export async function checkCommand({ projectDir = process.cwd(), profile = "standard", json = false, logger = console } = {}) {
|
|
10
|
+
const result = await checkHarden({ projectDir, profile });
|
|
11
|
+
|
|
12
|
+
if (json) {
|
|
13
|
+
logger.info?.(JSON.stringify(result));
|
|
14
|
+
return result.ok ? 0 : 1;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
logger.info?.(`kj check (${profile})`);
|
|
18
|
+
for (const c of result.checks) logger.info?.(` ${c.ok ? "✓" : "✗"} ${c.id}: ${c.detail}`);
|
|
19
|
+
if (!result.ok) logger.info?.("Harness drift detected — run `kj harden` to repair.");
|
|
20
|
+
else logger.info?.("Harness OK.");
|
|
21
|
+
return result.ok ? 0 : 1;
|
|
22
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `kj harden` — install the quality harness (git hooks) into any repo.
|
|
3
|
+
*
|
|
4
|
+
* Thin CLI layer over harden-engine (KJC-TSK-0555): resolves stack-aware
|
|
5
|
+
* lint/format/test commands, runs the installer and reports. Config files
|
|
6
|
+
* (eslint/prettier) and CI gates land in later slices (H-C / H-D).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
|
|
12
|
+
import { installConfigsForRoots } from "../harden/config-engine.js";
|
|
13
|
+
import { installGuidelines } from "../harden/guidelines-engine.js";
|
|
14
|
+
import { commandsForLanguage } from "../harden/hook-commands.js";
|
|
15
|
+
import { installHooks } from "../harden/harden-engine.js";
|
|
16
|
+
import { detectStackRoots } from "../harden/stack-roots.js";
|
|
17
|
+
import { installWorkflows } from "../harden/workflow-engine.js";
|
|
18
|
+
import { detectTestFramework } from "../utils/project-detect.js";
|
|
19
|
+
|
|
20
|
+
const JS_TEST_CMD = {
|
|
21
|
+
vitest: "npx vitest run",
|
|
22
|
+
jest: "npx jest",
|
|
23
|
+
mocha: "npx mocha",
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Resolve the hook's lint/format/test commands for the primary language.
|
|
28
|
+
* Non-JS stacks use their native toolchain (go/ruff/…); JS/TS is built from
|
|
29
|
+
* the project's own package.json scripts so no npm command is ever assumed.
|
|
30
|
+
*/
|
|
31
|
+
export async function resolveCmds(projectDir, language) {
|
|
32
|
+
const lang = language ?? detectStackRoots(projectDir)[0]?.language ?? null;
|
|
33
|
+
const cmds = { ...commandsForLanguage(lang) };
|
|
34
|
+
if (lang !== "javascript" && lang !== "typescript") return cmds;
|
|
35
|
+
|
|
36
|
+
const pkgPath = join(projectDir, "package.json");
|
|
37
|
+
if (existsSync(pkgPath)) {
|
|
38
|
+
try {
|
|
39
|
+
const scripts = JSON.parse(readFileSync(pkgPath, "utf8")).scripts ?? {};
|
|
40
|
+
if (scripts.lint) cmds.lint = "npm run -s lint";
|
|
41
|
+
if (scripts["format:check"]) cmds.format = "npm run -s format:check";
|
|
42
|
+
else if (scripts.format) cmds.format = "npm run -s format";
|
|
43
|
+
if (scripts.test) cmds.test = "npm test";
|
|
44
|
+
} catch {
|
|
45
|
+
/* unreadable package.json → fall back to framework detection */
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (!cmds.test) {
|
|
49
|
+
const { framework } = await detectTestFramework(projectDir);
|
|
50
|
+
if (framework && JS_TEST_CMD[framework]) cmds.test = JS_TEST_CMD[framework];
|
|
51
|
+
}
|
|
52
|
+
return cmds;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export async function hardenCommand({
|
|
56
|
+
projectDir = process.cwd(),
|
|
57
|
+
profile = "standard",
|
|
58
|
+
config = true,
|
|
59
|
+
ci = true,
|
|
60
|
+
guidelines = true,
|
|
61
|
+
dryRun = false,
|
|
62
|
+
json = false,
|
|
63
|
+
logger = console,
|
|
64
|
+
} = {}) {
|
|
65
|
+
const roots = detectStackRoots(projectDir);
|
|
66
|
+
const cmds = await resolveCmds(projectDir, roots[0]?.language ?? null);
|
|
67
|
+
let result;
|
|
68
|
+
try {
|
|
69
|
+
result = await installHooks({ projectDir, profile, cmds, dryRun });
|
|
70
|
+
} catch (err) {
|
|
71
|
+
if (json) logger.info?.(JSON.stringify({ ok: false, error: err.message }));
|
|
72
|
+
else logger.error?.(`kj harden: ${err.message}`);
|
|
73
|
+
return { ok: false, error: err.message };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Config (lint/format/commit) ships with standard+, per language root so a
|
|
77
|
+
// fullstack monorepo is hardened on every side, not just one.
|
|
78
|
+
const withConfig = config && profile !== "minimal";
|
|
79
|
+
const cfg = withConfig ? installConfigsForRoots({ projectDir, roots, dryRun }) : null;
|
|
80
|
+
const withCi = ci && profile !== "minimal";
|
|
81
|
+
const wf = withCi
|
|
82
|
+
? installWorkflows({ projectDir, language: roots[0]?.language ?? null, profile, dryRun })
|
|
83
|
+
: null;
|
|
84
|
+
const withGuidelines = guidelines && profile !== "minimal";
|
|
85
|
+
const gl = withGuidelines ? installGuidelines({ projectDir, dryRun }) : null;
|
|
86
|
+
const out = {
|
|
87
|
+
ok: true,
|
|
88
|
+
...result,
|
|
89
|
+
configs: cfg?.configs ?? [],
|
|
90
|
+
workflows: wf?.workflows ?? [],
|
|
91
|
+
guidelines: gl?.guidelines ?? [],
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
if (json) {
|
|
95
|
+
logger.info?.(JSON.stringify(out));
|
|
96
|
+
return out;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const verb = dryRun ? "would install" : "installed";
|
|
100
|
+
logger.info?.(`kj harden (${profile}) — ${verb} ${result.hooks.length} hook(s) → ${result.hooksPath}`);
|
|
101
|
+
for (const h of result.hooks) logger.info?.(` • ${h.hook}: ${h.action}`);
|
|
102
|
+
for (const c of out.configs) logger.info?.(` • ${c.file}: ${c.action}`);
|
|
103
|
+
for (const w of out.workflows) logger.info?.(` • ${w.file}: ${w.action}`);
|
|
104
|
+
for (const g of out.guidelines) logger.info?.(` • ${g.file}: ${g.action}`);
|
|
105
|
+
if (!dryRun) logger.info?.("core.hooksPath set. Verify later with `kj check` (H-E).");
|
|
106
|
+
return out;
|
|
107
|
+
}
|
package/src/commands/init.js
CHANGED
|
@@ -21,6 +21,8 @@ import { detectAiTrash, installAiTrashHook } from "../utils/ai-trash.js";
|
|
|
21
21
|
import { detectQmd } from "../utils/qmd-detect.js";
|
|
22
22
|
import { installQmd } from "../utils/qmd-install.js";
|
|
23
23
|
import { registerQmdCollections } from "../utils/qmd-collection.js";
|
|
24
|
+
import { isGitRepo } from "../harden/harden-engine.js";
|
|
25
|
+
import { hardenCommand } from "./harden.js";
|
|
24
26
|
import { detectProjectStack } from "../utils/stack-detect.js";
|
|
25
27
|
import { bootstrapSonarToken } from "../sonar/token-bootstrap.js";
|
|
26
28
|
|
|
@@ -834,6 +836,19 @@ export async function initCommand({ logger, flags = {} }) {
|
|
|
834
836
|
await setupSonarQube(config, logger, { interactive });
|
|
835
837
|
await scaffoldCiGateway(config, flags, logger);
|
|
836
838
|
|
|
839
|
+
// Install the quality harness (git hooks, lint/format/commit config, CI
|
|
840
|
+
// quality gates, agent guidelines) through the SAME engine as `kj harden`,
|
|
841
|
+
// so init and harden never drift. Opt-out: --no-harden. Needs a git repo.
|
|
842
|
+
const skipHarden = flags?.noHarden === true || flags?.harden === false;
|
|
843
|
+
if (skipHarden) {
|
|
844
|
+
logger.info("Quality harness skipped (--no-harden).");
|
|
845
|
+
} else if (isGitRepo(process.cwd())) {
|
|
846
|
+
logger.info("Installing quality harness (kj harden)...");
|
|
847
|
+
await hardenCommand({ projectDir: process.cwd(), logger });
|
|
848
|
+
} else {
|
|
849
|
+
logger.info("Not a git repository — run `kj harden` after `git init` to add the quality harness.");
|
|
850
|
+
}
|
|
851
|
+
|
|
837
852
|
// Persist any changes setupSonarQube made (token, etc.) back to disk.
|
|
838
853
|
// Use writeInitConfig so the deprecated `sonarqube.enabled` key —
|
|
839
854
|
// which setupSonarQube still mutates as an in-memory hint — never
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* checkHarden — verify the quality harness installed by `kj harden`
|
|
3
|
+
* (KJC-TSK-0558). Detects drift: a deleted hook, a hook that lost its kj
|
|
4
|
+
* marker or its executable bit, or a core.hooksPath that no longer points at
|
|
5
|
+
* `.karajan/hooks`. Returns a per-check report; the CLI maps it to exit 0/≠0.
|
|
6
|
+
*
|
|
7
|
+
* Config, workflow and language-advisory checks land in the next slice.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
|
|
13
|
+
import { runCommand } from "../utils/process.js";
|
|
14
|
+
import { CONFIGS_BY_LANGUAGE, UNIVERSAL_CONFIGS } from "./config-templates.js";
|
|
15
|
+
import { PROFILE_HOOKS } from "./hook-templates.js";
|
|
16
|
+
import { detectStackRoots } from "./stack-roots.js";
|
|
17
|
+
import { qualityWorkflowFor, WORKFLOWS } from "./workflow-templates.js";
|
|
18
|
+
|
|
19
|
+
const HOOKS_DIR = join(".karajan", "hooks");
|
|
20
|
+
const WORKFLOWS_DIR = join(".github", "workflows");
|
|
21
|
+
|
|
22
|
+
/** A config/workflow file just needs to be present (it may be user-owned). */
|
|
23
|
+
function presence(projectDir, rel, id, miss) {
|
|
24
|
+
const ok = existsSync(join(projectDir, rel));
|
|
25
|
+
return { id, ok, detail: ok ? "ok" : miss };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export async function checkHarden({ projectDir = process.cwd(), profile = "standard" } = {}) {
|
|
29
|
+
const checks = [];
|
|
30
|
+
|
|
31
|
+
const res = await runCommand("git", ["config", "--local", "core.hooksPath"], { cwd: projectDir });
|
|
32
|
+
const hooksPath = (res.stdout ?? "").trim();
|
|
33
|
+
checks.push({
|
|
34
|
+
id: "core.hooksPath",
|
|
35
|
+
ok: hooksPath === HOOKS_DIR,
|
|
36
|
+
detail: hooksPath === HOOKS_DIR ? "ok" : hooksPath || "(unset) — run kj harden",
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
for (const hook of PROFILE_HOOKS[profile] ?? []) {
|
|
40
|
+
const target = join(projectDir, HOOKS_DIR, hook);
|
|
41
|
+
const exists = existsSync(target);
|
|
42
|
+
const executable = exists && (statSync(target).mode & 0o100) !== 0;
|
|
43
|
+
const marked = exists && readFileSync(target, "utf8").includes(`kj:managed:hook:${hook}`);
|
|
44
|
+
const detail = !exists ? "missing" : !executable ? "not executable" : !marked ? "no kj marker" : "ok";
|
|
45
|
+
checks.push({ id: `hook:${hook}`, ok: exists && executable && marked, detail });
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Config + workflows ship with standard+ — and surface the greenfield gap:
|
|
49
|
+
// a language now present but never hardened ⇒ its config shows as missing.
|
|
50
|
+
if (profile !== "minimal") {
|
|
51
|
+
const roots = detectStackRoots(projectDir);
|
|
52
|
+
for (const cfg of UNIVERSAL_CONFIGS) {
|
|
53
|
+
checks.push(presence(projectDir, cfg.file, `config:${cfg.file}`, "missing — run kj harden"));
|
|
54
|
+
}
|
|
55
|
+
for (const { dir, language } of roots) {
|
|
56
|
+
for (const cfg of CONFIGS_BY_LANGUAGE[language] ?? []) {
|
|
57
|
+
const rel = dir === "." ? cfg.file : join(dir, cfg.file);
|
|
58
|
+
checks.push(presence(projectDir, rel, `config:${rel}`, `missing for ${language} — run kj harden`));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const expectedWf = [...WORKFLOWS];
|
|
62
|
+
const quality = qualityWorkflowFor(roots[0]?.language ?? null);
|
|
63
|
+
if (quality) expectedWf.push(quality);
|
|
64
|
+
for (const wf of expectedWf) {
|
|
65
|
+
checks.push(presence(projectDir, join(WORKFLOWS_DIR, wf.file), `workflow:${wf.file}`, "missing — run kj harden"));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return { ok: checks.every((c) => c.ok), checks };
|
|
70
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* config-engine — seeds/refreshes lint/format/commit config for `kj harden`
|
|
3
|
+
* (KJC-TSK-0556). Seed-if-absent: a config the user already authored (no
|
|
4
|
+
* kj:managed marker) is left untouched and reported as "skipped". Markered
|
|
5
|
+
* files refresh in place; JSON files (no comment syntax) are seed-only.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
9
|
+
import { dirname, join } from "node:path";
|
|
10
|
+
|
|
11
|
+
import { upsertManagedBlock } from "../utils/managed-markers.js";
|
|
12
|
+
import { CONFIGS_BY_LANGUAGE, UNIVERSAL_CONFIGS } from "./config-templates.js";
|
|
13
|
+
|
|
14
|
+
const BLOCK_VERSION = 1;
|
|
15
|
+
|
|
16
|
+
function writeFile(target, content) {
|
|
17
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
18
|
+
writeFileSync(target, content);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Seed a list of config entries into `targetDir`, labelling each by `prefix`. */
|
|
22
|
+
function seedInto(targetDir, configs, dryRun, prefix, results) {
|
|
23
|
+
for (const cfg of configs) {
|
|
24
|
+
const target = join(targetDir, cfg.file);
|
|
25
|
+
const exists = existsSync(target);
|
|
26
|
+
const file = prefix === "." ? cfg.file : join(prefix, cfg.file);
|
|
27
|
+
|
|
28
|
+
if (cfg.json) {
|
|
29
|
+
const action = exists ? "skipped" : "inserted";
|
|
30
|
+
if (!dryRun && !exists) writeFile(target, `${cfg.body}\n`);
|
|
31
|
+
results.push({ file, action });
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const source = exists ? readFileSync(target, "utf8") : "";
|
|
36
|
+
if (exists && !source.includes(`kj:managed:${cfg.blockId}`)) {
|
|
37
|
+
results.push({ file, action: "skipped" });
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const { content, action } = upsertManagedBlock({
|
|
41
|
+
source,
|
|
42
|
+
blockId: cfg.blockId,
|
|
43
|
+
version: BLOCK_VERSION,
|
|
44
|
+
body: cfg.body,
|
|
45
|
+
style: cfg.style,
|
|
46
|
+
});
|
|
47
|
+
if (!dryRun && action !== "unchanged") writeFile(target, content);
|
|
48
|
+
results.push({ file, action });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Single-directory seed: universal (.editorconfig, commitlint) plus the
|
|
54
|
+
* language's lint/format config, all at `projectDir`. Unknown language ⇒
|
|
55
|
+
* universal only. `dryRun` computes actions without writing.
|
|
56
|
+
*/
|
|
57
|
+
export function installConfigs({ projectDir = process.cwd(), language = "javascript", dryRun = false } = {}) {
|
|
58
|
+
const results = [];
|
|
59
|
+
seedInto(projectDir, [...UNIVERSAL_CONFIGS, ...(CONFIGS_BY_LANGUAGE[language] ?? [])], dryRun, ".", results);
|
|
60
|
+
return { dryRun, configs: results };
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Monorepo seed: universal config once at the root, then each language's
|
|
65
|
+
* lint/format config inside its own root (from detectStackRoots). A fullstack
|
|
66
|
+
* repo gets eslint in frontend/, ruff in backend/, etc.
|
|
67
|
+
*/
|
|
68
|
+
export function installConfigsForRoots({ projectDir = process.cwd(), roots = [], dryRun = false } = {}) {
|
|
69
|
+
const results = [];
|
|
70
|
+
seedInto(projectDir, UNIVERSAL_CONFIGS, dryRun, ".", results);
|
|
71
|
+
for (const { dir, language } of roots) {
|
|
72
|
+
seedInto(join(projectDir, dir), CONFIGS_BY_LANGUAGE[language] ?? [], dryRun, dir, results);
|
|
73
|
+
}
|
|
74
|
+
return { dryRun, configs: results };
|
|
75
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config-file templates for `kj harden` (KJC-TSK-0556).
|
|
3
|
+
*
|
|
4
|
+
* Each entry is seeded only when absent (project rule: never overwrite an
|
|
5
|
+
* existing file); on re-run a kj:managed block is refreshed in place. JSON
|
|
6
|
+
* formats carry no comment syntax, so they are seed-only (no marker).
|
|
7
|
+
*
|
|
8
|
+
* The eslint ES2025 deprecated-API blacklist lands in a follow-up slice.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export const EDITORCONFIG_BODY = [
|
|
12
|
+
"root = true",
|
|
13
|
+
"",
|
|
14
|
+
"[*]",
|
|
15
|
+
"charset = utf-8",
|
|
16
|
+
"end_of_line = lf",
|
|
17
|
+
"insert_final_newline = true",
|
|
18
|
+
"trim_trailing_whitespace = true",
|
|
19
|
+
"indent_style = space",
|
|
20
|
+
"indent_size = 2",
|
|
21
|
+
].join("\n");
|
|
22
|
+
|
|
23
|
+
export const PRETTIER_BODY = JSON.stringify(
|
|
24
|
+
{ printWidth: 110, singleQuote: false, trailingComma: "es5", semi: true },
|
|
25
|
+
null,
|
|
26
|
+
2
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
export const COMMITLINT_BODY = [
|
|
30
|
+
"// Conventional Commits — header <=100 chars, lowercase subject.",
|
|
31
|
+
"export default {",
|
|
32
|
+
' extends: ["@commitlint/config-conventional"],',
|
|
33
|
+
" rules: {",
|
|
34
|
+
' "header-max-length": [2, "always", 100],',
|
|
35
|
+
' "subject-case": [2, "never", ["sentence-case", "start-case", "pascal-case", "upper-case"]],',
|
|
36
|
+
" },",
|
|
37
|
+
"};",
|
|
38
|
+
].join("\n");
|
|
39
|
+
|
|
40
|
+
// Self-contained flat config (no plugin deps) banning APIs deprecated under
|
|
41
|
+
// an ES2025 target — mirrors the Karajan standard. Seeded only when the
|
|
42
|
+
// project has no eslint config of its own.
|
|
43
|
+
export const ESLINT_BODY = [
|
|
44
|
+
"export default [",
|
|
45
|
+
" {",
|
|
46
|
+
' files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],',
|
|
47
|
+
' languageOptions: { ecmaVersion: 2025, sourceType: "module" },',
|
|
48
|
+
" rules: {",
|
|
49
|
+
' "no-var": "error",',
|
|
50
|
+
' "no-eval": "error",',
|
|
51
|
+
' "no-new-func": "error",',
|
|
52
|
+
' "no-restricted-globals": [',
|
|
53
|
+
' "error",',
|
|
54
|
+
' { name: "alert", message: "Use the app modal, not alert()." },',
|
|
55
|
+
' { name: "confirm", message: "Use the app modal, not confirm()." },',
|
|
56
|
+
' { name: "prompt", message: "Use the app modal, not prompt()." },',
|
|
57
|
+
' { name: "escape", message: "Use encodeURIComponent()." },',
|
|
58
|
+
' { name: "unescape", message: "Use decodeURIComponent()." },',
|
|
59
|
+
' { name: "event", message: "Use the handler parameter, not window.event." },',
|
|
60
|
+
" ],",
|
|
61
|
+
' "no-restricted-properties": [',
|
|
62
|
+
' "error",',
|
|
63
|
+
' { object: "document", property: "write", message: "Use DOM nodes / Blob URLs, not document.write." },',
|
|
64
|
+
' { object: "document", property: "writeln", message: "Use DOM nodes, not document.writeln." },',
|
|
65
|
+
' { property: "substr", message: "Use slice() or substring(), not substr()." },',
|
|
66
|
+
" ],",
|
|
67
|
+
" },",
|
|
68
|
+
" },",
|
|
69
|
+
"];",
|
|
70
|
+
].join("\n");
|
|
71
|
+
|
|
72
|
+
// Ruff covers lint + format for Python; `UP` (pyupgrade) is the analogue of
|
|
73
|
+
// the ES2025 deprecated-API ban — it rewrites legacy idioms to modern Python.
|
|
74
|
+
export const RUFF_BODY = [
|
|
75
|
+
"line-length = 110",
|
|
76
|
+
'target-version = "py312"',
|
|
77
|
+
"",
|
|
78
|
+
"[lint]",
|
|
79
|
+
'select = ["E", "F", "I", "UP", "B", "SIM"]',
|
|
80
|
+
].join("\n");
|
|
81
|
+
|
|
82
|
+
export const GOLANGCI_BODY = [
|
|
83
|
+
"linters:",
|
|
84
|
+
" enable:",
|
|
85
|
+
" - govet",
|
|
86
|
+
" - staticcheck",
|
|
87
|
+
" - revive",
|
|
88
|
+
" - ineffassign",
|
|
89
|
+
" - gofmt",
|
|
90
|
+
].join("\n");
|
|
91
|
+
|
|
92
|
+
/** Language-agnostic configs (every stack gets these). */
|
|
93
|
+
export const UNIVERSAL_CONFIGS = [
|
|
94
|
+
{ file: ".editorconfig", blockId: "editorconfig", style: "hash", body: EDITORCONFIG_BODY },
|
|
95
|
+
{ file: "commitlint.config.js", blockId: "commitlint", style: "slash", body: COMMITLINT_BODY },
|
|
96
|
+
];
|
|
97
|
+
|
|
98
|
+
/** `json:true` ⇒ seed-only (no comment syntax for a marker). */
|
|
99
|
+
export const JS_CONFIGS = [
|
|
100
|
+
{ file: "eslint.config.js", blockId: "eslint", style: "slash", body: ESLINT_BODY },
|
|
101
|
+
{ file: ".prettierrc.json", json: true, body: PRETTIER_BODY },
|
|
102
|
+
];
|
|
103
|
+
export const PY_CONFIGS = [{ file: "ruff.toml", blockId: "ruff", style: "hash", body: RUFF_BODY }];
|
|
104
|
+
export const GO_CONFIGS = [{ file: ".golangci.yml", blockId: "golangci", style: "hash", body: GOLANGCI_BODY }];
|
|
105
|
+
|
|
106
|
+
/** Lint/format configs by detected language. Unknown ⇒ universal only. */
|
|
107
|
+
export const CONFIGS_BY_LANGUAGE = {
|
|
108
|
+
javascript: JS_CONFIGS,
|
|
109
|
+
typescript: JS_CONFIGS,
|
|
110
|
+
python: PY_CONFIGS,
|
|
111
|
+
go: GO_CONFIGS,
|
|
112
|
+
};
|